Coverage for network/models.py: 100%

31 statements  

« prev     ^ index     » next       coverage.py v7.10.1, created at 2025-07-29 15:38 +0000

1import re 

2 

3from django.conf import settings 

4from django.db import models 

5from django.urls import reverse 

6 

7 

8class Network(models.Model): 

9 supported_doi_prefixes: list = settings.SUPPORTED_DOI_PREFIXES 

10 

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 ) 

23 

24 class Meta: 

25 constraints = [ 

26 models.UniqueConstraint( 

27 fields=["fdsn_code", "start_year"], name="network_code_unique" 

28 ), 

29 ] 

30 

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

35 

36 def get_absolute_url(self) -> str: 

37 return reverse("datacite:metadata-detail", kwargs={"pk": self.pk}) 

38 

39 def is_temporary(self) -> bool: 

40 return re.match(r"^[0-9XYZ]", self.fdsn_code.upper()) is not None 

41 

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

46 

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