diff --git a/apis_core/apis_entities/base_filter.py b/apis_core/apis_entities/base_filter.py index 8e0894f..a4f0f03 100644 --- a/apis_core/apis_entities/base_filter.py +++ b/apis_core/apis_entities/base_filter.py @@ -2,7 +2,6 @@ class MyBaseFilter(django_filters.FilterSet): - def construct_lookup(self, value): """ Parses user input for wildcards and returns a tuple containing the interpreted django lookup string and the trimmed value @@ -17,24 +16,19 @@ def construct_lookup(self, value): """ if value.startswith("*") and not value.endswith("*"): - value = value[1:] return "__iendswith", value elif not value.startswith("*") and value.endswith("*"): - value = value[:-1] return "__istartswith", value elif value.startswith('"') and value.endswith('"'): - value = value[1:-1] return "__iexact", value else: - if value.startswith("*") and value.endswith("*"): - value = value[1:-1] return "__icontains", value @@ -44,4 +38,4 @@ def name_label_filter(self, queryset, name, value): lookup, value = self.construct_lookup(value) queryset_related_label = queryset.filter(**{"label__label" + lookup: value}) queryset_self_name = queryset.filter(**{name + lookup: value}) - return (queryset_related_label | queryset_self_name).distinct().all() \ No newline at end of file + return (queryset_related_label | queryset_self_name).distinct().all() diff --git a/dumper/templates/dumper/about.html b/dumper/templates/dumper/about.html new file mode 100644 index 0000000..21e9eba --- /dev/null +++ b/dumper/templates/dumper/about.html @@ -0,0 +1,462 @@ +{% extends "base.html" %} +{% load static %} + +{% block title %}Über das Projekt{% endblock %} + +{% block content %} +
+

PMB

+

Personen der Moderne Basis*

+

Die PMB ist ein Webservice für Personen, Werke, Institutionen, Orte und Ereignisse speziell + für die Zeit in Wien um 1900. Ihre einfachste Funktion besteht darin, für verschiedene + Projekte eine gemeinsame Datenbank zu schaffen. Das erleichtert einerseits die Erfassung von + Personen, wenn diese bereits angelegt sind. Es vereinfacht andererseits die Suche über + mehrere Projekte hinweg. Verweise auf andere Normdatensätze (GND, geonames.org) erlauben den + automatisierten Abgleich, ohne Fehler von diesen übernehmen zu müssen.

+

Datenherkunft

+

Größere Bestände und der Zeitpunkt ihrer Aufnahme

+ +

Die Entitäten werden kontinuierlich erweitert, durchgesehen und auch miteinander in Beziehung + gesetzt.

+

Folgende Projekte erweitern und korrigieren die Daten:

+ +

* Der Name ist ein Sonderfall eines Akronyms. Er versteht sich als Referenz auf Peter + Michael Braunwarth, dessen Arbeit den Grundstock bildet.

+
+

Open Source

+

Wir freuen uns, wenn sich weitere Unternehmungen anschließen und die PMB für die Erfassung ihrer Entitäten verwenden würden. Wir stellen die Daten aber auch tagesaktuell Open Access zur Verfügung. Einerseits kann das über die API erfolgen (die JSON- oder TEI-Links bei einem Eintrag auswählen), andererseits können hier die Listen zur Gänze geladen werden: PMB-Listen.

+

Richtlinien

+

Die Herkunft der Anfangsdaten brachten als Erbe einige Uneinheitlichkeiten mit sich. Im + Folgenden werden die unterschiedlichen Funktionen beschrieben und skizziert, wie die + Einträge möglichst regelkonform angelegt werden.

+

Personen

+

Zumindest das grundsätzliche Verständnis, was eine Person ist, dürfte zu wenig Diskussion + führen. Die relevante Unterscheidung: Die PMB verzeichnet real existierende Personen und + solche, von denen angenommen werden kann, dass sie existierten (»Homer«), aber keine + mythologische Gestalten (»Prometheus«).

+

Der Ansetzungsname ist dabei der für das Erwachsenenleben hauptsächlich gültige – jener Name, + von dem angenommen wird, dass sie darunter den meisten Menschen bekannt ist. Beispielsweise + wird »Marie Bernardt« als »Sarah Bernhardt« geführt. Ihr Geburtsname wird ebenso wie andere + Namensformen (Ehename »Damala«) als Label angelegt.

