On Sat, Aug 1, 2009 at 12:10 AM, Russell
Keith-Magee<freakboy3...@gmail.com> wrote:
>
> On Fri, Jul 31, 2009 at 8:34 AM, Jacob Kaplan-Moss<ja...@jacobian.org> wrote:
>>
>> Hi Alex, Russ --
>>
>> I see some good pros and cons of each your suggestions. Just to throw
>> some more fuel on the fire, though, I've got an idea of my own:
>>
>> I tend to slightly favor introspection to identify old-style fields --
>> it makes it easy to raise warnings/errors at the right point, for one
>> -- but I agree with Russ that the overhead of doing it all the time is
>> annoying, as is the slightly weird upgrade path.
>>
>> However, why not do the introspection once, when the field is created?
>> You could automatically wrap old-style methods with new-style
>> decorators (that discard `connection`) could easily check for the
>> existence of multiple databases and raise a
>> YouCantUseThisFieldTypeWithMultipleDatabases exception.
>>
>> Just sketching some code, I'd imagine it looking something like this::
>>
>>    # An old-style field doesn't need to change at alll...
>>    class MyOldCustomField(models.Field):
>>        def db_type(self):
>>            ...
>>
>>    # But a new-style field can needs to flag that it supports multiple
>>    # database connections
>>    class MyNewStyleCustomField(models.Field):
>>        supports_multiple_connections = True
>>
>>        def db_type(self, connection):
>>            ...
>>
>> We could then key off  `Field.supports_multiple_connections`, which
>> would default to `False`, and automatically wrap the given methods
>> (either in `__init__` or a metaclass; not sure which would be best).
>>
>> Further, this makes it very easy to raise warnings at startup time and
>> start the deprecation cycle of the old-style usages. In Django 1.4
>> (Really? We're talking about 1.4 already?)
>> `supports_multiple_connections` becomes a noop.
>>
>> Thoughts?
>
> I like this - a lot. It's a simple implementation. It completely
> avoids both the need to perform introspection and the API-name-change
> dance. It doesn't require a short lived wrapper function to call the
> underlying code. It forces users to be explicit about the upgrade
> process. Plus it provides a convenient place to raise deprecation
> warnings, and can be easily removed when we finalize deprecation.
>
> Alex - I think we have a solution! :-)
>
> Russ %-)
>
> >
>

Indeed, I committed this solution last night.  On to bigger, and
better, and more bikesheddier things!

Alex

-- 
"I disapprove of what you say, but I will defend to the death your
right to say it." -- Voltaire
"The people's good is the highest law." -- Cicero
"Code can always be simpler than you think, but never as simple as you
want" -- Me

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django developers" group.
To post to this group, send email to django-developers@googlegroups.com
To unsubscribe from this group, send email to 
django-developers+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/django-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to