# 439 Wartungskommando Nachverschneidung

* refactors command update_all_parcels into recalculate_parcels
* fixes bug in command generate_report
This commit is contained in:
mpeltriaux 2024-10-25 14:23:21 +02:00
parent 669a12410f
commit 62e1b046c3
2 changed files with 26 additions and 14 deletions

View File

@ -6,11 +6,11 @@ Created on: 26.10.22
""" """
import zipfile import zipfile
from datetime import datetime
from io import BytesIO from io import BytesIO
from django.core.mail import EmailMessage from django.core.mail import EmailMessage
from django.utils import timezone from django.utils import timezone
from django.utils.datetime_safe import datetime
from analysis.utils.excel.excel import TempExcelFile from analysis.utils.excel.excel import TempExcelFile
from analysis.utils.report import TimespanReport from analysis.utils.report import TimespanReport

View File

@ -8,27 +8,46 @@ Created on: 04.01.22
import datetime import datetime
from django.contrib.gis.db.models.functions import Area from django.contrib.gis.db.models.functions import Area
from django.utils.timezone import now
from konova.management.commands.setup import BaseKonovaCommand from konova.management.commands.setup import BaseKonovaCommand
from konova.models import Geometry, Parcel, District from konova.models import Geometry, Parcel, District
class Command(BaseKonovaCommand): class Command(BaseKonovaCommand):
help = "Checks the database' sanity and removes unused entries" help = "Recalculates parcels for entries with geometry but missing parcel information"
def add_arguments(self, parser):
parser.add_argument(
"--force-all",
action="store_true",
default=False,
help="If Attribute set, all entries parcels will be recalculated"
)
def handle(self, *args, **options): def handle(self, *args, **options):
try: try:
self.update_all_parcels() self.recalculate_parcels(options)
except KeyboardInterrupt: except KeyboardInterrupt:
self._break_line() self._break_line()
exit(-1) exit(-1)
def update_all_parcels(self): def recalculate_parcels(self, options: dict):
num_parcels_before = Parcel.objects.count() force_all = options.get("force_all", False)
num_districts_before = District.objects.count()
if force_all:
geometry_objects = Geometry.objects.all()
else:
_today = now().date()
_date_threshold = _today - datetime.timedelta(days=1)
geometry_objects = Geometry.objects.filter(
parcel_update_start__date__lte=_date_threshold,
parcel_update_end__isnull=True
)
self._write_warning("=== Update parcels and districts ===") self._write_warning("=== Update parcels and districts ===")
# Order geometries by size to process smaller once at first # Order geometries by size to process smaller once at first
geometries = Geometry.objects.all().exclude( geometries = geometry_objects.exclude(
geom=None geom=None
).annotate(area=Area("geom")).order_by( ).annotate(area=Area("geom")).order_by(
'area' 'area'
@ -43,12 +62,5 @@ class Command(BaseKonovaCommand):
i += 1 i += 1
self._write_warning(f"--- {i}/{num_geoms} processed") self._write_warning(f"--- {i}/{num_geoms} processed")
num_parcels_after = Parcel.objects.count()
num_districts_after = District.objects.count()
if num_parcels_after != num_parcels_before:
self._write_error(f"Parcels have changed: {num_parcels_before} to {num_parcels_after} entries. You should run the sanitize command.")
if num_districts_after != num_districts_before:
self._write_error(f"Districts have changed: {num_districts_before} to {num_districts_after} entries. You should run the sanitize command.")
self._write_success("Updating parcels done!") self._write_success("Updating parcels done!")
self._break_line() self._break_line()