From c8d06b60ec41cb3a75096ad64e7c3d8a6f9d0743 Mon Sep 17 00:00:00 2001 From: csae8092 Date: Sun, 11 Feb 2024 09:19:00 +0100 Subject: [PATCH 01/19] mgm cmd to serialize relations added --- .gitignore | 1 + .../management/commands/__init__.py | 0 .../management/commands/dump_relations.py | 37 +++++++++++++++++++ apis_core/apis_relations/models.py | 25 ++++--------- 4 files changed, 45 insertions(+), 18 deletions(-) create mode 100644 apis_core/apis_relations/management/commands/__init__.py create mode 100644 apis_core/apis_relations/management/commands/dump_relations.py diff --git a/.gitignore b/.gitignore index c23d6a3..c0aaae0 100644 --- a/.gitignore +++ b/.gitignore @@ -180,3 +180,4 @@ hansi.csv media/duplicated_*.csv Untitled.ipynb listevent.xml +relations.csv diff --git a/apis_core/apis_relations/management/commands/__init__.py b/apis_core/apis_relations/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apis_core/apis_relations/management/commands/dump_relations.py b/apis_core/apis_relations/management/commands/dump_relations.py new file mode 100644 index 0000000..bebb4b3 --- /dev/null +++ b/apis_core/apis_relations/management/commands/dump_relations.py @@ -0,0 +1,37 @@ +import os +import pandas as pd +from datetime import datetime + +from django.conf import settings +from django.core.management.base import BaseCommand + +from tqdm import tqdm +from typing import Any +from apis_core.apis_relations.models import AbstractRelation +from dumper.utils import write_report + + +class Command(BaseCommand): + help = "Dumps all relations into a csv" + + def handle(self, *args: Any, **options: Any) -> str | None: + start_time = datetime.now().strftime(settings.PMB_TIME_PATTERN) + print("dumping all relations into a csv") + + data = [] + issues = [] + for x in AbstractRelation.get_all_relation_classes(): + print(x.__name__) + for y in tqdm(x.objects.all()): + try: + data.append(y.get_web_object()) + except AttributeError: + issues.append(y) + df = pd.DataFrame(data) + save_path = os.path.join(settings.MEDIA_ROOT, "relations.csv") + df.to_csv(save_path, index=False) + end_time = datetime.now().strftime(settings.PMB_TIME_PATTERN) + report = [os.path.basename(__file__), start_time, end_time] + write_report(report) + print(f"serialized {len(df)} relations") + return "done" diff --git a/apis_core/apis_relations/models.py b/apis_core/apis_relations/models.py index 851ff09..0c2e12e 100644 --- a/apis_core/apis_relations/models.py +++ b/apis_core/apis_relations/models.py @@ -1,6 +1,7 @@ import inspect import sys +from icecream import ic from apis_core.apis_entities.models import Person from apis_core.apis_metainfo.models import TempEntityClass @@ -45,28 +46,16 @@ def __str__(self): ) def get_web_object(self): - namea = self.get_related_entity_instancea().name - nameb = self.get_related_entity_instanceb().name - - if self.get_related_entity_classa() == Person: - namea += ", " - if self.get_related_entity_instancea().first_name is None: - namea += "-" - else: - namea += self.get_related_entity_instancea().first_name - - if self.get_related_entity_classb() == Person: - nameb += ", " - if self.get_related_entity_instanceb().first_name is None: - nameb += "-" - else: - nameb += self.get_related_entity_instanceb().first_name + namea = self.get_related_entity_instancea() + nameb = self.get_related_entity_instanceb() result = { "relation_pk": self.pk, "relation_type": self.relation_type.name, - self.get_related_entity_field_namea(): namea, - self.get_related_entity_field_nameb(): nameb, + "source": namea, + "target": nameb, + "source_id": namea.id, + "target_id": nameb.id, "start_date": self.start_date_written, "end_date": self.end_date_written, } From 4869a0d36d0a5032b1a47d0bcb385bfb6c9d6b69 Mon Sep 17 00:00:00 2001 From: csae8092 Date: Mon, 12 Feb 2024 15:39:45 +0100 Subject: [PATCH 02/19] mgm cmd to find delete duplicated relations added --- .../management/commands/dump_relations.py | 41 +++++++++++++++++-- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/apis_core/apis_relations/management/commands/dump_relations.py b/apis_core/apis_relations/management/commands/dump_relations.py index bebb4b3..52979f8 100644 --- a/apis_core/apis_relations/management/commands/dump_relations.py +++ b/apis_core/apis_relations/management/commands/dump_relations.py @@ -1,14 +1,16 @@ import os import pandas as pd +import recordlinkage + from datetime import datetime from django.conf import settings from django.core.management.base import BaseCommand - +from icecream import ic from tqdm import tqdm from typing import Any from apis_core.apis_relations.models import AbstractRelation -from dumper.utils import write_report +from dumper.utils import upload_files_to_owncloud, write_report class Command(BaseCommand): @@ -24,14 +26,47 @@ def handle(self, *args: Any, **options: Any) -> str | None: print(x.__name__) for y in tqdm(x.objects.all()): try: - data.append(y.get_web_object()) + item = y.get_web_object() + item["relation_pk"] = y.id + data.append(item) except AttributeError: issues.append(y) df = pd.DataFrame(data) + print("lets find and delete duplicated relations") + df.set_index("relation_pk", inplace=True, drop=False) + save_path = os.path.join(settings.MEDIA_ROOT, "relations.csv") + print(f"serialized {len(df)} relations") + df.to_csv(save_path, index=False) + + df = pd.read_csv(save_path).fillna("nodate") + df.set_index("relation_pk", inplace=True, drop=False) + indexer = recordlinkage.Index() + indexer.block(["relation_type", "source_id", "target_id", "start_date", "end_date"]) + duplicates = indexer.index(df) + print(f"deleting {len(duplicates)} duplicated relations") + + deleted = [] + for double in duplicates: + for x in AbstractRelation.get_all_relation_classes(): + try: + item = x.objects.get(id=double[1]) + except: # noqa + continue + deleted.append(item.id) + item.delete() + break + print(deleted) + df.drop(deleted) save_path = os.path.join(settings.MEDIA_ROOT, "relations.csv") df.to_csv(save_path, index=False) end_time = datetime.now().strftime(settings.PMB_TIME_PATTERN) report = [os.path.basename(__file__), start_time, end_time] write_report(report) print(f"serialized {len(df)} relations") + files = list() + files.append(save_path) + try: + upload_files_to_owncloud(files) + except Exception as e: + ic(e) return "done" From af381518c6d263d022d7f9db4543764ef6b06f67 Mon Sep 17 00:00:00 2001 From: csae8092 Date: Mon, 12 Feb 2024 16:08:21 +0100 Subject: [PATCH 03/19] h1 -> h2; allow link to headline and closes #146 --- dumper/templates/dumper/about.html | 116 +++++++++++++++++------------ static/css/style.css | 9 +++ 2 files changed, 79 insertions(+), 46 deletions(-) diff --git a/dumper/templates/dumper/about.html b/dumper/templates/dumper/about.html index 3df4eb6..58d17d2 100644 --- a/dumper/templates/dumper/about.html +++ b/dumper/templates/dumper/about.html @@ -4,31 +4,37 @@ {% block title %}Über das Projekt{% endblock %} {% block content %} -
+

