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 | 39ae57f6f233cc097d303b397b78b9bfdd9b894b (patch) | |
tree | adba76d50670728470ed11bb60e7650271f4e466 | |
parent | dfc53677e6fec7269e5383c410ac1cc7f259b7ea (diff) | |
download | Ishtar-39ae57f6f233cc097d303b397b78b9bfdd9b894b.tar.bz2 Ishtar-39ae57f6f233cc097d303b397b78b9bfdd9b894b.zip |
Administrativ acts: generate document from the last step of creation/modification (refs #1523)
-rw-r--r-- | archaeological_files/views.py | 25 | ||||
-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 | ||||
-rw-r--r-- | ishtar_common/templates/ishtar/wizard/confirm_wizard.html | 7 | ||||
-rw-r--r-- | ishtar_common/templates/ishtar/wizard/wizard_done.html | 5 |
7 files changed, 94 insertions, 32 deletions
diff --git a/archaeological_files/views.py b/archaeological_files/views.py index 456926600..699335a56 100644 --- a/archaeological_files/views.py +++ b/archaeological_files/views.py @@ -18,12 +18,10 @@ # 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 @@ -36,6 +34,8 @@ from ishtar_common.forms_common import TownFormset from archaeological_operations.forms import ParcelFormSet from forms import * +from archaeological_operations.views import generatedoc_administrativeactop + def autocomplete_file(request): if not request.user.has_perm('ishtar_common.view_file', models.File) and \ not request.user.has_perm('ishtar_common.view_own_file', models.File) \ @@ -163,25 +163,8 @@ def file_administrativeactfile_document(request): if request.POST: dct['search_form'] = AdministrativeActFileFormSelection(request.POST) if dct['search_form'].is_valid(): - try: - act_file = AdministrativeAct.objects.get( - pk=dct['search_form'].cleaned_data.get('pk')) - doc = act_file.publish() - except 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 generatedoc_administrativeactop(request, + dct['search_form'].cleaned_data.get('pk')) else: dct['search_form'] = AdministrativeActFileFormSelection() return render_to_response('ishtar/administrativeact_document.html', dct, 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): diff --git a/ishtar_common/templates/ishtar/wizard/confirm_wizard.html b/ishtar_common/templates/ishtar/wizard/confirm_wizard.html index 76877a716..f67eb5c1e 100644 --- a/ishtar_common/templates/ishtar/wizard/confirm_wizard.html +++ b/ishtar_common/templates/ishtar/wizard/confirm_wizard.html @@ -28,9 +28,14 @@ {{ wizard.form.as_table }} </table> {%endif%} - <p>{%if confirm_end_msg %}{{confirm_end_msg|safe}}{%else%}{% trans "Would you like to save them?" %}{%endif%}</p> <input type="hidden" name="{{ step_field }}" value="{{ step0 }}" /> {{ previous_fields|safe }} + {% if extra_form %} + <table> + {{ extra_form }} + </table> + {% endif %} + <p>{%if confirm_end_msg %}{{confirm_end_msg|safe}}{%else%}{% trans "Would you like to save them?" %}{%endif%}</p> <input type="submit" value="{% trans "Validate" %}"/> </div> </form> diff --git a/ishtar_common/templates/ishtar/wizard/wizard_done.html b/ishtar_common/templates/ishtar/wizard/wizard_done.html index a7068bbab..7de3edfce 100644 --- a/ishtar_common/templates/ishtar/wizard/wizard_done.html +++ b/ishtar_common/templates/ishtar/wizard/wizard_done.html @@ -2,5 +2,10 @@ {% load i18n %} {% block content %} <p>{%trans "Item successfully saved"%}</p> +{% if redirect %} +<script type='text/javascript' language='javascript'> +window.location.href = "{{redirect}}"; +</script> +{% endif %} </div> {% endblock %} |