diff --git a/src/data/templates/view_events.html b/src/data/templates/view_events.html index 422872a09..1cf55e8af 100644 --- a/src/data/templates/view_events.html +++ b/src/data/templates/view_events.html @@ -3,10 +3,10 @@ {% block table_data %} - +
- + @@ -29,6 +29,7 @@ + {% endif %} {% endfor %} diff --git a/src/data/templates/view_families.html b/src/data/templates/view_families.html index 8c495df46..8f1d71d3e 100644 --- a/src/data/templates/view_families.html +++ b/src/data/templates/view_families.html @@ -3,7 +3,7 @@ {% block table_data %} -
Event ## ID Event Type Description
+
diff --git a/src/data/templates/view_media.html b/src/data/templates/view_media.html index 78dd3116a..ef059741c 100644 --- a/src/data/templates/view_media.html +++ b/src/data/templates/view_media.html @@ -3,10 +3,10 @@ {% block table_data %} -
#
+
- + diff --git a/src/data/templates/view_name_detail.html b/src/data/templates/view_name_detail.html new file mode 100644 index 000000000..bb2faebf7 --- /dev/null +++ b/src/data/templates/view_name_detail.html @@ -0,0 +1,156 @@ +{% extends "view_page_detail.html" %} +{% load my_tags %} + +{% block content %} + + + +
+

{{person.name_set|make_name:user}}

