summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commit65125fa79ab69a5b5b091f73141558e5a8bf8587 (patch)
tree3fb29419d4703fcc224df4265466cd9000502ba4
parentdb76313a941d9d859e023e300b672628d761b4a1 (diff)
downloadIshtar-65125fa79ab69a5b5b091f73141558e5a8bf8587.tar.bz2
Ishtar-65125fa79ab69a5b5b091f73141558e5a8bf8587.zip
Publish action for generic items
-rw-r--r--ishtar_common/models.py31
-rw-r--r--ishtar_common/urls.py3
-rw-r--r--ishtar_common/views.py66
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):