From c800392ffdf6fd7ffda3e6bf58c9365e714282c1 Mon Sep 17 00:00:00 2001 From: Doug Blank Date: Fri, 1 Jan 2010 15:16:20 +0000 Subject: [PATCH] Working add/edit people and names; working privacy (living and private); unified templates for display/edit svn: r13952 --- src/data/templates/gramps-base.html | 4 + src/data/templates/registration/login.html | 4 + src/data/templates/view_name_detail.html | 35 +-- src/data/templates/view_page.html | 74 +----- src/data/templates/view_people.html | 10 +- src/data/templates/view_person_detail.html | 33 +-- src/web/djangodb.py | 8 +- src/web/grampsdb/fixtures/initial_data.json | 2 +- src/web/grampsdb/forms.py | 66 ++---- src/web/grampsdb/models.py | 56 ++--- src/web/grampsdb/templatetags/my_tags.py | 44 ++-- src/web/grampsdb/views.py | 245 +++++++++++++------- src/web/sqlite.db | Bin 204800 -> 204800 bytes src/web/utils.py | 150 +++++++----- 14 files changed, 378 insertions(+), 353 deletions(-) diff --git a/src/data/templates/gramps-base.html b/src/data/templates/gramps-base.html index 4d7a2e9f9..a9db18a46 100644 --- a/src/data/templates/gramps-base.html +++ b/src/data/templates/gramps-base.html @@ -39,7 +39,11 @@
  • Admin
  • {% endif %} {% else %} + {% if next %} +
  • Login
  • + {% else %}
  • Login
  • + {% endif %} {% endif %} {% endblock %} diff --git a/src/data/templates/registration/login.html b/src/data/templates/registration/login.html index 277e038d0..9fadd9233 100644 --- a/src/data/templates/registration/login.html +++ b/src/data/templates/registration/login.html @@ -29,7 +29,11 @@ +{% if next %} + +{% else %} +{% endif %} {% endblock %} diff --git a/src/data/templates/view_name_detail.html b/src/data/templates/view_name_detail.html index cd44f2d72..d374ea176 100644 --- a/src/data/templates/view_name_detail.html +++ b/src/data/templates/view_name_detail.html @@ -26,33 +26,35 @@ {% endif %} {{form.surname.label}}: - {{form.surname|render:action}} + {% render form.surname user action %} {{form.prefix.label}}: - {{form.prefix|render:action}} + {% render form.prefix user action %} {{form.first_name.label}}: - {{form.first_name|render:action}} + {% render form.first_name user action %} {{form.call.label}}: - {{form.call|render:action}} + {% render form.call user action %} {{form.title.label}}: - {{form.title|render:action}} + {% render form.title user action %} {{form.suffix.label}}: - {{form.suffix|render:action}} + {% render form.suffix user action %} {{form.patronymic.label}}: - {{form.patronymic|render:action}} + {% render form.patronymic user action %} {{form.name_type.label}}: - {{form.name_type|render:action}} + {% render form.name_type user action %} {{form.preferred.label}}: {% if form.model.preferred %} - True + True {% else %} - {{form.preferred|render:action}} + {% render form.preferred user action %} {% endif %} + {{form.private.label}}: + {% render form.private user action %} @@ -65,6 +67,7 @@
    @@ -74,21 +77,24 @@
    - + - + - + - +
    {{form.group_as.label}}: {{form.group_as|render:action}}{% render form.group_as user action %}
    {{form.sort_as.label}}: {{form.sort_as|render:action}}{% render form.sort_as user action %}
    {{form.display_as.label}}: {{form.display_as|render:action}}{% render form.display_as user action %}
    {{form.text.label}}: {{form.text|render:action}}{% render form.text user action %}
     
    +
    + {% name_table person user action "/person/%s/name" person.handle %} +
    {% source_table form.model user action "/person/%s/name/%s/source" person.handle form.model.order %}
    @@ -107,6 +113,7 @@ {% else %} [Edit Name] [Delete Name] +[Add Name] {% endifequal %} {% else %} {% endif %} diff --git a/src/data/templates/view_page.html b/src/data/templates/view_page.html index 3d38145b8..d86c162e5 100644 --- a/src/data/templates/view_page.html +++ b/src/data/templates/view_page.html @@ -13,82 +13,14 @@ - - -

     

    - -
    +
    {% block table_data %}
    {% endblock %}
    - +{% include "paginator.html" %} {% endblock %} diff --git a/src/data/templates/view_people.html b/src/data/templates/view_people.html index bb609c10b..1e3b174d9 100644 --- a/src/data/templates/view_people.html +++ b/src/data/templates/view_people.html @@ -24,13 +24,19 @@ [{{name.person.gramps_id}}] {{name.person.gender_type}} - {{name.person.birth}} - {{name.person.death}} + {{name.person.birth|render_date:user}} + {{name.person.death|render_date:user}} {% endif %} {% endfor %} +{% if user.is_authenticated %} + +{% make_button "Add a new Person" "/person/add" %} + +{% endif %} + {% endblock %} diff --git a/src/data/templates/view_person_detail.html b/src/data/templates/view_person_detail.html index b2d7852de..93a3c9777 100644 --- a/src/data/templates/view_person_detail.html +++ b/src/data/templates/view_person_detail.html @@ -11,7 +11,7 @@
    -

    {{nameform|make_name:user}} [{{person.gramps_id}}]

    +

    {{nameform|render_name:user}} [{{person.gramps_id}}]

    {% comment %} 5 cols {% endcomment %} @@ -19,10 +19,10 @@ {% if user.is_authenticated %} {% ifequal action "edit" %} {% for error in personform.errors %} - {{error}}
    + Error in person: {{error}}
    {% endfor %} {% for error in nameform.errors %} - {{error}}
    + Error in name: {{error}}
    {% endfor %} {% endifequal %} @@ -30,43 +30,45 @@ - + - + - + - + - + - + - + - + - + - + - - + + + +
    {{nameform.surname.label}}{{nameform.surname|render:action}}{% render nameform.surname user action %} {{nameform.prefix.label}}{{nameform.prefix|render:action}}{% render nameform.prefix user action %} Image:
    {{nameform.suffix.label}}{{nameform.suffix|render:action}}{% render nameform.suffix user action %}
    {{nameform.first_name.label}}{{nameform.first_name|render:action}}{% render nameform.first_name user action nameform.model.person.probably_alive "[Living]" %} {{nameform.call.label}}{{nameform.call|render:action}}{% render nameform.call user action %}
    {{nameform.name_type.label}}{{nameform.name_type|render:action}}{% render nameform.name_type user action %} {{nameform.patronymic.label}}{{nameform.patronymic|render:action}}{% render nameform.patronymic user action %}
    {{nameform.title.label}}{{nameform.title|render:action}}{% render nameform.title user action %}
    {{personform.gender_type.label}}{{personform.gender_type|render:action}}{% render personform.gender_type user action %} {{personform.gramps_id.label}}{{personform.gramps_id|render:action}}{% render personform.gramps_id user action %}
    {{personform.marker_type.label}}{{personform.marker_type|render:action}}{% render personform.marker_type user action %}{{personform.private.label}}{% render personform.private user action %}
    @@ -135,6 +137,7 @@ {% else %} {% make_button "Back to People" "/person/" %} +{% make_button "Add Person" "/person/add" %} {% make_button "Edit Person" "/person/%s/edit" person.handle %} {% make_button "Delete Person" "/person/%s/delete" person.handle %} {% endifequal %} diff --git a/src/web/djangodb.py b/src/web/djangodb.py index c1f9d6e97..01c11bce7 100644 --- a/src/web/djangodb.py +++ b/src/web/djangodb.py @@ -86,8 +86,12 @@ class DjangoDb(DbReadBase, DbWriteBase): return obj def get_person_from_handle(self, handle): - data = self.dji.get_person(self.dji.Person.select_related().get(handle=handle)) - obj = gen.lib.Person.create(data) + try: + person = self.dji.Person.select_related().get(handle=handle) + except: + return None + data = self.dji.get_person(person) + obj = gen.lib.Person().unserialize(data) return obj def get_place_from_handle(self, handle): diff --git a/src/web/grampsdb/fixtures/initial_data.json b/src/web/grampsdb/fixtures/initial_data.json index f0d8cef08..234b2e572 100644 --- a/src/web/grampsdb/fixtures/initial_data.json +++ b/src/web/grampsdb/fixtures/initial_data.json @@ -18,7 +18,7 @@ "setting" : "db_created" , "description" : "database creation date/time" , "value_type" : "str" , - "value" : "2009-12-28 22:19" + "value" : "2010-01-01 10:12" } }, { diff --git a/src/web/grampsdb/forms.py b/src/web/grampsdb/forms.py index ee0f35f9e..d9dbcb753 100644 --- a/src/web/grampsdb/forms.py +++ b/src/web/grampsdb/forms.py @@ -11,11 +11,8 @@ class PersonForm(forms.ModelForm): class Meta: model = Person - '''def clean(self): - cleaned_data['last_changed'] = datetime.datetime.now() - super(PersonForm, self).clean() # validate based on model - return self.cleaned_data''' - + exclude = ["death", "birth", "handle"] + class NameForm(forms.ModelForm): class Meta: model = Name @@ -50,51 +47,14 @@ class NameForm(forms.ModelForm): required=False, widget=TextInput(attrs={'size':'30'})) -'''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" +class NameFormFromPerson(NameForm): + class Meta: + model = Name + # Exclude these, so they don't get checked: + exclude = ["order", "calendar", "modifier", + "quality", + #"quality_estimated", "quality_calculated", + #"quality_interpreted", + "year1", "day1", "month1", + "sortval", "newyear", "person", + "sort_as", "display_as"] diff --git a/src/web/grampsdb/models.py b/src/web/grampsdb/models.py index d4eb52db5..8b97b54f0 100644 --- a/src/web/grampsdb/models.py +++ b/src/web/grampsdb/models.py @@ -300,23 +300,23 @@ class DateNewYearType(mGrampsType): class DateObject(models.Model): class Meta: abstract = True - calendar = models.IntegerField() - modifier = models.IntegerField() - quality = models.IntegerField() + calendar = models.IntegerField(default=0) + modifier = models.IntegerField(default=0) + quality = models.IntegerField(default=0) #quality_estimated = models.BooleanField() #quality_calculated = models.BooleanField() #quality_interpreted = models.BooleanField() - day1 = models.IntegerField() - month1 = models.IntegerField() - year1 = models.IntegerField() - slash1 = models.BooleanField() + day1 = models.IntegerField(default=0) + month1 = models.IntegerField(default=0) + year1 = models.IntegerField(default=0) + slash1 = models.BooleanField(default=False) day2 = models.IntegerField(blank=True, null=True) month2 = models.IntegerField(blank=True, null=True) year2 = models.IntegerField(blank=True, null=True) slash2 = models.NullBooleanField(blank=True, null=True) text = models.CharField(max_length=80, blank=True) - sortval = models.IntegerField() - newyear = models.IntegerField() + sortval = models.IntegerField(default=0) + newyear = models.IntegerField(default=0) def set_date_from_datetime(self, date_time, text=""): """ @@ -401,8 +401,8 @@ class Person(PrimaryObject): references = generic.GenericRelation('PersonRef', related_name="refs", content_type_field="object_type", object_id_field="object_id") - birth = models.ForeignKey("Event", related_name="birth", null=True) - death = models.ForeignKey("Event", related_name="death", null=True) + birth = models.ForeignKey("Event", related_name="birth", blank=True, null=True) + death = models.ForeignKey("Event", related_name="death", blank=True, null=True) # Others keys here: # .name_set @@ -414,12 +414,7 @@ class Person(PrimaryObject): """ Return the preferred name of a person. """ - names = self.name_set.all().order_by("order") - if names.count() > 0: - name = names[0] - else: - name = None - return name + return self.name_set.get(preferred=True) class Family(PrimaryObject): father = models.ForeignKey('Person', related_name="father_ref", @@ -509,10 +504,12 @@ class SecondaryObject(models.Model): last_saved = models.DateTimeField('last changed', auto_now=True) last_changed = models.DateTimeField('last changed', null=True, blank=True) # user edits - order = models.PositiveIntegerField() + order = models.PositiveIntegerField(default=1) class Name(DateObject, SecondaryObject): - name_type = models.ForeignKey('NameType', related_name="name_code") + name_type = models.ForeignKey('NameType', + related_name="name_code", + default=2) preferred = models.BooleanField('Preferred name?') first_name = models.TextField(blank=True) surname = models.TextField(blank=True) @@ -523,12 +520,14 @@ class Name(DateObject, SecondaryObject): call = models.TextField(blank=True) group_as = models.TextField(blank=True) sort_as = models.ForeignKey('NameFormatType', - related_name="sort_as") + related_name="sort_as", + default=1) display_as = models.ForeignKey('NameFormatType', - related_name="display_as") - + related_name="display_as", + default=1) ## Key: person = models.ForeignKey("Person") + _sanitized = False def __unicode__(self): return "%s%s%s, %s" % (self.prefix, @@ -541,12 +540,13 @@ class Name(DateObject, SecondaryObject): #name. def sanitize(self): - self.first_name = "[Private]" - self.prefix = "" - self.suffix = "" - self.prefix = "" - self.prefix = "" - self.prefix = "" + if not self._sanitized: + self._sanitized = True + if self.person.probably_alive: + self.first_name = "[Living]" + self.call = "" + self.group_as = "" + self.title = "" class Lds(DateObject, SecondaryObject): """ diff --git a/src/web/grampsdb/templatetags/my_tags.py b/src/web/grampsdb/templatetags/my_tags.py index bf78eec1f..4b129d308 100644 --- a/src/web/grampsdb/templatetags/my_tags.py +++ b/src/web/grampsdb/templatetags/my_tags.py @@ -8,6 +8,16 @@ import web.utils register = Library() +def eval_template_exp(item, context): + """ + Wrapper to allow negation of variables in templates. Use + "!variable". + """ + if item.var.startswith("!"): + return not template.Variable(item.var[1:]).resolve(context) + else: + return item.resolve(context) + class TemplateNode(template.Node): def __init__(self, args, var_name, func): self.args = map(template.Variable, args) @@ -15,7 +25,8 @@ class TemplateNode(template.Node): self.func = func def render(self, context): - value = self.func(*[item.resolve(context) for item in self.args]) + value = self.func(*[eval_template_exp(item, context) + for item in self.args]) if self.var_name: context[self.var_name] = value return '' @@ -123,34 +134,9 @@ def paginator(context, adjacent_pages=2): view. """ -## Alternative page_numbers: - page_numbers = range(max(0, context['page']-adjacent_pages), - min(context['pages'], - context['page']+adjacent_pages)+1) - results_this_page = context['object_list'].__len__() - range_base = ((context['page'] - 1) * context['results_per_page']) - -# # Original -# # page_numbers = [n for n in range(context['page'] - adjacent_pages, -# # context['page'] + adjacent_pages + 1) -# # if n > 0 and n <= context['pages']] - - return { - 'hits': context['hits'], - 'results_per_page': context['results_per_page'], - 'results_this_page': results_this_page, - 'first_this_page': range_base + 1, - 'last_this_page': range_base + results_this_page, - 'page': context['page'], - 'pages': context['pages'], - 'page_numbers': page_numbers, - 'next': context['next'], - 'previous': context['previous'], - 'has_next': context['has_next'], - 'has_previous': context['has_previous'], - 'show_first': 1 not in page_numbers, - 'show_last': context['pages'] not in page_numbers, - } + results_this_page = context["page"].object_list.count() + context.update({'results_this_page': results_this_page,}) + return context register.inclusion_tag('paginator.html', takes_context=True)(paginator) diff --git a/src/web/grampsdb/views.py b/src/web/grampsdb/views.py index c7e60b1f4..186ed92d5 100644 --- a/src/web/grampsdb/views.py +++ b/src/web/grampsdb/views.py @@ -41,11 +41,11 @@ from django.db.models import Q #------------------------------------------------------------------------ import web from web.grampsdb.models import * -from web.grampsdb.forms import NameForm, PersonForm -from web.utils import probably_alive +from web.grampsdb.forms import * from web.djangodb import DjangoDb import gen.proxy +from Utils import create_id _ = lambda text: text @@ -70,6 +70,9 @@ def context_processor(request): context["css_theme"] = "Web_Mainz.css" # FIXME: get the views from a config? context["views"] = VIEWS + context["True"] = True + context["False"] = False + context["default"] = "" return context # CSS Themes: @@ -107,6 +110,40 @@ def user_page(request, username): context["tview"] = _('User') return render_to_response('user_page.html', context) +def fix_person(request, person): + try: + name = person.name_set.get(preferred=True) + except: + names = person.name_set.all().order_by("order") + if names.count() == 0: + name = Name(person=person, + surname="? Fixed", + first_name="? Missing name", + preferred=True) + name.save() + else: + order = 1 + for name in names: + if order == 1: + name.preferred = True + else: + name.preferred = False + name.order = order + name.save() + order += 1 + if request: + return redirect("/person/%s" % person.handle, request) + +def set_date(obj): + obj.calendar = 0 + obj.modifier = 0 + obj.quality = 0 + obj.text = "" + obj.sortval = 0 + obj.newyear = 0 + obj.day1, obj.month1, obj.year1, obj.slash1 = 0, 0, 0, 0 + obj.day2, obj.month2, obj.year2, obj.slash2 = 0, 0, 0, 0 + def view_name_detail(request, handle, order, action="view"): if order == "add": order = 0 @@ -115,50 +152,53 @@ def view_name_detail(request, handle, order, action="view"): action = request.POST.get("action") if action == "view": person = Person.objects.get(handle=handle) - name = person.name_set.get(order=order) + try: + name = person.name_set.filter(order=order)[0] + except: + return fix_person(request, person) form = NameForm(instance=name) form.model = name elif action == "edit": person = Person.objects.get(handle=handle) - name = person.name_set.get(order=order) + name = person.name_set.filter(order=order)[0] form = NameForm(instance=name) form.model = name elif action == "delete": person = Person.objects.get(handle=handle) - name_to_delete = person.name_set.get(order=order) - was_preferred = name_to_delete.preferred - name_to_delete.delete() names = person.name_set.all().order_by("order") - for count in range(names.count()): - if was_preferred: - names[count].preferred = True - was_preferred = False - names[count].order = count - names[count].save() + print "delete", names.count() + if names.count() > 1: + print "more than 1" + name_to_delete = names[0] + was_preferred = name_to_delete.preferred + name_to_delete.delete() + names = person.name_set.all().order_by("order") + for count in range(names[1:].count()): + print count + if was_preferred: + names[count].preferred = True + was_preferred = False + names[count].order = count + names[count].save() form = NameForm() name = Name() action = "back" - elif action == "add": + elif action == "add": # add name person = Person.objects.get(handle=handle) - name = Name() - 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 + name = Name(person=person, + display_as=NameFormatType.objects.get(val=0), + sort_as=NameFormatType.objects.get(val=0), + name_type=NameType.objects.get(val=2)) form = NameForm(instance=name) form.model = name action = "edit" elif action == "save": person = Person.objects.get(handle=handle) try: - name = person.name_set.get(order=order) + name = person.name_set.filter(order=order)[0] except: order = person.name_set.count() + 1 - name = Name(calendar=0, modifier=0, quality=0, - year1=0, day1=0, month1=0, - sortval = 0, newyear=0, order=order, - sort_as=NameFormatType(val=0), - display_as=NameFormatType(val=0), - person_id=person.id) + name = Name(person=person, order=order) form = NameForm(request.POST, instance=name) form.model = name if form.is_valid(): @@ -174,6 +214,7 @@ def view_name_detail(request, handle, order, action="view"): .update(preferred=False) # else some other name is preferred print "save" + set_date(name) n = form.save() print n.preferred else: @@ -187,6 +228,7 @@ def view_name_detail(request, handle, order, action="view"): context["person"] = person context["form"] = form context["order"] = name.order + context["next"] = "/person/%s/name/%d" % (person.handle, name.order) view_template = "view_name_detail.html" print "action:", action if action == "save": @@ -200,13 +242,6 @@ def view_name_detail(request, handle, order, action="view"): return render_to_response(view_template, context) -class PrivateProxy(object): - def __init__(self, obj): - self.obj = obj - - def __getattr__(self, attr): - return getattr(self.obj, attr) - def view_detail(request, view, handle, action="view"): context = RequestContext(request) context["action"] = action @@ -265,56 +300,104 @@ def view_detail(request, view, handle, action="view"): else: raise Http404(_("Requested page type not known")) context[view] = obj + context["next"] = "/%s/%s" % (view, obj.handle) return render_to_response(view_template, context) -def get_gramps_db(request): - dbase = DjangoDb() - #if request.user.is_authenticated(): - private_filter=False - living_filter=False - #else: - # private_filter=True - # living_filter=True - # If the private flag is set, apply the PrivateProxyDb - if private_filter: - dbase = gen.proxy.PrivateProxyDb(dbase) - # If the restrict flag is set, apply the LivingProxyDb - if living_filter: - dbase = gen.proxy.LivingProxyDb( - dbase, - gen.proxy.LivingProxyDb.MODE_INCLUDE_LAST_NAME_ONLY) - return dbase - def view_person_detail(request, view, handle, action="view"): context = RequestContext(request) + print view, handle, action + if handle == "add": + if request.POST.has_key("action"): + action = request.POST.get("action") + else: + action = "add" + elif request.POST.has_key("action"): + action = request.POST.get("action") + if request.user.is_authenticated(): + if action == "edit": + # get all of the data: + person = Person.objects.get(handle=handle) + try: + name = person.name_set.get(preferred=True) + except: + name = Name(person=person, preferred=True) + pf = PersonForm(instance=person) + pf.model = person + nf = NameForm(instance=name) + nf.model = name + elif action == "add": + # make new data: + person = Person() + name = Name(person=person, preferred=True, + display_as=NameFormatType.objects.get(val=0), + sort_as=NameFormatType.objects.get(val=0), + name_type=NameType.objects.get(val=2)) + nf = NameForm(instance=name) + nf.model = name + pf = PersonForm(instance=person) + pf.model = person + action = "edit" + elif action == "save": + try: + person = Person.objects.get(handle=handle) + except: + person = Person(handle=create_id()) + if person.id: # editing + name = person.name_set.get(preferred=True) + else: # adding a new person with new name + name = Name(person=person, preferred=True) + pf = PersonForm(request.POST, instance=person) + pf.model = person + nf = NameFormFromPerson(request.POST, instance=name) + nf.model = name + print "checking:", person.handle + if nf.is_valid() and pf.is_valid(): + person = pf.save() + name = nf.save(commit=False) + name.person = person + name.save() + else: + action = "edit" + else: # view + person = Person.objects.get(handle=handle) + try: + name = person.name_set.get(preferred=True) + except: + return fix_person(request, person) + pf = PersonForm(instance=person) + pf.model = person + nf = NameForm(instance=name) + nf.model = name + else: # view person detail + # BEGIN NON-AUTHENTICATED ACCESS + person = Person.objects.get(handle=handle) + if person: + if person.private: + raise Http404(_("Requested %s is not accessible.") % view) + name = person.name_set.get(preferred=True) + if person.probably_alive: + name.sanitize() + else: + raise Http404(_("Requested %s does not exist.") % view) + pf = PersonForm(instance=person) + pf.model = person + nf = NameForm(instance=name) + nf.model = name + # END NON-AUTHENTICATED ACCESS + if action == "save": + context["action"] = "view" + return redirect("/person/%s" % person.handle, context) context["action"] = action context["view"] = view context["tview"] = _("Person") - view_template = 'view_person_detail.html' - if request.user.is_authenticated(): - person = Person.objects.get(handle=handle) - name = person.name_set.get(preferred=True) - else: - db = get_gramps_db(request) - gramps_person = db.get_person_from_handle(handle) - if not gramps_person: - raise Http404(_("Requested %s is not accessible.") % view) - person = Person.objects.get(handle=handle) - name = person.name_set.get(preferred=True) - # fill forms with data from db - name.surname = gramps_person.get_primary_name().get_surname() - name.first_name = gramps_person.get_primary_name().get_first_name() - pf = PersonForm(instance=person) - pf.model = person - nf = NameForm(instance=name) - nf.model = name context["personform"] = pf context["nameform"] = nf context["person"] = person + context["next"] = "/person/%s" % person.handle + view_template = 'view_person_detail.html' return render_to_response(view_template, context) def view(request, view): - db = get_gramps_db(request) search = "" if view == "event": if request.user.is_authenticated(): @@ -366,12 +449,14 @@ def view(request, view): if request.GET.has_key("search"): search = request.GET.get("search") if "," in search: - search, trash = [term.strip() for term in search.split(",", 1)] + search_text, trash = [term.strip() for term in search.split(",", 1)] + else: + search_text = search object_list = Family.objects \ - .filter((Q(gramps_id__icontains=search) | - Q(family_rel_type__name__icontains=search) | - Q(father__name__surname__istartswith=search) | - Q(mother__name__surname__istartswith=search)) & + .filter((Q(gramps_id__icontains=search_text) | + Q(family_rel_type__name__icontains=search_text) | + Q(father__name__surname__istartswith=search_text) | + Q(mother__name__surname__istartswith=search_text)) & Q(private=False) & Q(mother__private=False) & Q(father__private=False) @@ -450,11 +535,14 @@ def view(request, view): # BEGIN NON-AUTHENTICATED users if request.GET.has_key("search"): search = request.GET.get("search") + print "search:", search if "," in search: - search, trash = [term.strip() for term in search.split(",", 1)] + search_text, trash = [term.strip() for term in search.split(",", 1)] + else: + search_text = search object_list = Name.objects \ .select_related() \ - .filter(Q(surname__istartswith=search) & + .filter(Q(surname__istartswith=search_text) & Q(private=False) & Q(person__private=False) ) \ @@ -548,9 +636,10 @@ def view(request, view): context["tview"] = _(view.title()) context["search"] = search context["total"] = total - context["db"] = db + context["object_list"] = object_list + context["next"] = "/person/" if search: - context["search_query"] = ("&search=%s" % escape(search)) + context["search_query"] = ("&search=%s" % search) else: context["search_query"] = "" return render_to_response(view_template, context) diff --git a/src/web/sqlite.db b/src/web/sqlite.db index 9d2c27b8fab05bd858e29cbc81e8d517ec6a9120..007a2a0187fedb2c2236620bbf0af6f9236afe6f 100644 GIT binary patch delta 143 zcmZoTz|(MmXTxmqRCDuGBSRHK%S6Kz6H`l*lq5?-V*?|@Bulfzl#~?XWOK7Lb0cF5 z3$s*Hqcl@SMn)q8Ljzp{Lm*NxG_W!>wlXl&v#>C?G%&<1vq|D$Hy?^NqvrFA+s`j% L+%s ] """ % (url, text) @@ -215,7 +208,7 @@ def event_table(obj, user, action, url=None, *args): get_title(djevent.place), str(event_ref.role_type)) retval += table.get_html() - if user.is_authenticated() and url and action != "edit": + if user.is_authenticated() and url and action == "view": retval += make_button(_("Add event"), (url + "/add") % args) else: retval += nbsp("") # to keep tabs same height @@ -244,7 +237,7 @@ def name_table(obj, user, action, url=None, *args): except: note = None table.row(make_name(name, user), - str(name.name_type), + str(name.name_type) + ["", " (preferred)"][int(name.preferred)], name.group_as, ["No", "Yes"][sourceq], note) @@ -253,7 +246,7 @@ def name_table(obj, user, action, url=None, *args): (url % name.person.handle) + ("/%s" % name.order))) table.links(links) retval += table.get_html() - if user.is_authenticated() and url and action != "edit": + if user.is_authenticated() and url and action == "view": retval += make_button(_("Add name"), (url + "/add") % args) else: retval += nbsp("") # to keep tabs same height @@ -278,7 +271,7 @@ def source_table(obj, user, action, url=None, *args): source_ref.page, ) retval += table.get_html() - if user.is_authenticated() and url and action != "edit": + if user.is_authenticated() and url and action == "view": retval += make_button(_("Add source"), (url + "/add") % args) else: retval += nbsp("") # to keep tabs same height @@ -302,7 +295,7 @@ def note_table(obj, user, action, url=None, *args): str(note_ref.ref_object.note_type), note_ref.ref_object.text[:50]) retval += table.get_html() - if user.is_authenticated() and url and action != "edit": + if user.is_authenticated() and url and action == "view": retval += make_button(_("Add note"), (url + "/add") % args) else: retval += nbsp("") # to keep tabs same height @@ -322,7 +315,7 @@ def attribute_table(obj, user, action, url=None, *args): table.row(attribute.attribute_type.name, attribute.value) retval += table.get_html() - if user.is_authenticated() and url and action != "edit": + if user.is_authenticated() and url and action == "view": retval += make_button(_("Add attribute"), (url + "/add") % args) else: retval += nbsp("") # to keep tabs same height @@ -346,7 +339,7 @@ def address_table(obj, user, action, url=None, *args): location.state, location.country) retval += table.get_html() - if user.is_authenticated() and url and action != "edit": + if user.is_authenticated() and url and action == "view": retval += make_button(_("Add address"), (url + "/add") % args) else: retval += nbsp("") # to keep tabs same height @@ -359,7 +352,7 @@ def gallery_table(obj, user, action, url=None, *args): _("Type"), ) retval += table.get_html() - if user.is_authenticated() and url and action != "edit": + if user.is_authenticated() and url and action == "view": retval += make_button(_("Add gallery"), (url + "/add") % args) else: retval += nbsp("") # to keep tabs same height @@ -378,7 +371,7 @@ def internet_table(obj, user, action, url=None, *args): url_obj.path, url_obj.desc) retval += table.get_html() - if user.is_authenticated() and url and action != "edit": + if user.is_authenticated() and url and action == "view": retval += make_button(_("Add internet"), ((str(url) % args) + "/add")) else: retval += nbsp("") # to keep tabs same height @@ -392,11 +385,12 @@ def association_table(obj, user, action, url=None, *args): _("Association")) if user.is_authenticated(): gperson = table.db.get_person_from_handle(obj.handle) - associations = gperson.get_person_ref_list() - for association in associations: - table.row() + if gperson: + associations = gperson.get_person_ref_list() + for association in associations: + table.row() retval += table.get_html() - if user.is_authenticated() and url and action != "edit": + if user.is_authenticated() and url and action == "view": retval += make_button(_("Add association"), (url + "/add") % args) else: retval += nbsp("") # to keep tabs same height @@ -420,7 +414,7 @@ def lds_table(obj, user, action, url=None, *args): lds.temple, get_title(lds.place)) retval += table.get_html() - if user.is_authenticated() and url and action != "edit": + if user.is_authenticated() and url and action == "view": retval += make_button(_("Add LDS"), (url + "/add") % args) else: retval += nbsp("") # to keep tabs same height @@ -492,6 +486,71 @@ def display_date(obj): else: return "" +def render(formfield, user, action, test=False, truetext=""): + if not user.is_authenticated(): + action = "view" + if action == "view": + if (not user.is_authenticated() and not test) or user.is_authenticated(): + fieldname = formfield.name # 'surname' + retval = str(getattr(formfield.form.model, fieldname)) + else: + retval = truetext + else: + retval = formfield.as_widget() + return retval + +def render_name(name, user): + """ + Given a Django or Gramps object, render the name and return. This + function uses authentication, privacy and probably_alive settings. + """ + if isinstance(name, models.Name): + if not user.is_authenticated(): + name.sanitize() + return "%s, %s" % (name.surname, name.first_name) + elif isinstance(name, forms.NameForm): + if not user.is_authenticated(): + name.model.sanitize() + return "%s, %s" % (name.model.surname, name.model.first_name) + elif isinstance(name, gen.lib.Person): # name is a gen.lib.Person + person = name + try: + name = person.get_primary_name() + except: + name = None + if name is None: + return "[No preferred name]" + if not user.is_authenticated(): + name.sanitize() + return "%s, %s" % (name.surname, name.first_name) + elif isinstance(name, models.Person): # django person + person = name + try: + name = person.name_set.get(preferred=True) + except: + return "Error" + return render_name(name, user) + else: # no name object + return "[No preferred name]" + +def make_name(name, user): + return render_name(name, user) + +def render_date(obj, user): + """ + Given a Django object, render the date as text and return. This + function uses authentication settings. + """ + if (user.is_authenticated() or + (not user.is_authenticated() and obj and not obj.private)): + if obj: + date_tuple = dji.get_date(obj) + if date_tuple: + gdate = GDate().unserialize(date_tuple) + return _dd(gdate) + return "" + return "[Private]" + def person_get_event(person, event_type=None): event_ref_list = dji.get_event_ref_list(person) if event_type: @@ -513,42 +572,6 @@ def person_get_event(person, event_type=None): for event_handle in event_ref_list] return [j for i in retval for j in i] -def make_name(name, user): - if isinstance(name, models.Name): - surname = name.surname.strip() - if not surname: - surname = "[Missing]" - if user.is_authenticated(): - return "%s, %s" % (surname, name.first_name) - else: - if name.person.probably_alive: - return "%s, %s" % (surname, "[Living]") - else: - return "%s, %s" % (surname, name.first_name) - elif isinstance(name, forms.NameForm): - surname = name.model.surname.strip() - if not surname: - surname = "[Missing]" - if user.is_authenticated(): - return "%s, %s" % (surname, name.model.first_name) - else: - if name.model.person.probably_alive: - return "%s, %s" % (surname, "[Living]") - else: - return "%s, %s" % (surname, name.model.first_name) - elif isinstance(name, gen.lib.Person): # name is a gen.lib.Person - person = name - name = person.get_primary_name() - if name is None: - return "[No preferred name]" - else: - return "%s, %s" % (name.get_surname(), name.get_first_name()) - elif isinstance(name, models.Person): # django person - person = name - return make_name(person.name_set.get(preferred=True), user) - else: # no name - return "" - class lazy(object): EMPTY = [] used = 0 @@ -573,6 +596,13 @@ class lazy(object): object.__getattribute__(self, "thaw")() return getattr(object.__getattribute__(self, "result"), attr) + def myclass(self): + if object.__getattribute__(self, "result") is lazy.EMPTY: + object.__getattribute__(self, "thaw")() + return object.__getattribute__(self, "result").__class__ + + #__class__ = property(myclass) + def __str__(self): if object.__getattribute__(self, "result") is lazy.EMPTY: object.__getattribute__(self, "thaw")()