+

Unsichere Lebensdaten können wörtlich eingegeben werden. Es ist in diesen Fällen aber + sinnvoll, eine ISO-Fassung separat anzugeben: »4.?4.1919 <1919-04-04>«

+

Geburts- und Todesort werden als Beziehung zu bestimmten Orten angelegt. Die + Orte werden dabei nach ihrem heutigen Namen angelegt, nicht nach dem zu dem Zeitpunkt + gültigen. So starb Hugo von Hofmannsthal in Rodaun, das erst seit 1938 zu Wien gehört. + Trotzdem ist in der Datenbank Rodaun als zu Wien gehörig angelegt. (Die Editor*innen des + Schnitzler-Tagebuchs hielten das anders, weswegen noch viele solcher Einträge in der + Datenbank sind.)

+

Berufe

+

Die Angabe von Berufen erfolgt nach einer vorgegebenen Liste, wobei unbeschränkt Berufe + angegeben werden können. Gegenwärtig ist kein Vokabular für die Berufe vorgesehen, doch + sollte sich das zu einem späteren Zeitpunkt ändern.

+

Nicht näher zu ermittelnde Personen

+

Unbekannte, nicht einmal durch einen Familien- oder Vornamen zu identifizierende Personen + werden im Familiennamen mit »??« markiert und in mit einer kurzen Beschreibung in eckigen + Klammern versehen, z. B. »?? [Vermieterin von F. M. Fels]«. In den respektiven + Relationsfeldern wird die Person durch nähere Angaben bestimmt. Hier scheint es besonders + angebracht, auch die Relationen zu datieren, etwa »gearbeitet in Wien 1904« oder »Arbeitet + für Hermann Bahr 1904« etc.

+

Normdaten

+

Schon bei der Anlage einer Person kann dies über den Import durch die Normdatei GND + geschehen. Sollte die GND-Nummer später nachgetragen werden, geschieht das durch Verknüpfen + einer URI im Menüpunkt URIs.

+

Relationen

+

Von Person zu Person

+

Hier lassen sich Verwandtschafts- und Beziehungsverhältnisse eintragen. Beispielsweise:

+ +

Von Person zu Ereignis

+ +

Von Person zu Institution

+ +

Von Person zu Werk

+ +

Von Person zu Ort

+ +

Labels

+

Die verschiedenen Labels sind über das Dropdown-Menü auszuwählen und weitgehend + selbsterklärend. Sie enthalten bei Personen vor allem Namensvarianten wie Geburtsname, + Pseudonym, Rufname.

+

Werke

+

Werke werden nach Möglichkeit in der ersten Fassung aufgenommen (»Lieutenant Gustl«), weitere + Namensvarianten (»Leutnant Gustl«) können als Label erfasst werden. Ein Werk und seine + Übersetzung werden im Normalfall als zwei Werke geführt, die beiden durch eine Relation + »Übersetzung« verknüpft. Die Jahresangabe nennt den Zeitpunkt, an dem das Werk von der + Öffentlichkeit rezipiert werden konnte. Bei Bühnenwerken sind d. h. erste Aufführung oder + erster Druck relevant. Sofern nicht ohnedies getrennt angelegt, ist bei fremdsprachigen + Werken die Datierung auf das Original bezogen, nicht die deutsche Übersetzung. Aus dem + Nachlass veröffentlichte Werke werden also nach dem Ableben – mit dem postumen + Erscheinungsdatum – datiert. Die Entstehungszeit des Werks kann bei der Relation zum + Künstler eingegeben werden.

+

Zeitungen, Zeitschriften und Periodika

+

Diese werden – soweit es sich um literarische Werke handelt – als Werk behandelt. + Entsprechend sind Texte, die in einer Zeitung erschienen sind, über eine Werk–Werk-Beziehung + abzubilden. (»enthalten in«). Eine genauere bibliografische Angabe kann über das + entsprechende Label gegeben werden. Jede Zeitschrift ist zudem als Institution (die + Redaktion, das Redaktionsbüro, die Organisation) anzulegen (Relation Type: »in Beziehung + zu«) und auch als Ort, sofern der geografische Ort der Druckerei oder des Redaktion + angesprochen wird.

