diff options
Diffstat (limited to 'ishtar_common')
| -rw-r--r-- | ishtar_common/models.py | 155 | ||||
| -rw-r--r-- | ishtar_common/templates/base.html | 2 | ||||
| -rw-r--r-- | ishtar_common/templates/ishtar/display_item.html | 13 | ||||
| -rw-r--r-- | ishtar_common/templates/ishtar/sheet_document.html | 2 | ||||
| -rw-r--r-- | ishtar_common/views.py | 49 | 
5 files changed, 203 insertions, 18 deletions
| diff --git a/ishtar_common/models.py b/ishtar_common/models.py index a5e8e6341..df9fe0c20 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -43,6 +43,8 @@ from ooopy.Transformer import Transformer as OOTransformer  import ooopy.Transforms as OOTransforms  import uuid  import zipfile +from urllib.parse import urlencode +from xml.etree import ElementTree as ET  from django import forms  from django.apps import apps @@ -4616,6 +4618,10 @@ class Person(Address, Merge, OwnPerms, ValueGetter, MainItem):          return (self.uuid,)      @property +    def first_name(self): +        return self.surname + +    @property      def full_title(self):          return " ".join(              [str(getattr(self, attr)) @@ -6014,6 +6020,155 @@ class Document(BaseHistorizedItem, QRCodeItem, OwnPerms, ImageModel,      def import_get_next_index(cls, context, value):          context["index"] = cls.get_next_index() +    @property +    def dublin_core_identifier(self): +        identifier = None +        if self.isbn: +            identifier = self.isbn +        elif self.issn: +            identifier = self.issn +        elif self.associated_url: +            identifier = self.associated_url +        elif Site.objects.count(): +            identifier = "http://{}{}".format( +                Site.objects.all()[0].domain, self.get_absolute_url()) +        return identifier + +    def dublin_core_tags(self): +        if not self.title: +            return "" +        tags = [ +            ("link", +             {"rel": "schema.DC", "href": "http://purl.org/dc/elements/1.1/"}), +            ("link", +             {"rel": "schema.DCTERMS", "href": "http://purl.org/dc/terms/"}), +        ] +        title = {"name": "DC.title", "content": self.title} +        tags.append(("meta", title)) +        if self.creation_date: +            date = {"name": "DC.date", "scheme": "DCTERMS.W3CDTF", +                    "content": self.creation_date.strftime("%Y-%m-%d")} +            tags.append(("meta", date)) +        if self.tags.count(): +            content = ", ".join([str(t) for t in self.tags.all()]) +            tg = {"name": "DC.subject", "content": content} +            tags.append(("meta", tg)) +        if self.description: +            tags.append( +                ("meta", {"name": "DC.description", +                          "content": self.description})) +        if self.publisher: +            tags.append( +                ("meta", {"name": "DC.publisher", +                          "content": self.publisher.name})) +        if self.authors.count(): +            content = ", ".join([str(t.person.raw_name) for t in +                                 self.authors.all()]) +            tags.append( +                ("meta", {"name": "DC.creator", +                          "content": content})) +        if self.source_type: +            tags.append( +                ("meta", {"name": "DC.type", +                          "content": str(self.source_type)})) +        if self.format_type: +            tags.append( +                ("meta", {"name": "DC.format", +                          "content": str(self.format_type)})) +        identifier = self.dublin_core_identifier +        if identifier: +            tags.append( +                ("meta", {"name": "DC.identifier", +                          "content": identifier})) +        if self.language: +            lang = self.language.iso_code +            tags.append( +                ("meta", {"name": "DC.language", +                          "content": lang})) +        if self.licenses.count(): +            licences = ", ".join([str(l) for l in self.licenses.all()]) +            tags.append( +                ("meta", {"name": "DC.rights", +                          "content": licences})) +        src = None +        if self.source: +            src = self.source.dublin_core_identifier +        if src: +            tags.append( +                ("meta", {"name": "DC.relation", +                          "content": src})) +            tags.append( +                ("meta", {"name": "DC.source", +                          "content": src})) +        elif self.source_free_input: +            tags.append( +                ("meta", {"name": "DC.source", +                          "content": self.source_free_input})) +        html = "" +        for tag, attrs in tags: +            et = ET.Element(tag, attrib=attrs) +            html += ET.tostring(et, encoding="unicode", method="html") +        return html + +    @property +    def extra_meta(self): +        return self.dublin_core_tags() + +    def coins_tag(self): +        if not self.title: +            return +        info = [ +            ("url_ver", "Z39.88-2004"), +            ("ctx_ver", "Z39.88-2004"), +            ("rft_val_fmt", "info:ofi/fmt:kev:mtx:dc"), +            ("rft.title", self.title), +            ("rft.btitle", self.title) +        ] +        if self.associated_url: +            info.append(("rft.identifier", self.associated_url)) +        elif Site.objects.count(): +            info.append(("rft.identifier", "http://{}{}".format( +                Site.objects.all()[0].domain, self.get_absolute_url()))) +        for author in self.authors.all(): +            person = author.person +            if not person.raw_name: +                continue +            if person.first_name and person.name: +                info.append(("rft.aulast", person.name)) +                info.append(("rft.aufirst", person.first_name)) +                info.append(("rft.au", "{}+{}".format(person.first_name, +                                                      person.name))) +            else: +                info.append(("rft.au", person.raw_name)) +        if self.source_type: +            info.append(("rft.type", self.source_type.coins_type)) +            if self.source_type.coins_genre: +                info.append(("rft.genre", self.source_type.coins_genre)) +        if self.description: +            info.append(("rft.description", self.description)) +        if self.publisher: +            info.append(("rft.publisher", self.publisher.name)) +        if self.creation_date: +            if self.creation_date.day == 1 and self.creation_date.month == 1: +                info.append(("rft.date", self.creation_date.year)) +            else: +                info.append(("rft.date", +                             self.creation_date.strftime("%Y-%m-%d"))) +        if self.source and self.source.title: +            info.append(("rft.source", self.source.title)) +        elif self.source_free_input: +            info.append(("rft.source", self.source_free_input)) +        if self.issn: +            info.append(("rft.issn", self.issn)) +        if self.isbn: +            info.append(("rft.isbn", self.isbn)) +        if self.licenses.count(): +            licenses = ";".join([str(l) for l in self.licenses.all()]) +            info.append(("rft.rights", licenses)) +        if self.language: +            info.append(("rft.language", self.language.iso_code)) +        return '<span class="Z3988" title="{}">'.format(urlencode(info)) +      def save(self, *args, **kwargs):          no_path_change = 'no_path_change' in kwargs \                           and kwargs.pop('no_path_change') diff --git a/ishtar_common/templates/base.html b/ishtar_common/templates/base.html index 5fb935eb5..ecd9197cb 100644 --- a/ishtar_common/templates/base.html +++ b/ishtar_common/templates/base.html @@ -3,6 +3,8 @@  <head>      <meta charset="utf-8">      <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> +    {% block extra_meta %} +    {% endblock %}      <link rel="shortcut icon" href="{{STATIC_URL}}/media/images/favicon.png"/>      <title>{% block title %}Ishtar{% if APP_NAME %} - {{APP_NAME}}{%endif%}{% endblock %}</title>      {% compress js %} diff --git a/ishtar_common/templates/ishtar/display_item.html b/ishtar_common/templates/ishtar/display_item.html index e1c63b775..a7be3554b 100644 --- a/ishtar_common/templates/ishtar/display_item.html +++ b/ishtar_common/templates/ishtar/display_item.html @@ -1,10 +1,21 @@  {% extends "base.html" %}  {% load i18n %} +{% block extra_meta %}{% if extra_meta %} +{{extra_meta|safe}} +{% endif %}{% endblock %} +  {% block content %} +{% if view_content %} +<div class="container"> +{{view_content|safe}} +</div> +{% else %}  <script type='text/javascript'>  $(document).ready( +{% if show_url %}  function(){      load_window("{{show_url}}"); -}); +});{% endif %}  </script> +{% endif %}  {% endblock %} diff --git a/ishtar_common/templates/ishtar/sheet_document.html b/ishtar_common/templates/ishtar/sheet_document.html index 598de5f76..292c964aa 100644 --- a/ishtar_common/templates/ishtar/sheet_document.html +++ b/ishtar_common/templates/ishtar/sheet_document.html @@ -10,7 +10,6 @@  {% block general %} -  {% if item.main_image %}  <div class="clearfix">      <div class="card float-left col-12 col-md-4"> @@ -116,6 +115,7 @@  {% field_flex_full "Containers" item.containers|add_links %}  {% endif %} +{{ item.coins_tag|safe }}  {% endblock %}  {% endblock %} diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 160653bbb..96c292c43 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -1120,22 +1120,6 @@ class ProfileEdit(LoginRequiredMixin, FormView):          return HttpResponseRedirect(self.get_success_url()) -class DisplayItemView(IshtarMixin, TemplateView): -    template_name = 'ishtar/display_item.html' - -    def dispatch(self, request, *args, **kwargs): -        if not self.request.user.is_authenticated: -            return redirect_to_login(reverse("display-item", kwargs=kwargs)) -        return super(DisplayItemView, self).dispatch(request, *args, **kwargs) - -    def get_context_data(self, *args, **kwargs): -        data = super(DisplayItemView, self).get_context_data(*args, **kwargs) -        pk = str(kwargs.get('pk')) + '/' -        item_url = '/show-' + kwargs.get('item_type') -        data['show_url'] = item_url + "/" + pk -        return data - -  class DynamicModelView:      def get_model(self, kwargs):          app = kwargs.get('app').replace('-', "_") @@ -2466,3 +2450,36 @@ class QADocumentPackagingFormView(QAItemForm):      def form_valid(self, form):          form.save(self.items, self.request.user)          return HttpResponseRedirect(reverse("success")) + + +class DisplayItemView(IshtarMixin, TemplateView): +    template_name = 'ishtar/display_item.html' +    SHOW_VIEWS = { +        'document': show_document +    } +    ASSOCIATED_MODEL = { +        "document": models.Document +    } + +    def dispatch(self, request, *args, **kwargs): +        if not self.request.user.is_authenticated: +            return redirect_to_login(reverse("display-item", kwargs=kwargs)) +        return super(DisplayItemView, self).dispatch(request, *args, **kwargs) + +    def get_context_data(self, *args, **kwargs): +        data = super(DisplayItemView, self).get_context_data(*args, **kwargs) +        pk = kwargs.get('pk') +        item_type = kwargs.get('item_type') +        if item_type in self.SHOW_VIEWS: +            data["view_content"] = self.SHOW_VIEWS[item_type]( +                self.request, pk).content +            if item_type in self.ASSOCIATED_MODEL and \ +                    hasattr(self.ASSOCIATED_MODEL[item_type], "extra_meta"): +                model = self.ASSOCIATED_MODEL[item_type] +                try: +                    data["extra_meta"] = model.objects.get(pk=pk).extra_meta +                except model.DoesNotExist: +                    pass +        else: +            data['show_url'] = "/show-{}/{}/".format(item_type, pk) +        return data | 
