From dd811b64984095264889966484c9710214ee2fb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Schl=C3=B6gl?= Date: Mon, 25 Nov 2024 12:42:47 +0100 Subject: [PATCH] fix: add RDF import for events resolves #374 --- apis_ontology/importers.py | 14 ++ .../0043_fandstattin_versionfandstattin.py | 213 ++++++++++++++++++ apis_ontology/models.py | 13 ++ apis_ontology/rdfimport/EventFromDNB.toml | 35 +++ 4 files changed, 275 insertions(+) create mode 100644 apis_ontology/migrations/0043_fandstattin_versionfandstattin.py create mode 100644 apis_ontology/rdfimport/EventFromDNB.toml diff --git a/apis_ontology/importers.py b/apis_ontology/importers.py index 9347742..24901b9 100644 --- a/apis_ontology/importers.py +++ b/apis_ontology/importers.py @@ -1,4 +1,6 @@ from apis_core.generic.importers import GenericModelImporter +from apis_core.utils.helpers import create_object_from_uri +from apis_ontology.models import FandStattIn, Place class PersonImporter(GenericModelImporter): @@ -6,3 +8,15 @@ def mangle_data(self, data): if "profession" in data: del data["profession"] return data + + +class EventImporter(GenericModelImporter): + def create_instance(self): + data = self.get_data(drop_unknown_fields=False) + modelfields = [field.name for field in self.model._meta.fields] + data_croped = {key: data[key] for key in data if key in modelfields} + subj = self.model.objects.create(**data_croped) + if "related_place" in data: + place = create_object_from_uri(data["related_place"], Place) + FandStattIn.objects.create(subj=subj, obj=place) + return subj diff --git a/apis_ontology/migrations/0043_fandstattin_versionfandstattin.py b/apis_ontology/migrations/0043_fandstattin_versionfandstattin.py new file mode 100644 index 0000000..8ad4179 --- /dev/null +++ b/apis_ontology/migrations/0043_fandstattin_versionfandstattin.py @@ -0,0 +1,213 @@ +# Generated by Django 5.1.3 on 2024-11-25 10:44 + +import apis_core.generic.abc +import django.db.models.deletion +import simple_history.models +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("apis_ontology", "0042_nobility_wargeburtstitelvon_wurdeerhobenin_and_more"), + ("contenttypes", "0002_remove_content_type_name"), + ("relations", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="FandStattIn", + fields=[ + ( + "relation_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="relations.relation", + ), + ), + ("start_date", models.DateField(blank=True, editable=False, null=True)), + ( + "start_start_date", + models.DateField(blank=True, editable=False, null=True), + ), + ( + "start_end_date", + models.DateField(blank=True, editable=False, null=True), + ), + ("end_date", models.DateField(blank=True, editable=False, null=True)), + ( + "end_start_date", + models.DateField(blank=True, editable=False, null=True), + ), + ( + "end_end_date", + models.DateField(blank=True, editable=False, null=True), + ), + ( + "start_date_written", + models.CharField( + blank=True, max_length=255, null=True, verbose_name="Start" + ), + ), + ( + "end_date_written", + models.CharField( + blank=True, max_length=255, null=True, verbose_name="End" + ), + ), + ( + "review", + models.BooleanField( + default=False, + editable=False, + help_text="Should be set to True, if the data record holds up quality standards.", + ), + ), + ( + "status", + models.CharField( + blank=True, editable=False, max_length=100, null=True + ), + ), + ("references", models.TextField(blank=True, null=True)), + ("notes", models.TextField(blank=True, null=True)), + ], + options={ + "abstract": False, + }, + bases=("relations.relation", models.Model), + ), + migrations.CreateModel( + name="VersionFandStattIn", + fields=[ + ( + "relation_ptr", + models.ForeignKey( + auto_created=True, + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + parent_link=True, + related_name="+", + to="relations.relation", + ), + ), + ( + "id", + models.IntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ("subj_object_id", models.PositiveIntegerField()), + ("obj_object_id", models.PositiveIntegerField()), + ("start_date", models.DateField(blank=True, editable=False, null=True)), + ( + "start_start_date", + models.DateField(blank=True, editable=False, null=True), + ), + ( + "start_end_date", + models.DateField(blank=True, editable=False, null=True), + ), + ("end_date", models.DateField(blank=True, editable=False, null=True)), + ( + "end_start_date", + models.DateField(blank=True, editable=False, null=True), + ), + ( + "end_end_date", + models.DateField(blank=True, editable=False, null=True), + ), + ( + "start_date_written", + models.CharField( + blank=True, max_length=255, null=True, verbose_name="Start" + ), + ), + ( + "end_date_written", + models.CharField( + blank=True, max_length=255, null=True, verbose_name="End" + ), + ), + ( + "version_tag", + models.CharField(blank=True, max_length=255, null=True), + ), + ( + "review", + models.BooleanField( + default=False, + editable=False, + help_text="Should be set to True, if the data record holds up quality standards.", + ), + ), + ( + "status", + models.CharField( + blank=True, editable=False, max_length=100, null=True + ), + ), + ("references", models.TextField(blank=True, null=True)), + ("notes", models.TextField(blank=True, null=True)), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ( + "history_user", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "obj_content_type", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="contenttypes.contenttype", + ), + ), + ( + "subj_content_type", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="contenttypes.contenttype", + ), + ), + ], + options={ + "verbose_name": "historical fand statt in", + "verbose_name_plural": "historical fand statt ins", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=( + simple_history.models.HistoricalChanges, + models.Model, + apis_core.generic.abc.GenericModel, + ), + ), + ] diff --git a/apis_ontology/models.py b/apis_ontology/models.py index 2e54c74..c4dd30b 100644 --- a/apis_ontology/models.py +++ b/apis_ontology/models.py @@ -1301,3 +1301,16 @@ def name(self) -> str: @classmethod def reverse_name(self) -> str: return "war Geburtstitel von [PIO]" + + +class FandStattIn(Relation, VersionMixin, TempTripleGenericAttributes, LegacyDateMixin): + subj_model = Event + obj_model = Place + + @classmethod + def name(self) -> str: + return "fand statt in [PIO]" + + @classmethod + def reverse_name(self) -> str: + return "war Ort von [PIO]" diff --git a/apis_ontology/rdfimport/EventFromDNB.toml b/apis_ontology/rdfimport/EventFromDNB.toml new file mode 100644 index 0000000..b0f9b6f --- /dev/null +++ b/apis_ontology/rdfimport/EventFromDNB.toml @@ -0,0 +1,35 @@ +################################################# +# Create an Event from GND # +################################################# +superclass = "apis_ontology.models.Event" +regex = "https://d-nb.info.*" +[[attributes]] +# name +sparql = """ +PREFIX gndo: +SELECT ?name +WHERE { + ?subject a gndo:HistoricSingleEventOrEra ; + gndo:preferredNameForTheSubjectHeading ?name . +} +""" +[[attributes]] +# start_date_written +sparql = """ +PREFIX gndo: +SELECT ?start_date_written +WHERE { + ?subject a gndo:HistoricSingleEventOrEra ; + gndo:dateOfProduction ?start_date_written . +} +""" +[[attributes]] +# related_place +sparql = """ +PREFIX gndo: +SELECT ?related_place +WHERE { + ?subject a gndo:HistoricSingleEventOrEra ; + gndo:place ?related_place . +} +"""