Some basic name editing; moved forms to web/grampsdb

svn: r13833
This commit is contained in:
Doug Blank
2009-12-17 04:10:41 +00:00
parent 9f74bdacce
commit d0318dd1a2
5 changed files with 85 additions and 27 deletions

83
src/web/grampsdb/forms.py Normal file
View File

@@ -0,0 +1,83 @@
# forms.py forms for Django web project
from django import forms
from web.grampsdb.models import *
from django.forms.models import inlineformset_factory
from django.forms.models import BaseModelFormSet
from django.forms.widgets import TextInput
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
fields = ("suffix", "first_name", "title", "prefix",
"call", "surname", "patronymic", "name_type",
"preferred")
# Add these because they are TextFields, which render as
# Textareas:
surname = forms.CharField(required=False, widget=TextInput())
first_name = forms.CharField(required=False, widget=TextInput())
title = forms.CharField(required=False, widget=TextInput())
prefix = forms.CharField(required=False, widget=TextInput())
suffix = forms.CharField(required=False, widget=TextInput())
call = forms.CharField(required=False, widget=TextInput())
patronymic = forms.CharField(required=False, widget=TextInput())
'''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"

View File

@@ -49,7 +49,10 @@ make_name.is_safe = True
register.filter('make_name', make_name)
def preferred(name_set, attr):
name = name_set.get(preferred=True)
try:
name = name_set.get(preferred=True)
except:
return "[No preferred name]"
if name:
return escape(getattr(name, attr))
else:

View File

@@ -41,11 +41,11 @@ from django.db.models import Q
#------------------------------------------------------------------------
import web
from web.grampsdb.models import *
from web.forms import NameForm
from web.grampsdb.forms import NameForm
_ = lambda text: text
# Views: [(Nice name plural, /name/handle, Model), ]
# Views: [(<Nice name plural>, /<name>/handle, <Model>), ]
VIEWS = [(_('People'), 'person', Name),
(_('Families'), 'family', Family),
(_('Events'), 'event', Event),
@@ -104,6 +104,9 @@ def user_page(request, username):
return render_to_response('user_page.html', context)
def view_name_detail(request, handle, order, action="view"):
if order == "add":
order = 0
action = "add"
if request.POST.has_key("action"):
action = request.POST.get("action")
if action == "view":
@@ -117,15 +120,39 @@ def view_name_detail(request, handle, order, action="view"):
form = NameForm(instance=name)
form.model = name
elif action == "delete":
pass
person = Person.objects.get(handle=handle)
person.name_set.get(order=order).delete()
action = "back"
elif action == "add":
pass
person = Person.objects.get(handle=handle)
name = Name()
form = NameForm()
form.model = name
action = "edit"
elif action == "new":
person = Person.objects.get(handle=handle)
form = NameForm(request.POST)
if form.is_valid():
name.save()
action = "save"
else:
action = "edit"
elif action == "save":
person = Person.objects.get(handle=handle)
name = person.name_set.get(order=order)
form = NameForm(request.POST, instance=name)
form.model = name
if form.is_valid():
# now it is preferred:
if form.cleaned_data["preferred"]:
# but it wasn't:
if not name.preferred:
# set all of the other names to be
# not preferred:
person.name_set.filter(~ Q(id=name.id)) \
.update(preferred=False)
# else it always was
# else some other name is preferred
form.save()
else:
action = "edit"
@@ -144,6 +171,9 @@ def view_name_detail(request, handle, order, action="view"):
context["action"] = "view"
return redirect("/person/%s/name/%d" %
(person.handle, name.order), context)
elif action == "back":
return redirect("/person/%s/" %
(person.handle), context)
else:
return render_to_response(view_template, context)