On Tuesday, March 20, 2012 at 11:25 AM, Alex Ogier wrote: > There have been various proposals about replacing the User class with > an abstract base class. Ian Lewis has a semi-workable version at > http://ianlewis.bitbucket.org/django-newauth/index.html but its > proposal met with resistance in part because there's not a great > migration path from existing apps. I recently attended a Boston-area > python meetup, and met James Sullivan and Max Thayer, two of the guys > behind www.matchbox.net (http://www.matchbox.net). We came up with a similar > solution to Ian's, > but with a better path away from the status quo. Here's our flavor of > the abstract base class, based on the needs we see in other threads. > > Starting from a basic set of premises: > > 1. People want to rip out auth.User’s authentication strictures > (username, email, password) > 2. People want to plug in fields via distribution of apps, not just in > one project-wide user table > 3. People want to depend on auth.User, by foreign key mostly > 4. For the foreseeable future, by default auth.User has to map to its > old DB table > > Here’s the clear winner for me: Make auth.User a subclass of an > abstract base class. It seems no one minds the whole auth permissions > thing sticking around even if it goes unused (if it ain’t broke don’t > fix it), so leave all that on auth.User and move everything else to > auth.DefaultUser, which is a class with Meta.abstract = True. Have > auth.User inherit from DefaultUser by default, with a setting to > override that with your own class(es). Languages like Ruby do this > with mixins, we do it with > https://docs.djangoproject.com/en/dev/topics/db/models/#multiple-inheritance > > There are definitely some cons: > > 1. Requiring classes and settings to be available at the time of > definition of auth.User means circular dependencies are a problem. > 2. Multiple inheritance is wonky and confusing in python, and only a > hackish sort of standin for mixins. > 3. In the absence of a way to override fields (something that might be > added later?), you can’t subclass DefaultUser hoping to change a > default field, you can only add fields or reimplement the whole thing. > Thankfully that would be much easier. > > But still the benefits are pretty large: > > 1. No changes to existing applications. > 2. The common case of adding fields to users is easier even than > profiles: subclass DefaultUser, add your stuff, change a setting. No > get_profile() or select_related mumbo-jumbo. > 3. The second use-case of ripping out auth.User’s broken assumptions > is possible: rewrite DefaultUser in your project. > 4. The third use-case of plugging app mixins into the User model is easy. > 5. The migration path is easy. You can incrementally step away from > the default user model, and (assuming running your migration framework > on a django.contrib app doesn’t blow up somehow) you can take > advantage of migrations without requiring them. > 6. When you change fields, you break only the stuff that depends on > them. If you remove the username field, then half the default forms > stop working, but there’s no reason for auth middleware to break, etc. > > Anyways, asides for circular dependency edge cases I think the rest of > the downsides can be mitigated by good docs. What do you guys think? > > -Alex Ogier > > P.S. I hear you are accepting GSOC applications. > > -- > 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 > (mailto:django-developers@googlegroups.com). > To unsubscribe from this group, send email to > django-developers+unsubscr...@googlegroups.com > (mailto:django-developers+unsubscr...@googlegroups.com). > For more options, visit this group at > http://groups.google.com/group/django-developers?hl=en. > >
This is pretty much exactly what django-primate does, except it includes a special metaclass to allow overriding of default fields. -- 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.