Refactoring #43

Merged
mpeltriaux merged 13 commits from Refactoring into master 2021-11-16 14:24:11 +01:00
17 changed files with 220 additions and 155 deletions
Showing only changes of commit bcffae4a95 - Show all commits

View File

@ -16,7 +16,7 @@ from codelist.models import KonovaCode
from codelist.settings import CODELIST_CONSERVATION_OFFICE_ID from codelist.settings import CODELIST_CONSERVATION_OFFICE_ID
from compensation.models import Compensation, EcoAccount from compensation.models import Compensation, EcoAccount
from intervention.inputs import GenerateInput from intervention.inputs import GenerateInput
from intervention.models import Intervention, ResponsibilityData, LegalData from intervention.models import Intervention, Responsibility, Legal
from konova.forms import BaseForm, SimpleGeomForm from konova.forms import BaseForm, SimpleGeomForm
from user.models import UserActionLogEntry, UserAction from user.models import UserActionLogEntry, UserAction
@ -371,13 +371,13 @@ class NewEcoAccountForm(AbstractCompensationForm, CompensationResponsibleFormMix
# Process the geometry form # Process the geometry form
geometry = geom_form.save(action) geometry = geom_form.save(action)
responsible = ResponsibilityData.objects.create( responsible = Responsibility.objects.create(
handler=handler, handler=handler,
conservation_file_number=conservation_file_number, conservation_file_number=conservation_file_number,
conservation_office=conservation_office, conservation_office=conservation_office,
) )
legal = LegalData.objects.create( legal = Legal.objects.create(
registration_date=registration_date registration_date=registration_date
) )

View File

@ -9,19 +9,17 @@ from bootstrap_modal_forms.utils import is_ajax
from dal import autocomplete from dal import autocomplete
from django import forms from django import forms
from django.contrib import messages from django.contrib import messages
from django.db import transaction
from django.http import HttpRequest, HttpResponseRedirect from django.http import HttpRequest, HttpResponseRedirect
from django.shortcuts import render from django.shortcuts import render
from django.utils.translation import pgettext_lazy as _con, gettext_lazy as _ from django.utils.translation import pgettext_lazy as _con, gettext_lazy as _
from codelist.models import KonovaCode from codelist.models import KonovaCode
from codelist.settings import CODELIST_BIOTOPES_ID, CODELIST_COMPENSATION_ACTION_ID from codelist.settings import CODELIST_BIOTOPES_ID, CODELIST_COMPENSATION_ACTION_ID
from compensation.models import Payment, CompensationState, UnitChoices, CompensationAction from compensation.models import CompensationDocument, EcoAccountDocument
from konova.contexts import BaseContext from konova.contexts import BaseContext
from konova.forms import BaseModalForm from konova.forms import BaseModalForm, NewDocumentForm
from konova.models import DeadlineType, Deadline from konova.models import DeadlineType
from konova.utils.message_templates import FORM_INVALID from konova.utils.message_templates import FORM_INVALID
from user.models import UserActionLogEntry, UserAction
class NewPaymentForm(BaseModalForm): class NewPaymentForm(BaseModalForm):
@ -99,26 +97,7 @@ class NewPaymentForm(BaseModalForm):
return super_valid return super_valid
def save(self): def save(self):
with transaction.atomic(): pay = self.instance.add_payment(self)
created_action = UserActionLogEntry.objects.create(
user=self.user,
action=UserAction.CREATED,
)
edited_action = UserActionLogEntry.objects.create(
user=self.user,
action=UserAction.EDITED,
comment=_("Added payment"),
)
pay = Payment.objects.create(
created=created_action,
amount=self.cleaned_data.get("amount", -1),
due_on=self.cleaned_data.get("due", None),
comment=self.cleaned_data.get("comment", None),
intervention=self.intervention,
)
self.intervention.log.add(edited_action)
self.intervention.modified = edited_action
self.intervention.save()
return pay return pay
@ -167,24 +146,7 @@ class NewStateModalForm(BaseModalForm):
self.form_caption = _("Insert data for the new state") self.form_caption = _("Insert data for the new state")
def save(self, is_before_state: bool = False): def save(self, is_before_state: bool = False):
with transaction.atomic(): state = self.instance.add_state(self, is_before_state)
user_action = UserActionLogEntry.objects.create(
user=self.user,
action=UserAction.EDITED,
comment=_("Added state")
)
self.instance.log.add(user_action)
self.instance.modified = user_action
self.instance.save()
state = CompensationState.objects.create(
biotope_type=self.cleaned_data["biotope_type"],
surface=self.cleaned_data["surface"],
)
if is_before_state:
self.instance.before_states.add(state)
else:
self.instance.after_states.add(state)
return state return state
def process_request(self, request: HttpRequest, msg_success: str = _("Object removed"), msg_error: str = FORM_INVALID, redirect_url: str = None): def process_request(self, request: HttpRequest, msg_success: str = _("Object removed"), msg_error: str = FORM_INVALID, redirect_url: str = None):
@ -287,26 +249,7 @@ class NewDeadlineModalForm(BaseModalForm):
self.form_caption = _("Insert data for the new deadline") self.form_caption = _("Insert data for the new deadline")
def save(self): def save(self):
with transaction.atomic(): deadline = self.instance.add_new_deadline(self)
created_action = UserActionLogEntry.objects.create(
user=self.user,
action=UserAction.CREATED
)
deadline = Deadline.objects.create(
type=self.cleaned_data["type"],
date=self.cleaned_data["date"],
comment=self.cleaned_data["comment"],
created=created_action,
)
edited_action = UserActionLogEntry.objects.create(
user=self.user,
action=UserAction.EDITED,
comment=_("Added deadline")
)
self.instance.modified = edited_action
self.instance.save()
self.instance.log.add(edited_action)
self.instance.deadlines.add(deadline)
return deadline return deadline
@ -318,6 +261,7 @@ class NewActionModalForm(BaseModalForm):
(not in the process logic in Konova, but in the real world). (not in the process logic in Konova, but in the real world).
""" """
from compensation.models import UnitChoices
action_type = forms.ModelChoiceField( action_type = forms.ModelChoiceField(
label=_("Action Type"), label=_("Action Type"),
label_suffix="", label_suffix="",
@ -381,25 +325,13 @@ class NewActionModalForm(BaseModalForm):
self.form_caption = _("Insert data for the new action") self.form_caption = _("Insert data for the new action")
def save(self): def save(self):
with transaction.atomic(): action = self.instance.add_new_action(self)
user_action = UserActionLogEntry.objects.create( return action
user=self.user,
action=UserAction.CREATED,
) class NewCompensationDocumentForm(NewDocumentForm):
comp_action = CompensationAction.objects.create( document_model = CompensationDocument
action_type=self.cleaned_data["action_type"],
amount=self.cleaned_data["amount"],
unit=self.cleaned_data["unit"], class NewEcoAccountDocumentForm(NewDocumentForm):
comment=self.cleaned_data["comment"], document_model = EcoAccountDocument
created=user_action,
)
edited_action = UserActionLogEntry.objects.create(
user=self.user,
action=UserAction.EDITED,
comment=_("Added action"),
)
self.instance.modified = edited_action
self.instance.save()
self.instance.log.add(edited_action)
self.instance.actions.add(comp_action)
return comp_action

View File

@ -11,19 +11,20 @@ from django.contrib.auth.models import User
from django.contrib.gis.db import models from django.contrib.gis.db import models
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.validators import MinValueValidator from django.core.validators import MinValueValidator
from django.db import transaction
from django.db.models import Sum, QuerySet from django.db.models import Sum, QuerySet
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from codelist.models import KonovaCode from codelist.models import KonovaCode
from intervention.models import Intervention, Responsibility
from codelist.settings import CODELIST_COMPENSATION_ACTION_ID, CODELIST_BIOTOPES_ID from codelist.settings import CODELIST_COMPENSATION_ACTION_ID, CODELIST_BIOTOPES_ID
from compensation.managers import CompensationStateManager, EcoAccountDeductionManager, CompensationActionManager, \ from compensation.managers import CompensationStateManager, EcoAccountDeductionManager, CompensationActionManager, \
EcoAccountManager, CompensationManager EcoAccountManager, CompensationManager
from compensation.utils.quality import CompensationQualityChecker, EcoAccountQualityChecker from compensation.utils.quality import CompensationQualityChecker, EcoAccountQualityChecker
from intervention.models import Intervention, ResponsibilityData, LegalData
from konova.models import BaseObject, BaseResource, Geometry, UuidModel, AbstractDocument, \ from konova.models import BaseObject, BaseResource, Geometry, UuidModel, AbstractDocument, \
generate_document_file_upload_path, RecordableObject, ShareableObject generate_document_file_upload_path, RecordableObject, ShareableObject, Deadline
from konova.settings import DEFAULT_SRID_RLP, LANIS_LINK_TEMPLATE from konova.settings import DEFAULT_SRID_RLP, LANIS_LINK_TEMPLATE
from user.models import UserActionLogEntry from user.models import UserActionLogEntry, UserAction
class Payment(BaseResource): class Payment(BaseResource):
@ -133,7 +134,7 @@ class AbstractCompensation(BaseObject):
""" """
responsible = models.OneToOneField( responsible = models.OneToOneField(
ResponsibilityData, Responsibility,
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
null=True, null=True,
blank=True, blank=True,
@ -151,6 +152,73 @@ class AbstractCompensation(BaseObject):
class Meta: class Meta:
abstract = True abstract = True
def add_new_deadline(self, form) -> Deadline:
""" Adds a new deadline to the abstract compensation
Args:
form (NewDeadlineModalForm): The form holding all relevant data
Returns:
"""
form_data = form.cleaned_data
user = form.user
with transaction.atomic():
created_action = UserActionLogEntry.objects.create(
user=user,
action=UserAction.CREATED
)
deadline = Deadline.objects.create(
type=form_data["type"],
date=form_data["date"],
comment=form_data["comment"],
created=created_action,
)
edited_action = UserActionLogEntry.objects.create(
user=user,
action=UserAction.EDITED,
comment=_("Added deadline")
)
self.modified = edited_action
self.save()
self.log.add(edited_action)
self.deadlines.add(deadline)
return deadline
def add_new_action(self, form) -> CompensationAction:
""" Adds a new action to the compensation
Args:
form (NewActionModalForm): The form holding all relevant data
Returns:
"""
form_data = form.cleaned_data
user = form.user
with transaction.atomic():
user_action = UserActionLogEntry.objects.create(
user=user,
action=UserAction.CREATED,
)
comp_action = CompensationAction.objects.create(
action_type=form_data["action_type"],
amount=form_data["amount"],
unit=form_data["unit"],
comment=form_data["comment"],
created=user_action,
)
edited_action = UserActionLogEntry.objects.create(
user=user,
action=UserAction.EDITED,
comment=_("Added action"),
)
self.modified = edited_action
self.save()
self.log.add(edited_action)
self.actions.add(comp_action)
return comp_action
def get_surface_after_states(self) -> float: def get_surface_after_states(self) -> float:
""" Calculates the compensation's/account's surface """ Calculates the compensation's/account's surface
@ -293,6 +361,38 @@ class Compensation(AbstractCompensation, CEFMixin, CoherenceMixin):
) )
return docs return docs
def add_state(self, form, is_before_state: bool) -> CompensationState:
""" Adds a new compensation state to the compensation
Args:
form (NewStateModalForm): The form, holding all relevant data
is_before_state (bool): Whether this is a new before_state or after_state
Returns:
"""
form_data = form.cleaned_data
user = form.user
with transaction.atomic():
user_action = UserActionLogEntry.objects.create(
user=user,
action=UserAction.EDITED,
comment=_("Added state")
)
self.log.add(user_action)
self.modified = user_action
self.save()
state = CompensationState.objects.create(
biotope_type=form_data["biotope_type"],
surface=form_data["surface"],
)
if is_before_state:
self.before_states.add(state)
else:
self.after_states.add(state)
return state
class CompensationDocument(AbstractDocument): class CompensationDocument(AbstractDocument):
""" """
@ -347,6 +447,7 @@ class EcoAccount(AbstractCompensation, ShareableObject, RecordableObject):
An eco account is a kind of 'prepaid' compensation. It can be compared to an account that already has been filled An eco account is a kind of 'prepaid' compensation. It can be compared to an account that already has been filled
with some kind of currency. From this account one is able to deduct currency for current projects. with some kind of currency. From this account one is able to deduct currency for current projects.
""" """
from intervention.models import Legal
deductable_surface = models.FloatField( deductable_surface = models.FloatField(
blank=True, blank=True,
null=True, null=True,
@ -355,7 +456,7 @@ class EcoAccount(AbstractCompensation, ShareableObject, RecordableObject):
) )
legal = models.OneToOneField( legal = models.OneToOneField(
LegalData, Legal,
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
null=True, null=True,
blank=True, blank=True,
@ -537,6 +638,7 @@ class EcoAccountDeduction(BaseResource):
""" """
A deduction object for eco accounts A deduction object for eco accounts
""" """
from intervention.models import Intervention
account = models.ForeignKey( account = models.ForeignKey(
EcoAccount, EcoAccount,
on_delete=models.SET_NULL, on_delete=models.SET_NULL,

View File

@ -61,7 +61,7 @@ class EcoAccountQualityChecker(CompensationQualityChecker):
super().run_check() super().run_check()
def _check_legal_data(self): def _check_legal_data(self):
""" Checks the data quality for LegalData """ Checks the data quality for Legal
Returns: Returns:

View File

@ -5,7 +5,8 @@ from django.shortcuts import render
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from compensation.forms.forms import NewCompensationForm, EditCompensationForm from compensation.forms.forms import NewCompensationForm, EditCompensationForm
from compensation.forms.modalForms import NewStateModalForm, NewDeadlineModalForm, NewActionModalForm from compensation.forms.modalForms import NewStateModalForm, NewDeadlineModalForm, NewActionModalForm, \
NewCompensationDocumentForm
from compensation.models import Compensation, CompensationState, CompensationAction, CompensationDocument from compensation.models import Compensation, CompensationState, CompensationAction, CompensationDocument
from compensation.tables import CompensationTable from compensation.tables import CompensationTable
from intervention.models import Intervention from intervention.models import Intervention
@ -258,7 +259,7 @@ def new_document_view(request: HttpRequest, id: str):
""" """
comp = get_object_or_404(Compensation, id=id) comp = get_object_or_404(Compensation, id=id)
form = NewDocumentForm(request.POST or None, request.FILES or None, instance=comp, user=request.user) form = NewCompensationDocumentForm(request.POST or None, request.FILES or None, instance=comp, user=request.user)
return form.process_request( return form.process_request(
request, request,
msg_success=_("Document added") msg_success=_("Document added")

View File

@ -15,7 +15,8 @@ from django.http import HttpRequest, Http404, JsonResponse
from django.shortcuts import render, get_object_or_404, redirect from django.shortcuts import render, get_object_or_404, redirect
from compensation.forms.forms import NewEcoAccountForm, EditEcoAccountForm from compensation.forms.forms import NewEcoAccountForm, EditEcoAccountForm
from compensation.forms.modalForms import NewStateModalForm, NewActionModalForm, NewDeadlineModalForm from compensation.forms.modalForms import NewStateModalForm, NewActionModalForm, NewDeadlineModalForm, \
NewEcoAccountDocumentForm
from compensation.models import EcoAccount, EcoAccountDocument, CompensationState, CompensationAction from compensation.models import EcoAccount, EcoAccountDocument, CompensationState, CompensationAction
from compensation.tables import EcoAccountTable from compensation.tables import EcoAccountTable
from intervention.forms.modalForms import NewDeductionModalForm, ShareInterventionModalForm from intervention.forms.modalForms import NewDeductionModalForm, ShareInterventionModalForm
@ -453,7 +454,7 @@ def new_document_view(request: HttpRequest, id: str):
""" """
acc = get_object_or_404(EcoAccount, id=id) acc = get_object_or_404(EcoAccount, id=id)
form = NewDocumentForm(request.POST or None, request.FILES or None, instance=acc, user=request.user) form = NewEcoAccountDocumentForm(request.POST or None, request.FILES or None, instance=acc, user=request.user)
return form.process_request( return form.process_request(
request, request,
msg_success=_("Document added") msg_success=_("Document added")

View File

@ -13,9 +13,9 @@ from django.urls import reverse, reverse_lazy
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from compensation.forms.forms import AbstractCompensationForm, CompensationResponsibleFormMixin from compensation.forms.forms import AbstractCompensationForm, CompensationResponsibleFormMixin
from ema.models import Ema from ema.models import Ema, EmaDocument
from intervention.models import ResponsibilityData from intervention.models import Responsibility
from konova.forms import SimpleGeomForm from konova.forms import SimpleGeomForm, NewDocumentForm
from user.models import UserActionLogEntry, UserAction from user.models import UserActionLogEntry, UserAction
@ -66,7 +66,7 @@ class NewEmaForm(AbstractCompensationForm, CompensationResponsibleFormMixin):
# Process the geometry form # Process the geometry form
geometry = geom_form.save(action) geometry = geom_form.save(action)
responsible = ResponsibilityData.objects.create( responsible = Responsibility.objects.create(
handler=handler, handler=handler,
conservation_file_number=conservation_file_number, conservation_file_number=conservation_file_number,
conservation_office=conservation_office, conservation_office=conservation_office,
@ -154,3 +154,7 @@ class EditEmaForm(NewEmaForm):
# Add the log entry to the main objects log list # Add the log entry to the main objects log list
self.instance.log.add(action) self.instance.log.add(action)
return self.instance return self.instance
class NewEmaDocumentForm(NewDocumentForm):
document_model = EmaDocument

View File

@ -11,7 +11,7 @@ from django.test.client import Client
from compensation.tests.test_views import CompensationViewTestCase from compensation.tests.test_views import CompensationViewTestCase
from ema.models import Ema from ema.models import Ema
from intervention.models import ResponsibilityData from intervention.models import Responsibility
from konova.models import Geometry from konova.models import Geometry
from konova.settings import DEFAULT_GROUP, ETS_GROUP from konova.settings import DEFAULT_GROUP, ETS_GROUP
from user.models import UserActionLogEntry, UserAction from user.models import UserActionLogEntry, UserAction
@ -66,7 +66,7 @@ class EmaViewTestCase(CompensationViewTestCase):
action=UserAction.CREATED, action=UserAction.CREATED,
) )
# Create responsible data object # Create responsible data object
responsibility_data = ResponsibilityData.objects.create() responsibility_data = Responsibility.objects.create()
geometry = Geometry.objects.create() geometry = Geometry.objects.create()
cls.ema = Ema.objects.create( cls.ema = Ema.objects.create(
identifier="TEST", identifier="TEST",

View File

@ -8,7 +8,7 @@ from django.utils.translation import gettext_lazy as _
from compensation.forms.modalForms import NewStateModalForm, NewActionModalForm, NewDeadlineModalForm from compensation.forms.modalForms import NewStateModalForm, NewActionModalForm, NewDeadlineModalForm
from compensation.models import CompensationAction, CompensationState from compensation.models import CompensationAction, CompensationState
from ema.forms import NewEmaForm, EditEmaForm from ema.forms import NewEmaForm, EditEmaForm, NewEmaDocumentForm
from ema.tables import EmaTable from ema.tables import EmaTable
from intervention.forms.modalForms import ShareInterventionModalForm from intervention.forms.modalForms import ShareInterventionModalForm
from konova.contexts import BaseContext from konova.contexts import BaseContext
@ -343,7 +343,7 @@ def document_new_view(request: HttpRequest, id: str):
""" """
ema = get_object_or_404(Ema, id=id) ema = get_object_or_404(Ema, id=id)
form = NewDocumentForm(request.POST or None, request.FILES or None, instance=ema, user=request.user) form = NewEmaDocumentForm(request.POST or None, request.FILES or None, instance=ema, user=request.user)
return form.process_request( return form.process_request(
request, request,
msg_success=_("Document added") msg_success=_("Document added")

View File

@ -1,6 +1,6 @@
from django.contrib import admin from django.contrib import admin
from intervention.models import Intervention, ResponsibilityData, LegalData, Revocation, InterventionDocument from intervention.models import Intervention, Responsibility, Legal, Revocation, InterventionDocument
from konova.admin import AbstractDocumentAdmin from konova.admin import AbstractDocumentAdmin
@ -46,7 +46,7 @@ class RevocationAdmin(admin.ModelAdmin):
admin.site.register(Intervention, InterventionAdmin) admin.site.register(Intervention, InterventionAdmin)
admin.site.register(ResponsibilityData, ResponsibilityAdmin) admin.site.register(Responsibility, ResponsibilityAdmin)
admin.site.register(LegalData, LegalAdmin) admin.site.register(Legal, LegalAdmin)
admin.site.register(Revocation, RevocationAdmin) admin.site.register(Revocation, RevocationAdmin)
admin.site.register(InterventionDocument, InterventionDocumentAdmin) admin.site.register(InterventionDocument, InterventionDocumentAdmin)

View File

@ -17,7 +17,7 @@ from codelist.models import KonovaCode
from codelist.settings import CODELIST_PROCESS_TYPE_ID, CODELIST_LAW_ID, \ from codelist.settings import CODELIST_PROCESS_TYPE_ID, CODELIST_LAW_ID, \
CODELIST_REGISTRATION_OFFICE_ID, CODELIST_CONSERVATION_OFFICE_ID CODELIST_REGISTRATION_OFFICE_ID, CODELIST_CONSERVATION_OFFICE_ID
from intervention.inputs import GenerateInput from intervention.inputs import GenerateInput
from intervention.models import Intervention, LegalData, ResponsibilityData from intervention.models import Intervention, Legal, Responsibility
from konova.forms import BaseForm, SimpleGeomForm from konova.forms import BaseForm, SimpleGeomForm
from user.models import UserActionLogEntry, UserAction from user.models import UserActionLogEntry, UserAction
@ -220,7 +220,7 @@ class NewInterventionForm(BaseForm):
) )
# Create legal data object (without M2M laws first) # Create legal data object (without M2M laws first)
legal_data = LegalData.objects.create( legal_data = Legal.objects.create(
registration_date=registration_date, registration_date=registration_date,
binding_date=binding_date, binding_date=binding_date,
process_type=_type, process_type=_type,
@ -229,7 +229,7 @@ class NewInterventionForm(BaseForm):
legal_data.laws.set(laws) legal_data.laws.set(laws)
# Create responsible data object # Create responsible data object
responsibility_data = ResponsibilityData.objects.create( responsibility_data = Responsibility.objects.create(
registration_office=registration_office, registration_office=registration_office,
conservation_office=conservation_office, conservation_office=conservation_office,
registration_file_number=registration_file_number, registration_file_number=registration_file_number,

View File

@ -14,8 +14,8 @@ from django.utils.translation import gettext_lazy as _
from compensation.models import EcoAccount, EcoAccountDeduction from compensation.models import EcoAccount, EcoAccountDeduction
from intervention.inputs import TextToClipboardInput from intervention.inputs import TextToClipboardInput
from intervention.models import Revocation, RevocationDocument, Intervention from intervention.models import Revocation, RevocationDocument, Intervention, InterventionDocument
from konova.forms import BaseModalForm from konova.forms import BaseModalForm, NewDocumentForm
from konova.utils.general import format_german_float from konova.utils.general import format_german_float
from konova.utils.messenger import Messenger from konova.utils.messenger import Messenger
from konova.utils.user_checks import is_default_group_only from konova.utils.user_checks import is_default_group_only
@ -410,3 +410,7 @@ class NewDeductionModalForm(BaseModalForm):
created=user_action_create, created=user_action_create,
) )
return deduction return deduction
class NewInterventionDocumentForm(NewDocumentForm):
document_model = InterventionDocument

View File

@ -9,7 +9,9 @@ import shutil
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib.gis.db import models from django.contrib.gis.db import models
from django.db import transaction
from django.db.models import QuerySet from django.db.models import QuerySet
from django.utils.translation import gettext_lazy as _
from codelist.models import KonovaCode from codelist.models import KonovaCode
from codelist.settings import CODELIST_REGISTRATION_OFFICE_ID, CODELIST_CONSERVATION_OFFICE_ID, CODELIST_LAW_ID, \ from codelist.settings import CODELIST_REGISTRATION_OFFICE_ID, CODELIST_CONSERVATION_OFFICE_ID, CODELIST_LAW_ID, \
@ -19,10 +21,10 @@ from intervention.utils.quality import InterventionQualityChecker
from konova.models import BaseObject, Geometry, UuidModel, BaseResource, AbstractDocument, \ from konova.models import BaseObject, Geometry, UuidModel, BaseResource, AbstractDocument, \
generate_document_file_upload_path, RecordableObject, CheckableObject, ShareableObject generate_document_file_upload_path, RecordableObject, CheckableObject, ShareableObject
from konova.settings import DEFAULT_SRID_RLP, LANIS_LINK_TEMPLATE, LANIS_ZOOM_LUT from konova.settings import DEFAULT_SRID_RLP, LANIS_LINK_TEMPLATE, LANIS_ZOOM_LUT
from user.models import UserActionLogEntry from user.models import UserActionLogEntry, UserAction
class ResponsibilityData(UuidModel): class Responsibility(UuidModel):
""" """
Holds intervention data about responsible organizations and their file numbers for this case Holds intervention data about responsible organizations and their file numbers for this case
@ -68,7 +70,7 @@ class Revocation(BaseResource):
Holds revocation data e.g. for intervention objects Holds revocation data e.g. for intervention objects
""" """
date = models.DateField(null=True, blank=True, help_text="Revocation from") date = models.DateField(null=True, blank=True, help_text="Revocation from")
legal = models.ForeignKey("LegalData", null=False, blank=False, on_delete=models.CASCADE, help_text="Refers to 'Widerspruch am'", related_name="revocations") legal = models.ForeignKey("Legal", null=False, blank=False, on_delete=models.CASCADE, help_text="Refers to 'Widerspruch am'", related_name="revocations")
comment = models.TextField(null=True, blank=True) comment = models.TextField(null=True, blank=True)
def delete(self, *args, **kwargs): def delete(self, *args, **kwargs):
@ -137,7 +139,7 @@ class RevocationDocument(AbstractDocument):
pass pass
class LegalData(UuidModel): class Legal(UuidModel):
""" """
Holds intervention legal data such as important dates, laws or responsible handler Holds intervention legal data such as important dates, laws or responsible handler
""" """
@ -175,14 +177,14 @@ class Intervention(BaseObject, ShareableObject, RecordableObject, CheckableObjec
Interventions are e.g. construction sites where nature used to be. Interventions are e.g. construction sites where nature used to be.
""" """
responsible = models.OneToOneField( responsible = models.OneToOneField(
ResponsibilityData, Responsibility,
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
null=True, null=True,
blank=True, blank=True,
help_text="Holds data on responsible organizations ('Zulassungsbehörde', 'Eintragungsstelle')" help_text="Holds data on responsible organizations ('Zulassungsbehörde', 'Eintragungsstelle')"
) )
legal = models.OneToOneField( legal = models.OneToOneField(
LegalData, Legal,
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
null=True, null=True,
blank=True, blank=True,
@ -322,6 +324,40 @@ class Intervention(BaseObject, ShareableObject, RecordableObject, CheckableObjec
for comp in comps: for comp in comps:
comp.log.add(log_entry) comp.log.add(log_entry)
def add_payment(self, form):
""" Adds a new payment to the intervention
Args:
form (NewPaymentForm): The form holding the data
Returns:
"""
from compensation.models import Payment
form_data = form.cleaned_data
user = form.user
with transaction.atomic():
created_action = UserActionLogEntry.objects.create(
user=user,
action=UserAction.CREATED,
)
edited_action = UserActionLogEntry.objects.create(
user=user,
action=UserAction.EDITED,
comment=_("Added payment"),
)
pay = Payment.objects.create(
created=created_action,
amount=form_data.get("amount", -1),
due_on=form_data.get("due", None),
comment=form_data.get("comment", None),
intervention=self,
)
self.log.add(edited_action)
self.modified = edited_action
self.save()
return pay
class InterventionDocument(AbstractDocument): class InterventionDocument(AbstractDocument):
""" """

View File

@ -24,7 +24,7 @@ class InterventionQualityChecker(AbstractQualityChecker):
self.valid = len(self.messages) == 0 self.valid = len(self.messages) == 0
def _check_responsible_data(self): def _check_responsible_data(self):
""" Checks data quality of related ResponsibilityData """ Checks data quality of related Responsibility
Args: Args:
self.messages (dict): Holds error messages self.messages (dict): Holds error messages
@ -55,7 +55,7 @@ class InterventionQualityChecker(AbstractQualityChecker):
self._add_missing_attr_name(_("Responsible data")) self._add_missing_attr_name(_("Responsible data"))
def _check_legal_data(self): def _check_legal_data(self):
""" Checks data quality of related LegalData """ Checks data quality of related Legal
Args: Args:
self.messages (dict): Holds error messages self.messages (dict): Holds error messages

View File

@ -5,7 +5,7 @@ from django.shortcuts import render
from intervention.forms.forms import NewInterventionForm, EditInterventionForm from intervention.forms.forms import NewInterventionForm, EditInterventionForm
from intervention.forms.modalForms import ShareInterventionModalForm, NewRevocationModalForm, \ from intervention.forms.modalForms import ShareInterventionModalForm, NewRevocationModalForm, \
CheckModalForm, NewDeductionModalForm CheckModalForm, NewDeductionModalForm, NewInterventionDocumentForm
from intervention.models import Intervention, Revocation, InterventionDocument, RevocationDocument from intervention.models import Intervention, Revocation, InterventionDocument, RevocationDocument
from intervention.tables import InterventionTable from intervention.tables import InterventionTable
from konova.contexts import BaseContext from konova.contexts import BaseContext
@ -123,7 +123,7 @@ def new_document_view(request: HttpRequest, id: str):
""" """
intervention = get_object_or_404(Intervention, id=id) intervention = get_object_or_404(Intervention, id=id)
form = NewDocumentForm(request.POST or None, request.FILES or None, instance=intervention, user=request.user) form = NewInterventionDocumentForm(request.POST or None, request.FILES or None, instance=intervention, user=request.user)
return form.process_request( return form.process_request(
request, request,
msg_success=_("Document added") msg_success=_("Document added")

View File

@ -21,11 +21,8 @@ from django.shortcuts import render
from django.utils import timezone from django.utils import timezone
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from compensation.models import EcoAccount, Compensation, EcoAccountDocument, CompensationDocument
from ema.models import Ema, EmaDocument
from intervention.models import Intervention, Revocation, RevocationDocument, InterventionDocument
from konova.contexts import BaseContext from konova.contexts import BaseContext
from konova.models import BaseObject, Geometry from konova.models import BaseObject, Geometry, RecordableObject
from konova.settings import DEFAULT_SRID from konova.settings import DEFAULT_SRID
from konova.utils.message_templates import FORM_INVALID from konova.utils.message_templates import FORM_INVALID
from user.models import UserActionLogEntry, UserAction from user.models import UserActionLogEntry, UserAction
@ -382,13 +379,10 @@ class NewDocumentForm(BaseModalForm):
} }
) )
) )
document_instance_map = { document_model = None
Intervention: InterventionDocument,
Compensation: CompensationDocument, class Meta:
EcoAccount: EcoAccountDocument, abstract = True
Revocation: RevocationDocument,
Ema: EmaDocument,
}
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
@ -398,11 +392,7 @@ class NewDocumentForm(BaseModalForm):
self.form_attrs = { self.form_attrs = {
"enctype": "multipart/form-data", # important for file upload "enctype": "multipart/form-data", # important for file upload
} }
self.document_type = self.document_instance_map.get( if not self.document_model:
self.instance.__class__,
None
)
if not self.document_type:
raise NotImplementedError("Unsupported document type for {}".format(self.instance.__class__)) raise NotImplementedError("Unsupported document type for {}".format(self.instance.__class__))
def save(self): def save(self):
@ -411,7 +401,7 @@ class NewDocumentForm(BaseModalForm):
user=self.user, user=self.user,
action=UserAction.CREATED, action=UserAction.CREATED,
) )
doc = self.document_type.objects.create( doc = self.document_model.objects.create(
created=action, created=action,
title=self.cleaned_data["title"], title=self.cleaned_data["title"],
comment=self.cleaned_data["comment"], comment=self.cleaned_data["comment"],
@ -456,13 +446,7 @@ class RecordModalForm(BaseModalForm):
self.form_title = _("Unrecord data") self.form_title = _("Unrecord data")
self.form_caption = _("I, {} {}, confirm that this data must be unrecorded.").format(self.user.first_name, self.user.last_name) self.form_caption = _("I, {} {}, confirm that this data must be unrecorded.").format(self.user.first_name, self.user.last_name)
implemented_cls_logic = { if not isinstance(self.instance, RecordableObject):
Intervention,
EcoAccount,
Ema,
}
instance_name = self.instance.__class__
if instance_name not in implemented_cls_logic:
raise NotImplementedError raise NotImplementedError
def is_valid(self): def is_valid(self):
@ -471,6 +455,7 @@ class RecordModalForm(BaseModalForm):
Returns: Returns:
""" """
from intervention.models import Intervention
super_val = super().is_valid() super_val = super().is_valid()
if self.instance.recorded: if self.instance.recorded:
# If user wants to unrecord an already recorded dataset, we do not need to perform custom checks # If user wants to unrecord an already recorded dataset, we do not need to perform custom checks

View File

@ -15,7 +15,7 @@ from django.urls import reverse
from codelist.models import KonovaCode from codelist.models import KonovaCode
from compensation.models import Compensation, CompensationState, CompensationAction, EcoAccount from compensation.models import Compensation, CompensationState, CompensationAction, EcoAccount
from intervention.models import LegalData, ResponsibilityData, Intervention from intervention.models import Legal, Responsibility, Intervention
from konova.management.commands.setup_data import GROUPS_DATA from konova.management.commands.setup_data import GROUPS_DATA
from konova.models import Geometry from konova.models import Geometry
from konova.settings import DEFAULT_GROUP from konova.settings import DEFAULT_GROUP
@ -103,9 +103,9 @@ class BaseTestCase(TestCase):
action=UserAction.CREATED, action=UserAction.CREATED,
) )
# Create legal data object (without M2M laws first) # Create legal data object (without M2M laws first)
legal_data = LegalData.objects.create() legal_data = Legal.objects.create()
# Create responsible data object # Create responsible data object
responsibility_data = ResponsibilityData.objects.create() responsibility_data = Responsibility.objects.create()
geometry = Geometry.objects.create() geometry = Geometry.objects.create()
# Finally create main object, holding the other objects # Finally create main object, holding the other objects
intervention = Intervention.objects.create( intervention = Intervention.objects.create(
@ -162,8 +162,8 @@ class BaseTestCase(TestCase):
) )
geometry = Geometry.objects.create() geometry = Geometry.objects.create()
# Create responsible data object # Create responsible data object
lega_data = LegalData.objects.create() lega_data = Legal.objects.create()
responsible_data = ResponsibilityData.objects.create() responsible_data = Responsibility.objects.create()
# Finally create main object, holding the other objects # Finally create main object, holding the other objects
eco_account = EcoAccount.objects.create( eco_account = EcoAccount.objects.create(
identifier="TEST", identifier="TEST",