Latest advancement in privacy issues; reworked proxy + forms

svn: r13929
This commit is contained in:
Doug Blank
2009-12-27 18:23:59 +00:00
parent ef3a25815a
commit 7ca0d94563
11 changed files with 315 additions and 275 deletions

View File

@ -83,25 +83,25 @@
</ul> </ul>
<div class="ui-tabs-panel ui-widget-content ui-corner-bottom" id="tab-children"> <div class="ui-tabs-panel ui-widget-content ui-corner-bottom" id="tab-children">
<!-- Events --> <!-- Events -->
{{ family|family_children_table:user|safe }} {% children_table family user action "/family/%s/children" family.handle %}
</div> </div>
<div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-events"> <div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-events">
{{ family|family_event_table:user|safe }} {% event_table family user action "/family/%s/children" family.handle %}
</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|source_table:user|safe }} {% source_table family user action "/family/%s/children" family.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">
{{ family|family_attribute_table:user|safe }} {% attribute_table family user action "/family/%s/children" family.handle %}
</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">
{{ family|family_note_table:user|safe }} {% note_table family user action "/family/%s/children" family.handle %}
</div> </div>
<div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-gallery"> <div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-gallery">
{{ family|family_gallery_table:user|safe }} {% gallery_table family user action "/family/%s/children" family.handle %}
</div> </div>
<div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-lds"> <div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-lds">
{{ family|family_lds_table:user|safe }} {% lds_table family user action "/family/%s/children" family.handle %}
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -11,7 +11,7 @@
</script> </script>
<div class="content" id="IndividualDetail"> <div class="content" id="IndividualDetail">
<h3>Name for Person [{{person.gramps_id}}]</h3> <h3>{{person|make_name:user}} [{{person.gramps_id}}]</h3>
<div id="summaryarea"> <div id="summaryarea">
<table class="infolist"> {% comment %} 4 cols {% endcomment %} <table class="infolist"> {% comment %} 4 cols {% endcomment %}
<tbody> <tbody>
@ -69,26 +69,32 @@
<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"
<table> id="tab-general">
<tr><td>{{form.group_as.label}}: </td> <div style="overflow: auto; height:150px; color: black; background-color: white;">
<table border="1">
<tr><td style="background-color: #FFF2C5;">{{form.group_as.label}}: </td>
<td>{{form.group_as|render:action}}</td> <td>{{form.group_as|render:action}}</td>
</tr> </tr>
<tr><td>{{form.sort_as.label}}: </td> <tr><td style="background-color: #FFF2C5;">{{form.sort_as.label}}: </td>
<td>{{form.sort_as|render:action}}</td> <td>{{form.sort_as|render:action}}</td>
</tr> </tr>
<tr><td>{{form.display_as.label}}: </td> <tr><td style="background-color: #FFF2C5;">{{form.display_as.label}}: </td>
<td>{{form.display_as|render:action}}</td> <td>{{form.display_as|render:action}}</td>
</tr> </tr>
<tr><td>{{form.text.label}}: </td> <tr><td style="background-color: #FFF2C5;">{{form.text.label}}: </td>
<td>{{form.text|render:action}}</td> <td>{{form.text|render:action}}</td>
</tr> </tr>
</table> </table>
</div>
&nbsp;
</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 %} {% source_table form.model user action "/person/%s/name/%s/source" 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">
{% note_table form.model user action "/person/%s/name/%s/note" person.handle form.model.order %}
</div> </div>
</div> </div>

View File

@ -24,7 +24,7 @@
{% if person %} {% if person %}
<td><a href="{{person.handle}}/" class="noThumb">{{ forloop.counter|row_count:page }}</a> <td><a href="{{person.handle}}/" class="noThumb">{{ forloop.counter|row_count:page }}</a>
</td> </td>
<td><a href="{{person.handle}}/" class="noThumb">{{person|make_name}}</a> <td><a href="{{person.handle}}/" class="noThumb">{{person|make_name:user}}</a>
</td> </td>
<td><a href="{{person.handle}}/" class="grampsid">[{{person.gramps_id}}]</a></td> <td><a href="{{person.handle}}/" class="grampsid">[{{person.gramps_id}}]</a></td>
<td><a href="{{person.handle}}/" class="noThumb">{{person.gender_type}}</a></td> <td><a href="{{person.handle}}/" class="noThumb">{{person.gender_type}}</a></td>

View File

@ -11,49 +11,61 @@
</script> </script>
<div class="content" id="IndividualDetail"> <div class="content" id="IndividualDetail">
<h3></h3> <h3>{{nameform|make_name:user}} [{{person.gramps_id}}]</h3>
<div id="summaryarea"> <div id="summaryarea">
<table class="infolist"> {% comment %} 5 cols {% endcomment %} <table class="infolist"> {% comment %} 5 cols {% endcomment %}
<tbody> <tbody>
{% if user.is_authenticated %}
{% ifequal action "edit" %}
{% for error in personform.errors %}
{{error}}<br>
{% endfor %}
{% for error in nameform.errors %}
{{error}}<br>
{% endfor %}
<form method="post">
{% endifequal %}
{% endif %}
<tr> <tr>
<td class="ColumnAttribute">Family:</td> <td class="ColumnAttribute">{{nameform.surname.label}}</td>
<td class="ColumnValue" id="data">{{name.surname}}</td> <td class="ColumnValue" id="data">{{nameform.surname|render:action}}</td>
<td class="ColumnAttribute">Prefix:</td> <td class="ColumnAttribute">{{nameform.prefix.label}}</td>
<td class="ColumnValue" id="data">{{name.prefix}}</td> <td class="ColumnValue" id="data">{{nameform.prefix|render:action}}</td>
<td rowspan="6" colspan="2" style="border:solid 2px #7D5925;">Image:</td> <td rowspan="6" colspan="2" style="border:solid 2px #7D5925;">Image:</td>
</tr> </tr>
<tr> <tr>
<td class="ColumnAttribute" colspan="2"></td> <td class="ColumnAttribute" colspan="2"></td>
<td class="ColumnAttribute">Suffix:</td> <td class="ColumnAttribute">{{nameform.suffix.label}}</td>
<td class="ColumnValue" id="data">{{name.suffix}}</td> <td class="ColumnValue" id="data">{{nameform.suffix|render:action}}</td>
</tr> </tr>
<tr> <tr>
<td class="ColumnAttribute">Given:</td> <td class="ColumnAttribute">{{nameform.first_name.label}}</td>
<td class="ColumnValue" id="data">{{name.first_name}}</td> <td class="ColumnValue" id="data">{{nameform.first_name|render:action}}</td>
<td class="ColumnAttribute">Call Name:</td> <td class="ColumnAttribute">{{nameform.call.label}}</td>
<td class="ColumnValue" id="data">{{name.call}}</td> <td class="ColumnValue" id="data">{{nameform.call|render:action}}</td>
</tr> </tr>
<tr> <tr>
<td class="ColumnAttribute">Type:</td> <td class="ColumnAttribute">{{nameform.name_type.label}}</td>
<td class="ColumnValue" id="data">{{name.name_type}}</td> <td class="ColumnValue" id="data">{{nameform.name_type|render:action}}</td>
<td class="ColumnAttribute">Patronymic:</td> <td class="ColumnAttribute">{{nameform.patronymic.label}}</td>
<td class="ColumnValue" id="data">{{name.patronymic}}</td> <td class="ColumnValue" id="data">{{nameform.patronymic|render:action}}</td>
</tr> </tr>
<tr> <tr>
<td class="ColumnAttribute" colspan="2"></td> <td class="ColumnAttribute" colspan="2"></td>
<td class="ColumnAttribute">Title:</td> <td class="ColumnAttribute">{{nameform.title.label}}</td>
<td class="ColumnValue" id="data">{{name.title}}</td> <td class="ColumnValue" id="data">{{nameform.title|render:action}}</td>
</tr> </tr>
<tr> <tr>
<td class="ColumnAttribute">Gender:</td> <td class="ColumnAttribute">{{personform.gender_type.label}}</td>
<td class="ColumnValue" id="data">{{person.gender_type}}</td> <td class="ColumnValue" id="data">{{personform.gender_type|render:action}}</td>
<td class="ColumnAttribute">ID:</td> <td class="ColumnAttribute">{{personform.gramps_id.label}}</td>
<td class="ColumnValue" id="data">{{person.gramps_id}}</td> <td class="ColumnValue" id="data">{{personform.gramps_id|render:action}}</td>
</tr> </tr>
<tr> <tr>
<td class="ColumnAttribute">Marker:</td> <td class="ColumnAttribute">{{personform.marker_type.label}}</td>
<td class="ColumnValue" id="data">{{person.marker_type}}</td> <td class="ColumnValue" id="data">{{personform.marker_type|render:action}}</td>
<td class="ColumnAttribute" colspan="3"></td> <td class="ColumnAttribute" colspan="3"></td>
</tr> </tr>
</tbody> </tbody>
@ -80,40 +92,54 @@
</ul> </ul>
<div class="ui-tabs-panel ui-widget-content ui-corner-bottom" id="tab-events"> <div class="ui-tabs-panel ui-widget-content ui-corner-bottom" id="tab-events">
<!-- Events --> <!-- Events -->
{{ person|person_event_table:user|safe }} {% event_table person user action "/person/%s/event" person.handle %}
</div> </div>
<div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-names"> <div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-names">
{{ person|person_name_table:user|safe }} {% name_table person user action "/person/%s/name" person.handle %}
</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 person user action "/person/%s/source/add" person.handle %} {% source_table person user action "/person/%s/source" 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 }} {% attribute_table person user action "/person/%s/attribute" person.handle %}
</div> </div>
<div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-addresses"> <div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-addresses">
{{ person|person_address_table:user|safe }} {% address_table person user action "/person/%s/address" person.handle %}
</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
{{ person|person_note_table:user|safe }} ui-tabs-hide" id="tab-notes">
{% note_table person user action "/person/%s/note" person.handle %}
</div> </div>
<div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-gallery"> <div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-gallery">
{{ person|person_gallery_table:user|safe }} {% gallery_table person user action "/person/%s/gallery" person.handle %}
</div> </div>
<div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-internet"> <div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-internet">
{{ person|person_internet_table:user|safe }} {% internet_table person user action "/person/%s/internet" person.handle %}
</div> </div>
<div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-association"> <div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-association">
{{ person|person_association_table:user|safe }} {% association_table person user action "/person/%s/association" person.handle %}
</div> </div>
<div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-lds"> <div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-lds">
{{ person|person_lds_table:user|safe }} {% lds_table person user action "/person/%s/lds" person.handle %}
</div> </div>
<div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-references"> <div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" id="tab-references">
{{ person|person_reference_table:user|safe }} {% reference_table person user action "/person/%s/reference" person.handle %}
</div> </div>
</div> </div>
{% if user.is_authenticated %}
{% ifequal action "edit" %}
{% make_button "Back to Person" "/person/%s" person.handle %}
<input type="hidden" name="action" value="save"/>
<input type="submit" value="Submit"/>
</form>
{% else %}
{% make_button "Back to People" "/person/" %}
{% make_button "Edit Person" "/person/%s/edit" person.handle %}
{% make_button "Delete Person" "/person/%s/delete" person.handle %}
{% endifequal %}
{% else %}
{% endif %}
{% endblock %} {% endblock %}

