diff options
Diffstat (limited to 'ishtar')
| -rw-r--r-- | ishtar/__init__.py | 5 | ||||
| -rw-r--r-- | ishtar/furnitures/models.py | 9 | ||||
| -rw-r--r-- | ishtar/furnitures/urls.py | 5 | ||||
| -rw-r--r-- | ishtar/furnitures/views.py | 62 | ||||
| -rw-r--r-- | ishtar/settings.py.example | 2 | ||||
| -rw-r--r-- | ishtar/templates/sheet.html | 16 | ||||
| -rw-r--r-- | ishtar/templates/sheet_file.html | 151 | ||||
| -rw-r--r-- | ishtar/templates/sheet_file_window.html | 3 | 
8 files changed, 169 insertions, 84 deletions
diff --git a/ishtar/__init__.py b/ishtar/__init__.py index 128bebf23..d9bcb5701 100644 --- a/ishtar/__init__.py +++ b/ishtar/__init__.py @@ -2,4 +2,7 @@  from django.utils.translation import ugettext as _  _("username")  _("email address") - +if settings.XHTML2ODT_PATH: +    import sys +    sys.path.append(settings.XHTML2ODT_PATH) +    from xhtml2odt import xhtml2odt diff --git a/ishtar/furnitures/models.py b/ishtar/furnitures/models.py index 3b73baba0..ce94e4042 100644 --- a/ishtar/furnitures/models.py +++ b/ishtar/furnitures/models.py @@ -237,7 +237,7 @@ class Person(Address, OwnPerms) :          return lbl      def full_label(self): -        return " ".join([getattr(self, attr) +        return u" ".join([unicode(getattr(self, attr))                           for attr in ('title', 'surname', 'name', 'attached_to')                           if getattr(self, attr)]) @@ -360,6 +360,11 @@ class File(BaseHistorizedItem, OwnPerms):          if self.total_developed_surface:              return self.total_developed_surface/10000.0 +    def operation_acts(self): +        return [act for act in +                [ope.administrative_act.all() for ope in self.operations.all()] +               ] +      def is_preventive(self):          return FileType.is_preventive(self.file_type.pk) @@ -391,7 +396,7 @@ class Operation(BaseHistorizedItem, OwnPerms):                                    blank=True, verbose_name=_(u"In charge"))      year = models.IntegerField(_(u"Year"))      operation_code = models.IntegerField(_(u"Operation code")) -    associated_file = models.ForeignKey(File, related_name='+', +    associated_file = models.ForeignKey(File, related_name='operations',                                   verbose_name=_(u"File"), blank=True, null=True)      operation_type = models.ForeignKey(OperationType, related_name='+',                                         verbose_name=_(u"Operation type")) diff --git a/ishtar/furnitures/urls.py b/ishtar/furnitures/urls.py index 5123609fc..c93f14c78 100644 --- a/ishtar/furnitures/urls.py +++ b/ishtar/furnitures/urls.py @@ -87,13 +87,14 @@ urlpatterns += patterns('ishtar.furnitures.views',                                        name='autocomplete-file'),       url(BASE_URL + r'get-file/(?P<type>.+)?$', 'get_file',                                        name='get-file'), -     url(BASE_URL + r'show-file/(?P<pk>.+)?$', 'show_file', +     url(BASE_URL + r'show-file/(?P<pk>.+)?/(?P<type>.+)?$', 'show_file',                                        name='show-file'),       url(BASE_URL + r'autocomplete-operation/$', 'autocomplete_operation',                                        name='autocomplete-operation'),       url(BASE_URL + r'get-operation/(?P<type>.+)?$', 'get_operation',                                        name='get-operation'), -     url(BASE_URL + r'show-operation/(?P<pk>.+)?$', 'show_operation', +     url(BASE_URL + r'show-operation/(?P<pk>.+)?/(?P<type>.+)?$', +                                      'show_operation',                                        name='show-operation'),       url(BASE_URL + r'update-current-item/$', 'update_current_item',                                        name='update-current-item'), diff --git a/ishtar/furnitures/views.py b/ishtar/furnitures/views.py index 8511022a4..34d5c4655 100644 --- a/ishtar/furnitures/views.py +++ b/ishtar/furnitures/views.py @@ -24,9 +24,12 @@ Furnitures views  import csv  import json  import datetime +import optparse +from tempfile import NamedTemporaryFile  from django.http import HttpResponse, Http404 -from django.template import RequestContext +from django.template import RequestContext, loader +from django.template.defaultfilters import slugify  from django.shortcuts import render_to_response, redirect  from django.utils.translation import ugettext, ugettext_lazy as _  from django.core.exceptions import ObjectDoesNotExist @@ -35,6 +38,11 @@ from django.db.models import Q  from django.core import serializers  from ishtar import settings +if settings.XHTML2ODT_PATH: +    import sys +    sys.path.append(settings.XHTML2ODT_PATH) +    from xhtml2odt import xhtml2odt +  from menus import menu  import forms as ishtar_forms  import models @@ -190,7 +198,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[]):              for data in datas:                  res = {'id':data[0],                         'link':link_template % reverse('show-'+default_name, -                                                      args=[data[0]])} +                                                      args=[data[0], ''])}                  for idx, value in enumerate(data[1:]):                      if value:                          res[model.TABLE_COLS[idx].split('.')[-1]] = value @@ -229,9 +237,55 @@ def show_item(model, name):              item = model.objects.get(pk=pk)          except ObjectDoesNotExist:              return HttpResponse(None) +        doc_type = 'type' in dct and dct.pop('type')          dct['item'] = item -        return render_to_response('sheet_%s.html' % name, dct, -                              context_instance=RequestContext(request)) +        context_instance = RequestContext(request) +        context_instance.update(dct) +        if doc_type == "odt" and settings.XHTML2ODT_PATH and \ +           settings.ODT_TEMPLATE: +            tpl = loader.get_template('sheet_%s.html' % name) +            content = tpl.render(context_instance) +            try: +                ht, odt = NamedTemporaryFile(), NamedTemporaryFile() +                ht.write(content.encode('utf-8')) +                options = optparse.Values() +                options.input = ht.name +                options.output = odt.name +                options.template = settings.ODT_TEMPLATE +                options.with_network = True +                for k, v in (('input', ht.name), +                             ('output', None), +                             ('template', settings.ODT_TEMPLATE), +                             ('with_network', True), +                             ('top_header_level', 1), +                             ('img_width', '8cm'), +                             ('img_height', '6cm'), +                             ('verbose', False), +                             ('replace_keyword', 'ODT-INSERT'), +                             ('cut_start', 'ODT-CUT-START'), +                             ('htmlid', None), +                             ('url', "#")): +                    setattr(options, k, v) +                htmlfile = xhtml2odt.HTMLFile(options) +                htmlfile.read() +                odtfile = xhtml2odt.ODTFile(options) +                odtfile.open() +                odtfile.import_xhtml(htmlfile.html) +                hop = odtfile.save() +            except xhtml2odt.ODTExportError, ex: +                return HttpResponse(content, content_type="application/xhtml") +            response = HttpResponse( +                            mimetype='application/vnd.oasis.opendocument.text') +            n = datetime.datetime.now() +            filename = u'%s_%s_%s.odt' % (name, slugify(unicode(item)), +                                          n.strftime('%Y%m%d-%H%M%S')) +            response['Content-Disposition'] = 'attachment; filename=%s'%filename +            response.write(hop) +            return response +        else: +            tpl = loader.get_template('sheet_%s_window.html' % name) +            content = tpl.render(context_instance) +            return HttpResponse(content, content_type="application/xhtml")      return func  get_file = get_item(models.File, 'get_file', 'file') diff --git a/ishtar/settings.py.example b/ishtar/settings.py.example index 99017d049..4b3388389 100644 --- a/ishtar/settings.py.example +++ b/ishtar/settings.py.example @@ -11,6 +11,8 @@ ROOT_PATH = "/var/local/webapp/ishtar/ishtar/"  URL_PATH = ""  JQUERY_URL = "/javascript/jquery/jquery.js"  JQUERY_UI_URL = "/javascript/jquery-ui/" +XHTML2ODT_PATH = ROOT_PATH + "../xhtml2odt" +ODT_TEMPLATE = ROOT_PATH + "../static/template.odt"  LOGIN_REDIRECT_URL = "/" + URL_PATH  DEBUG = True diff --git a/ishtar/templates/sheet.html b/ishtar/templates/sheet.html index 9d1305c1d..a93b193e0 100644 --- a/ishtar/templates/sheet.html +++ b/ishtar/templates/sheet.html @@ -1,7 +1,23 @@  {% load i18n %} +{% block main_head %} +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" +    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> +    <link rel="shortcut icon" href="{{MEDIA_URL}}/media/images/favicon.png"> +    <title>{% block title %}Ishtar{% if APP_NAME %} - {{APP_NAME}}{%endif%}{% endblock %} +    </title> +    <link rel="stylesheet" href="{{MEDIA_URL}}/media/style.css" /> +</head> +<body> +{% endblock %}  <div class="sheet">  <div class="head"><a href='#' onclick='$("#window").hide("slow")'>{% trans "Close" %}</a></div>  <div class="body">  {% block content %}{% endblock %}  </div>  </div> +{%block main_foot%} +</body> +</html> +{%endblock%} diff --git a/ishtar/templates/sheet_file.html b/ishtar/templates/sheet_file.html index 57f1c00fc..ea0fc20bd 100644 --- a/ishtar/templates/sheet_file.html +++ b/ishtar/templates/sheet_file.html @@ -2,58 +2,53 @@  {% load i18n %}  {% block content %}  <h3>{% trans "General"%}</h3> -<p><label>{%trans "Year:"%}</label> {{ item.year }}</p> -<p><label>{%trans "Numerical reference:"%}</label> {{ item.numeric_reference }}</p> +<p><label>{%trans "Year:"%}</label><span class='value'>{{ item.year }}</span></p> +<p><label>{%trans "Numerical reference:"%}</label><span class='value'>{{ item.numeric_reference }}</span></p> -<p><label>{%trans "File's name:"%}</label> {{ item.internal_reference }}</p> +<p><label>{%trans "File's name:"%}</label><span class='value'>{{ item.internal_reference }}</span></p> -<p><label>{%trans "Edition date:"%}</label> {{ item.history.all.0.history_date }}</p> <!-- date = now --> -{% if item.reception_date %}<p><label>{%trans "Reception date:"%}</label> {{ item.reception_date }}</p>{% endif %} -<p><label>{%trans "Creation date:"%}</label> {{ item.creation_date }}</p> +<p><label>{%trans "Edition date:"%}</label><span class='value'>{{ item.history.all.0.history_date }}</span></p> <!-- date = now --> +{% if item.reception_date %}<p><label>{%trans "Reception date:"%}</label><span class='value'>{{ item.reception_date }}</span></p>{% endif %} +<p><label>{%trans "Creation date:"%}</label><span class='value'>{{ item.creation_date }}</span></p>  {% comment %}  {% if item.deadline_date and not item.acts %} -    <p>{%trans "Deadline"%} : {% item.deadline_date %}</p> <!-- calculated deadline for some preventive files , see saisine_type, not displayed if an act as been send --> +    <p><label>{%trans "Deadline:"%}</label><span class='value'>{% item.deadline_date %}</span></p> <!-- calculated deadline for some preventive files , see saisine_type, not displayed if an act as been send -->  {% endif %}  {% endcomment %} -<p><label>{%trans "In charge:"%}</label> {{ item.in_charge.full_label }}</p> -<p><label>{%trans "State"%}</label> -{% if item.is_active %}{%trans "Active file"%}</strong></p> -{% else %}{%trans "Closed file"%}</p> -<p><label>{%trans "Closing date:"%}</label> {{ item.closing.date }} <strong>{%trans "by" %}</strong> {{ item.closing.user }}</p> +<p><label>{%trans "In charge:"%}</label><span class='value'>{{ item.in_charge.full_label }}</span></p> +<p><label>{%trans "State"%}</label><span class='value'>{% if item.is_active %}{%trans "Active file"%}</span></p> +{% else %}{%trans "Closed file"%}</span></p> +<p><label>{%trans "Closing date:"%}</label><span class='value'>{{ item.closing.date }} <strong>{%trans "by" %}</strong> {{ item.closing.user }}</span></p>  {% endif %} -<p><label>{%trans "Type:"%}</label> {{ item.file_type }}</p> +<p><label>{%trans "Type:"%}</label><span class='value'>{{ item.file_type }}</span></p> -{% if item.related_file %}<p>{%trans "Related file:"%} {{ item.related_file }}</p>{% endif %} <!-- Displayed as Year/index/Commune/Common_name This should be a link to the file sheet of the related file --> -<p><label>{%trans "Comment:"%}</label> {{ item.comment }}</p> +{% if item.related_file %}<p><label>{%trans "Related file:"%}</label><span class='value'><a href='{% url show-file item.related_file.pk %}'>{{ item.related_file }}</a></span></p>{% endif %} <!-- Displayed as Year/index/Commune/Common_name This should be a link to the file sheet of the related file --> +{% if item.comment %}<p><label>{%trans "Comment:"%}</label><span class='value'>{{ item.comment }}</span></p>{%endif%}  <h3>{% trans "Localisation"%}</h3> -<p><label>{%trans "Towns:"%}</label> {{ item.towns.all|join:", " }}</p> +<p><label>{%trans "Towns:"%}</label><span class='value'>{{ item.towns.all|join:", " }}</span></p> -<p><label>{%trans "Main address:"%}</label> {{ item.address }}</p> -<p><label>{%trans "Complement:"%}</label> {{ item.complem_adress }}</p> -<p><label>{%trans "Postal code:"%}</label> {{ item.postal_code }}</p> +<p><label>{%trans "Main address:"%}</label><span class='value'>{{ item.address }}</span></p> +{% if item.address_complement %}<p><label>{%trans "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%} -<p><label>{%trans "Surface:"%}</label> {{ item.total_surface }} m<sup>2</sup> ({{ item.total_surface_ha }} ha)</p> +<p><label>{%trans "Surface:"%}</label><span class='value'>{{ item.total_surface }} m<sup>2</sup> ({{ item.total_surface_ha }} ha)</span></p>  {% if item.is_preventive %}  <h3>{% trans "Preventive archaelogical file"%}</h3> -<p><label>{%trans "Planed surface:"%}</label> {{ item.total_developed_surface }} m<sup>2</sup> ({{ item.total_developed_surface_ha }} ha)</p> -<p><label>{%trans "Saisine type:"%}</label> {{ item.saisine_type }}</p> -{% if item.town_planning_service %}<p><label>{%trans "Town planning service:"%}</label>{{ item.town_planning_service }}</p>{% endif %} -{% if item.permit_type %}<p><label>{%trans "Permit type:"%}</label> {{ item.permit_type }}</p>{% endif %} -{% if item.permit_reference %}<p><label>{%trans "Permit reference:"%}</label> {{ item.permit_reference }}</p>{% endif %} -{% if item.general_contractor.attached_to %}<p><label>{%trans "General contractor organisation:"%}</label> {{ item.general_contractor.attached_to }}</p>{% endif %} <!-- Contractor's organisation displayed as concat of Name/Adress/postal_code/city --> -{% if item.general_contractor %}<p><label>{%trans "General contractor:"%}</label> {{ item.general_contractor.full_label }}</p>{% endif %} -{% comment %} -<p>{%trans "Numerical reference"%} : {% item.index %}</p> <!-- index --> -{% endcomment %} +<p><label>{%trans "Planed surface:"%}</label><span class='value'>{{ item.total_developed_surface }} m<sup>2</sup> ({{ item.total_developed_surface_ha }} ha)</span></p> +<p><label>{%trans "Saisine type:"%}</label><span class='value'>{{ item.saisine_type }}</span></p> +{% if item.town_planning_service %}<p><label>{%trans "Town planning service:"%}</label><span class='value'>{{ item.town_planning_service }}</span></p>{% endif %} +{% if item.permit_type %}<p><label>{%trans "Permit type:"%}</label><span class='value'>{{ item.permit_type }}</span></p>{% endif %} +{% if item.permit_reference %}<p><label>{%trans "Permit reference:"%}</label><span class='value'>{{ item.permit_reference }}</span></p>{% endif %} +{% if item.general_contractor.attached_to %}<p><label>{%trans "General contractor organisation:"%}</label><span class='value'>{{ item.general_contractor.attached_to }}</span></p>{% endif %} <!-- Contractor's organisation displayed as concat of Name/Adress/postal_code/city --> +{% if item.general_contractor %}<p><label>{%trans "General contractor:"%}</label><span class='value'>{{ item.general_contractor.full_label }}</span></p>{% endif %}  {% endif %} -{% if item.administrative_act.all %}  <table>    <caption>{%trans "Admninistrative acts"%}</caption>    <tr> @@ -66,53 +61,59 @@    <tr>      <td>{{act.signature_date.year}}</td>      <td>{{act.ref_sra}}</td> -    <td>{{act.act_type}}</td> +    <td class='string'>{{act.act_type}}</td>      <td>{{act.signature_date}}</td>    </tr> +  {% empty %} +  <tr><td colspan="4" class='no_items'>{% trans "No administrative act associated to this archaelogical file" %}</td></tr>    {% endfor %}  </table> -{%endif%} -{% comment %} -<!-- associated operations --> -   -  <table class='adm_ope'> <!-- associated ope class--> -    <caption>{%trans "Associated operations"%}</caption> -    <tr> -    {% for label, in item.data_ope %} -        <th>{{label}}</th> -    {% endfor %} -    </tr> -        {% for data, in item.data_ope %} -            <tr> -        <td>{{year}}</td> -        <td>{{reference}}</td> -        <td>{{patriarche}}</td> -        <td>{{type}}</td> -        <td>{{head_scientist}}</td> -        <td>{{date_debut}}</td> -        <td>{{date_fin}}</td> -        <td>{{link_to_ope_sheet}}</td> -            </tr> -        {% endfor %} -  </table> -<!-- Operation's associated acts --> -   -  <table class='adm_acts'> <!-- associated acts class--> -    <caption>{%trans "Admninistrative acts linked to associated operations"%}</caption> -    <tr> -    {% for label, in item.ope.data_acts %} -        <th>{{label}}</th> -    {% endfor %} -    </tr> -        {% for data, in item.ope.data_acts %} -            <tr> -        <td>{{year}}</td> -        <td>{{reference}}</td> -        <td>{{type}}</td> -        <td>{{date}}</td> -            </tr> -        {% endfor %} -  </table> -{% endcomment %} +<table> +  <caption>{%trans "Associated operations"%}</caption> +  <tr> +    <th>{% trans "Year" %}</th> +    <th>{% trans "Reference" %}</th> +    <th>Code Patriarche</th> +    <th>{% trans "Type" %}</th> +    <th>{% trans "In charge" %}</th> +    <th>{% trans "Start date" %}</th> +    <th>{% trans "End date" %}</th> +    <th></th> +  </tr> +  {% for operation in item.operations.all %} +  <tr> +    <td>{{operation.year}}</td> +    <td>{{operation.operation_code}}</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.end_date|default:""}}</td> +    <td><a href="#{#{%url show-operation operation.pk%}#}">{% trans "Details" %}</a></td> +  </tr> +  {% empty %} +  <tr><td colspan="4" class='no_items'>{% trans "No operation associated to this archaelogical file" %}</td></tr> +  {% endfor %} +</table> + +<table> +  <caption>{%trans "Admninistrative acts linked to associated operations"%}</caption> +  <tr> +    <th>{% trans "Year" %}</th> +    <th>{% trans "Reference" %}</th> +    <th>{% trans "Type" %}</th> +    <th>{% trans "Date" %}</th> +  </tr> +  {% for act in item.operation_acts %} +  <tr> +    <td>{{act.signature_date.year}}</td> +    <td>{{act.ref_sra}}</td> +    <td class='string'>{{act.act_type}}</td> +    <td>{{act.signature_date}}</td> +  </tr> +  {% empty %} +  <tr><td colspan="4" class='no_items'>{% trans "No administrative act linked to operations" %}</td></tr> +  {% endfor %} +</table>  {% endblock %} diff --git a/ishtar/templates/sheet_file_window.html b/ishtar/templates/sheet_file_window.html new file mode 100644 index 000000000..e9debdd0d --- /dev/null +++ b/ishtar/templates/sheet_file_window.html @@ -0,0 +1,3 @@ +{% extends "sheet_file.html" %} +{% block main_head %}{%endblock%} +{% block main_foot %}{%endblock%}  | 
