- forms.py → forms/ Package (8 Domänen: destinataere, land, finanzen, foerderung, dokumente, veranstaltung, system, geschichte) - admin.py → admin/ Package (7 Domänen, alle 22 @admin.register dekoriert) - views.py (8845 Zeilen) → views/ Package (10 Domänen: dashboard, destinataere, land, paechter, finanzen, foerderung, dokumente, unterstuetzungen, veranstaltung, geschichte, system) - __init__.py in jedem Package re-exportiert alle Symbole für Rückwärtskompatibilität - urls.py bleibt unverändert (funktioniert durch Re-Exports) - Django system check: 0 Fehler, alle URL-Auflösungen funktionieren Keine funktionalen Änderungen – reine Strukturverbesserung für Vision 2026. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
207 lines
6.1 KiB
Python
207 lines
6.1 KiB
Python
from django.contrib import admin
|
|
from django.utils.html import format_html
|
|
|
|
from ..models import Land, LandVerpachtung, Paechter
|
|
|
|
|
|
@admin.register(Paechter)
|
|
class PaechterAdmin(admin.ModelAdmin):
|
|
list_display = [
|
|
"nachname",
|
|
"vorname",
|
|
"pachtnummer",
|
|
"pachtzins_aktuell",
|
|
"landwirtschaftliche_ausbildung",
|
|
"aktiv",
|
|
]
|
|
list_filter = ["landwirtschaftliche_ausbildung", "aktiv"]
|
|
search_fields = ["nachname", "vorname", "email", "pachtnummer"]
|
|
ordering = ["nachname", "vorname"]
|
|
readonly_fields = ["id"]
|
|
|
|
fieldsets = (
|
|
(
|
|
"Persönliche Daten",
|
|
{"fields": ("vorname", "nachname", "geburtsdatum", "email", "telefon")},
|
|
),
|
|
(
|
|
"Pacht-Informationen",
|
|
{
|
|
"fields": (
|
|
"pachtnummer",
|
|
"pachtbeginn_erste",
|
|
"pachtende_letzte",
|
|
"pachtzins_aktuell",
|
|
)
|
|
},
|
|
),
|
|
(
|
|
"Landwirtschaftliche Qualifikation",
|
|
{
|
|
"fields": (
|
|
"landwirtschaftliche_ausbildung",
|
|
"berufserfahrung_jahre",
|
|
"spezialisierung",
|
|
)
|
|
},
|
|
),
|
|
("Kontaktdaten", {"fields": ("iban", "strasse", "plz", "ort")}),
|
|
("Pächter-Typ", {"fields": ("personentyp",)}),
|
|
("Zusätzlich", {"fields": ("notizen", "aktiv")}),
|
|
("System", {"fields": ("id",), "classes": ("collapse",)}),
|
|
)
|
|
|
|
def iban_display(self, obj):
|
|
if obj.iban:
|
|
return format_html(
|
|
'<span style="font-family: monospace;">{}</span>', obj.iban
|
|
)
|
|
return "-"
|
|
|
|
iban_display.short_description = "IBAN"
|
|
|
|
|
|
@admin.register(Land)
|
|
class LandAdmin(admin.ModelAdmin):
|
|
list_display = [
|
|
"lfd_nr",
|
|
"gemeinde",
|
|
"gemarkung",
|
|
"flur",
|
|
"flurstueck",
|
|
"groesse_qm",
|
|
"verp_flaeche_aktuell",
|
|
"verpachtungsgrad_display",
|
|
"aktiv",
|
|
]
|
|
list_filter = ["gemeinde", "gemarkung", "aktiv"]
|
|
search_fields = ["lfd_nr", "gemeinde", "gemarkung", "flur", "flurstueck"]
|
|
ordering = ["gemeinde", "gemarkung", "flur", "flurstueck"]
|
|
readonly_fields = ["id", "gesamtflaeche_berechnet", "verpachtungsgrad_berechnet"]
|
|
|
|
fieldsets = (
|
|
("Identifikation", {"fields": ("lfd_nr", "ew_nummer")}),
|
|
("Gerichtliche Zuständigkeit", {"fields": ("amtsgericht",)}),
|
|
(
|
|
"Verwaltungsstruktur",
|
|
{"fields": ("gemeinde", "gemarkung", "flur", "flurstueck")},
|
|
),
|
|
(
|
|
"Flächenangaben",
|
|
{
|
|
"fields": (
|
|
"groesse_qm",
|
|
"gruenland_qm",
|
|
"acker_qm",
|
|
"wald_qm",
|
|
"sonstiges_qm",
|
|
)
|
|
},
|
|
),
|
|
(
|
|
"Verpachtung",
|
|
{
|
|
"fields": (
|
|
"verpachtete_gesamtflaeche",
|
|
"flaeche_alte_liste",
|
|
"verp_flaeche_aktuell",
|
|
)
|
|
},
|
|
),
|
|
("Steuern und Abgaben", {"fields": ("anteil_grundsteuer", "anteil_lwk")}),
|
|
("Status", {"fields": ("aktiv", "notizen")}),
|
|
(
|
|
"System",
|
|
{
|
|
"fields": ("id", "erstellt_am", "aktualisiert_am"),
|
|
"classes": ("collapse",),
|
|
},
|
|
),
|
|
)
|
|
|
|
def verpachtungsgrad_display(self, obj):
|
|
grad = obj.get_verpachtungsgrad()
|
|
if grad > 90:
|
|
color = "green"
|
|
elif grad > 70:
|
|
color = "orange"
|
|
else:
|
|
color = "red"
|
|
return format_html('<span style="color: {};">{:.1f}%</span>', color, grad)
|
|
|
|
verpachtungsgrad_display.short_description = "Verpachtungsgrad"
|
|
|
|
def gesamtflaeche_berechnet(self, obj):
|
|
return f"{obj.get_gesamtflaeche():.2f} qm"
|
|
|
|
gesamtflaeche_berechnet.short_description = "Berechnete Gesamtfläche"
|
|
|
|
def verpachtungsgrad_berechnet(self, obj):
|
|
return f"{obj.get_verpachtungsgrad():.1f}%"
|
|
|
|
verpachtungsgrad_berechnet.short_description = "Verpachtungsgrad"
|
|
|
|
|
|
@admin.register(LandVerpachtung)
|
|
class LandVerpachtungAdmin(admin.ModelAdmin):
|
|
list_display = [
|
|
"land",
|
|
"paechter",
|
|
"pachtzins_pauschal",
|
|
"pachtbeginn",
|
|
"pachtende",
|
|
"status_display",
|
|
"erstellt_am",
|
|
]
|
|
list_filter = ["status", "pachtbeginn", "pachtende", "erstellt_am"]
|
|
search_fields = ["land__lfd_nr", "land__gemeinde", "paechter__vorname", "paechter__nachname", "vertragsnummer"]
|
|
ordering = ["-erstellt_am"]
|
|
readonly_fields = ["id", "erstellt_am", "aktualisiert_am"]
|
|
|
|
fieldsets = (
|
|
("Verpachtungsdetails", {
|
|
"fields": ("land", "paechter", "vertragsnummer", "status")
|
|
}),
|
|
("Laufzeit", {
|
|
"fields": ("pachtbeginn", "pachtende", "verlaengerung_klausel")
|
|
}),
|
|
("Fläche", {
|
|
"fields": ("verpachtete_flaeche",)
|
|
}),
|
|
("Pachtzins", {
|
|
"fields": ("pachtzins_pauschal", "pachtzins_pro_ha", "zahlungsweise")
|
|
}),
|
|
("Umsatzsteuer", {
|
|
"fields": ("ust_option", "ust_satz"),
|
|
"classes": ("collapse",)
|
|
}),
|
|
("Umlagen", {
|
|
"fields": ("grundsteuer_umlage", "versicherungen_umlage", "verbandsbeitraege_umlage", "jagdpacht_anteil_umlage"),
|
|
"classes": ("collapse",)
|
|
}),
|
|
("Zusatzinformationen", {
|
|
"fields": ("bemerkungen",),
|
|
"classes": ("collapse",)
|
|
}),
|
|
("System", {
|
|
"fields": ("id", "erstellt_am", "aktualisiert_am"),
|
|
"classes": ("collapse",)
|
|
}),
|
|
)
|
|
|
|
def status_display(self, obj):
|
|
colors = {
|
|
'aktiv': 'green',
|
|
'beendet': 'red',
|
|
'geplant': 'orange',
|
|
'gekündigt': 'red'
|
|
}
|
|
color = colors.get(obj.status, 'black')
|
|
return format_html(
|
|
'<span style="color: {}; font-weight: bold;">{}</span>',
|
|
color,
|
|
obj.get_status_display()
|
|
)
|
|
|
|
status_display.short_description = "Status"
|