70 lines
2.5 KiB
Python
70 lines
2.5 KiB
Python
# forms.py forms for Django project gen.web
|
|
|
|
from django import forms
|
|
from gen.web.grampsdb.models import *
|
|
from django.forms.models import inlineformset_factory
|
|
from django.forms.models import BaseModelFormSet
|
|
import datetime
|
|
|
|
class PersonForm(forms.ModelForm):
|
|
class Meta:
|
|
model = Person
|
|
exclude = ('handle',)
|
|
'''def clean(self):
|
|
cleaned_data['last_changed'] = datetime.datetime.now()
|
|
super(PersonForm, self).clean() # validate based on model
|
|
return self.cleaned_data'''
|
|
|
|
class NameForm(forms.ModelForm):
|
|
class Meta:
|
|
model = Name
|
|
|
|
'''class NameFormset(BaseModelFormSet):
|
|
def __init__(self, *args, **kwargs):
|
|
self.form = NameForm
|
|
super(NameFormset, self).__init__(*args, **kwargs)
|
|
|
|
def makeNameFormset(pid):
|
|
class NameFormset(BaseFormSet):
|
|
def __init__(self, *args, **kwargs):
|
|
self.form = NameForm
|
|
self.queryset = Name.objects.filter(person=pid)
|
|
super(NameFormset, self).__init__(*args, **kwargs)
|
|
def clean(self):
|
|
super(NameFormset, self).clean() # validate based on model
|
|
if any(self.errors):
|
|
# formset is not valid as long as any one form is invalid
|
|
return
|
|
# allow only one name per person to be preferred
|
|
ctPref = 0
|
|
for i in range(0, self.total_form_count()):
|
|
form = self.forms[i]
|
|
ctPref += form.cleaned_data['preferred']
|
|
if ctPref > 1:
|
|
raise forms.ValidationError, "Only one name may be the preferred name."
|
|
return NameFormset'''
|
|
|
|
NameInlineFormSet = inlineformset_factory(Person, Name,
|
|
fields=('preferred','prefix','first_name',
|
|
'surname','suffix','name_type'),
|
|
form=NameForm)
|
|
|
|
def cleanPreferred(fmst):
|
|
if fmst.total_form_count() == 3: # person has no names (assumes default 3 extra forms)
|
|
return "Error: Each person must have at least one name."
|
|
ctPref = 0
|
|
for i in range (0,fmst.total_form_count()-3):
|
|
form = fmst.forms[i]
|
|
try: # when preferred is false, its value is not in the form data
|
|
if form.data[fmst.prefix + '-' + str(i) + '-preferred'] == 'on':
|
|
val = 1
|
|
else:
|
|
val = 0
|
|
except:
|
|
val = 0
|
|
ctPref += val
|
|
if ctPref != 1:
|
|
return "Error: Exactly one name may be the preferred name."
|
|
else:
|
|
return "none"
|