from django.db import models class KonovaCode(models.Model): """ Representation of the OSIRIS Codelisten codes. KonovaCodes will be updated using a command regularly to provide all codes, which are provided by the Codelisten application itself. To reduce traffic, we store them in our own database. """ id = models.IntegerField( primary_key=True, help_text="Regular Id" ) atom_id = models.IntegerField( help_text="AtomId; Identifies this code uniquely over all NatIT projects; Duplicates possible", null=True, blank=True, ) parent = models.ForeignKey( "KonovaCode", on_delete=models.CASCADE, null=True, blank=True, ) short_name = models.CharField( max_length=500, null=True, blank=True, help_text="Short version of long name", ) long_name = models.CharField( max_length=1000, null=True, blank=True, help_text="", ) is_selectable = models.BooleanField( default=False, help_text="Whether this code shall be used for any select actions or not" ) is_leaf = models.BooleanField( default=False, help_text="Whether this code has children or not" ) is_archived = models.BooleanField( default=False, help_text="Whether this code is archived or not" ) def __str__(self, with_parent: bool = True): ret_val = "" if self.parent and with_parent: ret_val += self.parent.long_name + " > " ret_val += self.long_name if self.short_name and self.short_name != self.long_name: # Only add short name, if we won't have stupid repition like 'thing a (thing a)' due to misused long-short names ret_val += f" ({self.short_name})" return ret_val @property def str_as_office(self): ret_val = self.long_name if self.parent: ret_val += ", " + self.parent.long_name return ret_val def add_children(self, order_by: str = "long_name"): """ Adds all children (resurcively until leaf) as .children to the KonovaCode Returns: code (KonovaCode): The manipulated KonovaCode instance """ if self.is_leaf: return self children = KonovaCode.objects.filter( parent=self ).order_by( order_by ) self.children = children for child in children: child.add_children(order_by) return self class KonovaCodeList(models.Model): """ The codelist itself """ id = models.IntegerField( primary_key=True, help_text="List identifier", ) codes = models.ManyToManyField( KonovaCode, blank=True, help_text="Codes for this list", related_name="code_lists" ) def __str__(self): return str(self.id)