+

Verlage

+

Das Erscheinen eines Werks in einem Verlag wird durch eine datierte Beziehung zu dem Verlag + als Organisation gemacht, beispielsweise »Lieutenant Gustl enthalten in S. Fischer Verlag + 1901«.

+

Unter Pseudonym oder Kürzel veröffentlicht

+

Abweichungen bei den Autoren- und Autorinnennamen, die nur für ein Werk gelten, sind beim + Eintrag zum Werk zu hinterlegen. Also einerseits die entsprechende Beziehung »unter + Pseudonym geschaffen von«, »ohne Namensnennung geschaffen von«, »unter Kürzel + veröffentlicht«. Die Namensvariante, das Pseudonym selbst ist dann mit dem Label »unter + diesem Namen veröffentlicht« zu vermerken.

+

Beziehungen

+

Von Werk zu Ereignis

+ +

Von Werk zu Werk

+ +

Von Werk zu Ort

+ +

Von Werk zu Institution

+ + +

Institutionen

+

Als Institutionen werden juristische, politische oder anderweitige Einrichtungen erfasst, + deren Handlungsraum nicht genau lokalisierbar sind. Dazu gehören neben Unternehmen auch + Verlage und Literaturpreise, da ihre Produkte nicht an einem bestimmten Ort rezipiert + werden. Im speziellen Fall existieren bestimmte Institutionen sowohl als Institutionen wie + als Orte, etwa wenn Schnitzler im Verlagsgebäude ist, um Widmungsexemplare zu unterzeichnen. + In solchen Fällen legt man Beziehungen zwischen Institution und Ort an.

+

Relationen

+

Von einer Institution zu einem Ereignis

+ +

Von einer Institution zu einer Institution

+ +

Von einer Institution zu einem Ort

+ +

Orte

+

Orte sind im einfachsten Sinne gemeint, als Stellen, zu denen man physisch hingehen kann. + Anders gesagt: Gibt es einen Längen- und einen Breitengrad, ist es ein Ort. Das umfasst also auch + Organisationen wie Theater – die man physisch aufsucht.

+

Ortstypen

+

Ein Teil der Orte sind mit einem eigenen Vokabular gekennzeichnet. Dieses findet sich hier: + https://vocabs.acdh-dev.oeaw.ac.at/pmbplacetypes/de/?clang=de. Die meisten Orte + sind aber nach Geonames klassifiziert.

+

Für Orte sollte nach Möglichkeit eine Geonames-URI vorhanden sein.

+

Beziehungen

+

Beziehungen von Ort zu Ort

+ +

Wichtige Ressourcen

+

URIs

+

URIs sind beständige, eindeutige Marker, mit denen sich Verbindungen zu + anderen Projekten herstellen lassen. Dieses Projekt verwendet hauptsächlich drei davon:

+ +

Wikipedia-Einträge werden nicht direkt verlinkt. Auf der linken Seite im Menü eines Wikipedia-Eintrags + steht ein Link auf das entsprechende Wikidata-Objekt.

+ +

Zur Personensuche

+

Wien

+ +

Berlin

+ +
+{% endblock %} \ No newline at end of file diff --git a/dumper/templates/dumper/imprint.html b/dumper/templates/dumper/imprint.html new file mode 100644 index 0000000..743fbb6 --- /dev/null +++ b/dumper/templates/dumper/imprint.html @@ -0,0 +1,10 @@ +{% extends "base.html" %} +{% load static %} + +{% block title %}Imprint{% endblock %} + +{% block content %} +
+ {{ imprint_body|safe }} +
+{% endblock %} \ No newline at end of file diff --git a/dumper/templates/dumper/index.html b/dumper/templates/dumper/index.html index 287bb65..ce87e9a 100644 --- a/dumper/templates/dumper/index.html +++ b/dumper/templates/dumper/index.html @@ -23,7 +23,10 @@

Personen der Moderne Basis

{{ person_count }} Personen

-

Some representative placeholder content for the three columns of text below the carousel. This is the first column.

