Coverage for network/models.py: 100%
31 statements
« prev ^ index » next coverage.py v7.10.1, created at 2025-07-29 15:38 +0000
« prev ^ index » next coverage.py v7.10.1, created at 2025-07-29 15:38 +0000
1import re
3from django.conf import settings
4from django.db import models
5from django.urls import reverse
8class Network(models.Model):
9 supported_doi_prefixes: list = settings.SUPPORTED_DOI_PREFIXES
11 fdsn_code = models.CharField(max_length=20, help_text="Network FDSN code.")
12 name = models.CharField(max_length=255, help_text="Name of the network.")
13 start_year = models.IntegerField(help_text="Starting year of the network.")
14 end_year = models.IntegerField(
15 null=True, blank=True, help_text="End year of the network, if applied."
16 )
17 doi = models.CharField(
18 max_length=100,
19 default="",
20 blank=True,
21 help_text="Network DOI indicated in the FDSN.",
22 )
24 class Meta:
25 constraints = [
26 models.UniqueConstraint(
27 fields=["fdsn_code", "start_year"], name="network_code_unique"
28 ),
29 ]
31 def __str__(self) -> str:
32 if self.is_temporary():
33 return f"{self.fdsn_code.upper()}_{self.start_year}"
34 return f"{self.fdsn_code.upper()}"
36 def get_absolute_url(self) -> str:
37 return reverse("datacite:metadata-detail", kwargs={"pk": self.pk})
39 def is_temporary(self) -> bool:
40 return re.match(r"^[0-9XYZ]", self.fdsn_code.upper()) is not None
42 def generate_doi(self) -> None:
43 if not self.doi:
44 self.doi = f"{self.supported_doi_prefixes[0]}/SN/{self}"
45 self.save()
47 @property
48 def supported(self) -> bool:
49 for supported_doi_prefix in Network.supported_doi_prefixes:
50 if self.doi.startswith(supported_doi_prefix):
51 return True
52 return False