Coverage for apis_core/apis_entities/abc.py: 89%
73 statements
« prev ^ index » next coverage.py v7.5.3, created at 2025-09-17 09:41 +0000
« prev ^ index » next coverage.py v7.5.3, created at 2025-09-17 09:41 +0000
1from django.db import models
2from django.utils.translation import gettext_lazy as _
4from apis_core.generic.utils.rdf_namespace import CRM
6#########################
7# Abstract base classes #
8#########################
11# These abstract base classes are named after
12# CIDOC CRM entities, but we are *NOT*(!)
13# trying to implement CIDOC CRM in Django.
16class E21_Person(models.Model):
17 forename = models.CharField(
18 blank=True, default="", max_length=4096, verbose_name=_("forename")
19 )
20 surname = models.CharField(
21 blank=True, default="", max_length=4096, verbose_name=_("surname")
22 )
23 gender = models.CharField(
24 blank=True, default="", max_length=4096, verbose_name=_("gender")
25 )
26 date_of_birth = models.DateField(
27 blank=True, null=True, verbose_name=_("date of birth")
28 )
29 date_of_death = models.DateField(
30 blank=True, null=True, verbose_name=_("date of death")
31 )
33 class Meta:
34 abstract = True
35 verbose_name = _("person")
36 verbose_name_plural = _("persons")
37 ordering = ["surname", "forename"]
39 def __str__(self):
40 if self.forename and self.surname:
41 return f"{self.forename} {self.surname}"
42 return self.forename or self.surname or _("No name")
44 @classmethod
45 def rdf_configs(cls):
46 return {
47 "https://d-nb.info/*|/.*.rdf": "E21_PersonFromDNB.toml",
48 "http://www.wikidata.org/*|/.*.rdf": "E21_PersonFromWikidata.toml",
49 }
51 @classmethod
52 def get_rdf_types(cls):
53 return [CRM.E21_Person]
56class E53_Place(models.Model):
57 """
58 The feature_code field refers to the geonames feature codes, as
59 listed on https://www.geonames.org/export/codes.html
60 """
62 label = models.CharField(
63 blank=True, default="", max_length=4096, verbose_name=_("label")
64 )
65 latitude = models.FloatField(blank=True, null=True, verbose_name=_("latitude"))
66 longitude = models.FloatField(blank=True, null=True, verbose_name=_("longitude"))
67 feature_code = models.CharField(
68 blank=True,
69 default="",
70 max_length=16,
71 verbose_name=_("feature code"),
72 help_text='<a href="https://www.geonames.org/export/codes.html" target="_blank">Geonames Feature Code List</a>',
73 )
75 class Meta:
76 abstract = True
77 verbose_name = _("place")
78 verbose_name_plural = _("places")
79 ordering = ["label"]
81 def __str__(self):
82 return self.label or _("No label")
84 @classmethod
85 def rdf_configs(cls):
86 return {
87 "https://d-nb.info/*|/.*.rdf": "E53_PlaceFromDNB.toml",
88 "https://sws.geonames.org/*|/.*.rdf*": "E53_PlaceFromGeonames.toml",
89 "http://www.wikidata.org/*|/.*.rdf": "E53_PlaceFromWikidata.toml",
90 }
92 @classmethod
93 def get_rdf_types(cls):
94 return [CRM.E53_Place]
96 @classmethod
97 def create_from_string(cls, string):
98 return cls.objects.create(label=string)
101class E74_Group(models.Model):
102 label = models.CharField(
103 blank=True, default="", max_length=4096, verbose_name=_("label")
104 )
106 class Meta:
107 abstract = True
108 verbose_name = _("group")
109 verbose_name_plural = _("groups")
110 ordering = ["label"]
112 def __str__(self):
113 return self.label or _("No label")
115 @classmethod
116 def rdf_configs(cls):
117 return {
118 "https://d-nb.info/*|/.*.rdf": "E74_GroupFromDNB.toml",
119 "http://www.wikidata.org/*|/.*.rdf": "E74_GroupFromWikidata.toml",
120 }
122 @classmethod
123 def get_rdf_types(cls):
124 return [CRM.E74_Group]
126 @classmethod
127 def create_from_string(cls, string):
128 return cls.objects.create(label=string)
131class SimpleLabelModel(models.Model):
132 label = models.CharField(
133 blank=True, default="", max_length=4096, verbose_name=_("label")
134 )
136 class Meta:
137 abstract = True
138 ordering = ["label"]
140 def __str__(self):
141 return self.label or _("No label")
143 @classmethod
144 def create_from_string(cls, string):
145 return cls.objects.create(label=string)