218 lines
8.2 KiB
Python
218 lines
8.2 KiB
Python
"""
|
|
Author: Michel Peltriaux
|
|
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
|
|
Contact: michel.peltriaux@sgdnord.rlp.de
|
|
Created on: 30.11.20
|
|
|
|
"""
|
|
from dal import autocomplete
|
|
from django import forms
|
|
from django.contrib.auth.models import User
|
|
from django.db import transaction
|
|
from django.urls import reverse
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from intervention.models import Intervention
|
|
from konova.forms import BaseForm
|
|
from organisation.models import Organisation
|
|
from process.enums import ProcessStateEnum
|
|
from process.models import Process
|
|
|
|
|
|
class NewProcessForm(BaseForm):
|
|
"""
|
|
A form for new process
|
|
"""
|
|
identifier = forms.CharField(
|
|
max_length=255,
|
|
label=_("Identifier"),
|
|
label_suffix=_(""),
|
|
help_text=_("Generated automatically if none was given"),
|
|
required=False,
|
|
)
|
|
title = forms.CharField(
|
|
max_length=255,
|
|
label=_("Title"),
|
|
label_suffix=_(""),
|
|
help_text=_("Proper title of the process"),
|
|
required=True,
|
|
)
|
|
type = forms.CharField(
|
|
max_length=255,
|
|
label=_("Type"),
|
|
label_suffix=_(""),
|
|
help_text=_("Which process type is this"),
|
|
required=True,
|
|
)
|
|
|
|
licensing_authority = forms.ModelChoiceField(
|
|
label=_("Licencing Authority"),
|
|
label_suffix=_(""),
|
|
required=True,
|
|
queryset=Organisation.objects.all(),
|
|
widget=autocomplete.ModelSelect2(
|
|
url="orgs-autocomplete",
|
|
attrs={
|
|
"data-placeholder": _("Organization"),
|
|
"data-minimum-input-length": 3,
|
|
}
|
|
),
|
|
)
|
|
licensing_authority_document_identifier = forms.CharField(
|
|
max_length=255,
|
|
label=_("Licencing document identifier"),
|
|
label_suffix=_(""),
|
|
required=True,
|
|
)
|
|
comment_licensing_authority = forms.CharField(
|
|
widget=forms.Textarea,
|
|
label=_("Comment licensing authority"),
|
|
label_suffix=_(""),
|
|
required=False,
|
|
)
|
|
|
|
registration_office = forms.ModelChoiceField(
|
|
label=_("Registration office"),
|
|
label_suffix=_(""),
|
|
required=True,
|
|
queryset=Organisation.objects.all(),
|
|
widget=autocomplete.ModelSelect2(
|
|
url="orgs-autocomplete",
|
|
attrs={
|
|
"data-placeholder": _("Organization"),
|
|
"data-minimum-input-length": 3,
|
|
}
|
|
),
|
|
)
|
|
registration_office_document_identifier = forms.CharField(
|
|
max_length=255,
|
|
label=_("Registration document identifier"),
|
|
label_suffix=_(""),
|
|
required=True,
|
|
)
|
|
comment_registration_office = forms.CharField(
|
|
widget=forms.Textarea,
|
|
label=_("Comment registration office"),
|
|
label_suffix=_(""),
|
|
required=False,
|
|
)
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
self.action_url = reverse("process:new")
|
|
self.cancel_redirect = reverse("process:index")
|
|
self.form_title = _("Add new process")
|
|
self.form_caption = _("Enter these basic information for the new process.")
|
|
|
|
def save(self, user: User):
|
|
"""
|
|
Persists process objects into database
|
|
"""
|
|
with transaction.atomic():
|
|
identifier = self.cleaned_data.get("identifier", None)
|
|
title = self.cleaned_data.get("title", None)
|
|
_type = self.cleaned_data.get("type", None)
|
|
licencing_auth = self.cleaned_data.get("licensing_authority", None)
|
|
licencing_auth_doc_id = self.cleaned_data.get("licensing_authority_document_identifier", None)
|
|
reg_off = self.cleaned_data.get("registration_office", None)
|
|
reg_off_doc_id = self.cleaned_data.get("registration_office_document_identifier", None)
|
|
comment_license = self.cleaned_data.get("comment_licensing_authority", None)
|
|
comment_registration = self.cleaned_data.get("comment_registration_office", None)
|
|
|
|
process = Process()
|
|
process.licensing_authority = licencing_auth
|
|
process.licensing_authority_document_identifier = licencing_auth_doc_id
|
|
process.registration_office = reg_off
|
|
process.registration_office_document_identifier = reg_off_doc_id
|
|
process.state = ProcessStateEnum.PRIVATE.value
|
|
process.created_by = user
|
|
process.licensing_authority_comment = comment_license
|
|
process.registration_office_comment = comment_registration
|
|
process.save()
|
|
|
|
intervention = Intervention()
|
|
intervention.title = title
|
|
intervention.type = _type
|
|
intervention.created_by = user
|
|
intervention.process = process
|
|
intervention.identifier = identifier
|
|
intervention.save()
|
|
|
|
return process
|
|
|
|
|
|
class EditProcessForm(NewProcessForm):
|
|
status = forms.ChoiceField(
|
|
label=_("Status"),
|
|
label_suffix="",
|
|
choices=[],
|
|
)
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
self.user = kwargs.pop("user", None)
|
|
super().__init__(*args, **kwargs)
|
|
if self.instance is not None:
|
|
self.action_url = reverse("process:edit", args=(self.instance.id,))
|
|
self.cancel_redirect = reverse("process:index")
|
|
self.form_title = _("Edit process")
|
|
self.form_caption = ""
|
|
self.fields["status"].choices = ProcessStateEnum.as_next_role_choices(self.user, self.instance.state)
|
|
|
|
# Initialize form data
|
|
form_data = {
|
|
"identifier": self.instance.intervention.identifier,
|
|
"title": self.instance.intervention.title,
|
|
"type": self.instance.intervention.type,
|
|
"licensing_authority": self.instance.licensing_authority,
|
|
"licensing_authority_document_identifier": self.instance.licensing_authority_document_identifier,
|
|
"registration_office": self.instance.registration_office,
|
|
"registration_office_document_identifier": self.instance.registration_office_document_identifier,
|
|
"comment_licensing_authority": self.instance.licensing_authority_comment,
|
|
"comment_registration_office": self.instance.registration_office_comment,
|
|
"status": self.instance.state,
|
|
}
|
|
disabled_fields = [
|
|
"identifier",
|
|
]
|
|
self.load_initial_data(
|
|
form_data,
|
|
disabled_fields,
|
|
)
|
|
|
|
def save(self, user: User):
|
|
""" Persists changes from form to instance
|
|
|
|
Args:
|
|
user (User): The performing user
|
|
|
|
Returns:
|
|
process (Process): The edited process instance
|
|
"""
|
|
with transaction.atomic():
|
|
title = self.cleaned_data.get("title", None)
|
|
_type = self.cleaned_data.get("type", None)
|
|
licencing_auth = self.cleaned_data.get("licensing_authority", None)
|
|
licencing_auth_doc_id = self.cleaned_data.get("licensing_authority_document_identifier", None)
|
|
reg_off = self.cleaned_data.get("registration_office", None)
|
|
reg_off_doc_id = self.cleaned_data.get("registration_office_document_identifier", None)
|
|
comment_license = self.cleaned_data.get("comment_licensing_authority", None)
|
|
comment_registration = self.cleaned_data.get("comment_registration_office", None)
|
|
new_state = self.cleaned_data.get("status", None)
|
|
|
|
self.instance.licensing_authority = licencing_auth
|
|
self.instance.licensing_authority_document_identifier = licencing_auth_doc_id
|
|
self.instance.registration_office = reg_off
|
|
self.instance.registration_office_document_identifier = reg_off_doc_id
|
|
self.instance.state = ProcessStateEnum.PRIVATE.value
|
|
self.instance.created_by = user
|
|
self.instance.licensing_authority_comment = comment_license
|
|
self.instance.registration_office_comment = comment_registration
|
|
self.instance.state = new_state
|
|
self.instance.save()
|
|
|
|
self.instance.intervention.title = title
|
|
self.instance.intervention.type = _type
|
|
self.instance.intervention.created_by = user
|
|
self.instance.intervention.save()
|
|
|
|
return self.instance |