diff options
| -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]  | 
