Some basic name editing; moved forms to web/grampsdb
svn: r13833
This commit is contained in:
83
src/web/grampsdb/forms.py
Normal file
83
src/web/grampsdb/forms.py
Normal 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"
|
@@ -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:
|
||||
|
@@ -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)
|
||||
|
||||
|
Reference in New Issue
Block a user