From baa8ebef5c35bef80487abc790d5ef4ced17b630 Mon Sep 17 00:00:00 2001 From: mipel Date: Fri, 17 Sep 2021 09:05:43 +0200 Subject: [PATCH] #18 File upload in certain folders * removes 'revocation' folder if RevocationDocument is removed from an intervention and removes the whole intervention document folder as well, if no other documents for this intervention exist * adds further documentation * refactors getting of related documents into Intervention model --- intervention/models.py | 54 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/intervention/models.py b/intervention/models.py index fb344b2e..0f4fd677 100644 --- a/intervention/models.py +++ b/intervention/models.py @@ -9,6 +9,7 @@ import shutil from django.contrib.auth.models import User from django.contrib.gis.db import models +from django.db.models import QuerySet from django.utils.timezone import localtime from django.utils.translation import gettext_lazy as _ @@ -94,8 +95,39 @@ class RevocationDocument(AbstractDocument): @property def intervention(self): + """ + Shortcut for opening the related intervention + + Returns: + intervention (Intervention) + """ return self.instance.legaldata.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 + folder_path = self.file.path.split("/") + shutil.rmtree("/".join(folder_path[:-1])) + + if other_intervention_docs.count() == 0: + # If there are no further documents for the intervention, we can simply remove the whole folder as well! + shutil.rmtree("/".join(folder_path[:-2])) + class LegalData(UuidModel): """ @@ -326,6 +358,21 @@ class Intervention(BaseObject): tooltip = _("Recorded on {} by {}").format(on, self.recorded.user) return tooltip + def get_documents(self) -> (QuerySet, QuerySet): + """ Getter for all documents of an intervention + + Returns: + revoc_docs (QuerySet): The queryset of a revocation document + regular_docs (QuerySet): The queryset of regular other documents + """ + revoc_docs = RevocationDocument.objects.filter( + instance=self.legal.revocation + ) + regular_docs = InterventionDocument.objects.filter( + instance=self + ) + return revoc_docs, regular_docs + class InterventionDocument(AbstractDocument): """ @@ -353,12 +400,7 @@ class InterventionDocument(AbstractDocument): Returns: """ - revoc_docs = RevocationDocument.objects.filter( - instance=self.instance.legal.revocation - ) - other_intervention_docs = InterventionDocument.objects.filter( - instance=self.instance - ) + revoc_docs, other_intervention_docs = self.instance.get_documents() folder_path = None if revoc_docs.count() == 0 and other_intervention_docs.count() == 1: