diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-08-28 16:53:58 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-08-28 16:53:58 +0200 |
commit | 65125fa79ab69a5b5b091f73141558e5a8bf8587 (patch) | |
tree | 3fb29419d4703fcc224df4265466cd9000502ba4 | |
parent | db76313a941d9d859e023e300b672628d761b4a1 (diff) | |
download | Ishtar-65125fa79ab69a5b5b091f73141558e5a8bf8587.tar.bz2 Ishtar-65125fa79ab69a5b5b091f73141558e5a8bf8587.zip |
Publish action for generic items
-rw-r--r-- | ishtar_common/models.py | 31 | ||||
-rw-r--r-- | ishtar_common/urls.py | 3 | ||||
-rw-r--r-- | ishtar_common/views.py | 66 |
3 files changed, 85 insertions, 15 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py index fb84aafb4..02be873ce 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -1999,6 +1999,37 @@ class TemplateItem: def label_templates(cls): return cls._label_templates_q() + def get_extra_templates(self, request): + cls = self.__class__ + templates = [] + name = str(cls.__name__) + module = str(cls.__module__) + if "archaeological_finds" in module: + if "models_finds" in name or "models_treatments" in name: + names = [ + name, + name.replace("models_finds", "models" + ).replace("models_treatments", "models") + ] + else: + names = [name, name.replace("models", "models_finds"), + name.replace("models", "models_treatments")] + else: + names = [name] + model_names = [ + "{}.{}".format(module, name) for name in names + ] + q = DocumentTemplate.objects.filter( + associated_model__klass__in=model_names, + for_labels=False, available=True) + for template in q.all(): + urlname = "generate-document" + templates.append( + (template.name, reverse( + urlname, args=[template.slug, self.pk])) + ) + return templates + class StatisticItem: STATISTIC_MODALITIES = [] # example: "year", "operation_type__label" diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py index 55df6cb40..3667d46b2 100644 --- a/ishtar_common/urls.py +++ b/ishtar_common/urls.py @@ -46,6 +46,9 @@ urlpatterns = [ views.QRCodeView.as_view(), name='qrcode-item'), url(r'^generate-labels/(?P<template_slug>[-a-z0-9]+)/', views.GenerateLabelView.as_view(), name='generate-labels'), + url(r'^generate-document/(?P<template_slug>[-a-z0-9]+)/(' + r'?P<item_pk>\d+)/', + views.GenerateView.as_view(), name='generate-document'), url(r'person_search/(?P<step>.+)?$', check_rights(['add_person'])( views.person_search_wizard), name='person_search'), diff --git a/ishtar_common/views.py b/ishtar_common/views.py index f867a03cf..5a3f90da6 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -1062,18 +1062,64 @@ class QRCodeView(DynamicModelView, IshtarMixin, LoginRequiredMixin, View): return HttpResponse(f.read(), content_type="image/png") -class GenerateLabelView(IshtarMixin, LoginRequiredMixin, View): +class GenerateView(IshtarMixin, LoginRequiredMixin, View): + def get_template(self, template_slug): + try: + return models.DocumentTemplate.objects.get( + slug=template_slug, available=True, + for_labels=False + ) + except models.DocumentTemplate.DoesNotExist: + raise Http404() + + def publish(self, tpl, objects): + return tpl.publish(objects[0]) + + def get_items(self, request, model): + item_pk = self.kwargs.get('item_pk') + try: + object = model.objects.get(pk=item_pk) + if not object.can_view(request): + raise Http404() + except model.DoesNotExist: + raise Http404() + return [object] + def get(self, request, *args, **kwargs): template_slug = kwargs.get('template_slug') + tpl = self.get_template(template_slug) + app, __, model_name = tpl.associated_model.klass.split(".") + model = apps.get_model(app, model_name) + objects = self.get_items(request, model) + if not objects: + return HttpResponse(content_type='text/plain') + document = self.publish(tpl, objects) + if not document: + return HttpResponse(content_type='text/plain') + with open(document, "rb") as f: + response = HttpResponse( + f.read(), + content_type="application/vnd.oasis.opendocument.text" + ) + response['Content-Disposition'] = 'attachment; filename={}'.format( + document.split(os.sep)[-1]) + return response + + +class GenerateLabelView(GenerateView): + def get_template(self, template_slug): try: - tpl = models.DocumentTemplate.objects.get( + return models.DocumentTemplate.objects.get( slug=template_slug, available=True, for_labels=True ) except models.DocumentTemplate.DoesNotExist: raise Http404() - app, __, model_name = tpl.associated_model.klass.split(".") - model = apps.get_model(app, model_name) + + def publish(self, tpl, objects): + return tpl.publish_labels(objects) + + def get_items(self, request, model): # rights are managed by get_item get_list = get_item( model, None, model.SLUG, own_table_cols=["id"])( @@ -1085,17 +1131,7 @@ class GenerateLabelView(IshtarMixin, LoginRequiredMixin, View): ] except model.DoesNotExist: raise Http404() - document = tpl.publish_labels(objects) - if not document: - return HttpResponse(content_type='text/plain') - with open(document, "rb") as f: - response = HttpResponse( - f.read(), - content_type="application/vnd.oasis.opendocument.text" - ) - response['Content-Disposition'] = 'attachment; filename={}'.format( - document.split(os.sep)[-1]) - return response + return objects class GlobalVarEdit(IshtarMixin, AdminLoginRequiredMixin, ModelFormSetView): |