Basic framework for edit/view forms

svn: r13919
This commit is contained in:
Doug Blank
2009-12-26 05:40:32 +00:00
parent 5269f03669
commit 04d5da1939
14 changed files with 217 additions and 61 deletions

View File

@@ -89,7 +89,7 @@
{{ family|family_event_table:user|safe }} {{ family|family_event_table:user|safe }}
</div> </div>
<div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-sources"> <div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-sources">
{{ family|family_source_table:user|safe }} {{ family|source_table:user|safe }}
</div> </div>
<div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-attributes"> <div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-attributes">
{{ family|family_attribute_table:user|safe }} {{ family|family_attribute_table:user|safe }}

View File

@@ -68,9 +68,25 @@
<li class="ui-corner-top ui-state-default"><a href="#tab-sources">Sources</a></li> <li class="ui-corner-top ui-state-default"><a href="#tab-sources">Sources</a></li>
<li class="ui-corner-top ui-state-default"><a href="#tab-notes">Notes</a></li> <li class="ui-corner-top ui-state-default"><a href="#tab-notes">Notes</a></li>
</ul> </ul>
<div class="ui-tabs-panel ui-widget-content ui-corner-bottom" id="tab-general"> <div class="ui-tabs-panel ui-widget-content ui-corner-bottom" id="tab-general">
<table>
<tr><td>{{form.group_as.label}}: </td>
<td>{{form.group_as|render:action}}</td>
</tr>
<tr><td>{{form.sort_as.label}}: </td>
<td>{{form.sort_as|render:action}}</td>
</tr>
<tr><td>{{form.display_as.label}}: </td>
<td>{{form.display_as|render:action}}</td>
</tr>
<tr><td>{{form.text.label}}: </td>
<td>{{form.text|render:action}}</td>
</tr>
</table>
</div> </div>
<div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-sources"> <div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-sources">
{% source_table form.model user action "/person/%s/name/%s/source/add" person.handle form.model.order %}
</div> </div>
<div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-notes"> <div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-notes">
</div> </div>

View File

