diff options
author | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-02-25 15:58:32 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-02-25 15:58:32 +0100 |
commit | 8301e4705fccdf557d5d9e57eb32f9ba66c663b8 (patch) | |
tree | 5b761be14e420b8fb41ccaf55773f2f7d0f85611 /ishtar/furnitures | |
parent | cfe087f98169570c8ace3c1ecaa47c6f6e661f54 (diff) | |
download | Ishtar-8301e4705fccdf557d5d9e57eb32f9ba66c663b8.tar.bz2 Ishtar-8301e4705fccdf557d5d9e57eb32f9ba66c663b8.zip |
Work on file sheet and odt export (refs #227)
Diffstat (limited to 'ishtar/furnitures')
-rw-r--r-- | ishtar/furnitures/models.py | 9 | ||||
-rw-r--r-- | ishtar/furnitures/urls.py | 5 | ||||
-rw-r--r-- | ishtar/furnitures/views.py | 62 |
3 files changed, 68 insertions, 8 deletions
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') |