Complete rewrite by OpenCode
This commit is contained in:
@@ -1,6 +1,12 @@
|
||||
from django.contrib import admin
|
||||
#from nested_inline.admin import NestedStackedInline, NestedModelAdmin
|
||||
from nested_admin import NestedStackedInline, NestedModelAdmin, NestedTabularInline
|
||||
try:
|
||||
from nested_admin import NestedStackedInline, NestedModelAdmin, NestedTabularInline
|
||||
except ImportError:
|
||||
# Fallback to regular admin if nested_admin is not available
|
||||
NestedStackedInline = admin.StackedInline
|
||||
NestedModelAdmin = admin.ModelAdmin
|
||||
NestedTabularInline = admin.TabularInline
|
||||
from django import forms
|
||||
from mptt.forms import TreeNodeMultipleChoiceField
|
||||
from mptt.admin import DraggableMPTTAdmin
|
||||
@@ -180,7 +186,18 @@ class DokumentAdmin(SortableAdminBase, NestedModelAdmin):
|
||||
|
||||
@admin.register(VorgabenTable)
|
||||
class VorgabenTableAdmin(admin.ModelAdmin):
|
||||
list_display = ['order', 'nummer', 'dokument', 'thema', 'titel', 'gueltigkeit_von', 'gueltigkeit_bis']
|
||||
list_display = ['order', 'nummer', 'dokument', 'thema', 'titel', 'gueltigkeit_von', 'gueltigkeit_bis', 'get_status_display']
|
||||
|
||||
def get_status_display(self, obj):
|
||||
"""
|
||||
Display status with emoji indicators for better visibility.
|
||||
"""
|
||||
if obj.dokument.aktiv:
|
||||
return "✅ Aktiv"
|
||||
else:
|
||||
return "❌ Inaktiv"
|
||||
|
||||
get_status_display.short_description = 'Status'
|
||||
list_display_links = ['dokument']
|
||||
list_editable = ['order', 'nummer', 'thema', 'titel', 'gueltigkeit_von', 'gueltigkeit_bis']
|
||||
list_filter = ['dokument', 'thema', 'gueltigkeit_von', 'gueltigkeit_bis']
|
||||
@@ -188,6 +205,8 @@ class VorgabenTableAdmin(admin.ModelAdmin):
|
||||
autocomplete_fields = ['dokument', 'thema', 'stichworte', 'referenzen', 'relevanz']
|
||||
ordering = ['order']
|
||||
list_per_page = 100
|
||||
date_hierarchy = 'gueltigkeit_von'
|
||||
date_hierarchy = 'gueltigkeit_von'
|
||||
|
||||
fieldsets = (
|
||||
('Grunddaten', {
|
||||
@@ -239,6 +258,7 @@ class VorgabeAdmin(NestedModelAdmin):
|
||||
|
||||
def vorgabe_nummer(self, obj):
|
||||
return obj.Vorgabennummer()
|
||||
|
||||
vorgabe_nummer.short_description = 'Vorgabennummer'
|
||||
|
||||
admin.site.register(Checklistenfrage)
|
||||
|
||||
75
dokumente/migrations/0010_add_indexes_and_constraints.py
Normal file
75
dokumente/migrations/0010_add_indexes_and_constraints.py
Normal file
@@ -0,0 +1,75 @@
|
||||
# Generated by Django 4.2.25 on 2025-11-04 15:11
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('dokumente', '0009_alter_vorgabe_options_vorgabe_order'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='VorgabenTable',
|
||||
fields=[
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Vorgabe (Tabellenansicht)',
|
||||
'verbose_name_plural': 'Vorgaben (Tabellenansicht)',
|
||||
'proxy': True,
|
||||
'indexes': [],
|
||||
'constraints': [],
|
||||
},
|
||||
bases=('dokumente.vorgabe',),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='dokument',
|
||||
name='aktiv',
|
||||
field=models.BooleanField(),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='dokument',
|
||||
name='gueltigkeit_bis',
|
||||
field=models.DateField(blank=True, db_index=True, null=True),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='dokument',
|
||||
name='gueltigkeit_von',
|
||||
field=models.DateField(blank=True, db_index=True, null=True),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='dokument',
|
||||
name='name',
|
||||
field=models.CharField(db_index=True, max_length=255),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='vorgabe',
|
||||
name='gueltigkeit_bis',
|
||||
field=models.DateField(blank=True, db_index=True, null=True),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='vorgabe',
|
||||
name='gueltigkeit_von',
|
||||
field=models.DateField(db_index=True),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='vorgabe',
|
||||
name='nummer',
|
||||
field=models.IntegerField(db_index=True),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='vorgabe',
|
||||
name='order',
|
||||
field=models.IntegerField(db_index=True),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='vorgabe',
|
||||
name='titel',
|
||||
field=models.CharField(db_index=True, max_length=255),
|
||||
),
|
||||
migrations.AddConstraint(
|
||||
model_name='vorgabe',
|
||||
constraint=models.UniqueConstraint(fields=('dokument', 'thema', 'nummer', 'gueltigkeit_von'), name='unique_vorgabe_active_period'),
|
||||
),
|
||||
]
|
||||
@@ -40,14 +40,14 @@ class Thema(models.Model):
|
||||
class Dokument(models.Model):
|
||||
nummer = models.CharField(max_length=50, primary_key=True)
|
||||
dokumententyp = models.ForeignKey(Dokumententyp, on_delete=models.PROTECT)
|
||||
name = models.CharField(max_length=255)
|
||||
name = models.CharField(max_length=255, db_index=True)
|
||||
autoren = models.ManyToManyField(Person, related_name='verfasste_dokumente')
|
||||
pruefende = models.ManyToManyField(Person, related_name='gepruefte_dokumente')
|
||||
gueltigkeit_von = models.DateField(null=True, blank=True)
|
||||
gueltigkeit_bis = models.DateField(null=True, blank=True)
|
||||
gueltigkeit_von = models.DateField(null=True, blank=True, db_index=True)
|
||||
gueltigkeit_bis = models.DateField(null=True, blank=True, db_index=True)
|
||||
signatur_cso = models.CharField(max_length=255, blank=True)
|
||||
anhaenge = models.TextField(blank=True)
|
||||
aktiv = models.BooleanField(blank=True)
|
||||
aktiv = models.BooleanField()
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.nummer} – {self.name}"
|
||||
@@ -57,14 +57,14 @@ class Dokument(models.Model):
|
||||
verbose_name="Dokument"
|
||||
|
||||
class Vorgabe(models.Model):
|
||||
order = models.IntegerField()
|
||||
nummer = models.IntegerField()
|
||||
order = models.IntegerField(db_index=True)
|
||||
nummer = models.IntegerField(db_index=True)
|
||||
dokument = models.ForeignKey(Dokument, on_delete=models.CASCADE, related_name='vorgaben')
|
||||
thema = models.ForeignKey(Thema, on_delete=models.PROTECT, blank=False)
|
||||
titel = models.CharField(max_length=255)
|
||||
titel = models.CharField(max_length=255, db_index=True)
|
||||
referenzen = models.ManyToManyField(Referenz, blank=True)
|
||||
gueltigkeit_von = models.DateField()
|
||||
gueltigkeit_bis = models.DateField(blank=True,null=True)
|
||||
gueltigkeit_von = models.DateField(db_index=True)
|
||||
gueltigkeit_bis = models.DateField(blank=True,null=True, db_index=True)
|
||||
stichworte = models.ManyToManyField(Stichwort, blank=True)
|
||||
relevanz = models.ManyToManyField(Rolle,blank=True)
|
||||
|
||||
@@ -206,6 +206,12 @@ class Vorgabe(models.Model):
|
||||
class Meta:
|
||||
verbose_name_plural="Vorgaben"
|
||||
ordering = ['order']
|
||||
constraints = [
|
||||
models.UniqueConstraint(
|
||||
fields=['dokument', 'thema', 'nummer', 'gueltigkeit_von'],
|
||||
name='unique_vorgabe_active_period'
|
||||
),
|
||||
]
|
||||
|
||||
class VorgabeLangtext(Textabschnitt):
|
||||
abschnitt=models.ForeignKey(Vorgabe,on_delete=models.CASCADE)
|
||||
|
||||
@@ -13,7 +13,7 @@ calendar=parsedatetime.Calendar()
|
||||
|
||||
|
||||
def standard_list(request):
|
||||
dokumente = Dokument.objects.all()
|
||||
dokumente = Dokument.objects.select_related('dokumententyp').prefetch_related('vorgaben__thema').all()
|
||||
return render(request, 'standards/standard_list.html',
|
||||
{'dokumente': dokumente}
|
||||
)
|
||||
@@ -29,7 +29,11 @@ def standard_detail(request, nummer,check_date=""):
|
||||
check_date = date.today()
|
||||
standard.history = False
|
||||
standard.check_date=check_date
|
||||
vorgaben = list(standard.vorgaben.order_by("thema","nummer").select_related("thema","dokument")) # convert queryset to list so we can attach attributes
|
||||
vorgaben = list(standard.vorgaben.order_by("thema","nummer")
|
||||
.select_related("thema","dokument")
|
||||
.prefetch_related("relevanz", "referenzen",
|
||||
"vorgabekurztext_set__abschnitttyp",
|
||||
"vorgabelangtext_set__abschnitttyp")) # convert queryset to list so we can attach attributes
|
||||
|
||||
standard.geltungsbereich_html = render_textabschnitte(standard.geltungsbereich_set.order_by("order").select_related("abschnitttyp"))
|
||||
standard.einleitung_html=render_textabschnitte(standard.einleitung_set.order_by("order"))
|
||||
|
||||
Reference in New Issue
Block a user