Coverage for vocabs/models.py: 79%

77 statements  

« prev     ^ index     » next       coverage.py v7.5.3, created at 2024-06-10 15:48 +0000

1import os 

2from django.conf import settings 

3from django.db import models 

4from django.urls import reverse 

5from django.utils.text import slugify 

6 

7 

8DEFAULT_PEFIX = os.path.basename(settings.BASE_DIR) 

9 

10DEFAULT_NAMESPACE = "http://www.vocabs/{}/".format(DEFAULT_PEFIX) 

11 

12LABEL_TYPES = ( 

13 ("prefLabel", "prefLabel"), 

14 ("altLabel", "altLabel"), 

15 ("hiddenLabel", "hiddenLabel"), 

16) 

17 

18RELATION_TYPES = ( 

19 ("narrower", "narrower"), 

20 ("broader", "broader"), 

21 ("related", "related"), 

22 ("broadMatch", "broadMatch"), 

23 ("relatedMatch", "relatedMatch"), 

24 ("exactMatch", "exactMatch"), 

25) 

26 

27 

28class SkosNamespace(models.Model): 

29 namespace = models.URLField(blank=True, default=DEFAULT_NAMESPACE) 

30 prefix = models.CharField(max_length=50, blank=True, default=DEFAULT_PEFIX) 

31 

32 def __str__(self): 

33 return "{}".format(self.prefix) 

34 

35 

36class SkosConceptScheme(models.Model): 

37 dc_title = models.CharField(max_length=300, blank=True) 

38 namespace = models.ForeignKey( 

39 SkosNamespace, blank=True, null=True, on_delete=models.SET_NULL 

40 ) 

41 dct_creator = models.URLField(blank=True) 

42 legacy_id = models.CharField(max_length=200, blank=True) 

43 

44 def save(self, *args, **kwargs): 

45 if self.namespace is None: 

46 temp_namespace, _ = SkosNamespace.objects.get_or_create( 

47 namespace=DEFAULT_NAMESPACE, prefix=DEFAULT_PEFIX 

48 ) 

49 temp_namespace.save() 

50 self.namespace = temp_namespace 

51 else: 

52 pass 

53 super(SkosConceptScheme, self).save(*args, **kwargs) 

54 

55 def get_absolute_url(self): 

56 return reverse("vocabs:skosconceptscheme_detail", kwargs={"pk": self.id}) 

57 

58 def __str__(self): 

59 return "{}:{}".format(self.namespace, self.dc_title) 

60 

61 

62class SkosLabel(models.Model): 

63 label = models.CharField( 

64 max_length=100, blank=True, help_text="The entities label or name." 

65 ) 

66 label_type = models.CharField( 

67 max_length=30, 

68 blank=True, 

69 choices=LABEL_TYPES, 

70 help_text="The type of the label.", 

71 ) 

72 isocode = models.CharField( 

73 max_length=3, 

74 blank=True, 

75 help_text="The ISO 639-3 code for the label's language.", 

76 ) 

77 

78 def __str__(self): 

79 if self.label_type != "": 

80 return "{} @{} ({})".format(self.label, self.isocode, self.label_type) 

81 else: 

82 return "{} @{}".format(self.label, self.isocode) 

83 

84 def get_absolute_url(self): 

85 return reverse("vocabs:skoslabel_detail", kwargs={"pk": self.id}) 

86 

87 

88class SkosConcept(models.Model): 

89 pref_label = models.CharField(max_length=300, blank=True) 

90 pref_label_lang = models.CharField(max_length=3, blank=True, default="eng") 

91 scheme = models.ManyToManyField(SkosConceptScheme, blank=True) 

92 definition = models.TextField(blank=True) 

93 definition_lang = models.CharField(max_length=3, blank=True, default="eng") 

94 label = models.ManyToManyField(SkosLabel, blank=True) 

95 notation = models.CharField(max_length=300, blank=True) 

96 namespace = models.ForeignKey( 

97 SkosNamespace, blank=True, null=True, on_delete=models.SET_NULL 

98 ) 

99 skos_broader = models.ManyToManyField( 

100 "SkosConcept", blank=True, related_name="narrower" 

101 ) 

102 skos_narrower = models.ManyToManyField( 

103 "SkosConcept", blank=True, related_name="broader" 

104 ) 

105 skos_related = models.ManyToManyField( 

106 "SkosConcept", blank=True, related_name="related" 

107 ) 

108 skos_broadmatch = models.ManyToManyField( 

109 "SkosConcept", blank=True, related_name="broadmatch" 

110 ) 

111 skos_exactmatch = models.ManyToManyField( 

112 "SkosConcept", blank=True, related_name="exactmatch" 

113 ) 

114 skos_closematch = models.ManyToManyField( 

115 "SkosConcept", blank=True, related_name="closematch" 

116 ) 

117 legacy_id = models.CharField(max_length=200, blank=True) 

118 

119 @property 

120 def all_schemes(self): 

121 return ", ".join([x.dc_title for x in self.scheme.all()]) 

122 

123 def save(self, *args, **kwargs): 

124 if self.notation == "": 

125 temp_notation = slugify(self.pref_label, allow_unicode=True) 

126 concepts = len(SkosConcept.objects.filter(notation=temp_notation)) 

127 if concepts < 1: 

128 self.notation = temp_notation 

129 else: 

130 self.notation = "{}-{}".format(temp_notation, concepts) 

131 else: 

132 pass 

133 

134 if self.namespace is None: 

135 temp_namespace, _ = SkosNamespace.objects.get_or_create( 

136 namespace=DEFAULT_NAMESPACE, prefix=DEFAULT_PEFIX 

137 ) 

138 temp_namespace.save() 

139 self.namespace = temp_namespace 

140 else: 

141 pass 

142 

143 super(SkosConcept, self).save(*args, **kwargs) 

144 

145 def __str__(self): 

146 return "{}".format(self.pref_label) 

147 

148 def get_absolute_url(self): 

149 return reverse("vocabs:skosconcept_detail", kwargs={"pk": self.id})