- Add migrate_to_landverpachtung management command that converts old Land-level pacht fields (aktueller_paechter, pachtbeginn, etc.) into proper LandVerpachtung records - Fix SyntaxError in system.py (fancy Unicode quotes in f-strings) - Ran migration: 1 LandVerpachtung record created for Jens Bodden The old system stored pacht data directly on the Land model. The new LandVerpachtung model supports multiple leases per Land. The verpachtung_list view queries LandVerpachtung, which was empty. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
91 lines
3.6 KiB
Python
91 lines
3.6 KiB
Python
"""
|
|
Migriert Legacy-Pachtdaten von Land-Feldern zu LandVerpachtung-Einträgen.
|
|
|
|
Die alte Struktur speichert Pachtdaten direkt auf dem Land-Model
|
|
(aktueller_paechter, pachtbeginn, pachtende, etc.).
|
|
Die neue Struktur nutzt das LandVerpachtung-Model (1:n).
|
|
"""
|
|
|
|
from decimal import Decimal
|
|
|
|
from django.core.management.base import BaseCommand
|
|
from django.db import transaction
|
|
|
|
from stiftung.models import Land, LandVerpachtung
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = "Migriert Land-Pachtfelder zu LandVerpachtung-Einträgen"
|
|
|
|
def add_arguments(self, parser):
|
|
parser.add_argument(
|
|
"--dry-run",
|
|
action="store_true",
|
|
help="Zeigt nur an, was gemacht würde",
|
|
)
|
|
|
|
def handle(self, *args, **options):
|
|
dry_run = options["dry_run"]
|
|
|
|
lands = Land.objects.filter(
|
|
aktueller_paechter__isnull=False,
|
|
).select_related("aktueller_paechter")
|
|
|
|
self.stdout.write(f"Land-Einträge mit aktueller_paechter: {lands.count()}")
|
|
|
|
created = 0
|
|
skipped = 0
|
|
|
|
with transaction.atomic():
|
|
for land in lands:
|
|
# Skip if LandVerpachtung already exists for this land+paechter
|
|
existing = LandVerpachtung.objects.filter(
|
|
land=land, paechter=land.aktueller_paechter
|
|
).exists()
|
|
if existing:
|
|
self.stdout.write(
|
|
self.style.WARNING(f" Übersprungen: {land} (bereits migriert)")
|
|
)
|
|
skipped += 1
|
|
continue
|
|
|
|
vertragsnummer = f"LEGACY-{land.lfd_nr}"
|
|
verpachtete_flaeche = land.verp_flaeche_aktuell or land.groesse_qm or Decimal("1.00")
|
|
pachtzins = land.pachtzins_pauschal or Decimal("0.00")
|
|
|
|
self.stdout.write(
|
|
f" Migriere: {land} -> {land.aktueller_paechter} "
|
|
f"(Beginn={land.pachtbeginn}, Ende={land.pachtende}, "
|
|
f"Fläche={verpachtete_flaeche}qm, Pachtzins={pachtzins}€)"
|
|
)
|
|
|
|
if not dry_run:
|
|
LandVerpachtung.objects.create(
|
|
land=land,
|
|
paechter=land.aktueller_paechter,
|
|
vertragsnummer=vertragsnummer,
|
|
pachtbeginn=land.pachtbeginn or land.erstellt_am.date(),
|
|
pachtende=land.pachtende,
|
|
verlaengerung_klausel=land.verlaengerung_klausel,
|
|
verpachtete_flaeche=verpachtete_flaeche,
|
|
pachtzins_pauschal=pachtzins,
|
|
pachtzins_pro_ha=land.pachtzins_pro_ha,
|
|
zahlungsweise=land.zahlungsweise or "jaehrlich",
|
|
ust_option=land.ust_option,
|
|
ust_satz=land.ust_satz or Decimal("19.00"),
|
|
grundsteuer_umlage=land.grundsteuer_umlage,
|
|
versicherungen_umlage=land.versicherungen_umlage,
|
|
verbandsbeitraege_umlage=land.verbandsbeitraege_umlage,
|
|
jagdpacht_anteil_umlage=land.jagdpacht_anteil_umlage,
|
|
status="aktiv",
|
|
bemerkungen=f"Automatisch migriert aus Land-Feldern (Lfd.Nr. {land.lfd_nr})",
|
|
)
|
|
created += 1
|
|
|
|
action = "würden erstellt" if dry_run else "erstellt"
|
|
self.stdout.write(
|
|
self.style.SUCCESS(
|
|
f"\n{created} LandVerpachtung-Einträge {action}, {skipped} übersprungen."
|
|
)
|
|
)
|