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