+

Welche Personen werden in den Dokumenten von + Karl Kraus, Arthur Schnitzler und + ihren Zeitgenoss:innen erwähnt? +

@@ -33,7 +36,7 @@

{{ person_count }} Personen

{{ place_count }} Orte

-

Some representative placeholder content for the three columns of text below the carousel. This is the first column.

+

Alle durch Längen- und Breitengrade lokalisierbaren Plätze (heutige politische Zuordnung), auf die Bezug genommen werden.

@@ -43,7 +46,9 @@

{{ place_count }} Orte

{{ work_count }} Werke

-

Some representative placeholder content for the three columns of text below the carousel. This is the first column.

+

Literarische und künstlerische Kunstwerke, einschließlich + Zeitungen und Zeitschriften, die bislang erfasst sind. +

@@ -55,7 +60,8 @@

{{ work_count }} Werke

{{ event_count }} Ereignisse

-

Some representative placeholder content for the three columns of text below the carousel. This is the first column.

+

Die kleinste Kategorie umfasst bislang vor allem Aufführungen von + Theaterbesuchen Arthur Schnitzlers.

@@ -65,7 +71,8 @@

{{ event_count }} Ereignisse

{{ institution_count }} Institutionen

-

Some representative placeholder content for the three columns of text below the carousel. This is the first column.

+

Jegliche Art von Organisation, aber auch sonst schwer zuordenbares wie Bahnlinien und + Kunstpreise sind hier verzeichnet.

@@ -74,8 +81,10 @@

{{ institution_count }} Institutionen

-

{{ uri_count }} Uris

-

Some representative placeholder content for the three columns of text below the carousel. This is the first column.

+

{{ uri_count }} URIs

+

Damit nicht nur wir, sondern auch die Maschine und andere Projekte wissen, wovon + die Rede ist. +