@@ -6,41 +6,45 @@
{% block content %} {% block content %}
<p id="description"> <div id="description" style="padding: 10pt 10pt 10pt 10pt;">
<form name="SearchForm"> <form name="SearchForm">
<input type="submit" value="Search:"></input> <input type="submit" value="Search:"></input>
<input autocomplete="off" name="search" id="get_focus" type="text" size="50" value="{{search}}"></input> <input autocomplete="off" name="search" id="get_focus" type="text" size="50" value="{{search}}"></input>
</form> </form>
</p> </div>
<div class="pagination"> <div class="pagination">
<span class="step-links"> <span class="step-links">
<div id="alphabet" style="padding: 0pt 0 0pt 0;">
<ul>
{% ifequal page.number 1 %} {% ifequal page.number 1 %}
[first] <li>first</li>
{% else %} {% else %}
[<a href="?page=1{{search_query}}">first</a>] <li><a href="?page=1{{search_query}}">first</a></li>
{% endifequal %} {% endifequal %}
{% if page.has_previous %} {% if page.has_previous %}
[<a href="?page={{page.previous_page_number}}{{search_query}}">previous</a>] <li><a href="?page={{page.previous_page_number}}{{search_query}}">previous</a></li>
{% else %} {% else %}
[previous] <li>previous</li>
{% endif %} {% endif %}
<span class="current"> <span class="current">
Page {{ page.number }} of {{ page.paginator.num_pages }} <li>Page {{ page.number }} of {{ page.paginator.num_pages }}</li>
</span> </span>
{% if page.has_next %} {% if page.has_next %}
[<a href="?page={{ page.next_page_number }}{{search_query}}">next</a>] <li><a href="?page={{ page.next_page_number }}{{search_query}}">next</a></li>
{% else %} {% else %}
[next] <li>next</li>
{% endif %} {% endif %}
{% ifequal page.number page.paginator.num_pages %} {% ifequal page.number page.paginator.num_pages %}
[last] <li>last</li>
{% else %} {% else %}
[<a href="?page={{page.paginator.num_pages}}{{search_query}}">last</a>] <li><a href="?page={{page.paginator.num_pages}}{{search_query}}">last</a></li>
{% endifequal %} {% endifequal %}
<b>Matches</b>: {{page.paginator.count}}/{{total}} <b>Matches</b>: {{page.paginator.count}}/{{total}}
</ul>
</div>
</span> </span>
</div> </div>
@@ -54,32 +58,36 @@
<div class="pagination"> <div class="pagination">
<span class="step-links"> <span class="step-links">
<div id="alphabet" style="padding: 10pt 0 10pt 0;">
<ul>
{% ifequal page.number 1 %} {% ifequal page.number 1 %}
[first] <li>first</li>
{% else %} {% else %}
[<a href="?page=1{{search_query}}">first</a>] <li><a href="?page=1{{search_query}}">first</a></li>
{% endifequal %} {% endifequal %}
{% if page.has_previous %} {% if page.has_previous %}
[<a href="?page={{page.previous_page_number}}{{search_query}}">previous</a>] <li><a href="?page={{page.previous_page_number}}{{search_query}}">previous</a></li>
{% else %} {% else %}
[previous] <li>previous</li>
{% endif %} {% endif %}
<span class="current"> <span class="current">
Page {{ page.number }} of {{ page.paginator.num_pages }} <li>Page {{ page.number }} of {{ page.paginator.num_pages }}</li>
</span> </span>
{% if page.has_next %} {% if page.has_next %}
[<a href="?page={{ page.next_page_number }}{{search_query}}">next</a>] <li><a href="?page={{ page.next_page_number }}{{search_query}}">next</a></li>
{% else %} {% else %}
[next] <li>next</li>
{% endif %} {% endif %}
{% ifequal page.number page.paginator.num_pages %} {% ifequal page.number page.paginator.num_pages %}
[last] <li>last</li>
{% else %} {% else %}
[<a href="?page={{page.paginator.num_pages}}{{search_query}}">last</a>] <li><a href="?page={{page.paginator.num_pages}}{{search_query}}">last</a></li>
{% endifequal %} {% endifequal %}
<b>Matches</b>: {{page.paginator.count}}/{{total}} <b>Matches</b>: {{page.paginator.count}}/{{total}}
</ul>
</div>
</span> </span>
</div> </div>

View File

@@ -86,7 +86,7 @@
{{ person|person_name_table:user|safe }} {{ person|person_name_table:user|safe }}
</div> </div>
<div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-sources"> <div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-sources">
{{ person|person_source_table:user|safe }} {% source_table person user action "/person/%s/source/add" person.handle %}
</div> </div>
<div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-attributes"> <div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-attributes">
{{ person|person_attribute_table:user|safe }} {{ person|person_attribute_table:user|safe }}

View File

@@ -18,7 +18,7 @@
"setting" : "db_created" , "setting" : "db_created" ,
"description" : "database creation date/time" , "description" : "database creation date/time" ,
"value_type" : "str" , "value_type" : "str" ,
"value" : "2009-12-12 20:42" "value" : "2009-12-26 00:38"
} }
}, },
{ {
@@ -1568,5 +1568,41 @@
"val" : 13, "val" : 13,
"name": "Uncleared" "name": "Uncleared"
} }
} ,
{
"model": "grampsdb.nameformattype",
"pk": 1,
"fields":
{
"val" : 0,
"name": "Default format"
}
} ,
{
"model": "grampsdb.nameformattype",
"pk": 2,
"fields":
{
"val" : 1,
"name": "Surname, Given Patronymic"
}
} ,
{
"model": "grampsdb.nameformattype",
"pk": 3,
"fields":
{
"val" : 2,
"name": "Given Surname"
}
} ,
{
"model": "grampsdb.nameformattype",
"pk": 4,
"fields":
{
"val" : 3,
"name": "Patronymic, Given"
}
} }
] ]