PMB

-

Personen der Moderne Basis*

+

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

+

Datenherkunft#

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

  • Peter Michael Braunwarth: Personen-, Werk- und Ortindex: Arthur Schnitzler: Tagebuch 1879–1931. Herausgegeben von der Kommission für literarische Gebrauchsformen der Österreichischen Akademie der Wissenschaften, Obmann: Werner Welzig. Wien: Verlag der - Österreichischen Akademie der Wissenschaften, 1981–2000.
    - 10.772 Entitäten (Februar 2019)
  • + Österreichischen Akademie der Wissenschaften, 1981–2000.
    + 10.772 Entitäten (Februar 2019) +
  • Martin Anton Müller: Personen-, Werk-, Organisations- und Ortindex für die Edition: Arthur Schnitzler – Briefwechsel mit Autorinnen und Autoren (2018–2021). Diese sind eine Weiterführung von den von Kurt Ifkovits und Martin Anton Müller erstellten Daten zu: Hermann Bahr, Arthur Schnitzler: Briefwechsel, Aufzeichnungen, Dokumente. Hg. K. I. und - M. A. M. Göttingen: Wallstein 2018.
    - 6.755 Entitäten (Februar 2019)
  • -
  • Martin Anton Müller: Hermann Bahr – Textverzeichnis. Weimar: VDG 2014
    rund 7.000 Entitäten (März 2023)
  • -
  • Hermann Bahr: Tagebücher, Skizzenbücher, Notizhefte. Hg. Moritz Csáky, Mitarbeit von Lottelis Moser, Helene Zand, Lukas Mayerhofer und Kurt Ifkovits. Wien, Köln, Weimar: Böhlau 1994-2003, Link (Januar 2024)
  • + M. A. M. Göttingen: Wallstein 2018.
    + 6.755 Entitäten (Februar 2019) + +
  • Martin Anton Müller: Hermann Bahr – Textverzeichnis. Weimar: VDG 2014
    rund 7.000 Entitäten (März + 2023)
  • +
  • Hermann Bahr: Tagebücher, Skizzenbücher, Notizhefte. Hg. Moritz Csáky, Mitarbeit von Lottelis Moser, Helene + Zand, Lukas Mayerhofer und Kurt Ifkovits. Wien, Köln, Weimar: Böhlau 1994-2003, Link (Januar 2024)

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

@@ -37,33 +43,35 @@

