Format code with Black and isort for CI/CD compliance

- Apply Black formatting to all Python files in core and stiftung modules
- Fix import statement ordering with isort
- Ensure all code meets automated quality standards
- Resolve CI/CD pipeline formatting failures
- Maintain consistent code style across the entire codebase
This commit is contained in:
Stiftung Development
2025-09-06 21:04:07 +02:00
parent c7c790ee09
commit e0c7d0e351
54 changed files with 11004 additions and 6423 deletions

View File

@@ -1,111 +1,127 @@
import logging
from datetime import datetime
from django.core.management.base import BaseCommand
from django.db import transaction
from stiftung.models import Land, Verpachtung, Paechter, LandAbrechnung
from datetime import datetime
import logging
from stiftung.models import Land, LandAbrechnung, Paechter, Verpachtung
logger = logging.getLogger(__name__)
class Command(BaseCommand):
help = 'Vereinheitlicht Verpachtungen, Land und Abrechnungen zu einem konsistenten System'
help = "Vereinheitlicht Verpachtungen, Land und Abrechnungen zu einem konsistenten System"
def add_arguments(self, parser):
parser.add_argument(
'--dry-run',
action='store_true',
help='Zeigt nur an, was gemacht würde, ohne Änderungen zu speichern',
"--dry-run",
action="store_true",
help="Zeigt nur an, was gemacht würde, ohne Änderungen zu speichern",
)
parser.add_argument(
'--create-abrechnungen',
action='store_true',
help='Erstellt automatisch Abrechnungen aus Verpachtungsdaten',
"--create-abrechnungen",
action="store_true",
help="Erstellt automatisch Abrechnungen aus Verpachtungsdaten",
)
def handle(self, *args, **options):
dry_run = options['dry_run']
create_abrechnungen = options['create_abrechnungen']
dry_run = options["dry_run"]
create_abrechnungen = options["create_abrechnungen"]
if dry_run:
self.stdout.write(self.style.WARNING('DRY RUN - Keine Änderungen werden gespeichert!'))
self.stdout.write(
self.style.WARNING("DRY RUN - Keine Änderungen werden gespeichert!")
)
# Schritt 1: Alle Verpachtungen analysieren
alle_verpachtungen = Verpachtung.objects.all().order_by('land', '-pachtbeginn')
self.stdout.write(f'Gefunden: {alle_verpachtungen.count()} Verpachtungen insgesamt')
alle_verpachtungen = Verpachtung.objects.all().order_by("land", "-pachtbeginn")
self.stdout.write(
f"Gefunden: {alle_verpachtungen.count()} Verpachtungen insgesamt"
)
land_updates = 0
abrechnungen_created = 0
with transaction.atomic():
current_land = None
for verpachtung in alle_verpachtungen:
land = verpachtung.land
# Für jedes Land nur die neueste aktive Verpachtung als "aktuell" setzen
if current_land != land:
current_land = land
# Prüfen ob dies die neueste aktive Verpachtung ist
if verpachtung.status == 'aktiv' and not land.aktueller_paechter:
self.stdout.write(f'Setze aktuelle Verpachtung: {land} -> {verpachtung.paechter}')
if verpachtung.status == "aktiv" and not land.aktueller_paechter:
self.stdout.write(
f"Setze aktuelle Verpachtung: {land} -> {verpachtung.paechter}"
)
if not dry_run:
# Land-Felder aktualisieren
land.aktueller_paechter = verpachtung.paechter
land.paechter_name = verpachtung.paechter.get_full_name()
land.paechter_anschrift = self._get_paechter_anschrift(verpachtung.paechter)
land.paechter_anschrift = self._get_paechter_anschrift(
verpachtung.paechter
)
land.pachtbeginn = verpachtung.pachtbeginn
land.pachtende = verpachtung.pachtende
land.verlaengerung_klausel = bool(verpachtung.verlaengerung)
land.pachtzins_pauschal = verpachtung.pachtzins_jaehrlich
# Verpachtete Fläche synchronisieren
land.verp_flaeche_aktuell = verpachtung.verpachtete_flaeche
land.save()
land_updates += 1
# Schritt 2: Abrechnungen aus Verpachtungen erstellen (optional)
if create_abrechnungen and verpachtung.status == 'aktiv':
if create_abrechnungen and verpachtung.status == "aktiv":
# Erstelle Abrechnungen für die letzten 3 Jahre
current_year = datetime.now().year
for jahr in range(current_year - 2, current_year + 1):
# Prüfen ob Abrechnung bereits existiert
existing = LandAbrechnung.objects.filter(
land=land,
abrechnungsjahr=jahr
land=land, abrechnungsjahr=jahr
).first()
if not existing:
self.stdout.write(f'Erstelle Abrechnung: {land} - {jahr}')
self.stdout.write(f"Erstelle Abrechnung: {land} - {jahr}")
if not dry_run:
abrechnung = LandAbrechnung.objects.create(
land=land,
abrechnungsjahr=jahr,
pacht_vereinnahmt=verpachtung.pachtzins_jaehrlich,
bemerkungen=f'Automatisch erstellt aus Verpachtung {verpachtung.vertragsnummer}'
bemerkungen=f"Automatisch erstellt aus Verpachtung {verpachtung.vertragsnummer}",
)
abrechnungen_created += 1
# Zusammenfassung
self.stdout.write(self.style.SUCCESS('\n=== MIGRATION ABGESCHLOSSEN ==='))
self.stdout.write(self.style.SUCCESS("\n=== MIGRATION ABGESCHLOSSEN ==="))
if dry_run:
self.stdout.write(f'DRY RUN: {land_updates} Länder würden aktualisiert')
self.stdout.write(f"DRY RUN: {land_updates} Länder würden aktualisiert")
if create_abrechnungen:
self.stdout.write(f'DRY RUN: {abrechnungen_created} Abrechnungen würden erstellt')
self.stdout.write(
f"DRY RUN: {abrechnungen_created} Abrechnungen würden erstellt"
)
else:
self.stdout.write(f'{land_updates} Länder aktualisiert')
self.stdout.write(f"{land_updates} Länder aktualisiert")
if create_abrechnungen:
self.stdout.write(f'{abrechnungen_created} Abrechnungen erstellt')
self.stdout.write(f"{abrechnungen_created} Abrechnungen erstellt")
# Empfehlungen
self.stdout.write(self.style.WARNING('\n=== NÄCHSTE SCHRITTE ==='))
self.stdout.write('1. Prüfen Sie die migrierten Daten in der Weboberfläche')
self.stdout.write('2. Alte Verpachtungs-Views können als "Legacy" markiert werden')
self.stdout.write('3. Neue Verpachtungen sollten direkt im Land-Model erstellt werden')
self.stdout.write(self.style.WARNING("\n=== NÄCHSTE SCHRITTE ==="))
self.stdout.write("1. Prüfen Sie die migrierten Daten in der Weboberfläche")
self.stdout.write(
'2. Alte Verpachtungs-Views können als "Legacy" markiert werden'
)
self.stdout.write(
"3. Neue Verpachtungen sollten direkt im Land-Model erstellt werden"
)
def _get_paechter_anschrift(self, paechter):
"""Erstellt eine Anschrift aus den Pächter-Daten"""
parts = []
@@ -115,5 +131,5 @@ class Command(BaseCommand):
parts.append(f"{paechter.plz} {paechter.ort}")
elif paechter.ort:
parts.append(paechter.ort)
return '\n'.join(parts) if parts else ''
return "\n".join(parts) if parts else ""