View File

@@ -20,18 +20,36 @@ class PersonForm(forms.ModelForm):
class NameForm(forms.ModelForm): class NameForm(forms.ModelForm):
class Meta: class Meta:
model = Name model = Name
fields = ("suffix", "first_name", "title", "prefix", # Exclude these, so they don't get checked:
"call", "surname", "patronymic", "name_type", exclude = ["order", "calendar", "modifier",
"preferred") "quality",
#"quality_estimated", "quality_calculated",
#"quality_interpreted",
"year1", "day1", "month1",
"sortval", "newyear", "person"]
# Add these because they are TextFields, which render as # Add these because they are TextFields, which render as
# Textareas: # Textareas:
surname = forms.CharField(required=False, widget=TextInput(attrs={'size':'30'})) surname = forms.CharField(required=False,
first_name = forms.CharField(required=False, widget=TextInput(attrs={'size':'30'})) widget=TextInput(attrs={'size':'30'}))
title = forms.CharField(required=False, widget=TextInput(attrs={'size':'30'})) first_name = forms.CharField(label="Given",
prefix = forms.CharField(required=False, widget=TextInput(attrs={'size':'30'})) required=False,
suffix = forms.CharField(required=False, widget=TextInput(attrs={'size':'30'})) widget=TextInput(attrs={'size':'30'}))
call = forms.CharField(required=False, widget=TextInput(attrs={'size':'30'})) title = forms.CharField(required=False,
patronymic = forms.CharField(required=False, widget=TextInput(attrs={'size':'30'})) widget=TextInput(attrs={'size':'30'}))
prefix = forms.CharField(required=False,
widget=TextInput(attrs={'size':'30'}))
suffix = forms.CharField(required=False,
widget=TextInput(attrs={'size':'30'}))
call = forms.CharField(label="Callname",
required=False,
widget=TextInput(attrs={'size':'30'}))
patronymic = forms.CharField(required=False,
widget=TextInput(attrs={'size':'30'}))
group_as = forms.CharField(required=False,
widget=TextInput(attrs={'size':'30'}))
text = forms.CharField(label="Date",
required=False,
widget=TextInput(attrs={'size':'30'}))
'''class NameFormset(BaseModelFormSet): '''class NameFormset(BaseModelFormSet):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):

View File

