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

1from django.db import models 

2from django.utils.translation import gettext_lazy as _ 

3 

4from apis_core.generic.utils.rdf_namespace import CRM 

5 

6######################### 

7# Abstract base classes # 

8######################### 

9 

10 

11# These abstract base classes are named after 

12# CIDOC CRM entities, but we are *NOT*(!) 

13# trying to implement CIDOC CRM in Django. 

14 

15 

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 ) 

32 

33 class Meta: 

34 abstract = True 

35 verbose_name = _("person") 

36 verbose_name_plural = _("persons") 

37 ordering = ["surname", "forename"] 

38 

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") 

43 

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 } 

50 

51 @classmethod 

52 def get_rdf_types(cls): 

53 return [CRM.E21_Person] 

54 

55 

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 """ 

61 

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 ) 

74 

75 class Meta: 

76 abstract = True 

77 verbose_name = _("place") 

78 verbose_name_plural = _("places") 

79 ordering = ["label"] 

80 

81 def __str__(self): 

82 return self.label or _("No label") 

83 

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 } 

91 

92 @classmethod 

93 def get_rdf_types(cls): 

94 return [CRM.E53_Place] 

95 

96 @classmethod 

97 def create_from_string(cls, string): 

98 return cls.objects.create(label=string) 

99 

100 

101class E74_Group(models.Model): 

102 label = models.CharField( 

103 blank=True, default="", max_length=4096, verbose_name=_("label") 

104 ) 

105 

106 class Meta: 

107 abstract = True 

108 verbose_name = _("group") 

109 verbose_name_plural = _("groups") 

110 ordering = ["label"] 

111 

112 def __str__(self): 

113 return self.label or _("No label") 

114 

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 } 

121 

122 @classmethod 

123 def get_rdf_types(cls): 

124 return [CRM.E74_Group] 

125 

126 @classmethod 

127 def create_from_string(cls, string): 

128 return cls.objects.create(label=string) 

129 

130 

131class SimpleLabelModel(models.Model): 

132 label = models.CharField( 

133 blank=True, default="", max_length=4096, verbose_name=_("label") 

134 ) 

135 

136 class Meta: 

137 abstract = True 

138 ordering = ["label"] 

139 

140 def __str__(self): 

141 return self.label or _("No label") 

142 

143 @classmethod 

144 def create_from_string(cls, string): 

145 return cls.objects.create(label=string)