diff --git a/dumper/tests.py b/dumper/tests.py index dbd3939..a1ed1db 100644 --- a/dumper/tests.py +++ b/dumper/tests.py @@ -81,3 +81,13 @@ def test_06_login_and_out(self): form_data = {"username": "whatever", "password": USER["password"]} rv = self.client.post(reverse("dumper:user_login"), form_data, follow=True) self.assertContains(rv, "user does not exist") + + def test_07_imprint(self): + url = reverse("dumper:imprint") + response = client.get(url) + self.assertEqual(response.status_code, 200) + + def test_08_imprint(self): + url = reverse("dumper:about") + response = client.get(url) + self.assertEqual(response.status_code, 200) diff --git a/dumper/urls.py b/dumper/urls.py index 2205ce5..5791105 100644 --- a/dumper/urls.py +++ b/dumper/urls.py @@ -7,6 +7,8 @@ urlpatterns = [ path("", views.HomePageView.as_view(), name="home"), + path("about/", views.AboutView.as_view(), name="about"), + path("imprint/", views.ImprintView.as_view(), name="imprint"), path("login/", views.user_login, name="user_login"), path("logout/", views.user_logout, name="user_logout"), ] diff --git a/dumper/views.py b/dumper/views.py index 1ce157a..8767dfd 100644 --- a/dumper/views.py +++ b/dumper/views.py @@ -4,11 +4,44 @@ from django.views.generic.base import TemplateView from apis_core.apis_entities.models import Event, Institution, Person, Place, Work +from django.conf import settings from apis_core.apis_metainfo.models import Uri +import requests + from .forms import form_user_login +def get_imprint_url(): + base_url = "https://imprint.acdh.oeaw.ac.at/" + redmine_id = getattr(settings, "REDMINE_ID", "go-register-a-redmine-service-issue") + return f"{base_url}{redmine_id}" + + +class AboutView(TemplateView): + template_name = "dumper/about.html" + + +class ImprintView(TemplateView): + template_name = "dumper/imprint.html" + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + r = requests.get(get_imprint_url()) + + if r.status_code == 200: + context["imprint_body"] = f"{r.text}" + else: + context[ + "imprint_body" + ] = """ + On of our services is currently not available. Please try it later or write + an email to acdh@oeaw.ac.at; if you are service provide, make sure that you + provided ACDH_IMPRINT_URL and REDMINE_ID + """ + return context + + class HomePageView(TemplateView): template_name = "dumper/index.html" diff --git a/pmb/settings.py b/pmb/settings.py index 0fd4c13..3fc5295 100644 --- a/pmb/settings.py +++ b/pmb/settings.py @@ -165,7 +165,7 @@ APIS_BASE_URI = "https://pmb.acdh.oeaw.ac.at/" -REDMINE_ID = "13424" +REDMINE_ID = "20586" APIS_RELATIONS_FILTER_EXCLUDE = [] CSRF_TRUSTED_ORIGINS = ["https://pmb.acdh.oeaw.ac.at"] BIRTH_REL = [ diff --git a/static/css/style.css b/static/css/style.css index 69e833a..9e24c22 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -1,11 +1,11 @@ :root { --pmb: #9B5F98; --pmb-hover: #9b5f98c2; - --person: #ad3f58; - --place: #f5db9e; - --work: #668cb9; - --event: #5c8c7c; - --institution: #c57f7f; + --person: #720e07; + --place: #5bc0eb; + --work: #ff8600; + --event: #9bc53d; + --institution: #1d3461; --uri: #e80d0d; } @@ -99,4 +99,4 @@ main { .marketing .col-lg-4 p { margin-right: .75rem; margin-left: .75rem; -} \ No newline at end of file +} diff --git a/static/img/android-chrome-192x192.png b/static/img/android-chrome-192x192.png new file mode 100644 index 0000000..a2cdf62 Binary files /dev/null and b/static/img/android-chrome-192x192.png differ diff --git a/static/img/android-chrome-512x512.png b/static/img/android-chrome-512x512.png new file mode 100644 index 0000000..36ba5d3 Binary files /dev/null and b/static/img/android-chrome-512x512.png differ diff --git a/static/img/apple-touch-icon.png b/static/img/apple-touch-icon.png new file mode 100644 index 0000000..b19e0f6 Binary files /dev/null and b/static/img/apple-touch-icon.png differ diff --git a/static/img/browserconfig.xml b/static/img/browserconfig.xml new file mode 100644 index 0000000..ba99813 --- /dev/null +++ b/static/img/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #da532c + + + diff --git a/static/img/favicon-16x16.png b/static/img/favicon-16x16.png new file mode 100644 index 0000000..8f4028e Binary files /dev/null and b/static/img/favicon-16x16.png differ diff --git a/static/img/favicon-32x32.png b/static/img/favicon-32x32.png new file mode 100644 index 0000000..993d2a6 Binary files /dev/null and b/static/img/favicon-32x32.png differ diff --git a/static/img/favicon.ico b/static/img/favicon.ico new file mode 100644 index 0000000..efd72e0 Binary files /dev/null and b/static/img/favicon.ico differ diff --git a/static/img/mstile-150x150.png b/static/img/mstile-150x150.png new file mode 100644 index 0000000..55a423e Binary files /dev/null and b/static/img/mstile-150x150.png differ diff --git a/static/img/safari-pinned-tab.svg b/static/img/safari-pinned-tab.svg new file mode 100644 index 0000000..9cdefdb --- /dev/null +++ b/static/img/safari-pinned-tab.svg @@ -0,0 +1,189 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + + diff --git a/templates/partials/footer.html b/templates/partials/footer.html index 4879253..a45bee4 100644 --- a/templates/partials/footer.html +++ b/templates/partials/footer.html @@ -1,5 +1,68 @@ +{% load static %} \ No newline at end of file diff --git a/templates/partials/head.html b/templates/partials/head.html index f824fe1..b48b8cd 100644 --- a/templates/partials/head.html +++ b/templates/partials/head.html @@ -11,5 +11,14 @@ href="https://cdn.rawgit.com/afeld/bootstrap-toc/v1.0.1/dist/bootstrap-toc.min.css" /> + + + + + + + + + {% block scriptHeader %} {% endblock scriptHeader %} \ No newline at end of file diff --git a/templates/partials/navbar.html b/templates/partials/navbar.html index 6a27ab1..24d9b72 100644 --- a/templates/partials/navbar.html +++ b/templates/partials/navbar.html @@ -18,11 +18,7 @@ Info