diff options
-rw-r--r-- | archaeological_files/models.py | 6 | ||||
-rw-r--r-- | archaeological_operations/models.py | 5 | ||||
-rw-r--r-- | ishtar_common/forms_common.py | 21 | ||||
-rw-r--r-- | ishtar_common/models.py | 26 | ||||
-rw-r--r-- | ishtar_common/templates/ishtar/sheet_person.html | 108 | ||||
-rw-r--r-- | ishtar_common/templates/ishtar/sheet_person_pdf.html | 18 | ||||
-rw-r--r-- | ishtar_common/templates/ishtar/sheet_person_window.html | 3 | ||||
-rw-r--r-- | ishtar_common/urls.py | 4 | ||||
-rw-r--r-- | ishtar_common/views.py | 41 |
9 files changed, 209 insertions, 23 deletions
diff --git a/archaeological_files/models.py b/archaeological_files/models.py index 7b7a7d9b5..49b9086d0 100644 --- a/archaeological_files/models.py +++ b/archaeological_files/models.py @@ -68,7 +68,7 @@ class File(BaseHistorizedItem, OwnPerms): null=True, max_length=60, unique=True) name = models.CharField(_(u"Name"), max_length=100, blank=True, null=True) file_type = models.ForeignKey(FileType, verbose_name=_(u"File type")) - in_charge = models.ForeignKey(Person, related_name='+', + in_charge = models.ForeignKey(Person, related_name='file_responsability', verbose_name=_(u"Person in charge"), blank=True, null=True) general_contractor = models.ForeignKey(Person, related_name='+', @@ -180,6 +180,10 @@ class File(BaseHistorizedItem, OwnPerms): def is_active(self): return not bool(self.end_date) + @property + def town_list(self): + return u", ".join([unicode(tw) for tw in self.towns.all()]) + def closing(self): if self.is_active(): return diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py index 589d8d69e..6619bc72e 100644 --- a/archaeological_operations/models.py +++ b/archaeological_operations/models.py @@ -79,8 +79,9 @@ class Operation(BaseHistorizedItem, OwnPerms): excavation_end_date = models.DateField(_(u"Excavation end date"), null=True, blank=True) end_date = models.DateField(_(u"Closing date"), null=True, blank=True) - in_charge = models.ForeignKey(Person, related_name='+', null=True, - blank=True, verbose_name=_(u"In charge")) + in_charge = models.ForeignKey(Person, blank=True, null=True, + verbose_name=_(u"In charge"), + related_name='operation_responsability') year = models.IntegerField(_(u"Year"), null=True, blank=True) operation_code = models.IntegerField(_(u"Operation code"), null=True, blank=True) diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index db406aaa9..0a001883c 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -100,13 +100,28 @@ class OrganizationForm(forms.Form): new_item.save() return new_item +class PersonSelect(TableSelect): + name = forms.CharField(label=_(u"Name"), max_length=30) + surname = forms.CharField(label=_(u"Surname"), max_length=20) + email = forms.CharField(label=_(u"Email"), max_length=40) + person_types = forms.ChoiceField(label=_(u"Type"), choices=[]) + attached_to = forms.IntegerField(label=_("Organization"), + widget=widgets.JQueryAutoComplete( + reverse_lazy('autocomplete-organization'), + associated_model=models.Organization), + validators=[models.valid_id(models.Organization)]) + + def __init__(self, *args, **kwargs): + super(PersonSelect, self).__init__(*args, **kwargs) + self.fields['person_types'].choices = models.PersonType.get_types() + class PersonFormSelection(forms.Form): form_label = _(u"Person search") associated_models = {'pk':models.Person} currents = {'pk':models.Person} - pk = forms.IntegerField(label=_("Person"), - widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-person'), - associated_model=models.Person), + pk = forms.IntegerField(label="", + widget=widgets.JQueryJqGrid(reverse_lazy('get-person'), + PersonSelect, models.Person), validators=[models.valid_id(models.Person)]) class PersonForm(forms.Form): diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 738e86107..3f0cdc6b4 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -634,6 +634,8 @@ class Person(Address, OwnPerms) : ('Md', _(u'Mrs')), ('Dr', _(u'Doctor')), ) + TABLE_COLS = ('name', 'surname', 'email', 'person_types_list', + 'attached_to') title = models.CharField(_(u"Title"), max_length=2, choices=TYPE) surname = models.CharField(_(u"Surname"), max_length=20, blank=True, null=True) @@ -660,6 +662,11 @@ class Person(Address, OwnPerms) : if getattr(self, attr)] return u" ".join(values) + person_types_list_lbl = _(u"Types") + @property + def person_types_list(self): + return u", ".join([unicode(pt) for pt in self.person_types.all()]) + def has_right(self, right_name): if type(right_name) in (list, tuple): return bool( @@ -677,6 +684,13 @@ class Person(Address, OwnPerms) : if getattr(self, attr)] return u" ".join(values) + @property + def associated_filename(self): + values = [unicode(getattr(self, attr)) + for attr in ('surname', 'name', 'attached_to') + if getattr(self, attr)] + return slugify(u"-".join(values)) + class IshtarUser(User): person = models.ForeignKey(Person, verbose_name=_(u"Person"), unique=True) @@ -710,7 +724,8 @@ class AuthorType(GeneralType): verbose_name_plural = _(u"Author types") class Author(models.Model): - person = models.ForeignKey(Person, verbose_name=_(u"Person")) + person = models.ForeignKey(Person, verbose_name=_(u"Person"), + related_name='author') author_type = models.ForeignKey(AuthorType, verbose_name=_(u"Author type")) class Meta: @@ -720,6 +735,12 @@ class Author(models.Model): def __unicode__(self): return unicode(self.person) + settings.JOINT + unicode(self.author_type) + def related_sources(self): + return list(self.treatmentsource_related.all()) + \ + list(self.operationsource_related.all()) + \ + list(self.findsource_related.all()) + \ + list(self.contextrecordsource_related.all()) + class SourceType(GeneralType): class Meta: verbose_name = _(u"Source type") @@ -728,7 +749,8 @@ class SourceType(GeneralType): class Source(models.Model): title = models.CharField(_(u"Title"), max_length=300) source_type = models.ForeignKey(SourceType, verbose_name=_(u"Type")) - authors = models.ManyToManyField(Author, verbose_name=_(u"Authors")) + authors = models.ManyToManyField(Author, verbose_name=_(u"Authors"), + related_name="%(class)s_related") associated_url = models.URLField(verify_exists=False, blank=True, null=True, verbose_name=_(u"Numerical ressource (web address)")) receipt_date = models.DateField(blank=True, null=True, diff --git a/ishtar_common/templates/ishtar/sheet_person.html b/ishtar_common/templates/ishtar/sheet_person.html new file mode 100644 index 000000000..61b87654d --- /dev/null +++ b/ishtar_common/templates/ishtar/sheet_person.html @@ -0,0 +1,108 @@ +{% extends "ishtar/sheet.html" %} +{% load i18n %} +{% block content %} +<div class='tool'>{%trans "Export as:"%} <a href='{% url show-person item.pk "odt" %}'>{%trans "OpenOffice.org file"%}</a>, <a href='{% url show-person item.pk "pdf" %}'>{%trans "PDF file"%}</a></div> + +<h3>{% trans "Person"%}</h3> + +<p><label>{% trans "Name" %}</label> <span class='value'>{{item.name}}</span></p> +<p><label>{% trans "Surname" %}</label> <span class='value'>{{item.surname}}</span></p> +{% if item.email %}<p><label>{% trans "Email" %}</label> <span class='value'>{{item.email}}</span></p>{% endif %} +<p><label>{% trans "Type(s)" %}</label> <span class='value'>{{item.person_types_list}}</span></p> +{% if item.address %}<p><label>{% trans "Address" %}</label> <span class='value'>{{item.address}}</span></p> {% endif %} +{% if item.address_complement %}<p><label>{% trans "Address complement" %}</label> <span class='value'>{{item.address_complement}}</span></p> {% endif %} +{% if item.postal_code %}<p><label>{% trans "Postal code" %}</label> <span class='value'>{{item.postal_code}}</span></p> {% endif %} +{% if item.town %}<p><label>{% trans "Town" %}</label> <span class='value'>{{item.town}}</span></p> {% endif %} +{% if item.phone %}<p><label>{% trans "Phone" %}</label> <span class='value'>{{item.phone}}</span></p> {% endif %} +{% if item.mobile_phone %}<p><label>{% trans "Mobile phone" %}</label> <span class='value'>{{item.mobile_phone}}</span></p> {% endif %} + + +{% if item.organization %}<h3>{% trans "Associated organization"%}</h3> +<p><label>{% trans "Name" %}</label> <span class='value'>{{item.organization}}</span></p> +{% if item.organization.address %}<p><label>{% trans "Address" %}</label> <span class='value'>{{item.organization.address}}</span></p> {% endif %} +{% if item.organization.address_complement %}<p><label>{% trans "Address complement" %}</label> <span class='value'>{{item.organization.address_complement}}</span></p> {% endif %} +{% if item.organization.postal_code %}<p><label>{% trans "Postal code" %}</label> <span class='value'>{{item.organization.postal_code}}</span></p> {% endif %} +{% if item.organization.town %}<p><label>{% trans "Town" %}</label> <span class='value'>{{item.organization.town}}</span></p> {% endif %} +{% if item.organization.phone %}<p><label>{% trans "Phone" %}</label> <span class='value'>{{item.organization.phone}}</span></p> {% endif %} +{% if item.organization.mobile_phone %}<p><label>{% trans "Mobile phone" %}</label> <span class='value'>{{item.organization.mobile_phone}}</span></p> {% endif %} +{% endif %} + + +<table> + <caption>{%trans "Associated operations"%}</caption> + <tr> + <th>{% trans "Year" %}</th> + <th>{% trans "Ref." %}</th> + <th>Code Patriarche</th> + <th>{% trans "Type" %}</th> + <th>{% trans "In charge" %}</th> + <th>{% trans "Start date" %}</th> + <th>{% trans "Excavation end date" %}</th> + <th class='link'> </th> + </tr> + {% for operation in item.operation_responsability.all %} + <tr> + <td>{{operation.year|default:""}}</td> + <td>{{operation.operation_code|default:""}}</td> + <td>{{operation.code_patriarche|default:""}}</td> + <td class='string'>{{operation.operation_type}}</td> + <td class='string'>{{operation.in_charge|default:""}}</td> + <td>{{operation.start_date|default:""}}</td> + <td>{{operation.excavation_end_date|default:""}}</td> + <td class='link'><a href="#" onclick='load_window("{%url show-operation operation.pk ''%}")'>{% trans "Details" %}</a></td> + </tr> + {% empty %} + <tr><td colspan="8" class='no_items'>{% trans "No operation associated to this person" %}</td></tr> + {% endfor %} +</table> + +<table> + <caption>{%trans "Associated archaelogical files"%}</caption> + <tr> + <th>{% trans "Ref." %}</th> + <th>{% trans "Year" %}</th> + <th>{% trans "Internal ref." %}</th> + <th>{% trans "File type" %}</th> + <th>Type de saisine</th> + <th>{% trans "Towns" %}</th> + <th class='link'> </th> + </tr> + {% for file in item.file_responsability.all %} + <tr> + <td>{{file.numeric_reference}}</td> + <td>{{file.year}}</td> + <td>{{file.internal_reference}}</td> + <td>{{file.file_type}}</td> + <td>{{file.saisine_type}}</td> + <td class='string'>{{file.town_list}}</td> + <td class='link'><a href="#" onclick='load_window("{%url show-file file.pk ''%}")'>{% trans "Details" %}</a></td> + </tr> + {% empty %} + <tr><td colspan="8" class='no_items'>{% trans "No archaelogical file associated to this person" %}</td></tr> + {% endfor %} +</table> + +<table> + <caption>{%trans "Documents"%}</caption> + <tr> + <th>{% trans "Year" %}</th> + <th>{% trans "Title" %}</th> + <th>{% trans "Type" %}</th> + <th>{% trans "Link" %}</th> + </tr> + {% for author in item.author.all %} + {% for doc in author.related_sources %} + <tr> + <td class='string'>{{ doc.creation_date|date:"Y"}}</td> + <td class='string'>{{ doc.title }}</td> + <td class='string'>{{ doc.source_type }}</td> + <td class='string'>{% if doc.associated_url %}<a href='{{doc.associated_url}}'>{% trans "Link"%}</a>{% endif %}</td> + </tr> + {% empty %} + <tr><td colspan="4" class='no_items'>{% trans "No document associated to this person" %}</td></tr> + {% endfor %} + {% endfor %} +</table> + + +{% endblock %} diff --git a/ishtar_common/templates/ishtar/sheet_person_pdf.html b/ishtar_common/templates/ishtar/sheet_person_pdf.html new file mode 100644 index 000000000..1abc70243 --- /dev/null +++ b/ishtar_common/templates/ishtar/sheet_person_pdf.html @@ -0,0 +1,18 @@ +{% extends "ishtar/sheet_person.html" %} +{% block header %} +<link rel="stylesheet" href="{{STATIC_URL}}/media/style_basic.css" /> +{% endblock %} +{% block main_head %} +{{ block.super }} +<div id="pdfheader"> +Ishtar – {{APP_NAME}} – {{item}} +</div> +{% endblock %} +{%block head_sheet%}{%endblock%} +{%block main_foot%} +<div id="pdffooter"> +– <pdf:pagenumber/> – +</div> +</body> +</html> +{%endblock%} diff --git a/ishtar_common/templates/ishtar/sheet_person_window.html b/ishtar_common/templates/ishtar/sheet_person_window.html new file mode 100644 index 000000000..4e8d874cd --- /dev/null +++ b/ishtar_common/templates/ishtar/sheet_person_window.html @@ -0,0 +1,3 @@ +{% extends "ishtar/sheet_person.html" %} +{% block main_head %}{%endblock%} +{% block main_foot %}{%endblock%} diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py index 597327379..a11c989d5 100644 --- a/ishtar_common/urls.py +++ b/ishtar_common/urls.py @@ -56,6 +56,10 @@ urlpatterns += patterns('ishtar_common.views', 'new_person', name='new-person'), url(r'autocomplete-person/([0-9_]+)?$', 'autocomplete_person', name='autocomplete-person'), + url(r'get-person/(?P<type>.+)?$', 'get_person', + name='get-person'), + url(r'show-person/(?P<pk>.+)?/(?P<type>.+)?$', + 'show_person', name='show-person'), url(r'autocomplete-town/?$', 'autocomplete_town', name='autocomplete-town'), url(r'new-author/(?P<parent_name>.+)?/$', diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 554fcc839..2278cf47a 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -374,21 +374,23 @@ def show_item(model, name): date = 'date' in dct and dct.pop('date') dct['window_id'] = "%s-%d-%s" % (name, item.pk, datetime.datetime.now().strftime('%M%s')) - if date: - try: - date = datetime.datetime.strptime(date, '%Y-%m-%dT%H:%M:%S.%f') - item = item.get_previous(date=date) - assert item != None - except (ValueError, AssertionError): - return HttpResponse(None, mimetype='text/plain') - dct['previous'] = item._previous - dct['next'] = item._next - else: - historized = item.history.all() - if historized: - item.history_date = historized[0].history_date - if len(historized) > 1: - dct['previous'] = historized[1].history_date + if hasattr(item, 'history'): + if date: + try: + date = datetime.datetime.strptime(date, + '%Y-%m-%dT%H:%M:%S.%f') + item = item.get_previous(date=date) + assert item != None + except (ValueError, AssertionError): + return HttpResponse(None, mimetype='text/plain') + dct['previous'] = item._previous + dct['next'] = item._next + else: + historized = item.history.all() + if historized: + item.history_date = historized[0].history_date + if len(historized) > 1: + dct['previous'] = historized[1].history_date dct['item'], dct['item_name'] = item, name context_instance = RequestContext(request) context_instance.update(dct) @@ -545,6 +547,15 @@ def new_item(model, frm): new_person = new_item(models.Person, PersonForm) new_organization = new_item(models.Organization, OrganizationForm) new_author = new_item(models.Author, AuthorForm) +show_person = show_item(models.Person, 'person') +get_person = get_item(models.Person, + 'get_person', 'person', + extra_request_keys={ + 'name':'name__icontains', + 'surname':'surname__icontains', + 'attached_to':'attached_to__pk', + 'person_types':'person_types__pk__in', + },) def action(request, action_slug, obj_id=None, *args, **kwargs): """ |