My application has some hundred users and about 10 to 20 groups. Now the customer wants to give special privileges to group leaders.
How would you do this (in a reusable way)?
My application has some hundred users and about 10 to 20 groups. Now the customer wants to give special privileges to group leaders.
How would you do this (in a reusable way)?
You can create a new model that extends the group
class and add it a new foreign key to a user
(the leader)
#------------------------------------------
# models.py of fooapp
from django.db import models
from django.contrib.auth.models import User, Group
class GroupLeader(models.Model):
user=models.OneToOneField(User, primary_key=True)
groups=models.ManyToManyField(Group, related_name='leaders')
class Meta:
verbose_name_plural=u'Group Leaders'
The next snippet makes the group leaders available in django admin:
#-----------------------------------------
# admin.py of fooapp
# See http://stackoverflow.com/questions/2216974/django-modelform-for-many-to-many-fields
from django.contrib.auth.admin import GroupAdmin
from fooapp.models import GroupLeader
class MyGroupForm(forms.ModelForm):
class Meta:
model=Group
leaders = forms.ModelMultipleChoiceField(queryset=User.objects.all())
def __init__(self, *args, **kwargs):
if 'instance' in kwargs:
# We get the 'initial' keyword argument or initialize it
# as a dict if it didn't exist.
initial = kwargs.setdefault('initial', {})
# The widget for a ModelMultipleChoiceField expects
# a list of primary key for the selected data.
initial['leaders'] = [t.pk for t in kwargs['instance'].leaders.all()]
forms.ModelForm.__init__(self, *args, **kwargs)
self.fields['leaders'].widget.attrs['size']=10
def save(self, commit=True):
instance = forms.ModelForm.save(self, False)
# Prepare a 'save_m2m' method for the form,
old_save_m2m = self.save_m2m
def save_m2m():
old_save_m2m()
instance.leaders.clear()
for leader_user in self.cleaned_data['leaders']:
leader_obj, created = GroupLeader.objects.get_or_create(pk=leader_user.pk) # User object to GroupLeader object
instance.leaders.add(leader_obj)
self.save_m2m = save_m2m
# Do we need to save all changes now?
if commit:
instance.save()
self.save_m2m()
return instance
class MyGroupAdmin(GroupAdmin):
form=MyGroupForm
admin.site.unregister(Group)
admin.site.register(Group, MyGroupAdmin)