Datenherkunft

  • Arthur Schnitzler – Briefwechsel mit Autorinnen und Autoren, link (2018–[2024])
  • Intertextuality in the Legal Papers of Karl Kraus – A Scholarly Digital Edition, link (2019–2022)
  • + href="https://www.kraus.wienbibliothek.at">link (2019–2022)

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

    -
    -

    Open Source

    -

    Alle Daten sind mit der Lizenz CC BY 4.0 versehen und können ohne Rücksprache verwendet und weiter - bearbeitet werden. Als Listen können sie zur Gänze geladen werden (rechte Maustaste: »speichern unter«):

    - -

    Einzelne Einträge können über die API (die JSON- oder TEI-Symbole bei einem Eintrag) geladen werden.

    -

    Wir freuen uns, wenn sich weitere Unternehmungen anschließen und die PMB für die Erfassung ihrer Entitäten verwenden würden - und bitten um Kontaktaufnahme.

    -

    Richtlinien

    +

    Einzelne Einträge können über die API (die JSON- oder TEI-Symbole bei einem Eintrag) geladen werden.

    +

    Wir freuen uns, wenn sich weitere Unternehmungen anschließen und die PMB für die Erfassung ihrer Entitäten + verwenden würden + und bitten um Kontaktaufnahme.

    +

    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

    +

    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 @@ -177,12 +185,20 @@

    Von Person zu Person

    • -
      • ist adoptiertes Elternteil von
    • +
    • +
        +
      • ist adoptiertes Elternteil von
      • +
      +
    • -
      • ist Stiefelternteil von
    • +
    • +
        +
      • ist Stiefelternteil von
      • +
      +
  • @@ -222,7 +238,11 @@

    Von Person zu Person

    • -
      • ist Stiefkind von
    • +
    • +
        +
      • ist Stiefkind von
      • +
      +
  • @@ -298,7 +318,7 @@

    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#

    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 @@ -395,8 +415,8 @@

    Von Werk zu Institution

  • enthält
  • enthalten in
  • - -

    Institutionen

    + +

    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 @@ -420,15 +440,17 @@

    Von einer Institution zu einem Ort

    • angesiedelt in
    -

    Orte

    +

    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.

    + 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

    @@ -436,20 +458,22 @@

    Beziehungen von Ort zu Ort

  • gehört zu
  • enthält
  • -

    Wichtige Ressourcen

    +

    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:

    + anderen Projekten herstellen lassen. Dieses Projekt verwendet hauptsächlich drei davon:

    -

    Eine Konkordanz zwischen PMB-URIs und GND-URIs kann über folgende BEACON Datei bezogen werden.

    -

    Eine Konkordanz zwischen PMB-URIs und Wikidata-URIs kann über folgende BEACON Datei bezogen werden.

    +

    Eine Konkordanz zwischen PMB-URIs und GND-URIs kann über folgende BEACON Datei bezogen werden.

    +

    Eine Konkordanz zwischen PMB-URIs und Wikidata-URIs kann über folgende BEACON Datei bezogen werden.

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

    - + steht ein Link auf das entsprechende Wikidata-Objekt.

    +

    Zur Personensuche

    Wien

      @@ -461,8 +485,8 @@

      Wien

    • Jüdische Matrikeln (Kostenfreie Registrierung. Achtung: Nicht auf die Datenbank setzen, sondern die Bilder ansehen. Einträge vor allem in Wien-Allgemein und Wien I.)
    • -
    • Lehmann online OCR (Adressbuch Wien. Wenn die Volltexterkennung nicht +
    • Lehmann online OCR + (Adressbuch Wien. Wenn die Volltexterkennung nicht funktioniert, ist die herkömmliche Blätterversion besser).
    • ANNO Zeitungen (Grade für Namen empfiehlt sich die Abstandsuche: "Johann Goethe"~2 findet auch "Johann Wolfgang Goethe")
    • @@ -475,5 +499,5 @@

      Berlin

    • The European Library (Internationale Zeitungen, auch Berlin.)
    -
    +
    {% endblock %} \ No newline at end of file diff --git a/static/css/style.css b/static/css/style.css index ea38e23..42a830a 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -109,4 +109,13 @@ main { .table-relations th { width: 25% !important; +} + +.anchor-link { + padding: 0 .175rem; + font-weight: 400; + color: rgba(13,110,253,0.5); + text-decoration: none; + opacity: 0; + transition: color 0.15s ease-in-out,opacity 0.15s ease-in-out; } \ No newline at end of file From 5e7d797b3ccddd6c3b843c9dee2330a7500c67f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Anton=20M=C3=BCller?= Date: Mon, 12 Feb 2024 13:44:13 +0100 Subject: [PATCH 04/19] imprint params in redmine nachtgetragen --- dumper/templates/dumper/index.html | 4 ++-- templates/partials/footer.html | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/dumper/templates/dumper/index.html b/dumper/templates/dumper/index.html index c2ab7ca..b51eb5e 100644 --- a/dumper/templates/dumper/index.html +++ b/dumper/templates/dumper/index.html @@ -49,8 +49,8 @@

    {{ place_count|intcomma }} Orte

    {{ work_count|intcomma }} Werke

    -

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

    Literarische und künstlerische Schöpfungen, einschließlich + Zeitungen und Zeitschriften. Fast ein Drittel der Werke stammt von Hermann Bahr

    diff --git a/templates/partials/footer.html b/templates/partials/footer.html index 33bf83b..80c06fe 100644 --- a/templates/partials/footer.html +++ b/templates/partials/footer.html @@ -1,6 +1,9 @@ {% load static %}