""" 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() @property def intervention(self): return self.legal.intervention 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