Subclassing AbstractUser in Django for two types of users -


i'm developing school database system in django 1.5, , planning on having number of different user types (student, staff, parent) subclass abstractuser (actually, abstract subclass of abstractuser). attempting add externally developed app system, uses user in foreignkey of models, however, fails user type not 'user' instance. can't set apps models use abstractuser 1 can't use abstract classes foreign keys. considering adding settings.py auth_user_model = 'myapp.myuser' , using settings.auth_user_model in place of user foreignkey in app. however, have 3 different user types, can't either.

an earlier prototype used django 1.4, did not support custom user models, hence had reference user instead, required join every query, leading quite complex queries. way can go forward this, or there solution?

i have used following solution:
1. create schooluser class in models.py - auth_user_model class

types = (('student', 'student'), ('staff', 'staff'), ('parent', 'parent'), ) class schooluser(abstractuser):     type = models.charfield(max_length=10, choices=types, default='student') 

2. create users.py file , put whole users logic there. have 1 abstract class others inherit , implement factory method:

class usermanager(object):     def __init__(self, user):         self.user = user      @classmethod     def factory(cls, user):         """         dynamically creates user object         """         if cls.__name__.startswith(user.type):  # children class naming convention important             return cls(user)         sub_cls in cls.__subclasses__():             result = sub_cls.factory(user)             if result not none:                 return result 

sample children classes (also go users.py file):

class studentuser(usermanager):     def do_something(self):         pass class staffuser(usermanager):     def do_something(self):         pass class parentuser(usermanager):     def do_something(self):         pass 

views magic happens ;)

def my_view(request):     school_user = usermanager.factory(request.user)     if school_user.do_something:  # each class can have different behaviour 

this way don't need know, type of user is, implement logic.
hope clear enough, if not let me know!


Comments

Popular posts from this blog

python - How to create a legend for 3D bar in matplotlib? -

java - Multi-Label Document Classification -

php - Dynamic url re-writing using htaccess -