From e327f03893aaa9966effba0821537ced793e211f Mon Sep 17 00:00:00 2001 From: mipel Date: Fri, 30 Jul 2021 09:30:33 +0200 Subject: [PATCH] Intervention model refactoring * splits Intervention model into three main components * Intervention (main object) * LegalData (holds legal dates, laws, etc.) * ResponsibilityData (holds organizations and handler) * This way data can be extended more easily in the future * refactors admin.py and usages in templates * introduces UuidModel as a base class for BaseResource --- intervention/admin.py | 27 +++++++++-- intervention/models.py | 48 +++++++++++++++---- .../templates/intervention/detail/view.html | 22 ++++----- konova/models.py | 13 ++++- konova/views.py | 2 +- 5 files changed, 85 insertions(+), 27 deletions(-) diff --git a/intervention/admin.py b/intervention/admin.py index 6d0df04..4adf095 100644 --- a/intervention/admin.py +++ b/intervention/admin.py @@ -1,17 +1,38 @@ from django.contrib import admin -from intervention.models import Intervention +from intervention.models import Intervention, ResponsibilityData, LegalData class InterventionAdmin(admin.ModelAdmin): list_display = [ "id", "title", - "process_type", - "handler", "created_on", "deleted_on", ] +class ResponsibilityAdmin(admin.ModelAdmin): + list_display = [ + "id", + "registration_office", + "registration_file_number", + "conservation_office", + "conservation_file_number", + "handler", + ] + + +class LegalAdmin(admin.ModelAdmin): + list_display = [ + "id", + "process_type", + "law", + "registration_date", + "binding_date", + ] + + admin.site.register(Intervention, InterventionAdmin) +admin.site.register(ResponsibilityData, ResponsibilityAdmin) +admin.site.register(LegalData, LegalAdmin) diff --git a/intervention/models.py b/intervention/models.py index 5280c84..67fd83a 100644 --- a/intervention/models.py +++ b/intervention/models.py @@ -12,32 +12,60 @@ from django.utils import timezone from django.utils.timezone import now from intervention.settings import INTERVENTION_IDENTIFIER_LENGTH, INTERVENTION_IDENTIFIER_TEMPLATE -from konova.models import BaseObject, Geometry +from konova.models import BaseObject, Geometry, UuidModel from konova.utils.generators import generate_random_string from organisation.models import Organisation from user.models import UserActionLogEntry -class Intervention(BaseObject): +class ResponsibilityData(UuidModel): """ - Interventions are e.g. construction sites where nature used to be. + Holds intervention data about responsible organizations and their file numbers for this case + """ 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) conservation_office = models.ForeignKey(Organisation, on_delete=models.SET_NULL, null=True, related_name="+") conservation_file_number = models.CharField(max_length=1000, blank=True, null=True) + handler = models.CharField(max_length=500, null=True, blank=True, help_text="Refers to 'Eingriffsverursacher'") - 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, help_text="Who is responsible for this intervention?") - geometry = models.ForeignKey(Geometry, null=True, blank=True, on_delete=models.SET_NULL) - documents = models.ManyToManyField("konova.Document", blank=True) +class LegalData(UuidModel): + """ + Holds intervention legal data such as important dates, laws or responsible handler + """ # Refers to "zugelassen am" - registration_date = models.DateField(null=True, blank=True) + registration_date = models.DateField(null=True, blank=True, help_text="Refers to 'Zugelassen am'") # Refers to "Bestandskraft am" - binding_on = models.DateField(null=True, blank=True) + binding_date = models.DateField(null=True, blank=True, help_text="Refers to 'Bestandskraft am'") + + process_type = models.CharField(max_length=500, null=True, blank=True) + law = models.CharField(max_length=500, null=True, blank=True) + + +class Intervention(BaseObject): + """ + Interventions are e.g. construction sites where nature used to be. + """ + responsible = models.OneToOneField( + ResponsibilityData, + on_delete=models.SET_NULL, + null=True, + blank=True, + related_name='+', + help_text="Holds data on responsible organizations ('Zulassungsbehörde', 'Eintragungsstelle')" + ) + legal = models.OneToOneField( + LegalData, + on_delete=models.SET_NULL, + null=True, + blank=True, + related_name='+', + help_text="Holds data on legal dates or law" + ) + geometry = models.ForeignKey(Geometry, null=True, blank=True, on_delete=models.SET_NULL) + documents = models.ManyToManyField("konova.Document", blank=True) # Checks - Refers to "Genehmigen" but optional checked = models.OneToOneField( diff --git a/intervention/templates/intervention/detail/view.html b/intervention/templates/intervention/detail/view.html index e19d3c1..7354bca 100644 --- a/intervention/templates/intervention/detail/view.html +++ b/intervention/templates/intervention/detail/view.html @@ -64,31 +64,31 @@ {% trans 'Process type' %} - {{intervention.process_type|default_if_none:""}} + {{intervention.legal.process_type|default_if_none:""}} {% trans 'Law' %} - {{intervention.law|default_if_none:""}} + {{intervention.legal.law|default_if_none:""}} {% trans 'Registration office' %} - {{intervention.registration_office|default_if_none:""}} + {{intervention.responsible.registration_office|default_if_none:""}} {% trans 'Registration office file number' %} - {{intervention.registration_file_number|default_if_none:""}} + {{intervention.responsible.registration_file_number|default_if_none:""}} {% trans 'Conservation office' %} - {{intervention.conservation_office|default_if_none:""}} + {{intervention.responsible.conservation_office|default_if_none:""}} {% trans 'Conversation office file number' %} - {{intervention.conservation_file_number|default_if_none:""}} + {{intervention.responsible.conservation_file_number|default_if_none:""}} {% trans 'Intervention handler' %} - {{intervention.handler|default_if_none:""}} + {{intervention.responsible.handler|default_if_none:""}} {% trans 'Checked' %} @@ -98,7 +98,7 @@ {% fa5_icon 'star' 'far' %} {% else %} - + {% fa5_icon 'star' %} {% endif %} @@ -112,7 +112,7 @@ {% fa5_icon 'bookmark' 'far' %} {% else %} - + {% fa5_icon 'bookmark' %} {% endif %} @@ -120,11 +120,11 @@ {% trans 'Registration date' %} - {{intervention.registration_date|default_if_none:""}} + {{intervention.legal.registration_date|default_if_none:""}} {% trans 'Binding on' %} - {{intervention.binding_on|default_if_none:""}} + {{intervention.legal.binding_on|default_if_none:""}} {% trans 'Last modified' %} diff --git a/konova/models.py b/konova/models.py index 0d4d79a..53d7bcc 100644 --- a/konova/models.py +++ b/konova/models.py @@ -15,14 +15,23 @@ from django.db import models from konova.settings import DEFAULT_SRID -class BaseResource(models.Model): +class UuidModel(models.Model): """ - A basic resource model, which defines attributes for every derived model + Encapsules identifying via uuid """ id = models.UUIDField( primary_key=True, default=uuid.uuid4, ) + + class Meta: + abstract = True + + +class BaseResource(UuidModel): + """ + A basic resource model, which defines attributes for every derived model + """ created_on = models.DateTimeField(auto_now_add=True, null=True) created_by = models.ForeignKey(User, null=True, on_delete=models.SET_NULL, related_name="+") diff --git a/konova/views.py b/konova/views.py index df11a1e..e857d09 100644 --- a/konova/views.py +++ b/konova/views.py @@ -78,7 +78,7 @@ def home_view(request: HttpRequest): next_version=None, ) user_comps = comps.filter( - users__in=[user] + intervention__users__in=[user] ) eco_accs = EcoAccount.objects.filter( deleted_on=None,