+
+
Media ## ID MIME Type Date
{% comment %} 5 cols {% endcomment %} + + +{% if user.is_authenticated %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Family:{{person.name_set|preferred:"surname"}}Prefix:{{person.name_set|preferred:"prefix"}}Image:
Suffix:{{person.name_set|preferred:"suffix"}}
Given:{{person.name_set|preferred:"first_name"}}Call Name:{{person.name_set|preferred:"call"}}
Type:{{person.name_set|preferred:"name_type"}}Patronymic:{{person.name_set|preferred:"patronymic"}}
Title:{{person.name_set|preferred:"title"}}
Gender:{{person.gender_type|escape}}ID:{{person.gramps_id|escape}}Marker:{{person.marker_type|escape}}
+ +{% else %} + + + Family: + {{person.name_set|preferred:"surname"}} + Prefix: + [Private] + Image: + + + Suffix: + [Private] + + Given: + [Private] + Call Name: + [Private] + + + Type: + {{person.name_set|preferred:"name_type"}} + Patronymic: + [Private] + + + + Title: + [Private] + + + Gender: + {{person.gender_type|escape}} + ID: + {{person.gramps_id|escape}} + Marker: + + + + + +{% endif %} + + + +

Tabs

+ +
+ +
+ + {{ person|person_event_table:user|safe }} +
+
+ {{ person|person_name_table:user|safe }} +
+
+ {{ person|person_source_table:user|safe }} +
+
+ {{ person|person_attribute_table:user|safe }} +
+
+ {{ person|person_address_table:user|safe }} +
+
+ {{ person|person_note_table:user|safe }} +
+ +
+ {{ person|person_internet_table:user|safe }} +
+
+ {{ person|person_association_table:user|safe }} +
+
+ {{ person|person_lds_table:user|safe }} +
+
+ {{ person|person_reference_table:user|safe }} +
+
+ + +{% endblock %} + diff --git a/src/data/templates/view_notes.html b/src/data/templates/view_notes.html index 7d1856271..b4acde9cd 100644 --- a/src/data/templates/view_notes.html +++ b/src/data/templates/view_notes.html @@ -3,10 +3,10 @@ {% block table_data %} - +
- + @@ -24,7 +24,6 @@ {% else %} - {% endif %} {% endfor %} diff --git a/src/data/templates/view_page.html b/src/data/templates/view_page.html index 3c62e3535..cfe7f480a 100644 --- a/src/data/templates/view_page.html +++ b/src/data/templates/view_page.html @@ -9,7 +9,7 @@

- +

@@ -40,6 +40,7 @@ {% else %} [last] {% endifequal %} + Matches: {{page.paginator.count}}/{{total}} @@ -78,6 +79,7 @@ {% else %} [last] {% endifequal %} + Matches: {{page.paginator.count}}/{{total}} diff --git a/src/data/templates/view_people.html b/src/data/templates/view_people.html index a50cf587f..fa844203a 100644 --- a/src/data/templates/view_people.html +++ b/src/data/templates/view_people.html @@ -3,7 +3,7 @@ {% block table_data %} -
Note ## ID Note Type Text
+
diff --git a/src/data/templates/view_places.html b/src/data/templates/view_places.html index 902dfdcdc..61b2cdc3d 100644 --- a/src/data/templates/view_places.html +++ b/src/data/templates/view_places.html @@ -3,10 +3,10 @@ {% block table_data %} -
#
+
- + @@ -21,8 +21,6 @@ - - {% endif %} {% endfor %} diff --git a/src/data/templates/view_repositories.html b/src/data/templates/view_repositories.html index 36b19f484..a730c6d2c 100644 --- a/src/data/templates/view_repositories.html +++ b/src/data/templates/view_repositories.html @@ -3,10 +3,11 @@ {% block table_data %} -
Place ## ID Title
{{place.title|escape}} {% else %}
+
+ - + @@ -24,7 +25,6 @@ {% else %} - {% endif %} {% endfor %} diff --git a/src/data/templates/view_sources.html b/src/data/templates/view_sources.html index 15d2b8515..467d6b297 100644 --- a/src/data/templates/view_sources.html +++ b/src/data/templates/view_sources.html @@ -3,10 +3,10 @@ {% block table_data %} -
Repository ## ID Type Name
+
- + diff --git a/src/web/grampsdb/views.py b/src/web/grampsdb/views.py index d62be79ae..bdaad8667 100644 --- a/src/web/grampsdb/views.py +++ b/src/web/grampsdb/views.py @@ -45,7 +45,7 @@ from web.grampsdb.models import * _ = lambda text: text # Views: [(Nice name plural, /name/handle, Model), ] -VIEWS = [(_('People'), 'person', Person), +VIEWS = [(_('People'), 'person', Name), (_('Families'), 'family', Family), (_('Events'), 'event', Event), (_('Notes'), 'note', Note), @@ -102,6 +102,19 @@ def user_page(request, username): context["cview"] = _('User') return render_to_response('user_page.html', context) +def view_name_detail(request, handle, id): + view_template = "view_name_detail.html" + name = Name.objects.get(id=id) + person = Person.objects.get(handle=handle) + context = RequestContext(request) + context["cview"] = 'Name' + context["view"] = 'name' + context["handle"] = handle + context["id"] = id + context["name"] = name + context["person"] = person + return render_to_response(view_template, context) + def view_detail(request, view, handle): if view == "event": try: @@ -160,69 +173,215 @@ def view_detail(request, view, handle): context["handle"] = handle context[view] = obj return render_to_response(view_template, context) - + def view(request, view): cview = view.title() search = "" if view == "event": - object_list = Event.objects.all().order_by("gramps_id") + if request.user.is_authenticated(): + private = Q() + else: + # NON-AUTHENTICATED users + private = Q(private=False) + if request.GET.has_key("search"): + search = request.GET.get("search") + object_list = Event.objects \ + .filter((Q(gramps_id__icontains=search) | + Q(event_type__name__icontains=search) | + Q(place__title__icontains=search)) & + private + ) \ + .order_by("gramps_id") + else: + object_list = Event.objects.filter(private).order_by("gramps_id") view_template = 'view_events.html' + total = Event.objects.all().count() elif view == "family": - object_list = Family.objects.all().order_by("gramps_id") + if request.GET.has_key("search"): + search = request.GET.get("search") + if request.user.is_authenticated(): + if "," in search: + surname, first = [term.strip() for term in + search.split(",", 1)] + object_list = Family.objects \ + .filter((Q(father__name__surname__istartswith=surname) & + Q(father__name__first_name__istartswith=first)) | + (Q(mother__name__surname__istartswith=surname) & + Q(mother__name__first_name__istartswith=first)) + ) \ + .order_by("gramps_id") + else: # no comma + object_list = Family.objects \ + .filter(Q(gramps_id__icontains=search) | + Q(family_rel_type__name__icontains=search) | + Q(father__name__surname__istartswith=search) | + Q(father__name__first_name__istartswith=search) | + Q(mother__name__surname__istartswith=search) | + Q(mother__name__first_name__istartswith=search) + ) \ + .order_by("gramps_id") + else: + # NON-AUTHENTICATED users + if "," in search: + search, trash = [term.strip() for term in search.split(",", 1)] + 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)) & + Q(private=False) + ) \ + .order_by("gramps_id") + else: # no search + if request.user.is_authenticated(): + object_list = Family.objects.all().order_by("gramps_id") + else: + # NON-AUTHENTICATED users + object_list = Family.objects.filter(private=False).order_by("gramps_id") view_template = 'view_families.html' + total = Family.objects.all().count() elif view == "media": - object_list = Media.objects.all().order_by("gramps_id") + if request.user.is_authenticated(): + private = Q() + else: + # NON-AUTHENTICATED users + private = Q(private=False) + if request.GET.has_key("search"): + search = request.GET.get("search") + object_list = Media.objects \ + .filter(Q(gramps_id__icontains=search) & + private + ) \ + .order_by("gramps_id") + else: + object_list = Media.objects.filter(private).order_by("gramps_id") view_template = 'view_media.html' + total = Media.objects.all().count() elif view == "note": - object_list = Note.objects.all().order_by("gramps_id") + if request.user.is_authenticated(): + private = Q() + else: + # NON-AUTHENTICATED users + private = Q(private=False) + if request.GET.has_key("search"): + search = request.GET.get("search") + object_list = Note.objects \ + .filter((Q(gramps_id__icontains=search) | + Q(note_type__name__icontains=search) | + Q(text__icontains=search)) & + private + ) \ + .order_by("gramps_id") + else: + object_list = Note.objects.filter(private).order_by("gramps_id") view_template = 'view_notes.html' + total = Note.objects.all().count() elif view == "person": if request.GET.has_key("search"): search = request.GET.get("search") if request.user.is_authenticated(): if "," in search: - surname, first_name = [term.strip() for term in search.split(",", 1)] + surname, first_name = [term.strip() for term in + search.split(",", 1)] object_list = Name.objects \ - .filter(surname__istartswith=surname, - first_name__istartswith=first_name) \ - .order_by("surname", "first_name") + .filter(Q(surname__istartswith=surname, + first_name__istartswith=first_name)) \ + .order_by("surname", "first_name") else: object_list = Name.objects \ - .filter(Q(surname__icontains=search) | - Q(first_name__icontains=search) | - Q(suffix__icontains=search) | - Q(prefix__icontains=search) | - Q(patronymic__icontains=search) | - Q(title__icontains=search) | - Q(person__gramps_id__icontains=search) + .filter((Q(surname__icontains=search) | + Q(first_name__icontains=search) | + Q(suffix__icontains=search) | + Q(prefix__icontains=search) | + Q(patronymic__icontains=search) | + Q(title__icontains=search) | + Q(person__gramps_id__icontains=search)) ) \ .order_by("surname", "first_name") else: - # FIXME: non-authenticated users don't get to search first_names + # BEGIN NON-AUTHENTICATED users if "," in search: - search, first_name = [term.strip() for term in search.split(",", 1)] + search, trash = [term.strip() for term in search.split(",", 1)] object_list = Name.objects \ - .filter(surname__istartswith=search) \ + .filter(Q(surname__istartswith=search) & + Q(private=False) & + Q(person__private=False) + ) \ .order_by("surname", "first_name") + # END NON-AUTHENTICATED users else: - object_list = Name.objects.order_by("surname", "first_name") + if request.user.is_authenticated(): + object_list = Name.objects.all().order_by("surname", "first_name") + else: + # BEGIN NON-AUTHENTICATED users + object_list = Name.objects.filter(Q(private=False) & + Q(person__private=False)).order_by("surname", "first_name") + # END NON-AUTHENTICATED users view_template = 'view_people.html' + total = Name.objects.all().count() elif view == "place": - object_list = Place.objects.all().order_by("gramps_id") + if request.user.is_authenticated(): + private = Q() + else: + # NON-AUTHENTICATED users + private = Q(private=False) + if request.GET.has_key("search"): + search = request.GET.get("search") + object_list = Place.objects \ + .filter((Q(gramps_id__icontains=search) | + Q(title__icontains=search) + ) & + private + ) \ + .order_by("gramps_id") + else: + object_list = Place.objects.filter(private).order_by("gramps_id") view_template = 'view_places.html' + total = Place.objects.all().count() elif view == "repository": - object_list = Repository.objects.all().order_by("gramps_id") + if request.user.is_authenticated(): + private = Q() + else: + # NON-AUTHENTICATED users + private = Q(private=False) + if request.GET.has_key("search"): + search = request.GET.get("search") + object_list = Repository.objects \ + .filter((Q(gramps_id__icontains=search) | + Q(name__icontains=search) | + Q(repository_type__name__icontains=search) + ) & + private + ) \ + .order_by("gramps_id") + else: + object_list = Repository.objects.filter(private).order_by("gramps_id") view_template = 'view_repositories.html' + total = Repository.objects.all().count() elif view == "source": - object_list = Source.objects.all().order_by("gramps_id") + if request.user.is_authenticated(): + private = Q() + else: + # NON-AUTHENTICATED users + private = Q(private=False) + if request.GET.has_key("search"): + search = request.GET.get("search") + object_list = Source.objects \ + .filter(Q(gramps_id__icontains=search) & + private + ) \ + .order_by("gramps_id") + else: + object_list = Source.objects.filter(private).order_by("gramps_id") view_template = 'view_sources.html' + total = Source.objects.all().count() else: raise Http404("Requested page type not known") if request.user.is_authenticated(): paginator = Paginator(object_list, 50) else: - paginator = Paginator(object_list, 15) + paginator = Paginator(object_list, 19) try: page = int(request.GET.get('page', '1')) @@ -239,6 +398,7 @@ def view(request, view): context["view"] = view context["cview"] = cview context["search"] = search + context["total"] = total if search: context["search_query"] = ("&search=%s" % escape(search)) else: diff --git a/src/web/urls.py b/src/web/urls.py index efa2ba03f..671b7eeab 100644 --- a/src/web/urls.py +++ b/src/web/urls.py @@ -39,7 +39,7 @@ from django.contrib import admin admin.autodiscover() from web.grampsdb.views import (main_page, user_page, logout_page, - view, view_detail) + view, view_detail, view_name_detail) urlpatterns = patterns('', # Specific matches first: @@ -68,6 +68,7 @@ urlpatterns += patterns('', url(r'^person/(?P(\w+))/$', view_detail, {"view": "person"}, name="view-person-detail"), (r'^(?P(\w+))/(?P(\w+))/$', view_detail), + (r'^person/(?P(\w+))/name/(?P(\w+))$', view_name_detail), ) # In urls: diff --git a/src/web/utils.py b/src/web/utils.py index 77ae926ca..5ab5f9217 100644 --- a/src/web/utils.py +++ b/src/web/utils.py @@ -60,7 +60,8 @@ def register_plugins(): def probably_alive(handle): db = DjangoDb() - return Utils.probably_alive(db.get_person_from_handle(handle), db) + person = db.get_person_from_handle(handle) + return Utils.probably_alive(person, db) def format_number(number, with_grouping=True): # FIXME: should be user's setting
Source ## ID Title Pub Info