Files
postgres-web/pgweb/core/forms.py
2019-01-26 16:19:26 +01:00

67 lines
2.7 KiB
Python

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 manager(s)", 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)
if self.instance and self.instance.pk:
self.fields['remove_manager'].queryset = self.instance.managers.all()
else:
del self.fields['remove_manager']
del self.fields['add_manager']
def clean_add_manager(self):
if self.cleaned_data['add_manager']:
# Something was added as manager - let's make sure the user exists
try:
User.objects.get(email=self.cleaned_data['add_manager'].lower())
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 'add_manager' in self.cleaned_data and self.cleaned_data['add_manager']:
model.managers.add(User.objects.get(email=self.cleaned_data['add_manager'].lower()))
if 'remove_manager' in self.cleaned_data and self.cleaned_data['remove_manager']:
for toremove in self.cleaned_data['remove_manager']:
model.managers.remove(toremove)
return model
def apply_submitter(self, model, User):
model.managers.add(User)
class MergeOrgsForm(forms.Form):
merge_into = forms.ModelChoiceField(queryset=Organisation.objects.all())
merge_from = forms.ModelChoiceField(queryset=Organisation.objects.all())
def clean(self):
if self.cleaned_data['merge_into'] == self.cleaned_data['merge_from']:
raise ValidationError("The two organisations selected must be different!")
return self.cleaned_data