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
This commit is contained in:
		
							parent
							
								
									9f3b858f9f
								
							
						
					
					
						commit
						8cb4e1168d
					
				@ -1,17 +1,38 @@
 | 
				
			|||||||
from django.contrib import admin
 | 
					from django.contrib import admin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from intervention.models import Intervention
 | 
					from intervention.models import Intervention, ResponsibilityData, LegalData
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class InterventionAdmin(admin.ModelAdmin):
 | 
					class InterventionAdmin(admin.ModelAdmin):
 | 
				
			||||||
    list_display = [
 | 
					    list_display = [
 | 
				
			||||||
        "id",
 | 
					        "id",
 | 
				
			||||||
        "title",
 | 
					        "title",
 | 
				
			||||||
        "process_type",
 | 
					 | 
				
			||||||
        "handler",
 | 
					 | 
				
			||||||
        "created_on",
 | 
					        "created_on",
 | 
				
			||||||
        "deleted_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(Intervention, InterventionAdmin)
 | 
				
			||||||
 | 
					admin.site.register(ResponsibilityData, ResponsibilityAdmin)
 | 
				
			||||||
 | 
					admin.site.register(LegalData, LegalAdmin)
 | 
				
			||||||
 | 
				
			|||||||
@ -12,33 +12,61 @@ from django.utils import timezone
 | 
				
			|||||||
from django.utils.timezone import now
 | 
					from django.utils.timezone import now
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from intervention.settings import INTERVENTION_IDENTIFIER_LENGTH, INTERVENTION_IDENTIFIER_TEMPLATE
 | 
					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 konova.utils.generators import generate_random_string
 | 
				
			||||||
from organisation.models import Organisation
 | 
					from organisation.models import Organisation
 | 
				
			||||||
from user.models import UserActionLogEntry
 | 
					from user.models import UserActionLogEntry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ResponsibilityData(UuidModel):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    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'")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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, help_text="Refers to 'Zugelassen am'")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Refers to "Bestandskraft am"
 | 
				
			||||||
 | 
					    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):
 | 
					class Intervention(BaseObject):
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    Interventions are e.g. construction sites where nature used to be.
 | 
					    Interventions are e.g. construction sites where nature used to be.
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    registration_office = models.ForeignKey(Organisation, on_delete=models.SET_NULL, null=True, related_name="+")
 | 
					    responsible = models.OneToOneField(
 | 
				
			||||||
    registration_file_number = models.CharField(max_length=1000, blank=True, null=True)
 | 
					        ResponsibilityData,
 | 
				
			||||||
    conservation_office = models.ForeignKey(Organisation, on_delete=models.SET_NULL, null=True, related_name="+")
 | 
					        on_delete=models.SET_NULL,
 | 
				
			||||||
    conservation_file_number = models.CharField(max_length=1000, blank=True, null=True)
 | 
					        null=True,
 | 
				
			||||||
 | 
					        blank=True,
 | 
				
			||||||
    process_type = models.CharField(max_length=500, null=True, blank=True)
 | 
					        related_name='+',
 | 
				
			||||||
    law = models.CharField(max_length=500, null=True, blank=True)
 | 
					        help_text="Holds data on responsible organizations ('Zulassungsbehörde', 'Eintragungsstelle')"
 | 
				
			||||||
    handler = models.CharField(max_length=500, null=True, blank=True, help_text="Who is responsible for this intervention?")
 | 
					    )
 | 
				
			||||||
 | 
					    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)
 | 
					    geometry = models.ForeignKey(Geometry, null=True, blank=True, on_delete=models.SET_NULL)
 | 
				
			||||||
    documents = models.ManyToManyField("konova.Document", blank=True)
 | 
					    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)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Checks - Refers to "Genehmigen" but optional
 | 
					    # Checks - Refers to "Genehmigen" but optional
 | 
				
			||||||
    checked = models.OneToOneField(
 | 
					    checked = models.OneToOneField(
 | 
				
			||||||
        UserActionLogEntry,
 | 
					        UserActionLogEntry,
 | 
				
			||||||
 | 
				
			|||||||
@ -64,31 +64,31 @@
 | 
				
			|||||||
                    </tr>
 | 
					                    </tr>
 | 
				
			||||||
                    <tr>
 | 
					                    <tr>
 | 
				
			||||||
                        <th scope="row">{% trans 'Process type' %}</th>
 | 
					                        <th scope="row">{% trans 'Process type' %}</th>
 | 
				
			||||||
                        <td class="align-middle">{{intervention.process_type|default_if_none:""}}</td>
 | 
					                        <td class="align-middle">{{intervention.legal.process_type|default_if_none:""}}</td>
 | 
				
			||||||
                    </tr>
 | 
					                    </tr>
 | 
				
			||||||
                    <tr>
 | 
					                    <tr>
 | 
				
			||||||
                        <th scope="row">{% trans 'Law' %}</th>
 | 
					                        <th scope="row">{% trans 'Law' %}</th>
 | 
				
			||||||
                        <td class="align-middle">{{intervention.law|default_if_none:""}}</td>
 | 
					                        <td class="align-middle">{{intervention.legal.law|default_if_none:""}}</td>
 | 
				
			||||||
                    </tr>
 | 
					                    </tr>
 | 
				
			||||||
                    <tr>
 | 
					                    <tr>
 | 
				
			||||||
                        <th scope="row">{% trans 'Registration office' %}</th>
 | 
					                        <th scope="row">{% trans 'Registration office' %}</th>
 | 
				
			||||||
                        <td class="align-middle">{{intervention.registration_office|default_if_none:""}}</td>
 | 
					                        <td class="align-middle">{{intervention.responsible.registration_office|default_if_none:""}}</td>
 | 
				
			||||||
                    </tr>
 | 
					                    </tr>
 | 
				
			||||||
                    <tr>
 | 
					                    <tr>
 | 
				
			||||||
                        <th scope="row">{% trans 'Registration office file number' %}</th>
 | 
					                        <th scope="row">{% trans 'Registration office file number' %}</th>
 | 
				
			||||||
                        <td class="align-middle">{{intervention.registration_file_number|default_if_none:""}}</td>
 | 
					                        <td class="align-middle">{{intervention.responsible.registration_file_number|default_if_none:""}}</td>
 | 
				
			||||||
                    </tr>
 | 
					                    </tr>
 | 
				
			||||||
                    <tr>
 | 
					                    <tr>
 | 
				
			||||||
                        <th scope="row">{% trans 'Conservation office' %}</th>
 | 
					                        <th scope="row">{% trans 'Conservation office' %}</th>
 | 
				
			||||||
                        <td class="align-middle">{{intervention.conservation_office|default_if_none:""}}</td>
 | 
					                        <td class="align-middle">{{intervention.responsible.conservation_office|default_if_none:""}}</td>
 | 
				
			||||||
                    </tr>
 | 
					                    </tr>
 | 
				
			||||||
                    <tr>
 | 
					                    <tr>
 | 
				
			||||||
                        <th scope="row">{% trans 'Conversation office file number' %}</th>
 | 
					                        <th scope="row">{% trans 'Conversation office file number' %}</th>
 | 
				
			||||||
                        <td class="align-middle">{{intervention.conservation_file_number|default_if_none:""}}</td>
 | 
					                        <td class="align-middle">{{intervention.responsible.conservation_file_number|default_if_none:""}}</td>
 | 
				
			||||||
                    </tr>
 | 
					                    </tr>
 | 
				
			||||||
                    <tr>
 | 
					                    <tr>
 | 
				
			||||||
                        <th scope="row">{% trans 'Intervention handler' %}</th>
 | 
					                        <th scope="row">{% trans 'Intervention handler' %}</th>
 | 
				
			||||||
                        <td class="align-middle">{{intervention.handler|default_if_none:""}}</td>
 | 
					                        <td class="align-middle">{{intervention.responsible.handler|default_if_none:""}}</td>
 | 
				
			||||||
                    </tr>
 | 
					                    </tr>
 | 
				
			||||||
                    <tr>
 | 
					                    <tr>
 | 
				
			||||||
                        <th scope="row">{% trans 'Checked' %}</th>
 | 
					                        <th scope="row">{% trans 'Checked' %}</th>
 | 
				
			||||||
@ -98,7 +98,7 @@
 | 
				
			|||||||
                                    {% fa5_icon 'star' 'far' %}
 | 
					                                    {% fa5_icon 'star' 'far' %}
 | 
				
			||||||
                                </span>
 | 
					                                </span>
 | 
				
			||||||
                            {% else %}
 | 
					                            {% else %}
 | 
				
			||||||
                                <span class="check-star">
 | 
					                                <span class="check-star" title="{% trans 'Checked on '%} {{intervention.checked.timestamp}} {% trans 'by' %} {{intervention.checked.user}}">
 | 
				
			||||||
                                    {% fa5_icon 'star' %}
 | 
					                                    {% fa5_icon 'star' %}
 | 
				
			||||||
                                </span>
 | 
					                                </span>
 | 
				
			||||||
                            {% endif %}
 | 
					                            {% endif %}
 | 
				
			||||||
@ -112,7 +112,7 @@
 | 
				
			|||||||
                                    {% fa5_icon 'bookmark' 'far' %}
 | 
					                                    {% fa5_icon 'bookmark' 'far' %}
 | 
				
			||||||
                                </span>
 | 
					                                </span>
 | 
				
			||||||
                            {% else %}
 | 
					                            {% else %}
 | 
				
			||||||
                                <span class="registered-bookmark">
 | 
					                                <span class="registered-bookmark" title="{% trans 'Recorded on '%} {{intervention.recorded.timestamp}} {% trans 'by' %} {{intervention.recorded.user}}">
 | 
				
			||||||
                                    {% fa5_icon 'bookmark' %}
 | 
					                                    {% fa5_icon 'bookmark' %}
 | 
				
			||||||
                                </span>
 | 
					                                </span>
 | 
				
			||||||
                            {% endif %}
 | 
					                            {% endif %}
 | 
				
			||||||
@ -120,11 +120,11 @@
 | 
				
			|||||||
                    </tr>
 | 
					                    </tr>
 | 
				
			||||||
                    <tr>
 | 
					                    <tr>
 | 
				
			||||||
                        <th scope="row">{% trans 'Registration date' %}</th>
 | 
					                        <th scope="row">{% trans 'Registration date' %}</th>
 | 
				
			||||||
                        <td class="align-middle">{{intervention.registration_date|default_if_none:""}}</td>
 | 
					                        <td class="align-middle">{{intervention.legal.registration_date|default_if_none:""}}</td>
 | 
				
			||||||
                    </tr>
 | 
					                    </tr>
 | 
				
			||||||
                    <tr>
 | 
					                    <tr>
 | 
				
			||||||
                        <th scope="row">{% trans 'Binding on' %}</th>
 | 
					                        <th scope="row">{% trans 'Binding on' %}</th>
 | 
				
			||||||
                        <td class="align-middle">{{intervention.binding_on|default_if_none:""}}</td>
 | 
					                        <td class="align-middle">{{intervention.legal.binding_on|default_if_none:""}}</td>
 | 
				
			||||||
                    </tr>
 | 
					                    </tr>
 | 
				
			||||||
                    <tr>
 | 
					                    <tr>
 | 
				
			||||||
                        <th scope="row">{% trans 'Last modified' %}</th>
 | 
					                        <th scope="row">{% trans 'Last modified' %}</th>
 | 
				
			||||||
 | 
				
			|||||||
@ -15,14 +15,23 @@ from django.db import models
 | 
				
			|||||||
from konova.settings import DEFAULT_SRID
 | 
					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(
 | 
					    id = models.UUIDField(
 | 
				
			||||||
        primary_key=True,
 | 
					        primary_key=True,
 | 
				
			||||||
        default=uuid.uuid4,
 | 
					        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_on = models.DateTimeField(auto_now_add=True, null=True)
 | 
				
			||||||
    created_by = models.ForeignKey(User, null=True, on_delete=models.SET_NULL, related_name="+")
 | 
					    created_by = models.ForeignKey(User, null=True, on_delete=models.SET_NULL, related_name="+")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -78,7 +78,7 @@ def home_view(request: HttpRequest):
 | 
				
			|||||||
        next_version=None,
 | 
					        next_version=None,
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
    user_comps = comps.filter(
 | 
					    user_comps = comps.filter(
 | 
				
			||||||
        users__in=[user]
 | 
					        intervention__users__in=[user]
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
    eco_accs = EcoAccount.objects.filter(
 | 
					    eco_accs = EcoAccount.objects.filter(
 | 
				
			||||||
        deleted_on=None,
 | 
					        deleted_on=None,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user