Make it possible to add and remove managers from an organisation
authorMagnus Hagander <magnus@hagander.net>
Wed, 9 Nov 2011 21:11:48 +0000 (22:11 +0100)
committerMagnus Hagander <magnus@hagander.net>
Wed, 9 Nov 2011 21:16:12 +0000 (22:16 +0100)
(from the general interface, not just from /admin/)

pgweb/core/forms.py
pgweb/core/views.py

index 295c31bccd6fd3acd0759d485abb6d1be86a6a28..366fc0065c667b8e55228034d8387660eb1f4f4d 100644 (file)
@@ -2,12 +2,51 @@ from django import forms
 from django.forms import ValidationError
 
 from models import Organisation
+from django.contrib.auth.models import User
 
 class OrganisationForm(forms.ModelForm):
+       remove_manager = forms.ModelMultipleChoiceField(required=False, queryset=None, label="Current manage", help_text="Select one or more managers to remove")
+       add_manager = forms.EmailField(required=False)
+
        class Meta:
                model = Organisation
                exclude = ('lastconfirmed', 'approved', 'managers', )
 
+       def __init__(self, *args, **kwargs):
+               super(OrganisationForm, self).__init__(*args, **kwargs)
+               self.fields['remove_manager'].queryset = self.instance.managers.all()
+
+       def clean_add_manager(self):
+               if self.cleaned_data['add_manager']:
+                       # Something was added as manager - let's make sure the user exists
+                       try:
+                               u = User.objects.get(email=self.cleaned_data['add_manager'])
+                       except User.DoesNotExist:
+                               raise ValidationError("User with email %s not found" % self.cleaned_data['add_manager'])
+
+               return self.cleaned_data['add_manager']
+
+       def clean_remove_manager(self):
+               if self.cleaned_data['remove_manager']:
+                       removecount = 0
+                       for toremove in self.cleaned_data['remove_manager']:
+                               if toremove in self.instance.managers.all():
+                                       removecount += 1
+
+                       if len(self.instance.managers.all()) - removecount <= 0:
+                               raise ValidationError("Cannot remove all managers from an organsation!")
+               return self.cleaned_data['remove_manager']
+
+       def save(self, commit=True):
+               model = super(OrganisationForm, self).save(commit=False)
+               if self.cleaned_data['add_manager']:
+                       model.managers.add(User.objects.get(email=self.cleaned_data['add_manager']))
+               if self.cleaned_data['remove_manager']:
+                       for toremove in self.cleaned_data['remove_manager']:
+                               model.managers.remove(toremove)
+
+               return model
+
 class MergeOrgsForm(forms.Form):
        merge_into = forms.ModelChoiceField(queryset=Organisation.objects.all())
        merge_from = forms.ModelChoiceField(queryset=Organisation.objects.all())
index 398c6d4b35da7344e2a70f80e32d74d586e70b85..24c00c15f5edb12d5cedd84ef8d8a4b479592af7 100644 (file)
@@ -96,9 +96,7 @@ def fallback(request, url):
 @ssl_required
 @login_required
 def organisationform(request, itemid):
-       return simple_form(Organisation, itemid, request, OrganisationForm, fixedfields={
-                       'managers': (request.user, ),
-                       })
+       return simple_form(Organisation, itemid, request, OrganisationForm)
 
 # robots.txt
 def robots(request):