mpeltriaux
df241747cf
* adds migration for app codelist to migrate existing biotope type details codes from list 975 to 288 depending on their atomID * improves rendering of action and biotope type details on frontend for KOM, OEK and EMA * refactors KonovaCode str() rendering
120 lines
3.3 KiB
Python
120 lines
3.3 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,
|
|
blank=True,
|
|
help_text="Short version of long name",
|
|
)
|
|
long_name = models.CharField(
|
|
max_length=1000,
|
|
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 = ""
|
|
|
|
long_name = self.long_name
|
|
short_name = self.short_name
|
|
|
|
both_names_exist = long_name is not None and short_name is not None
|
|
|
|
if both_names_exist:
|
|
if with_parent and self.parent:
|
|
parent_short_name_exists = self.parent.short_name is not None
|
|
parent_long_name_exists = self.parent.long_name is not None
|
|
if parent_long_name_exists:
|
|
ret_val += self.parent.long_name + " > "
|
|
elif parent_short_name_exists:
|
|
ret_val += self.parent.short_name + " > "
|
|
|
|
ret_val += long_name
|
|
|
|
if short_name and short_name != long_name:
|
|
ret_val += f" ({short_name})"
|
|
else:
|
|
ret_val += str(long_name or 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,
|
|
is_archived=False,
|
|
).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)
|