#132 Control deadlines

* extends migration to migration of action control deadlines
* adds EMA deadline migration
This commit is contained in:
mpeltriaux 2022-03-17 15:30:27 +01:00
parent 87e88fea54
commit 4a06f8625a
2 changed files with 191 additions and 2 deletions

View File

@ -49,7 +49,7 @@
<td class="align-middle">{{ deadline.date|default_if_none:"---" }}</td> <td class="align-middle">{{ deadline.date|default_if_none:"---" }}</td>
<td class="align-middle"> <td class="align-middle">
<div class="scroll-150"> <div class="scroll-150">
{{ deadline.comment }} {{ deadline.comment|linebreaks }}
</div> </div>
</td> </td>
<td class="align-middle float-right"> <td class="align-middle float-right">

View File

@ -3,7 +3,8 @@ from django.db import transaction
from codelist.models import KonovaCode from codelist.models import KonovaCode
from codelist.settings import CODELIST_BIOTOPES_ID, CODELIST_BIOTOPES_EXTRA_CODES_ID, \ from codelist.settings import CODELIST_BIOTOPES_ID, CODELIST_BIOTOPES_EXTRA_CODES_ID, \
CODELIST_COMPENSATION_ACTION_DETAIL_ID, CODELIST_COMPENSATION_ACTION_ID CODELIST_COMPENSATION_ACTION_DETAIL_ID, CODELIST_COMPENSATION_ACTION_ID, CODELIST_CONSERVATION_OFFICE_ID, \
CODELIST_HANDLER_ID, CODELIST_COMPENSATION_HANDLER_ID
from compensation.models import Compensation, CompensationState, CompensationAction, UnitChoices, CompensationDocument from compensation.models import Compensation, CompensationState, CompensationAction, UnitChoices, CompensationDocument
from ema.models import Ema, EmaDocument from ema.models import Ema, EmaDocument
from intervention.models import Responsibility, Handler, Intervention from intervention.models import Responsibility, Handler, Intervention
@ -63,6 +64,7 @@ class CompensationMigrater(BaseMigrater):
compensation = self._migrate_compensation_type(compensation, kom) compensation = self._migrate_compensation_type(compensation, kom)
compensation = self._migrate_states(compensation, kom) compensation = self._migrate_states(compensation, kom)
compensation = self._migrate_deadlines(compensation, kom) compensation = self._migrate_deadlines(compensation, kom)
compensation = self._migrate_action_control_deadlines(compensation, kom)
compensation = self._migrate_actions(compensation, kom) compensation = self._migrate_actions(compensation, kom)
compensation = self._migrate_documents(compensation, CompensationDocument, kom) compensation = self._migrate_documents(compensation, CompensationDocument, kom)
try: try:
@ -219,6 +221,92 @@ class CompensationMigrater(BaseMigrater):
tmp_cursor.close() tmp_cursor.close()
return compensation return compensation
def _migrate_action_control_deadlines(self, compensation, kom):
kom_identifier = f"'{kom[0]}'"
tmp_cursor = self.db_connection.cursor()
tmp_cursor.execute(
'select '
'k."Datum", '
'k."Typ", '
'k."Ergebnis", '
'k."Stelle", '
'k."Bemerkung" '
'from "OBJ_MASTER" om '
'left join "MASSN" m on m."GISPADID"=om."GISPADID" '
'left join "Kontrolle" k on m."PKEY"=k."FKEY" '
'where '
f'om."KENNUNG"={kom_identifier}'
)
control_types = {
707175: "Zielerreichungskontrolle",
707176: "Zustandskontrolle",
707174: "Ausführungskontrolle",
}
control_results = {
153097: "nicht beurteilbar",
153954: "vollständig umgesetzt",
153956: "teilweise umgesetzt",
153957: "eher nicht umgesetzt",
153960: "mit leichten Mängeln",
153963: "ohne Mängel",
187136: "Ziel nicht erreicht",
187137: "Ziel teilweise erreicht",
187139: "Ziel vollständig umgesetzt",
}
db_results = tmp_cursor.fetchall()
for result in db_results:
control_date = result[0]
if control_date is None:
# useless data
continue
control_type = result[1]
control_result = result[2]
control_responsible = result[3]
control_comment = result[4] or ""
try:
control_type = control_types[control_type]
except KeyError:
control_type = "Unbekannt"
try:
control_result = control_results[control_result]
except KeyError:
control_result = "Unbekannt"
try:
control_responsible = KonovaCode.objects.get(
atom_id=control_responsible,
is_selectable=True,
is_archived=False,
code_lists__in=[CODELIST_COMPENSATION_HANDLER_ID]
)
control_responsible = control_responsible.long_name
except ObjectDoesNotExist:
control_responsible = "Unbekannt"
control_comment += f"\n\nKontrolltyp: {control_type}"
control_comment += f"\nKontrollergebnis: {control_result}"
control_comment += f"\nKontrollstelle: {control_responsible}"
try:
deadline = compensation.deadlines.get(
type=DeadlineType.CONTROL,
date=control_date,
comment=control_comment
)
except ObjectDoesNotExist:
deadline = Deadline.objects.create(
type=DeadlineType.CONTROL,
date=control_date,
comment=control_comment
)
compensation.deadlines.add(deadline)
tmp_cursor.close()
return compensation
def _migrate_deadlines(self, compensation, kom): def _migrate_deadlines(self, compensation, kom):
compensation.deadlines.all().delete() compensation.deadlines.all().delete()
kom_identifier = f"'{kom[0]}'" kom_identifier = f"'{kom[0]}'"
@ -461,9 +549,110 @@ class EmaMigrater(CompensationMigrater):
ema_obj = self._migrate_compensation_type(ema_obj, ema) ema_obj = self._migrate_compensation_type(ema_obj, ema)
ema_obj = self._migrate_states(ema_obj, ema) ema_obj = self._migrate_states(ema_obj, ema)
ema_obj = self._migrate_deadlines(ema_obj, ema) ema_obj = self._migrate_deadlines(ema_obj, ema)
ema_obj = self._migrate_action_control_deadlines(ema_obj, ema)
ema_obj = self._migrate_actions(ema_obj, ema) ema_obj = self._migrate_actions(ema_obj, ema)
ema_obj = self._migrate_documents(ema_obj, EmaDocument, ema) ema_obj = self._migrate_documents(ema_obj, EmaDocument, ema)
ema_obj.save() ema_obj.save()
num_processed += 1 num_processed += 1
cursor.close() cursor.close()
def _migrate_deadlines(self, ema_obj, ema_result):
ema_obj.deadlines.all().delete()
ema_identifier = f"'{ema_result[0]}'"
tmp_cursor = self.db_connection.cursor()
tmp_cursor.execute(
'select '
't."Terminart", '
't."K_Termin"::date '
'from "OBJ_MASTER" om '
'left join "Termine" t on om."GISPADID"=t."GISPADID" '
'where '
f'om."KENNUNG"={ema_identifier}'
)
db_results = tmp_cursor.fetchall()
for result in db_results:
deadline_type = result[0]
deadline_comment = None
if deadline_type == 708166:
deadline_comment = "Wiedervorlage"
elif deadline_type == 708163:
deadline_comment = "Projektbeginn"
deadline_date = result[1]
if deadline_date is None:
# Useless data
continue
try:
deadline = ema_obj.deadlines.get(
type=DeadlineType.OTHER,
date=deadline_date,
comment=deadline_comment
)
except ObjectDoesNotExist:
deadline = Deadline.objects.create(
type=DeadlineType.OTHER,
date=deadline_date,
comment=deadline_comment
)
ema_obj.deadlines.add(deadline)
return ema_obj
def _migrate_responsibility(self, ema_obj, ema_result):
ema_identifier = f"'{ema_result[0]}'"
tmp_cursor = self.db_connection.cursor()
tmp_cursor.execute(
'select '
'adr."adr_pruef" as ets, '
'linf."AZ", '
'adr.behoerde, '
'adr.angaben '
'from "OBJ_MASTER" om '
'left join "LINFOS" linf on om."GISPADID"=linf."GISPADID" '
'left join adressrolle adr on adr."GISPADID"=om."GISPADID" '
'where '
f'om."KENNUNG"={ema_identifier} '
)
db_results = tmp_cursor.fetchall()
if len(db_results) != 1:
raise AssertionError(f"{ema_identifier} has invalid responsibilities: {db_results}")
db_results = db_results[0]
cons_office_code = db_results[0]
cons_file_number = db_results[1]
handler_type = db_results[2]
handler_detail = db_results[3]
responsible = ema_obj.responsible or Responsibility.objects.create()
try:
conservation_office = KonovaCode.objects.get(
atom_id=cons_office_code,
is_selectable=True,
is_archived=False,
code_lists__in=[CODELIST_CONSERVATION_OFFICE_ID]
)
except ObjectDoesNotExist:
raise ObjectDoesNotExist(f"{ema_identifier}, {db_results}")
try:
handler_type = KonovaCode.objects.get(
atom_id=handler_type,
is_selectable=True,
is_archived=False,
code_lists__in=[CODELIST_COMPENSATION_HANDLER_ID]
)
except ObjectDoesNotExist:
handler_type = None
responsible.conservation_file_number = db_results[1]
ema_obj.responsible.conservation_office = conservation_office
ema_obj.responsible.conservation_file_number = cons_file_number
handler = ema_obj.responsible.handler or Handler.objects.create()
handler.type = handler_type
handler.detail = handler_detail
ema_obj.responsible.handler = handler
ema_obj.responsible.handler.save()
ema_obj.responsible.save()
tmp_cursor.close()
return ema_obj