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
 | 
					Author: Michel Peltriaux
 | 
				
			||||||
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
 | 
					Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
 | 
				
			||||||
Contact: michel.peltriaux@sgdnord.rlp.de
 | 
					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.auth.models import User
 | 
				
			||||||
from django.contrib.gis.db import models
 | 
					from django.db import models, transaction
 | 
				
			||||||
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 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.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 intervention.utils.quality import InterventionQualityChecker
 | 
				
			||||||
from konova.models import BaseObject, Geometry, UuidModel, BaseResource, AbstractDocument, \
 | 
					from konova.models import generate_document_file_upload_path, AbstractDocument, Geometry, BaseObject, ShareableObject, \
 | 
				
			||||||
    generate_document_file_upload_path, RecordableObject, CheckableObject, ShareableObject
 | 
					    RecordableObject, CheckableObject
 | 
				
			||||||
from konova.settings import DEFAULT_SRID_RLP, LANIS_LINK_TEMPLATE, LANIS_ZOOM_LUT
 | 
					from konova.settings import LANIS_LINK_TEMPLATE, LANIS_ZOOM_LUT, DEFAULT_SRID_RLP
 | 
				
			||||||
from user.models import UserActionLogEntry, UserAction
 | 
					from user.models import UserAction, UserActionLogEntry
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
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,
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Intervention(BaseObject, ShareableObject, RecordableObject, CheckableObject):
 | 
					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