@@ -229,6 +229,68 @@ class LdsStatus(mGrampsType):
_DEFAULT = _DATAMAP[0] _DEFAULT = _DATAMAP[0]
val = models.IntegerField('lds status', choices=_DATAMAP, blank=False) val = models.IntegerField('lds status', choices=_DATAMAP, blank=False)
class NameFormatType(mGrampsType):
_DATAMAP = [(0, "Default format"),
(1, "Surname, Given Patronymic"),
(2, "Given Surname"),
(3, "Patronymic, Given"),]
_DEFAULT = _DATAMAP[0]
val = models.IntegerField('Name formats', choices=_DATAMAP, blank=False)
class CalendarType(mGrampsType):
CAL_GREGORIAN = 0 # CODE
CAL_JULIAN = 1
CAL_HEBREW = 2
CAL_FRENCH = 3
CAL_PERSIAN = 4
CAL_ISLAMIC = 5
CAL_SWEDISH = 6
_DATAMAP = [(CAL_GREGORIAN, "Gregorian"),
(CAL_JULIAN, "Julian"),
(CAL_HEBREW, "Hebrew"),
(CAL_FRENCH, "French Republican"),
(CAL_PERSIAN, "Persian"),
(CAL_ISLAMIC, "Islamic"),
(CAL_SWEDISH, "Swedish")]
_DEFAULT = _DATAMAP[CAL_GREGORIAN]
val = models.IntegerField('Calendar', choices=_DATAMAP, blank=False)
class DateModifierType(mGrampsType):
MOD_NONE = 0 # CODE
MOD_BEFORE = 1
MOD_AFTER = 2
MOD_ABOUT = 3
MOD_RANGE = 4
MOD_SPAN = 5
MOD_TEXTONLY = 6
_DATAMAP = [(MOD_NONE, ""),
(MOD_BEFORE, "Before"),
(MOD_AFTER, "After"),
(MOD_ABOUT, "About"),
(MOD_RANGE, "Range"),
(MOD_SPAN, "Span"),
(MOD_TEXTONLY, "Text only")]
_DEFAULT = _DATAMAP[MOD_NONE]
val = models.IntegerField('Date modifier', choices=_DATAMAP, blank=False)
class DateNewYearType(mGrampsType):
NEWYEAR_JAN1 = 0 # CODE
NEWYEAR_MAR1 = 1
NEWYEAR_MAR25 = 2
NEWYEAR_SEP1 = 3
_DATAMAP = [(NEWYEAR_JAN1, ""),
(NEWYEAR_MAR1, "March 1"),
(NEWYEAR_MAR25, "March 25"),
(NEWYEAR_SEP1, "September 1")]
_DEFAULT = _DATAMAP[NEWYEAR_JAN1]
val = models.IntegerField('New Year start date', choices=_DATAMAP, blank=False)
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# #
# Support definitions # Support definitions
@@ -241,6 +303,9 @@ class DateObject(models.Model):
calendar = models.IntegerField() calendar = models.IntegerField()
modifier = models.IntegerField() modifier = models.IntegerField()
quality = models.IntegerField() quality = models.IntegerField()
#quality_estimated = models.BooleanField()
#quality_calculated = models.BooleanField()
#quality_interpreted = models.BooleanField()
day1 = models.IntegerField() day1 = models.IntegerField()
month1 = models.IntegerField() month1 = models.IntegerField()
year1 = models.IntegerField() year1 = models.IntegerField()
@@ -447,7 +512,7 @@ class SecondaryObject(models.Model):
class Name(DateObject, SecondaryObject): class Name(DateObject, SecondaryObject):
name_type = models.ForeignKey('NameType', related_name="name_code") name_type = models.ForeignKey('NameType', related_name="name_code")
preferred = models.BooleanField('preferred name?') preferred = models.BooleanField('Preferred name?')
first_name = models.TextField(blank=True) first_name = models.TextField(blank=True)
surname = models.TextField(blank=True) surname = models.TextField(blank=True)
suffix = models.TextField(blank=True) suffix = models.TextField(blank=True)
@@ -456,8 +521,10 @@ class Name(DateObject, SecondaryObject):
patronymic = models.TextField(blank=True) patronymic = models.TextField(blank=True)
call = models.TextField(blank=True) call = models.TextField(blank=True)
group_as = models.TextField(blank=True) group_as = models.TextField(blank=True)
sort_as = models.IntegerField(blank=True) sort_as = models.ForeignKey('NameFormatType',
display_as = models.IntegerField(blank=True) related_name="sort_as")
display_as = models.ForeignKey('NameFormatType',
related_name="display_as")
## Key: ## Key:
person = models.ForeignKey("Person") person = models.ForeignKey("Person")
@@ -656,6 +723,7 @@ TABLES = [
("type", MarkerType), ("type", MarkerType),
("type", MarkupType), ("type", MarkupType),
("type", NameType), ("type", NameType),
("type", NameFormatType),
("type", AttributeType), ("type", AttributeType),
("type", UrlType), ("type", UrlType),
("type", ChildRefType), ("type", ChildRefType),

View File

@@ -8,17 +8,6 @@ import web.utils
register = Library() register = Library()
util_filters = ['person_event_table', 'person_name_table',
'person_source_table', 'person_attribute_table',
'person_address_table', 'person_note_table',
'person_gallery_table', 'person_internet_table',
'person_association_table', 'person_lds_table',
'person_reference_table',
'family_children_table', 'family_event_table',
'family_source_table', 'family_attribute_table',
'family_note_table', 'family_gallery_table',
'family_lds_table',
'nbsp', 'render']
for filter_name in util_filters: for filter_name in util_filters:
func = getattr(web.utils, filter_name) func = getattr(web.utils, filter_name)
func.is_safe = True func.is_safe = True
@@ -66,6 +55,9 @@ def make_tag(func):
register.tag("get_person_from_handle", register.tag("get_person_from_handle",
make_tag(get_person_from_handle)) make_tag(get_person_from_handle))
register.tag("source_table",
make_tag(source_table))
probably_alive.is_safe = True probably_alive.is_safe = True
register.filter('probably_alive', probably_alive) register.filter('probably_alive', probably_alive)

View File

@@ -141,7 +141,10 @@ def view_name_detail(request, handle, order, action="view"):
elif action == "add": elif action == "add":
person = Person.objects.get(handle=handle) person = Person.objects.get(handle=handle)
name = Name() name = Name()
form = NameForm() name.sort_as = NameFormatType.objects.get(val=0)
name.display_as = NameFormatType.objects.get(val=0)
name.name_type = NameType.objects.get(val=2) # Birth Name
form = NameForm(instance=name)
form.model = name form.model = name
action = "edit" action = "edit"
elif action == "save": elif action == "save":
@@ -153,7 +156,9 @@ def view_name_detail(request, handle, order, action="view"):
name = Name(calendar=0, modifier=0, quality=0, name = Name(calendar=0, modifier=0, quality=0,
year1=0, day1=0, month1=0, year1=0, day1=0, month1=0,
sortval = 0, newyear=0, order=order, sortval = 0, newyear=0, order=order,
sort_as=0, display_as=0, person_id=person.id) sort_as=NameFormatType(val=0),
display_as=NameFormatType(val=0),
person_id=person.id)
form = NameForm(request.POST, instance=name) form = NameForm(request.POST, instance=name)
form.model = name form.model = name
if form.is_valid(): if form.is_valid():
@@ -276,6 +281,7 @@ def view_detail(request, view, handle):
else: else:
raise Http404(_("Requested page type not known")) raise Http404(_("Requested page type not known"))
context[view] = obj context[view] = obj
context["action"] = "view"
return render_to_response(view_template, context) return render_to_response(view_template, context)
def view(request, view): def view(request, view):

View File

@@ -43,7 +43,7 @@ from gen.lib.srcmediatype import SourceMediaType
from gen.lib.eventroletype import EventRoleType from gen.lib.eventroletype import EventRoleType
from gen.lib.notetype import NoteType from gen.lib.notetype import NoteType
from grampsdb.models import GenderType, LdsType, LdsStatus from grampsdb.models import GenderType, LdsType, LdsStatus, NameFormatType
def get_datamap(x): def get_datamap(x):
""" """
@@ -86,7 +86,8 @@ for table, entries in [("grampsdb.config",
type_models = [MarkerType, NameType, AttributeType, UrlType, ChildRefType, type_models = [MarkerType, NameType, AttributeType, UrlType, ChildRefType,
RepositoryType, EventType, FamilyRelType, SourceMediaType, RepositoryType, EventType, FamilyRelType, SourceMediaType,
EventRoleType, NoteType, GenderType, LdsType, LdsStatus] EventRoleType, NoteType, GenderType, LdsType, LdsStatus,
NameFormatType]
for type in type_models: for type in type_models:
count = 1 count = 1
# Add each code: # Add each code:

View File

@@ -583,7 +583,7 @@ class DjangoInterface(object):
return (name.private, source_list, note_list, date, return (name.private, source_list, note_list, date,
name.first_name, name.surname, name.suffix, name.title, name.first_name, name.surname, name.suffix, name.title,
tuple(name.name_type), name.prefix, name.patronymic, tuple(name.name_type), name.prefix, name.patronymic,
name.group_as, name.sort_as, name.display_as, name.call) name.group_as, name.sort_as.val, name.display_as.val, name.call)
def pack_location(self, loc, with_parish): def pack_location(self, loc, with_parish):
if with_parish: if with_parish:
@@ -1005,8 +1005,8 @@ class DjangoInterface(object):
name.prefix = prefix name.prefix = prefix
name.patronymic = patronymic name.patronymic = patronymic
name.group_as = group_as name.group_as = group_as
name.sort_as = sort_as name.sort_as = models.get_type(models.NameFormatType, sort_as)
name.display_as = display_as name.display_as = models.get_type(models.NameFormatType, display_as)
name.call = call name.call = call
# we know person exists # we know person exists
# needs to have an ID for key # needs to have an ID for key

View File

@@ -26,7 +26,7 @@
import const import const
import os import os
DEBUG = False DEBUG = True
TEMPLATE_DEBUG = DEBUG TEMPLATE_DEBUG = DEBUG
INTERNAL_IPS = ('127.0.0.1',) INTERNAL_IPS = ('127.0.0.1',)

Binary file not shown.

View File

@@ -62,9 +62,20 @@ from gen.utils import get_birth_or_fallback, get_death_or_fallback
from gen.plug import BasePluginManager from gen.plug import BasePluginManager
from cli.grampscli import CLIManager from cli.grampscli import CLIManager
util_filters = ['person_event_table', 'person_name_table',
'person_attribute_table',
'person_address_table', 'person_note_table',
'person_gallery_table', 'person_internet_table',
'person_association_table', 'person_lds_table',
'person_reference_table',
'family_children_table', 'family_event_table',
'family_attribute_table',
'family_note_table', 'family_gallery_table',
'family_lds_table',
'nbsp', 'render']
#------------------------------------------------------------------------ #------------------------------------------------------------------------
# #
# Modeul Constants # Module Constants
# #
#------------------------------------------------------------------------ #------------------------------------------------------------------------
dji = libdjango.DjangoInterface() dji = libdjango.DjangoInterface()
@@ -216,7 +227,7 @@ def person_name_table(djperson, user):
retval += make_button(_("Add name"), "/person/%s/name/add" % djperson.handle) retval += make_button(_("Add name"), "/person/%s/name/add" % djperson.handle)
return retval return retval
def person_source_table(djperson, user): def source_table(obj, user, action, url=None, *args):
retval = "" retval = ""
table = Table() table = Table()
table.columns(_("ID"), table.columns(_("ID"),
@@ -224,9 +235,9 @@ def person_source_table(djperson, user):
_("Author"), _("Author"),
_("Page")) _("Page"))
if user.is_authenticated(): if user.is_authenticated():
obj_type = ContentType.objects.get_for_model(djperson) obj_type = ContentType.objects.get_for_model(obj)
source_refs = dji.SourceRef.filter(object_type=obj_type, source_refs = dji.SourceRef.filter(object_type=obj_type,
object_id=djperson.id) object_id=obj.id)
for source_ref in source_refs: for source_ref in source_refs:
source = table.db.get_source_from_handle(source_ref.ref_object.handle) source = table.db.get_source_from_handle(source_ref.ref_object.handle)
table.row(source, table.row(source,
@@ -235,8 +246,8 @@ def person_source_table(djperson, user):
source_ref.page, source_ref.page,
) )
retval += table.get_html() retval += table.get_html()
if user.is_authenticated(): if user.is_authenticated() and url and action != "edit":
retval += make_button(_("Add source"), "/person/%s/source/add" % djperson.handle) retval += make_button(_("Add source"), url % args)
return retval return retval
def person_attribute_table(djperson, user): def person_attribute_table(djperson, user):