View File

@ -92,9 +92,17 @@ class DjangoDb(DbReadBase, DbWriteBase):
return obj return obj
def get_place_from_handle(self, handle): def get_place_from_handle(self, handle):
obj = gen.lib.Place() try:
obj.unserialize(self.dji.get_place(self.dji.Place.get(handle=handle))) dji_obj = self.dji.Place.get(handle=handle)
return obj except:
dji_obj = None
if dji_obj:
tuple_obj = self.dji.get_place(dji_obj)
if tuple_obj:
obj = gen.lib.Place()
obj.unserialize(tuple_obj)
return obj
return None
def get_source_from_handle(self, handle): def get_source_from_handle(self, handle):
obj = gen.lib.Source() obj = gen.lib.Source()

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-26 00:38" "value" : "2009-12-26 08:01"
} }
}, },
{ {

View File

@ -10,7 +10,6 @@ import datetime
class PersonForm(forms.ModelForm): class PersonForm(forms.ModelForm):
class Meta: class Meta:
model = Person model = Person
exclude = ('handle',)
'''def clean(self): '''def clean(self):
cleaned_data['last_changed'] = datetime.datetime.now() cleaned_data['last_changed'] = datetime.datetime.now()

View File

@ -8,16 +8,6 @@ import web.utils
register = Library() register = Library()
for filter_name in util_filters:
func = getattr(web.utils, filter_name)
func.is_safe = True
register.filter(filter_name, func)
def get_person_from_handle(db, handle):
# db is a Gramps Db interface
# handle is a Person Handle
return db.get_person_from_handle(handle)
class TemplateNode(template.Node): class TemplateNode(template.Node):
def __init__(self, args, var_name, func): def __init__(self, args, var_name, func):
self.args = map(template.Variable, args) self.args = map(template.Variable, args)
@ -33,8 +23,7 @@ class TemplateNode(template.Node):
return value return value
def parse_tokens(tokens): def parse_tokens(tokens):
# Splitting by None splits by spaces items = tokens.split_contents()
items = tokens.contents.split(None)
# {% tag_name arg1 arg2 arg3 as variable %} # {% tag_name arg1 arg2 arg3 as variable %}
# {% tag_name arg1 arg2 arg3 %} # {% tag_name arg1 arg2 arg3 %}
tag_name = items[0] tag_name = items[0]
@ -52,11 +41,14 @@ def make_tag(func):
return TemplateNode(args, var_name, func) return TemplateNode(args, var_name, func)
return do_func return do_func
register.tag("get_person_from_handle", for filter_name in util_filters:
make_tag(get_person_from_handle)) func = getattr(web.utils, filter_name)
func.is_safe = True
register.filter(filter_name, func)
register.tag("source_table", for tag_name in util_tags:
make_tag(source_table)) func = getattr(web.utils, tag_name)
register.tag(tag_name, make_tag(func))
probably_alive.is_safe = True probably_alive.is_safe = True
register.filter('probably_alive', probably_alive) register.filter('probably_alive', probably_alive)

View File

@ -41,11 +41,11 @@ from django.db.models import Q
#------------------------------------------------------------------------ #------------------------------------------------------------------------
import web import web
from web.grampsdb.models import * from web.grampsdb.models import *
from web.grampsdb.forms import NameForm from web.grampsdb.forms import NameForm, PersonForm
from web.utils import probably_alive from web.utils import probably_alive
from web.djangodb import DjangoDb from web.djangodb import DjangoDb
from gen.proxy import LivingProxyDb import gen.proxy
_ = lambda text: text _ = lambda text: text
@ -207,8 +207,9 @@ class PrivateProxy(object):
def __getattr__(self, attr): def __getattr__(self, attr):
return getattr(self.obj, attr) return getattr(self.obj, attr)
def view_detail(request, view, handle): def view_detail(request, view, handle, action="view"):
context = RequestContext(request) context = RequestContext(request)
context["action"] = action
context["view"] = view context["view"] = view
if view == "event": if view == "event":
try: try:
@ -239,24 +240,7 @@ def view_detail(request, view, handle):
view_template = 'view_note_detail.html' view_template = 'view_note_detail.html'
context["tview"] = _("Note") context["tview"] = _("Note")
elif view == "person": elif view == "person":
try: return view_person_detail(request, view, handle, action)
obj = Person.objects.get(handle=handle)
except:
raise Http404(_("Requested %s does not exist.") % view)
view_template = 'view_person_detail.html'
person = obj
name = person.get_primary_name()
if request.user.is_authenticated():
pass # see everything, no limits
elif probably_alive(person.handle):
name.first_name = "[Living]"
elif person.private:
name = Name()
name.surname = "[Private]"
name.first_name = "[Private]"
# FIXME: protect everything else; what if name.private?
context["name"] = name
context["tview"] = _("Person")
elif view == "place": elif view == "place":
try: try:
obj = Place.objects.get(handle=handle) obj = Place.objects.get(handle=handle)
@ -281,19 +265,56 @@ 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)
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)
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
return render_to_response(view_template, context) return render_to_response(view_template, context)
def view(request, view): def view(request, view):
db_direct = DjangoDb() db = get_gramps_db(request)
if not request.user.is_authenticated():
#MODE_EXCLUDE_ALL = 0
#MODE_INCLUDE_LAST_NAME_ONLY = 1
#MODE_INCLUDE_FULL_NAME_ONLY = 2
db = LivingProxyDb(db_direct,
LivingProxyDb.MODE_INCLUDE_LAST_NAME_ONLY)
else:
db = db_direct
search = "" search = ""
if view == "event": if view == "event":
if request.user.is_authenticated(): if request.user.is_authenticated():
@ -315,9 +336,9 @@ def view(request, view):
view_template = 'view_events.html' view_template = 'view_events.html'
total = Event.objects.all().count() total = Event.objects.all().count()
elif view == "family": elif view == "family":
if request.GET.has_key("search"): if request.user.is_authenticated():
search = request.GET.get("search") if request.GET.has_key("search"):
if request.user.is_authenticated(): search = request.GET.get("search")
if "," in search: if "," in search:
surname, first = [term.strip() for term in surname, first = [term.strip() for term in
search.split(",", 1)] search.split(",", 1)]
@ -338,8 +359,12 @@ def view(request, view):
Q(mother__name__first_name__istartswith=search) Q(mother__name__first_name__istartswith=search)
) \ ) \
.order_by("gramps_id") .order_by("gramps_id")
else: else: # no search
# NON-AUTHENTICATED users object_list = Family.objects.all().order_by("gramps_id")
else:
# NON-AUTHENTICATED users
if request.GET.has_key("search"):
search = request.GET.get("search")
if "," in search: if "," in search:
search, trash = [term.strip() for term in search.split(",", 1)] search, trash = [term.strip() for term in search.split(",", 1)]
object_list = Family.objects \ object_list = Family.objects \
@ -347,15 +372,18 @@ def view(request, view):
Q(family_rel_type__name__icontains=search) | Q(family_rel_type__name__icontains=search) |
Q(father__name__surname__istartswith=search) | Q(father__name__surname__istartswith=search) |
Q(mother__name__surname__istartswith=search)) & Q(mother__name__surname__istartswith=search)) &
Q(private=False) Q(private=False) &
Q(mother__private=False) &
Q(father__private=False)
) \ ) \
.order_by("gramps_id") .order_by("gramps_id")
else: # no search
if request.user.is_authenticated():
object_list = Family.objects.all().order_by("gramps_id")
else: else:
# NON-AUTHENTICATED users object_list = Family.objects \
object_list = Family.objects.filter(private=False).order_by("gramps_id") .filter(Q(private=False) &
Q(mother__private=False) &
Q(father__private=False)
) \
.order_by("gramps_id")
view_template = 'view_families.html' view_template = 'view_families.html'
total = Family.objects.all().count() total = Family.objects.all().count()
elif view == "media": elif view == "media":
@ -395,9 +423,9 @@ def view(request, view):
view_template = 'view_notes.html' view_template = 'view_notes.html'
total = Note.objects.all().count() total = Note.objects.all().count()
elif view == "person": elif view == "person":
if request.GET.has_key("search"): if request.user.is_authenticated():
search = request.GET.get("search") if request.GET.has_key("search"):
if request.user.is_authenticated(): search = request.GET.get("search")
if "," in search: if "," in search:
surname, first_name = [term.strip() for term in surname, first_name = [term.strip() for term in
search.split(",", 1)] search.split(",", 1)]
@ -417,7 +445,11 @@ def view(request, view):
) \ ) \
.order_by("surname", "first_name") .order_by("surname", "first_name")
else: else:
# BEGIN NON-AUTHENTICATED users object_list = Name.objects.all().order_by("surname", "first_name")
else:
# BEGIN NON-AUTHENTICATED users
if request.GET.has_key("search"):
search = request.GET.get("search")
if "," in search: if "," in search:
search, trash = [term.strip() for term in search.split(",", 1)] search, trash = [term.strip() for term in search.split(",", 1)]
object_list = Name.objects \ object_list = Name.objects \
@ -426,15 +458,12 @@ def view(request, view):
Q(person__private=False) Q(person__private=False)
) \ ) \
.order_by("surname", "first_name") .order_by("surname", "first_name")
# END NON-AUTHENTICATED users
else:
if request.user.is_authenticated():
object_list = Name.objects.all().order_by("surname", "first_name")
else: else:
# BEGIN NON-AUTHENTICATED users object_list = Name.objects \
object_list = Name.objects.filter(Q(private=False) & .filter(Q(private=False) &
Q(person__private=False)).order_by("surname", "first_name") Q(person__private=False)) \
# END NON-AUTHENTICATED users .order_by("surname", "first_name")
# END NON-AUTHENTICATED users
view_template = 'view_people.html' view_template = 'view_people.html'
total = Name.objects.all().count() total = Name.objects.all().count()
elif view == "place": elif view == "place":

