Coverage for vocabs/models.py: 79%
77 statements
« prev ^ index » next coverage.py v7.5.3, created at 2024-06-10 15:48 +0000
« 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
8DEFAULT_PEFIX = os.path.basename(settings.BASE_DIR)
10DEFAULT_NAMESPACE = "http://www.vocabs/{}/".format(DEFAULT_PEFIX)
12LABEL_TYPES = (
13 ("prefLabel", "prefLabel"),
14 ("altLabel", "altLabel"),
15 ("hiddenLabel", "hiddenLabel"),
16)
18RELATION_TYPES = (
19 ("narrower", "narrower"),
20 ("broader", "broader"),
21 ("related", "related"),
22 ("broadMatch", "broadMatch"),
23 ("relatedMatch", "relatedMatch"),
24 ("exactMatch", "exactMatch"),
25)
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)
32 def __str__(self):
33 return "{}".format(self.prefix)
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)
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)
55 def get_absolute_url(self):
56 return reverse("vocabs:skosconceptscheme_detail", kwargs={"pk": self.id})
58 def __str__(self):
59 return "{}:{}".format(self.namespace, self.dc_title)
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 )
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)
84 def get_absolute_url(self):
85 return reverse("vocabs:skoslabel_detail", kwargs={"pk": self.id})
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)
119 @property
120 def all_schemes(self):
121 return ", ".join([x.dc_title for x in self.scheme.all()])
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
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
143 super(SkosConcept, self).save(*args, **kwargs)
145 def __str__(self):
146 return "{}".format(self.pref_label)
148 def get_absolute_url(self):
149 return reverse("vocabs:skosconcept_detail", kwargs={"pk": self.id})