gramps/src/gen/web/forms.py

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"