diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-04-30 13:35:06 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-06-17 13:21:27 +0200 |
commit | f7eb29db4d43080dcb87994a18a2be7a2a07c622 (patch) | |
tree | 73cecce534117dd5c3a5a8e897b3d20a6a554146 /ishtar_common | |
parent | c7e8d8c880068afdd5a035767f81138f49c18111 (diff) | |
download | Ishtar-f7eb29db4d43080dcb87994a18a2be7a2a07c622.tar.bz2 Ishtar-f7eb29db4d43080dcb87994a18a2be7a2a07c622.zip |
Label generation: view to generate labels
Diffstat (limited to 'ishtar_common')
-rw-r--r-- | ishtar_common/urls.py | 2 | ||||
-rw-r--r-- | ishtar_common/views.py | 54 | ||||
-rw-r--r-- | ishtar_common/views_item.py | 30 |
3 files changed, 67 insertions, 19 deletions
diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py index eae297af7..99d80e7ad 100644 --- a/ishtar_common/urls.py +++ b/ishtar_common/urls.py @@ -42,6 +42,8 @@ urlpatterns = [ views.DisplayItemView.as_view(), name='display-item'), url(r'qrcode/(?P<app>[-a-z]+)/(?P<model_name>[-a-z]+)/(?P<pk>\d+)/', 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'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 a45d4ad08..65ea70685 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -1018,17 +1018,25 @@ class DisplayItemView(IshtarMixin, TemplateView): return data -class QRCodeView(IshtarMixin, LoginRequiredMixin, View): - def get(self, request, *args, **kwargs): +class DynamicModelView: + def get_model(self, kwargs): + app = kwargs.get('app').replace('-', "_") model_name = "".join( [part.capitalize() for part in kwargs.get('model_name').split('-')] ) - app = kwargs.get('app').replace('-', "_") try: - model = apps.get_model(app, model_name) + return apps.get_model(app, model_name) + except LookupError: + raise Http404() + + +class QRCodeView(DynamicModelView, IshtarMixin, LoginRequiredMixin, View): + def get(self, request, *args, **kwargs): + model = self.get_model(kwargs) + try: item = model.objects.get(pk=kwargs.get("pk")) assert hasattr(item, 'qrcode') - except (LookupError, model.DoesNotExist, AssertionError): + except (model.DoesNotExist, AssertionError): raise Http404() if not item.qrcode or not item.qrcode.name: @@ -1041,6 +1049,42 @@ class QRCodeView(IshtarMixin, LoginRequiredMixin, View): return HttpResponse(f.read(), content_type="image/png") +class GenerateLabelView(IshtarMixin, LoginRequiredMixin, View): + def get(self, request, *args, **kwargs): + template_slug = kwargs.get('template_slug') + try: + tpl = 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) + # rights are managed by get_item + get_list = get_item( + model, None, model.SLUG, own_table_cols=["id"])( + request, no_link=True, no_limit=True) + try: + objects = [ + model.objects.get(pk=int(dct["id"])) + for dct in json.loads(get_list.content.decode("utf-8"))["rows"] + ] + 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 + + class GlobalVarEdit(IshtarMixin, AdminLoginRequiredMixin, ModelFormSetView): template_name = 'ishtar/formset.html' model = models.GlobalVar diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py index 557058728..01475f6ae 100644 --- a/ishtar_common/views_item.py +++ b/ishtar_common/views_item.py @@ -1243,7 +1243,7 @@ def get_item(model, func_name, default_name, extra_request_keys=None, :return: """ def func(request, data_type='json', full=False, force_own=False, - col_names=None, **dct): + col_names=None, no_link=False, no_limit=False, **dct): available_perms = [] if specific_perms: available_perms = specific_perms[:] @@ -1395,8 +1395,9 @@ def get_item(model, func_name, default_name, extra_request_keys=None, if data_type == 'json-map': # other limit for map row_nb = settings.ISHTAR_MAP_MAX_ITEMS - if request_items.get('no_limit', False): - row_nb = None + if no_limit or (data_type == 'json-map' and + request_items.get('no_limit', False)): + row_nb = None dct_request_items = {} @@ -1471,7 +1472,7 @@ def get_item(model, func_name, default_name, extra_request_keys=None, dct, pinned_search = _manage_default_search( dct, request, model, default_name, my_base_request, my_relative_session_names) - else: + elif func_name: request.session[func_name] = dct for k in request_keys: @@ -1762,19 +1763,20 @@ def get_item(model, func_name, default_name, extra_request_keys=None, data = json.dumps(_format_geojson(datas, lnk)) return HttpResponse(data, content_type='application/json') for data in datas: - try: - lnk_template = link_template - lnk = lnk_template % reverse('show-' + default_name, - args=[data[0], '']) - except NoReverseMatch: - logger.warning( - '**WARN "show-' + default_name + '" args (' - + str(data[0]) + ") url not available") - lnk = '' res = { 'id': data[0], - 'link': lnk } + if not no_link: + try: + lnk_template = link_template + lnk = lnk_template % reverse('show-' + default_name, + args=[data[0], '']) + except NoReverseMatch: + logger.warning( + '**WARN "show-' + default_name + '" args (' + + str(data[0]) + ") url not available") + lnk = '' + res["link"] = lnk for idx, value in enumerate(data[1:]): if value: table_col = table_cols[idx] |