Refactoring to konova

This commit is contained in:
mipel
2021-07-01 15:08:22 +02:00
parent 947f50b11c
commit 972cbf5433
19 changed files with 94 additions and 263 deletions

View File

@@ -9,7 +9,6 @@ class InterventionAdmin(admin.ModelAdmin):
"title",
"process_type",
"handler",
"is_active",
"created_on",
"deleted_on",
]

View File

@@ -7,8 +7,11 @@ Created on: 17.11.20
"""
from django.contrib.auth.models import User
from django.contrib.gis.db import models
from django.db import transaction
from django.utils import timezone
from django.utils.timezone import now
from compensation.models import Payment, Compensation
from intervention.settings import INTERVENTION_IDENTIFIER_LENGTH, INTERVENTION_IDENTIFIER_TEMPLATE
from konova.models import BaseObject, Geometry
from konova.utils.generators import generate_random_string
@@ -18,22 +21,23 @@ from organisation.models import Organisation
class Intervention(BaseObject):
"""
Interventions are e.g. construction sites where nature used to be.
A process consists of exactly one intervention and one or more compensation
"""
registration_office = models.ForeignKey(Organisation, on_delete=models.SET_NULL, null=True)
registration_office = models.ForeignKey(Organisation, on_delete=models.SET_NULL, null=True, related_name="+")
registration_file_number = models.CharField(max_length=1000, blank=True, null=True)
registration_date = models.DateTimeField(null=True, blank=True)
conservation_office = models.ForeignKey(Organisation, on_delete=models.SET_NULL, null=True)
conservation_office = models.ForeignKey(Organisation, on_delete=models.SET_NULL, null=True, related_name="+")
conservations_file_number = models.CharField(max_length=1000, blank=True, null=True)
process_type = models.CharField(max_length=500, null=True, blank=True)
law = models.CharField(max_length=500, null=True, blank=True)
handler = models.CharField(max_length=500, null=True, blank=True)
geometry = models.ForeignKey(Geometry, null=True, blank=True, on_delete=models.SET_NULL)
documents = models.ManyToManyField("konova.Document", blank=True)
# Refers to "zugelassen am"
registration_date = models.DateField(null=True, blank=True)
# Refers to "Bestandskraft am"
binding_on = models.DateField(null=True, blank=True)
# Refers to "verzeichnen"
recorded_on = models.DateTimeField(default=None)
recorded_by = models.ForeignKey(User, null=True, blank=True, on_delete=models.SET_NULL)
@@ -41,14 +45,39 @@ class Intervention(BaseObject):
# Holds which intervention is simply a newer version of this dataset
next_version = models.ForeignKey("Intervention", null=True, on_delete=models.DO_NOTHING)
def __str__(self):
return "{} by {}".format(self.type, self.handler)
# Compensation or payments, one-directional
payments = models.ManyToManyField(Payment, related_name="+")
compensations = models.ManyToManyField(Compensation, related_name="+")
def delete(self, *args, **kwargs):
super().delete(*args, **kwargs)
""" Custom delete functionality
Does not delete from database but sets a timestamp for being deleted on and which user deleted the object
Args:
*args ():
**kwargs ():
Returns:
"""
_now = timezone.now()
_user = kwargs.get("user", None)
with transaction.atomic():
# "Delete" related compensations as well
coms = self.compensations.all()
for com in coms:
com.deleted_on = _now
com.deleted_by = _user
com.save()
self.deleted_on = _now
self.deleted_by = _user
self.save()
@staticmethod
def __generate_new_identifier() -> str:
def _generate_new_identifier() -> str:
""" Generates a new identifier for the intervention object
Returns:
@@ -66,8 +95,8 @@ class Intervention(BaseObject):
def save(self, *args, **kwargs):
if self.identifier is None or len(self.identifier) == 0:
# Create new identifier
new_id = self.__generate_new_identifier()
new_id = self._generate_new_identifier()
while Intervention.objects.filter(identifier=new_id).exists():
new_id = self.__generate_new_identifier()
new_id = self._generate_new_identifier()
self.identifier = new_id
super().save(*args, **kwargs)

View File

@@ -25,11 +25,6 @@ class InterventionTable(BaseTable):
orderable=True,
accessor="title",
)
p = tables.Column(
verbose_name=_("Process"),
orderable=True,
accessor="process",
)
d = tables.Column(
verbose_name=_("Created on"),
orderable=True,

View File

@@ -2,8 +2,7 @@ from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.utils.translation import gettext_lazy as _
from django.http import HttpRequest
from django.shortcuts import render, get_object_or_404, redirect
from django.urls import reverse
from django.shortcuts import render, get_object_or_404
from intervention.forms import NewInterventionForm, EditInterventionForm, OpenInterventionForm
from intervention.models import Intervention
@@ -11,14 +10,12 @@ from intervention.tables import InterventionTable
from konova.contexts import BaseContext
from konova.decorators import *
from konova.forms import RemoveForm
from process.models import Process
@login_required
def index_view(request: HttpRequest):
"""
Renders the index view for process
Renders the index view for Interventions
Args:
request (HttpRequest): The incoming request
@@ -56,14 +53,8 @@ def new_view(request: HttpRequest):
if request.method == "POST":
if form.is_valid():
intervention = form.save(request.user)
if intervention.process is None:
# An intervention can not be created without a process -> automatically create a new process
process = Process.create_from_intervention(intervention)
messages.info(request, _("Interventions must be part of a process. Please fill in the missing data for the process"))
return redirect("process:edit", id=process.id)
else:
messages.success(request, _("Intervention {} added").format(intervention.title))
return redirect("intervention:index")
messages.success(request, _("Intervention {} added").format(intervention.title))
return redirect("intervention:index")
else:
messages.error(request, _("Invalid input"))
else:
@@ -129,7 +120,7 @@ def edit_view(request: HttpRequest, id: str):
@login_required
def remove_view(request: HttpRequest, id: str):
""" Renders a remove view for this process
""" Renders a remove view for this intervention
Args:
request (HttpRequest): The incoming request
@@ -139,29 +130,13 @@ def remove_view(request: HttpRequest, id: str):
"""
template = "konova/form.html"
# Since an intervention is always organized inside a process, we will call the process removing routine, which
# disables all related elements by default
obj = get_object_or_404(Intervention, id=id)
process = obj.process
if request.method == "POST":
form = RemoveForm(
request.POST or None,
object_to_remove=obj,
remove_post_url=reverse("process:remove", args=(process.id,)),
cancel_url=reverse("intervention:index"),
)
if form.is_valid():
confirmed = form.is_checked()
if confirmed:
process.deactivate()
messages.success(request, _("Intervention {} removed").format(obj))
return redirect("intervention:index")
else:
messages.error(request, _("Invalid input"))
obj = Intervention.objects.get(id=id)
# ToDo
form = RemoveForm(
object_to_remove=obj,
remove_post_url=reverse("process:remove", args=(process.id,)),
remove_post_url=reverse("intervention:remove", args=(id,)),
cancel_url=reverse("intervention:index"),
)
context = {