Refactoring
* splits intervention/models.py into subpackage
This commit is contained in:
		
							parent
							
								
									bcffae4a95
								
							
						
					
					
						commit
						d78afbfb5c
					
				
							
								
								
									
										12
									
								
								intervention/models/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								intervention/models/__init__.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
			
		||||
"""
 | 
			
		||||
Author: Michel Peltriaux
 | 
			
		||||
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
 | 
			
		||||
Contact: michel.peltriaux@sgdnord.rlp.de
 | 
			
		||||
Created on: 15.11.21
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
from .intervention import *
 | 
			
		||||
from .legal import *
 | 
			
		||||
from .revocation import *
 | 
			
		||||
from .responsibility import *
 | 
			
		||||
@ -2,174 +2,23 @@
 | 
			
		||||
Author: Michel Peltriaux
 | 
			
		||||
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
 | 
			
		||||
Contact: michel.peltriaux@sgdnord.rlp.de
 | 
			
		||||
Created on: 17.11.20
 | 
			
		||||
Created on: 15.11.21
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
import shutil
 | 
			
		||||
 | 
			
		||||
from django.contrib.auth.models import User
 | 
			
		||||
from django.contrib.gis.db import models
 | 
			
		||||
from django.db import transaction
 | 
			
		||||
from django.db import models, transaction
 | 
			
		||||
from django.db.models import QuerySet
 | 
			
		||||
from django.utils.translation import gettext_lazy as _
 | 
			
		||||
 | 
			
		||||
from codelist.models import KonovaCode
 | 
			
		||||
from codelist.settings import CODELIST_REGISTRATION_OFFICE_ID, CODELIST_CONSERVATION_OFFICE_ID, CODELIST_LAW_ID, \
 | 
			
		||||
    CODELIST_PROCESS_TYPE_ID
 | 
			
		||||
from intervention.managers import InterventionManager
 | 
			
		||||
from intervention.models.legal import Legal
 | 
			
		||||
from intervention.models.responsibility import Responsibility
 | 
			
		||||
from intervention.models.revocation import RevocationDocument
 | 
			
		||||
from intervention.utils.quality import InterventionQualityChecker
 | 
			
		||||
from konova.models import BaseObject, Geometry, UuidModel, BaseResource, AbstractDocument, \
 | 
			
		||||
    generate_document_file_upload_path, RecordableObject, CheckableObject, ShareableObject
 | 
			
		||||
from konova.settings import DEFAULT_SRID_RLP, LANIS_LINK_TEMPLATE, LANIS_ZOOM_LUT
 | 
			
		||||
from user.models import UserActionLogEntry, UserAction
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Responsibility(UuidModel):
 | 
			
		||||
    """
 | 
			
		||||
    Holds intervention data about responsible organizations and their file numbers for this case
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    registration_office = models.ForeignKey(
 | 
			
		||||
        KonovaCode,
 | 
			
		||||
        on_delete=models.SET_NULL,
 | 
			
		||||
        null=True,
 | 
			
		||||
        related_name="+",
 | 
			
		||||
        blank=True,
 | 
			
		||||
        limit_choices_to={
 | 
			
		||||
            "code_lists__in": [CODELIST_REGISTRATION_OFFICE_ID],
 | 
			
		||||
            "is_selectable": True,
 | 
			
		||||
            "is_archived": False,
 | 
			
		||||
        }
 | 
			
		||||
    )
 | 
			
		||||
    registration_file_number = models.CharField(max_length=1000, blank=True, null=True)
 | 
			
		||||
    conservation_office = models.ForeignKey(
 | 
			
		||||
        KonovaCode,
 | 
			
		||||
        on_delete=models.SET_NULL,
 | 
			
		||||
        null=True,
 | 
			
		||||
        related_name="+",
 | 
			
		||||
        blank=True,
 | 
			
		||||
        limit_choices_to={
 | 
			
		||||
            "code_lists__in": [CODELIST_CONSERVATION_OFFICE_ID],
 | 
			
		||||
            "is_selectable": True,
 | 
			
		||||
            "is_archived": False,
 | 
			
		||||
        }
 | 
			
		||||
    )
 | 
			
		||||
    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' or 'Maßnahmenträger'")
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return "ZB: {} | ETS: {} | Handler: {}".format(
 | 
			
		||||
            self.registration_office,
 | 
			
		||||
            self.conservation_office,
 | 
			
		||||
            self.handler
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Revocation(BaseResource):
 | 
			
		||||
    """
 | 
			
		||||
    Holds revocation data e.g. for intervention objects
 | 
			
		||||
    """
 | 
			
		||||
    date = models.DateField(null=True, blank=True, help_text="Revocation from")
 | 
			
		||||
    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)
 | 
			
		||||
 | 
			
		||||
    def delete(self, *args, **kwargs):
 | 
			
		||||
        # Make sure related objects are being removed as well
 | 
			
		||||
        if self.document:
 | 
			
		||||
            self.document.delete(*args, **kwargs)
 | 
			
		||||
        super().delete()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class RevocationDocument(AbstractDocument):
 | 
			
		||||
    """
 | 
			
		||||
    Specializes document upload for revocations with certain path
 | 
			
		||||
    """
 | 
			
		||||
    instance = models.OneToOneField(
 | 
			
		||||
        Revocation,
 | 
			
		||||
        on_delete=models.CASCADE,
 | 
			
		||||
        related_name="document",
 | 
			
		||||
    )
 | 
			
		||||
    file = models.FileField(
 | 
			
		||||
        upload_to=generate_document_file_upload_path,
 | 
			
		||||
        max_length=1000,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def intervention(self):
 | 
			
		||||
        """
 | 
			
		||||
        Shortcut for opening the related intervention
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
            intervention (Intervention)
 | 
			
		||||
        """
 | 
			
		||||
        return self.instance.legal.intervention
 | 
			
		||||
 | 
			
		||||
    def delete(self, *args, **kwargs):
 | 
			
		||||
        """
 | 
			
		||||
        Custom delete functionality for RevocationDocuments.
 | 
			
		||||
        Removes the folder from the file system if there are no further documents for this entry.
 | 
			
		||||
 | 
			
		||||
        Args:
 | 
			
		||||
            *args ():
 | 
			
		||||
            **kwargs ():
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        revoc_docs, other_intervention_docs = self.intervention.get_documents()
 | 
			
		||||
 | 
			
		||||
        # Remove the file itself
 | 
			
		||||
        super().delete(*args, **kwargs)
 | 
			
		||||
 | 
			
		||||
        # Always remove 'revocation' folder if the one revocation we just processed is the only one left
 | 
			
		||||
        folder_path = self.file.path.split("/")
 | 
			
		||||
        if revoc_docs.count() == 0:
 | 
			
		||||
            try:
 | 
			
		||||
                shutil.rmtree("/".join(folder_path[:-1]))
 | 
			
		||||
            except FileNotFoundError:
 | 
			
		||||
                # Revocation subfolder seems to be missing already
 | 
			
		||||
                pass
 | 
			
		||||
 | 
			
		||||
        if other_intervention_docs.count() == 0:
 | 
			
		||||
            # If there are no further documents for the intervention, we can simply remove the whole folder as well!
 | 
			
		||||
            try:
 | 
			
		||||
                shutil.rmtree("/".join(folder_path[:-2]))
 | 
			
		||||
            except FileNotFoundError:
 | 
			
		||||
                # Folder seems to be missing already
 | 
			
		||||
                pass
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Legal(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.ForeignKey(
 | 
			
		||||
        KonovaCode,
 | 
			
		||||
        on_delete=models.SET_NULL,
 | 
			
		||||
        null=True,
 | 
			
		||||
        related_name="+",
 | 
			
		||||
        blank=True,
 | 
			
		||||
        limit_choices_to={
 | 
			
		||||
            "code_lists__in": [CODELIST_PROCESS_TYPE_ID],
 | 
			
		||||
            "is_selectable": True,
 | 
			
		||||
            "is_archived": False,
 | 
			
		||||
        }
 | 
			
		||||
    )
 | 
			
		||||
    laws = models.ManyToManyField(
 | 
			
		||||
        KonovaCode,
 | 
			
		||||
        blank=True,
 | 
			
		||||
        limit_choices_to={
 | 
			
		||||
            "code_lists__in": [CODELIST_LAW_ID],
 | 
			
		||||
            "is_selectable": True,
 | 
			
		||||
            "is_archived": False,
 | 
			
		||||
        }
 | 
			
		||||
    )
 | 
			
		||||
from konova.models import generate_document_file_upload_path, AbstractDocument, Geometry, BaseObject, ShareableObject, \
 | 
			
		||||
    RecordableObject, CheckableObject
 | 
			
		||||
from konova.settings import LANIS_LINK_TEMPLATE, LANIS_ZOOM_LUT, DEFAULT_SRID_RLP
 | 
			
		||||
from user.models import UserAction, UserActionLogEntry
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Intervention(BaseObject, ShareableObject, RecordableObject, CheckableObject):
 | 
			
		||||
							
								
								
									
										46
									
								
								intervention/models/legal.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								intervention/models/legal.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,46 @@
 | 
			
		||||
"""
 | 
			
		||||
Author: Michel Peltriaux
 | 
			
		||||
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
 | 
			
		||||
Contact: michel.peltriaux@sgdnord.rlp.de
 | 
			
		||||
Created on: 15.11.21
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
from django.db import models
 | 
			
		||||
 | 
			
		||||
from codelist.models import KonovaCode
 | 
			
		||||
from codelist.settings import CODELIST_LAW_ID, CODELIST_PROCESS_TYPE_ID
 | 
			
		||||
from konova.models import UuidModel
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Legal(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.ForeignKey(
 | 
			
		||||
        KonovaCode,
 | 
			
		||||
        on_delete=models.SET_NULL,
 | 
			
		||||
        null=True,
 | 
			
		||||
        related_name="+",
 | 
			
		||||
        blank=True,
 | 
			
		||||
        limit_choices_to={
 | 
			
		||||
            "code_lists__in": [CODELIST_PROCESS_TYPE_ID],
 | 
			
		||||
            "is_selectable": True,
 | 
			
		||||
            "is_archived": False,
 | 
			
		||||
        }
 | 
			
		||||
    )
 | 
			
		||||
    laws = models.ManyToManyField(
 | 
			
		||||
        KonovaCode,
 | 
			
		||||
        blank=True,
 | 
			
		||||
        limit_choices_to={
 | 
			
		||||
            "code_lists__in": [CODELIST_LAW_ID],
 | 
			
		||||
            "is_selectable": True,
 | 
			
		||||
            "is_archived": False,
 | 
			
		||||
        }
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										53
									
								
								intervention/models/responsibility.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								intervention/models/responsibility.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,53 @@
 | 
			
		||||
"""
 | 
			
		||||
Author: Michel Peltriaux
 | 
			
		||||
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
 | 
			
		||||
Contact: michel.peltriaux@sgdnord.rlp.de
 | 
			
		||||
Created on: 15.11.21
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
from django.db import models
 | 
			
		||||
 | 
			
		||||
from codelist.models import KonovaCode
 | 
			
		||||
from codelist.settings import CODELIST_CONSERVATION_OFFICE_ID, CODELIST_REGISTRATION_OFFICE_ID
 | 
			
		||||
from konova.models import UuidModel
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Responsibility(UuidModel):
 | 
			
		||||
    """
 | 
			
		||||
    Holds intervention data about responsible organizations and their file numbers for this case
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    registration_office = models.ForeignKey(
 | 
			
		||||
        KonovaCode,
 | 
			
		||||
        on_delete=models.SET_NULL,
 | 
			
		||||
        null=True,
 | 
			
		||||
        related_name="+",
 | 
			
		||||
        blank=True,
 | 
			
		||||
        limit_choices_to={
 | 
			
		||||
            "code_lists__in": [CODELIST_REGISTRATION_OFFICE_ID],
 | 
			
		||||
            "is_selectable": True,
 | 
			
		||||
            "is_archived": False,
 | 
			
		||||
        }
 | 
			
		||||
    )
 | 
			
		||||
    registration_file_number = models.CharField(max_length=1000, blank=True, null=True)
 | 
			
		||||
    conservation_office = models.ForeignKey(
 | 
			
		||||
        KonovaCode,
 | 
			
		||||
        on_delete=models.SET_NULL,
 | 
			
		||||
        null=True,
 | 
			
		||||
        related_name="+",
 | 
			
		||||
        blank=True,
 | 
			
		||||
        limit_choices_to={
 | 
			
		||||
            "code_lists__in": [CODELIST_CONSERVATION_OFFICE_ID],
 | 
			
		||||
            "is_selectable": True,
 | 
			
		||||
            "is_archived": False,
 | 
			
		||||
        }
 | 
			
		||||
    )
 | 
			
		||||
    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' or 'Maßnahmenträger'")
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return "ZB: {} | ETS: {} | Handler: {}".format(
 | 
			
		||||
            self.registration_office,
 | 
			
		||||
            self.conservation_office,
 | 
			
		||||
            self.handler
 | 
			
		||||
        )
 | 
			
		||||
							
								
								
									
										87
									
								
								intervention/models/revocation.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								intervention/models/revocation.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,87 @@
 | 
			
		||||
"""
 | 
			
		||||
Author: Michel Peltriaux
 | 
			
		||||
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
 | 
			
		||||
Contact: michel.peltriaux@sgdnord.rlp.de
 | 
			
		||||
Created on: 15.11.21
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
import shutil
 | 
			
		||||
 | 
			
		||||
from django.contrib.gis.db import models
 | 
			
		||||
from konova.models import BaseResource, AbstractDocument, generate_document_file_upload_path
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Revocation(BaseResource):
 | 
			
		||||
    """
 | 
			
		||||
    Holds revocation data e.g. for intervention objects
 | 
			
		||||
    """
 | 
			
		||||
    date = models.DateField(null=True, blank=True, help_text="Revocation from")
 | 
			
		||||
    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)
 | 
			
		||||
 | 
			
		||||
    def delete(self, *args, **kwargs):
 | 
			
		||||
        # Make sure related objects are being removed as well
 | 
			
		||||
        if self.document:
 | 
			
		||||
            self.document.delete(*args, **kwargs)
 | 
			
		||||
        super().delete()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class RevocationDocument(AbstractDocument):
 | 
			
		||||
    """
 | 
			
		||||
    Specializes document upload for revocations with certain path
 | 
			
		||||
    """
 | 
			
		||||
    instance = models.OneToOneField(
 | 
			
		||||
        Revocation,
 | 
			
		||||
        on_delete=models.CASCADE,
 | 
			
		||||
        related_name="document",
 | 
			
		||||
    )
 | 
			
		||||
    file = models.FileField(
 | 
			
		||||
        upload_to=generate_document_file_upload_path,
 | 
			
		||||
        max_length=1000,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def intervention(self):
 | 
			
		||||
        """
 | 
			
		||||
        Shortcut for opening the related intervention
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
            intervention (Intervention)
 | 
			
		||||
        """
 | 
			
		||||
        return self.instance.legal.intervention
 | 
			
		||||
 | 
			
		||||
    def delete(self, *args, **kwargs):
 | 
			
		||||
        """
 | 
			
		||||
        Custom delete functionality for RevocationDocuments.
 | 
			
		||||
        Removes the folder from the file system if there are no further documents for this entry.
 | 
			
		||||
 | 
			
		||||
        Args:
 | 
			
		||||
            *args ():
 | 
			
		||||
            **kwargs ():
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        revoc_docs, other_intervention_docs = self.intervention.get_documents()
 | 
			
		||||
 | 
			
		||||
        # Remove the file itself
 | 
			
		||||
        super().delete(*args, **kwargs)
 | 
			
		||||
 | 
			
		||||
        # Always remove 'revocation' folder if the one revocation we just processed is the only one left
 | 
			
		||||
        folder_path = self.file.path.split("/")
 | 
			
		||||
        if revoc_docs.count() == 0:
 | 
			
		||||
            try:
 | 
			
		||||
                shutil.rmtree("/".join(folder_path[:-1]))
 | 
			
		||||
            except FileNotFoundError:
 | 
			
		||||
                # Revocation subfolder seems to be missing already
 | 
			
		||||
                pass
 | 
			
		||||
 | 
			
		||||
        if other_intervention_docs.count() == 0:
 | 
			
		||||
            # If there are no further documents for the intervention, we can simply remove the whole folder as well!
 | 
			
		||||
            try:
 | 
			
		||||
                shutil.rmtree("/".join(folder_path[:-2]))
 | 
			
		||||
            except FileNotFoundError:
 | 
			
		||||
                # Folder seems to be missing already
 | 
			
		||||
                pass
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user