diff options
author | Étienne Loks <etienne.loks@peacefrogs.net> | 2013-12-04 23:55:07 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2013-12-04 23:55:07 +0100 |
commit | f2928e399ed554fb4f3f2c501008e1b8b3c8a967 (patch) | |
tree | adba76d50670728470ed11bb60e7650271f4e466 /archaeological_operations | |
parent | 5e1cafecaabecd5f6dd8d77f5e0ac70e785fdcc3 (diff) | |
download | Ishtar-f2928e399ed554fb4f3f2c501008e1b8b3c8a967.tar.bz2 Ishtar-f2928e399ed554fb4f3f2c501008e1b8b3c8a967.zip |
Administrativ acts: generate document from the last step of creation/modification (refs #1523)
Diffstat (limited to 'archaeological_operations')
-rw-r--r-- | archaeological_operations/forms.py | 4 | ||||
-rw-r--r-- | archaeological_operations/urls.py | 3 | ||||
-rw-r--r-- | archaeological_operations/views.py | 27 | ||||
-rw-r--r-- | archaeological_operations/wizards.py | 55 |
4 files changed, 79 insertions, 10 deletions
diff --git a/archaeological_operations/forms.py b/archaeological_operations/forms.py index 50a5e7f5f..955b2f825 100644 --- a/archaeological_operations/forms.py +++ b/archaeological_operations/forms.py @@ -613,3 +613,7 @@ class FinalAdministrativeActDeleteForm(FinalForm): confirm_msg = " " confirm_end_msg = _(u"Would you like to delete this administrative act?") +class GenerateDocForm(forms.Form): + form_label = _("Doc generation") + doc_generation = forms.BooleanField(required=False, + label=_(u"Generate the associated doc?")) diff --git a/archaeological_operations/urls.py b/archaeological_operations/urls.py index 13a2c5c35..4453b10ed 100644 --- a/archaeological_operations/urls.py +++ b/archaeological_operations/urls.py @@ -71,6 +71,9 @@ urlpatterns += patterns('archaeological_operations.views', 'show_operation', name='show-historized-operation'), url(r'get-administrativeactop/(?P<type>.+)?$', 'get_administrativeactop', name='get-administrativeactop'), + url(r'generatedoc-administrativeactop/(?P<pk>.+)?$', + 'generatedoc_administrativeactop', + name='generatedoc-administrativeactop'), url(r'get-operationsource/(?P<type>.+)?$', 'get_operationsource', name='get-operationsource'), url(r'dashboard_operation/$', 'dashboard_operation', diff --git a/archaeological_operations/views.py b/archaeological_operations/views.py index 97446b635..92ac0373b 100644 --- a/archaeological_operations/views.py +++ b/archaeological_operations/views.py @@ -18,10 +18,12 @@ # See the file COPYING for details. import json +import os from django.db.models import Q from django.http import HttpResponse from django.shortcuts import render_to_response +from django.template.defaultfilters import slugify from django.utils.translation import ugettext_lazy as _ from ishtar_common.views import get_item, show_item, revert_item @@ -258,3 +260,28 @@ operation_administrativeactop_deletion_wizard = \ label=_(u"Operation: administrative act deletion"), url_name='operation_administrativeactop_deletion',) +def generatedoc_administrativeactop(request, pk): + if (not request.user.has_perm('ishtar_common.view_operation', + models.Operation) + and not request.user.has_perm('ishtar_common.view_own_operation', + models.Operation)): + return HttpResponse(mimetype='text/plain') + try: + act_file = models.AdministrativeAct.objects.get(pk=pk) + doc = act_file.publish() + except models.AdministrativeAct.DoesNotExist: + doc = None + if doc: + MIMES = {'odt':'application/vnd.oasis.opendocument.text', + 'ods':'application/vnd.oasis.opendocument.spreadsheet'} + ext = doc.split('.')[-1] + doc_name = slugify(doc.split(os.path.sep)[-1][:-len(ext)])+ "."\ + + ext + mimetype = 'text/csv' + if ext in MIMES: + mimetype = MIMES[ext] + response = HttpResponse(open(doc), mimetype=mimetype) + response['Content-Disposition'] = 'attachment; filename=%s' % \ + doc_name + return response + return HttpResponse(mimetype='text/plain') diff --git a/archaeological_operations/wizards.py b/archaeological_operations/wizards.py index 07c8844b9..86af26351 100644 --- a/archaeological_operations/wizards.py +++ b/archaeological_operations/wizards.py @@ -19,6 +19,7 @@ from django.conf import settings from django.core.exceptions import ObjectDoesNotExist +from django.core.urlresolvers import reverse from django.db.models import Max from django.shortcuts import render_to_response from django.template import RequestContext @@ -27,7 +28,7 @@ from django.utils.translation import ugettext_lazy as _ from ishtar_common.wizards import Wizard, ClosingWizard, DeletionWizard, \ SourceWizard import models -from forms import ParcelForm +from forms import ParcelForm, GenerateDocForm class OperationWizard(Wizard): model = models.Operation @@ -267,18 +268,27 @@ class OperationAdministrativeActWizard(OperationWizard): dct['history_modifier'] = self.request.user return dct + def get_context_data(self, form, **kwargs): + # manage document generation + context = super(OperationAdministrativeActWizard, self + ).get_context_data(form, **kwargs) + step = self.steps.current + if step.startswith('final-'): + general_form_key = 'administrativeact-' + self.url_name + try: + act_type = models.ActType.objects.get( + pk=self.session_get_value(general_form_key, "act_type")) + except models.ActType.DoesNotExist: + pass + if act_type and act_type.associated_template.count(): + context['extra_form'] = GenerateDocForm() + return context + def get_associated_item(self, dct): return self.get_current_object() def save_model(self, dct, m2m, whole_associated_models, form_list, return_object): - associated_item = self.get_associated_item(dct) - if not associated_item: - return self.render(form_list[-1]) - if isinstance(associated_item, models.File): - dct['associated_file'] = associated_item - elif isinstance(associated_item, models.Operation): - dct['operation'] = associated_item dct['history_modifier'] = self.request.user if 'pk' in dct: dct.pop('pk') @@ -288,10 +298,35 @@ class OperationAdministrativeActWizard(OperationWizard): if hasattr(admact, k): setattr(admact, k, dct[k]) else: + associated_item = self.get_associated_item(dct) + if not associated_item: + return self.render(form_list[-1]) + if isinstance(associated_item, models.File): + dct['associated_file'] = associated_item + elif isinstance(associated_item, models.Operation): + dct['operation'] = associated_item admact = models.AdministrativeAct(**dct) admact.save() - res = render_to_response('ishtar/wizard/wizard_done.html', {}, - context_instance=RequestContext(self.request)) + dct['item'] = admact + + # check if a doc generation is required + keys = [self.storage.prefix, 'step_data', 'final-' + self.url_name, + 'doc_generation'] + level = 0 + r = self.request.session + for k in keys: + if k in r and r[k]: + level += 1 + r = r[k] + else: + break + if level == len(keys): # the whole tree as been traversed + # redirect to the generated doc + dct['redirect'] = reverse('generatedoc-administrativeactop', + args=[admact.pk]) + + res = render_to_response('ishtar/wizard/wizard_done.html', dct, + context_instance=RequestContext(self.request)) return res class OperationEditAdministrativeActWizard(OperationAdministrativeActWizard): |