summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2020-09-04 16:22:44 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2021-02-28 12:15:21 +0100
commit1a4af35045908e4285dc18bce3733f069fada220 (patch)
treecdf909dfa35be53ca15e5391e4baa97e455b00ae
parent5845864ea387d35f5c66f916a6c262ba5b06fb2b (diff)
downloadIshtar-1a4af35045908e4285dc18bce3733f069fada220.tar.bz2
Ishtar-1a4af35045908e4285dc18bce3733f069fada220.zip
Documents: COinS and Dublin Core tags
-rw-r--r--ishtar_common/models.py155
-rw-r--r--ishtar_common/templates/base.html2
-rw-r--r--ishtar_common/templates/ishtar/display_item.html13
-rw-r--r--ishtar_common/templates/ishtar/sheet_document.html2
-rw-r--r--ishtar_common/views.py49
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