View File

@ -67,6 +67,8 @@ urlpatterns += patterns('',
(r'^(?P<view>(\w+))/$', view), (r'^(?P<view>(\w+))/$', view),
url(r'^person/(?P<handle>(\w+))/$', view_detail, url(r'^person/(?P<handle>(\w+))/$', view_detail,
{"view": "person"}, name="view-person-detail"), {"view": "person"}, name="view-person-detail"),
url(r'^person/(?P<handle>(\w+))/(?P<action>(\w+))$', view_detail,
{"view": "person"}, name="view-person-detail"),
(r'^(?P<view>(\w+))/(?P<handle>(\w+))/$', view_detail), (r'^(?P<view>(\w+))/(?P<handle>(\w+))/$', view_detail),
(r'^person/(?P<handle>(\w+))/name/(?P<order>(\w+))$', view_name_detail), (r'^person/(?P<handle>(\w+))/name/(?P<order>(\w+))$', view_name_detail),
(r'^person/(?P<handle>(\w+))/name/(?P<order>(\w+))/(?P<action>(\w+))$', view_name_detail), (r'^person/(?P<handle>(\w+))/name/(?P<order>(\w+))/(?P<action>(\w+))$', view_name_detail),

View File

@ -62,17 +62,28 @@ 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', util_filters = [
'person_attribute_table', 'nbsp',
'person_address_table', 'person_note_table', 'render',
'person_gallery_table', 'person_internet_table', ]
'person_association_table', 'person_lds_table',
'person_reference_table', util_tags = [
'family_children_table', 'family_event_table', "get_person_from_handle",
'family_attribute_table', "event_table",
'family_note_table', 'family_gallery_table', "name_table",
'family_lds_table', "source_table",
'nbsp', 'render'] "note_table",
"attribute_table",
"address_table",
"gallery_table",
"internet_table",
"association_table",
"lds_table",
"reference_table",
"children_table",
"make_button",
]
#------------------------------------------------------------------------ #------------------------------------------------------------------------
# #
# Module Constants # Module Constants
@ -89,6 +100,14 @@ def register_plugins():
pmgr = BasePluginManager.get_instance() pmgr = BasePluginManager.get_instance()
return pmgr return pmgr
def get_person_from_handle(db, handle):
# db is a Gramps Db interface
# handle is a Person Handle
try:
return db.get_person_from_handle(handle)
except:
return None
def probably_alive(handle): def probably_alive(handle):
db = DjangoDb() db = DjangoDb()
person = db.get_person_from_handle(handle) person = db.get_person_from_handle(handle)
@ -160,10 +179,11 @@ def render(formfield, action):
retval = formfield.as_widget() retval = formfield.as_widget()
return retval return retval
def make_button(text, url): def make_button(text, url, *args):
return """[<a href="%s">%s</a>]""" % (url, text) url = url % args
return """[ <a href="%s">%s</a> ] """ % (url, text)
def person_event_table(djperson, user): def event_table(obj, user, action, url=None, *args):
retval = "" retval = ""
table = Table() table = Table()
table.columns(_("Description"), table.columns(_("Description"),
@ -173,9 +193,9 @@ def person_event_table(djperson, user):
_("Place"), _("Place"),
_("Role")) _("Role"))
if user.is_authenticated(): if user.is_authenticated():
obj_type = ContentType.objects.get_for_model(djperson) obj_type = ContentType.objects.get_for_model(obj)
event_ref_list = models.EventRef.objects.filter( event_ref_list = models.EventRef.objects.filter(
object_id=djperson.id, object_id=obj.id,
object_type=obj_type).order_by("order") object_type=obj_type).order_by("order")
event_list = [(obj.ref_object, obj) for obj in event_ref_list] event_list = [(obj.ref_object, obj) for obj in event_ref_list]
for (djevent, event_ref) in event_list: for (djevent, event_ref) in event_list:
@ -187,12 +207,13 @@ def person_event_table(djperson, user):
get_title(djevent.place), get_title(djevent.place),
str(event_ref.role_type)) str(event_ref.role_type))
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 event"), "/person/%s/event/add" % djperson.handle) retval += make_button(_("Add event"), (url + "/add") % args)
else:
retval += nbsp("") # to keep tabs same height
return retval return retval
def person_name_table(djperson, user): def name_table(obj, user, action, url=None, *args):
print "person_name_table", djperson, user
retval = "" retval = ""
table = Table() table = Table()
table.columns(_("Name"), table.columns(_("Name"),
@ -202,7 +223,7 @@ def person_name_table(djperson, user):
_("Note Preview")) _("Note Preview"))
if user.is_authenticated(): if user.is_authenticated():
links = [] links = []
for name in djperson.name_set.all().order_by("order"): for name in obj.name_set.all().order_by("order"):
obj_type = ContentType.objects.get_for_model(name) obj_type = ContentType.objects.get_for_model(name)
sourceq = dji.SourceRef.filter(object_type=obj_type, sourceq = dji.SourceRef.filter(object_type=obj_type,
object_id=name.id).count() > 0 object_id=name.id).count() > 0
@ -219,12 +240,15 @@ def person_name_table(djperson, user):
name.group_as, name.group_as,
["No", "Yes"][sourceq], ["No", "Yes"][sourceq],
note) note)
links.append(('URL', "/person/%s/name/%s" % links.append(('URL',
(name.person.handle, name.order))) # url is "/person/%s/name"
(url % name.person.handle) + ("/%s" % name.order)))
table.links(links) table.links(links)
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 name"), "/person/%s/name/add" % djperson.handle) retval += make_button(_("Add name"), (url + "/add") % args)
else:
retval += nbsp("") # to keep tabs same height
return retval return retval
def source_table(obj, user, action, url=None, *args): def source_table(obj, user, action, url=None, *args):
@ -247,28 +271,56 @@ def source_table(obj, user, action, url=None, *args):
) )
retval += table.get_html() retval += table.get_html()
if user.is_authenticated() and url and action != "edit": if user.is_authenticated() and url and action != "edit":
retval += make_button(_("Add source"), url % args) retval += make_button(_("Add source"), (url + "/add") % args)
else:
retval += nbsp("") # to keep tabs same height
return retval return retval
def person_attribute_table(djperson, user): def note_table(obj, user, action, url=None, *args):
retval = ""
table = Table()
table.columns(
_("ID"),
_("Type"),
_("Note"))
if user.is_authenticated():
obj_type = ContentType.objects.get_for_model(obj)
note_refs = dji.NoteRef.filter(object_type=obj_type,
object_id=obj.id)
for note_ref in note_refs:
note = table.db.get_note_from_handle(
note_ref.ref_object.handle)
table.row(table.db.get_note_from_handle(note.handle),
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":
retval += make_button(_("Add note"), (url + "/add") % args)
else:
retval += nbsp("") # to keep tabs same height
return retval
def attribute_table(obj, user, action, url=None, *args):
retval = "" retval = ""
table = Table() table = Table()
table.columns(_("Type"), table.columns(_("Type"),
_("Value"), _("Value"),
) )
if user.is_authenticated(): if user.is_authenticated():
obj_type = ContentType.objects.get_for_model(djperson) obj_type = ContentType.objects.get_for_model(obj)
attributes = dji.Attribute.filter(object_type=obj_type, attributes = dji.Attribute.filter(object_type=obj_type,
object_id=djperson.id) object_id=obj.id)
for attribute in attributes: for attribute in attributes:
table.row(attribute.attribute_type.name, table.row(attribute.attribute_type.name,
attribute.value) attribute.value)
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 attribute"), "/person/%s/attribute/add" % djperson.handle) retval += make_button(_("Add attribute"), (url + "/add") % args)
else:
retval += nbsp("") # to keep tabs same height
return retval return retval
def person_address_table(djperson, user): def address_table(obj, user, action, url=None, *args):
retval = "" retval = ""
table = Table() table = Table()
table.columns(_("Date"), table.columns(_("Date"),
@ -277,7 +329,7 @@ def person_address_table(djperson, user):
_("State"), _("State"),
_("Country")) _("Country"))
if user.is_authenticated(): if user.is_authenticated():
for address in djperson.address_set.all().order_by("order"): for address in obj.address_set.all().order_by("order"):
locations = address.location_set.all().order_by("order") locations = address.location_set.all().order_by("order")
for location in locations: for location in locations:
table.row(display_date(address), table.row(display_date(address),
@ -286,77 +338,63 @@ def person_address_table(djperson, user):
location.state, location.state,
location.country) location.country)
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 address"), "/person/%s/address/add" % djperson.handle) retval += make_button(_("Add address"), (url + "/add") % args)
else:
retval += nbsp("") # to keep tabs same height
return retval return retval
def person_note_table(djperson, user): def gallery_table(obj, user, action, url=None, *args):
retval = ""
table = Table()
table.columns(
_("ID"),
_("Type"),
_("Note"))
if user.is_authenticated():
obj_type = ContentType.objects.get_for_model(djperson)
note_refs = dji.NoteRef.filter(object_type=obj_type,
object_id=djperson.id)
for note_ref in note_refs:
note = table.db.get_note_from_handle(
note_ref.ref_object.handle)
table.row(table.db.get_note_from_handle(note.handle),
str(note_ref.ref_object.note_type),
note_ref.ref_object.text[:50])
retval += table.get_html()
if user.is_authenticated():
retval += make_button(_("Add note"), "/person/%s/note/add" % djperson.handle)
return retval
def person_gallery_table(djperson, user):
retval = "" retval = ""
table = Table() table = Table()
table.columns(_("Name"), table.columns(_("Name"),
_("Type"), _("Type"),
) )
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 gallery"), "/person/%s/gallery/add" % djperson.handle) retval += make_button(_("Add gallery"), (url + "/add") % args)
else:
retval += nbsp("") # to keep tabs same height
return retval return retval
def person_internet_table(djperson, user): def internet_table(obj, user, action, url=None, *args):
retval = "" retval = ""
table = Table() table = Table()
table.columns(_("Type"), table.columns(_("Type"),
_("Path"), _("Path"),
_("Description")) _("Description"))
if user.is_authenticated(): if user.is_authenticated():
urls = dji.Url.filter(person=djperson) urls = dji.Url.filter(person=obj)
for url in urls: for url in urls:
table.row(str(url.url_type), table.row(str(url.url_type),
url.path, url.path,
url.desc) url.desc)
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 internet"), "/person/%s/internet/add" % djperson.handle) retval += make_button(_("Add internet"), (url + "/add") % args)
else:
retval += nbsp("") # to keep tabs same height
return retval return retval
def person_association_table(djperson, user): def association_table(obj, user, action, url=None, *args):
retval = "" retval = ""
table = Table() table = Table()
table.columns(_("Name"), table.columns(_("Name"),
_("ID"), _("ID"),
_("Association")) _("Association"))
if user.is_authenticated(): if user.is_authenticated():
gperson = table.db.get_person_from_handle(djperson.handle) gperson = table.db.get_person_from_handle(obj.handle)
associations = gperson.get_person_ref_list() associations = gperson.get_person_ref_list()
for association in associations: for association in associations:
table.row() table.row()
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 association"), "/person/%s/association/add" % djperson.handle) retval += make_button(_("Add association"), (url + "/add") % args)
else:
retval += nbsp("") # to keep tabs same height
return retval return retval
def person_lds_table(djperson, user): def lds_table(obj, user, action, url=None, *args):
retval = "" retval = ""
table = Table() table = Table()
table.columns(_("Type"), table.columns(_("Type"),
@ -365,8 +403,8 @@ def person_lds_table(djperson, user):
_("Temple"), _("Temple"),
_("Place")) _("Place"))
if user.is_authenticated(): if user.is_authenticated():
obj_type = ContentType.objects.get_for_model(djperson) obj_type = ContentType.objects.get_for_model(obj)
ldss = djperson.lds_set.all().order_by("order") ldss = obj.lds_set.all().order_by("order")
for lds in ldss: for lds in ldss:
table.row(str(lds.lds_type), table.row(str(lds.lds_type),
display_date(lds), display_date(lds),
@ -374,25 +412,29 @@ def person_lds_table(djperson, user):
lds.temple, lds.temple,
get_title(lds.place)) get_title(lds.place))
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 LDS"), "/person/%s/lds/add" % djperson.handle) retval += make_button(_("Add LDS"), (url + "/add") % args)
else:
retval += nbsp("") # to keep tabs same height
return retval return retval
def person_reference_table(djperson, user): def reference_table(obj, user, action, url=None, *args):
retval = "" retval = ""
table = Table() table = Table()
table.columns(_("Type"), table.columns(_("Type"),
_("ID"), _("ID"),
_("Name")) _("Name"))
if user.is_authenticated(): if user.is_authenticated():
references = dji.PersonRef.filter(ref_object=djperson) references = dji.PersonRef.filter(ref_object=obj)
for reference in references: for reference in references:
table.row(str(reference.ref_object), table.row(str(reference.ref_object),
reference.ref_object.gramps_id, reference.ref_object.gramps_id,
make_name(reference.ref_object.name_set, user)) make_name(reference.ref_object.name_set, user))
return table.get_html() retval += table.get_html()
retval += nbsp("") # to keep tabs same height
return retval
def family_children_table(djfamily, user): def children_table(obj, user, action, url=None, *args):
retval = "" retval = ""
table = Table() table = Table()
table.columns( table.columns(
@ -407,74 +449,7 @@ def family_children_table(djfamily, user):
#if user.is_authenticated(): #if user.is_authenticated():
#for djfamily: #for djfamily:
# table.row("test") # table.row("test")
return table.get_html() retval += nbsp("") # to keep tabs same height
def family_event_table(djfamily, user):
retval = ""
table = Table()
table.columns(
_("Description"),
_("Type"),
_("ID"),
_("Date"),
_("Place"),
_("Role"),
)
table.row("test")
return table.get_html()
def family_source_table(djfamily, user):
retval = ""
table = Table()
table.columns(
_("ID"),
_("Type"),
_("Author"),
_("Page"),
)
table.row("test")
return table.get_html()
def family_attribute_table(djfamily, user):
retval = ""
table = Table()
table.columns(
_("Type"),
_("Value"),
)
table.row("test")
return table.get_html()
def family_note_table(djfamily, user):
retval = ""
table = Table()
table.columns(
_("Type"),
_("Preview"),
)
table.row("test")
return table.get_html()
def family_gallery_table(djfamily, user):
retval = ""
table = Table()
table.columns(
_("Column"),
)
table.row("test")
return table.get_html()
def family_lds_table(djfamily, user):
retval = ""
table = Table()
table.columns(
_("Type"),
_("Date"),
_("Status"),
_("Temple"),
_("Place"),
)
table.row("test")
return table.get_html() return table.get_html()
## FIXME: these dji function wrappers just use the functions ## FIXME: these dji function wrappers just use the functions
@ -488,14 +463,14 @@ def get_title(place):
def person_get_birth_date(person): def person_get_birth_date(person):
db = DjangoDb() db = DjangoDb()
event = get_birth_or_fallback(db, person) event = get_birth_or_fallback(db, db.get_person_from_handle(person.handle))
if event: if event:
return event.date return event.date
return None return None
def person_get_death_date(person): def person_get_death_date(person):
db = DjangoDb() db = DjangoDb()
event = get_death_or_fallback(db, person) event = get_death_or_fallback(db, db.get_person_from_handle(person.handle))
if event: if event:
return event.date return event.date
return None return None
@ -530,7 +505,7 @@ def person_get_event(person, event_type=None):
for event_handle in event_ref_list] for event_handle in event_ref_list]
return [j for i in retval for j in i] return [j for i in retval for j in i]
def make_name(name, user=None): def make_name(name, user):
if isinstance(name, models.Name): if isinstance(name, models.Name):
surname = name.surname.strip() surname = name.surname.strip()
if not surname: if not surname:
@ -560,6 +535,9 @@ def make_name(name, user=None):
return "[No preferred name]" return "[No preferred name]"
else: else:
return "%s, %s" % (name.get_surname(), name.get_first_name()) 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 else: # no name
return "" return ""