Refactoring
* splits intervention/models.py into subpackage
This commit is contained in:
parent
4ae5b38198
commit
26ae6bc96b
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…
Reference in New Issue
Block a user