0

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)?

guettli
  • 25,042
  • 81
  • 346
  • 663

2 Answers2

0

You can create a new model that extends the group class and add it a new foreign key to a user (the leader)

juankysmith
  • 11,839
  • 5
  • 37
  • 62
0
#------------------------------------------
# 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)
guettli
  • 25,042
  • 81
  • 346
  • 663