added vehicles and vehicles extra, dynamic tables for entities, dynamic dropdowns with overlay for selecting and manage data

This commit is contained in:
2026-02-10 17:32:33 +02:00
parent ed35a90cc0
commit 6a42099169
60 changed files with 4845 additions and 81 deletions
+19 -1
View File
@@ -1,3 +1,21 @@
from django.contrib import admin
from .models import Nomenclature, NomenclatureField, NomenclatureEntry
# Register your models here.
class NomenclatureFieldInline(admin.TabularInline):
model = NomenclatureField
extra = 1
@admin.register(Nomenclature)
class NomenclatureAdmin(admin.ModelAdmin):
list_display = ['code', 'name', 'applies_to', 'kind', 'sort_order']
list_filter = ['applies_to', 'kind']
search_fields = ['code', 'name']
inlines = [NomenclatureFieldInline]
@admin.register(NomenclatureEntry)
class NomenclatureEntryAdmin(admin.ModelAdmin):
list_display = ['id', '__str__', 'nomenclature', 'is_active']
list_filter = ['nomenclature', 'is_active']
@@ -0,0 +1,111 @@
# Generated by Django 4.2.8 on 2026-02-05 15:29
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("nomenclatures", "0001_initial"),
]
operations = [
migrations.AlterModelOptions(
name="nomenclature",
options={"ordering": ["sort_order", "code"]},
),
migrations.AlterModelOptions(
name="nomenclaturefield",
options={"ordering": ["sort_order", "key"]},
),
migrations.AddField(
model_name="nomenclature",
name="display_field",
field=models.CharField(
blank=True,
default="name",
help_text="Key of the NomenclatureField to use as dropdown label (for lookup kind)",
max_length=50,
),
),
migrations.AddField(
model_name="nomenclature",
name="kind",
field=models.CharField(
choices=[("lookup", "Lookup Table"), ("field", "Custom Field")],
default="lookup",
max_length=10,
),
),
migrations.AddField(
model_name="nomenclature",
name="sort_order",
field=models.IntegerField(default=0),
),
migrations.AddField(
model_name="nomenclaturefield",
name="choices",
field=models.JSONField(
blank=True,
help_text='List of allowed values for choice type, e.g. ["Red","Green","Blue"]',
null=True,
),
),
migrations.AddField(
model_name="nomenclaturefield",
name="label",
field=models.CharField(blank=True, max_length=100),
),
migrations.AddField(
model_name="nomenclaturefield",
name="required",
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name="nomenclaturefield",
name="sort_order",
field=models.IntegerField(default=0),
),
migrations.AlterField(
model_name="nomenclaturefield",
name="nomenclature",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="fields",
to="nomenclatures.nomenclature",
),
),
migrations.AlterUniqueTogether(
name="nomenclaturefield",
unique_together={("nomenclature", "key")},
),
migrations.CreateModel(
name="NomenclatureEntry",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("data", models.JSONField(default=dict)),
("is_active", models.BooleanField(default=True)),
(
"nomenclature",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="entries",
to="nomenclatures.nomenclature",
),
),
],
options={
"verbose_name_plural": "Nomenclature entries",
"ordering": ["id"],
},
),
]
+66 -5
View File
@@ -1,13 +1,39 @@
from django.db import models
# Create your models here.
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(
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,
choices=[("vehicle", "Vehicle"), ("container", "Container")]
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"
@@ -23,7 +49,42 @@ class NomenclatureField(models.Model):
]
nomenclature = models.ForeignKey(
Nomenclature, on_delete=models.CASCADE
Nomenclature,
on_delete=models.CASCADE,
related_name="fields",
)
key = models.CharField(max_length=50)
field_type = models.CharField(max_length=20, choices=FIELD_TYPES)
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}"))