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.
91 lines
2.5 KiB
Python
91 lines
2.5 KiB
Python
from django.db import models
|
|
|
|
|
|
class Nomenclature(models.Model):
|
|
VEHICLE = "vehicle"
|
|
CONTAINER = "container"
|
|
APPLIES_TO_CHOICES = [
|
|
(VEHICLE, "Vehicle"),
|
|
(CONTAINER, "Container"),
|
|
]
|
|
|
|
LOOKUP = "lookup"
|
|
FIELD = "field"
|
|
KIND_CHOICES = [
|
|
(LOOKUP, "Lookup Table"),
|
|
(FIELD, "Custom Field"),
|
|
]
|
|
|
|
code = models.CharField(max_length=50, unique=True)
|
|
name = models.CharField(max_length=255)
|
|
applies_to = models.CharField(max_length=50, choices=APPLIES_TO_CHOICES)
|
|
kind = models.CharField(max_length=10, choices=KIND_CHOICES, default=LOOKUP)
|
|
display_field = models.CharField(
|
|
max_length=50,
|
|
default="name",
|
|
blank=True,
|
|
help_text="Key of the NomenclatureField to use as dropdown label (for lookup kind)",
|
|
)
|
|
sort_order = models.IntegerField(default=0)
|
|
|
|
class Meta:
|
|
ordering = ["sort_order", "code"]
|
|
|
|
def __str__(self):
|
|
return f"{self.name} ({self.code})"
|
|
|
|
|
|
class NomenclatureField(models.Model):
|
|
TEXT = "text"
|
|
NUMBER = "number"
|
|
BOOL = "bool"
|
|
CHOICE = "choice"
|
|
|
|
FIELD_TYPES = [
|
|
(TEXT, "Text"),
|
|
(NUMBER, "Number"),
|
|
(BOOL, "Boolean"),
|
|
(CHOICE, "Choice"),
|
|
]
|
|
|
|
nomenclature = models.ForeignKey(
|
|
Nomenclature,
|
|
on_delete=models.CASCADE,
|
|
related_name="fields",
|
|
)
|
|
key = models.CharField(max_length=50)
|
|
label = models.CharField(max_length=100, blank=True)
|
|
field_type = models.CharField(max_length=20, choices=FIELD_TYPES)
|
|
required = models.BooleanField(default=False)
|
|
choices = models.JSONField(
|
|
null=True,
|
|
blank=True,
|
|
help_text='List of allowed values for choice type, e.g. ["Red","Green","Blue"]',
|
|
)
|
|
sort_order = models.IntegerField(default=0)
|
|
|
|
class Meta:
|
|
unique_together = [("nomenclature", "key")]
|
|
ordering = ["sort_order", "key"]
|
|
|
|
def __str__(self):
|
|
return f"{self.nomenclature.code}.{self.key} ({self.field_type})"
|
|
|
|
|
|
class NomenclatureEntry(models.Model):
|
|
nomenclature = models.ForeignKey(
|
|
Nomenclature,
|
|
on_delete=models.CASCADE,
|
|
related_name="entries",
|
|
)
|
|
data = models.JSONField(default=dict)
|
|
is_active = models.BooleanField(default=True)
|
|
|
|
class Meta:
|
|
verbose_name_plural = "Nomenclature entries"
|
|
ordering = ["id"]
|
|
|
|
def __str__(self):
|
|
display_key = self.nomenclature.display_field or "name"
|
|
return str(self.data.get(display_key, f"Entry #{self.pk}"))
|