You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
konova/codelist/models.py

106 lines
2.9 KiB
Python

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):
""" Adds all children (resurcively until leaf) as .children to the KonovaCode
Returns:
code (KonovaCode): The manipulated KonovaCode instance
"""
if self.is_leaf:
return None
children = KonovaCode.objects.filter(
code_lists__in=self.code_lists.all(),
parent=self
).order_by(
"long_name"
)
self.children = children
for child in children:
child.add_children()
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)