summaryrefslogtreecommitdiff
path: root/archaeological_finds/forms_treatments.py
diff options
context:
space:
mode:
Diffstat (limited to 'archaeological_finds/forms_treatments.py')
-rw-r--r--archaeological_finds/forms_treatments.py232
1 files changed, 222 insertions, 10 deletions
diff --git a/archaeological_finds/forms_treatments.py b/archaeological_finds/forms_treatments.py
index 88b26905d..c624ebfc6 100644
--- a/archaeological_finds/forms_treatments.py
+++ b/archaeological_finds/forms_treatments.py
@@ -25,6 +25,7 @@ from bootstrap_datepicker.widgets import DateField
from django import forms
from django.core import validators
from ishtar_common.utils import ugettext_lazy as _
+from ishtar_common.forms import FormHeader
from archaeological_finds import models
from archaeological_operations.forms import AdministrativeActForm, \
@@ -705,16 +706,6 @@ class TreatmentFileFormSelectionMultiple(MultiSearchForm):
validators=[valid_ids(models.TreatmentFile)])
-class ExhibitionFormSelection(TreatmentFileFormSelection):
- pk = forms.CharField(
- label="", required=False,
- widget=widgets.DataTable(
- reverse_lazy('get-exhibition'),
- TreatmentFileSelect, models.TreatmentFile,
- ),
- validators=[valid_ids(models.TreatmentFile)])
-
-
class TreatmentFileForm(CustomForm, ManageOldType):
form_label = _("Treatment request")
base_models = ['treatment_type_type']
@@ -903,3 +894,224 @@ class AdministrativeActTreatmentFileModifForm(
AdministrativeActModifForm, AdministrativeActTreatmentFileForm):
pk = forms.IntegerField(required=False, widget=forms.HiddenInput)
index = forms.IntegerField(label=_("Index"), required=False)
+
+
+# Exhibitions
+
+
+class ExhibitionSelect(DocumentItemSelect):
+ _model = models.Exhibition
+ form_admin_name = _("Exhibition - 001 - Search")
+ form_slug = "exhibition-001-search"
+
+ search_vector = forms.CharField(
+ label=_("Full text search"), widget=widgets.SearchWidget(
+ 'archaeological-finds', 'Exhibition'
+ ))
+ name = forms.CharField(label=_("Name"))
+ exhibition_type = forms.ChoiceField(label=_("Type"), choices=[])
+ year = forms.IntegerField(label=_("Year"))
+ reference = forms.CharField(label=_("Reference"))
+ in_charge = forms.IntegerField(
+ label=_("In charge"),
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-person'),
+ associated_model=Person),
+ validators=[valid_id(Person)])
+ TYPES = [
+ FieldType("exhibition_type", models.ExhibitionType),
+ ]
+
+
+class ExhibitionFormSelection(CustomForm, forms.Form):
+ SEARCH_AND_SELECT = True
+ form_label = _("Exhibition search")
+ associated_models = {'pk': models.Exhibition}
+ currents = {'pk': models.Exhibition}
+ pk = forms.CharField(
+ label="", required=False,
+ widget=widgets.DataTable(
+ reverse_lazy('get-exhibition'),
+ ExhibitionSelect, models.Exhibition,
+ ),
+ validators=[valid_ids(models.Exhibition)])
+
+
+class ExhibitionForm(forms.ModelForm, CustomForm, ManageOldType):
+ form_label = _("Exhibition")
+ form_admin_name = _("Exhibition - 020 - Main form")
+ form_slug = "exhibition-20-general"
+ extra_form_modals = ["person"]
+
+ pk = forms.IntegerField(label="", required=False, widget=forms.HiddenInput)
+ name = forms.CharField(label=_("Name"), max_length=500)
+ exhibition_type = forms.ChoiceField(label=_("Type"), choices=[])
+ year = forms.IntegerField(label=_("Year"),
+ initial=lambda: datetime.datetime.now().year,
+ validators=[validators.MinValueValidator(1000),
+ validators.MaxValueValidator(2100)])
+ reference = forms.CharField(
+ label=_("Reference"), max_length=500, required=False)
+ in_charge = forms.IntegerField(
+ label=_("Responsible"),
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-person'), associated_model=Person,
+ new=True),
+ validators=[valid_id(Person)], required=False)
+ associated_basket_id = forms.IntegerField(
+ label=_("Associated basket"),
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-findbasket'),
+ associated_model=models.FindBasket), required=False)
+ comment = forms.CharField(label=_("Comment"),
+ widget=forms.Textarea, required=False)
+
+ class Meta:
+ model = models.Exhibition
+ fields = [
+ "pk",
+ "name",
+ "exhibition_type",
+ "year",
+ "reference",
+ "in_charge",
+ "comment",
+ "associated_basket_id",
+ ]
+
+ HEADERS = {
+ "name": FormHeader(_("General")),
+ }
+ TYPES = [
+ FieldType("exhibition_type", models.ExhibitionType, empty_first=False),
+ ]
+
+ def __init__(self, *args, **kwargs):
+ self.user = kwargs.pop("user")
+ super().__init__(*args, **kwargs)
+ type_field = self.fields["exhibition_type"]
+ if len(type_field.choices) == 1:
+ type_field.initial = type_field.choices[0][0]
+ type_field.widget.attrs["readonly"] = True
+
+ def clean_in_charge(self):
+ return self._clean_model_field("in_charge", Person)
+
+ def clean_exhibition_type(self):
+ return self._clean_model_field("exhibition_type", models.ExhibitionType)
+
+ def save(self, *args, **kwargs):
+ obj = super().save(*args, **kwargs)
+ obj = models.Exhibition.objects.get(pk=obj.pk)
+ if self.user and not obj.history_creator:
+ obj.history_creator = self.user
+ obj.history_modifier = self.user
+ obj.skip_history_when_saving = True
+ obj.save()
+ return obj
+
+
+class QANewExhibitionLoanForm(IshtarForm):
+ extra_form_modals = [
+ "applicant_organisation", "exhibition_location",
+ "insurance_provider", "in_charge"
+ ]
+ qa_exhibition_start = DateField(label=_("Exhibition start date"))
+ qa_exhibition_end = DateField(label=_("Exhibition end date"))
+ qa_applicant_organisation = forms.IntegerField(
+ label=_("Beneficiary of the loan"),
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-organization'),
+ associated_model=Organization, # new=True
+ ),
+ validators=[valid_id(Organization)])
+ qa_in_charge = forms.IntegerField(
+ label=_("Scientific manager of the exhibition"),
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-person'),
+ associated_model=Person, # new=True
+ ),
+ validators=[valid_id(Person)])
+ qa_exhibition_location = forms.IntegerField(
+ label=_("Exhibition location"),
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-warehouse'),
+ associated_model=Warehouse, # new=True
+ ),
+ validators=[valid_id(Warehouse)],
+ help_text=_("The exhibition location must have an organization attached.")
+ )
+ qa_insurance_provider = forms.IntegerField(
+ label=_("Insurance provider"),
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-organization'),
+ associated_model=Organization, # new=True
+ ),
+ validators=[valid_id(Organization)], required=False)
+
+ def __init__(self, *args, **kwargs):
+ self.user = None
+ if 'user' in kwargs:
+ self.user = kwargs.pop('user')
+ if hasattr(self.user, 'ishtaruser'):
+ self.user = self.user.ishtaruser
+ self.exhibition = kwargs.pop('items')[0]
+ super().__init__(*args, **kwargs)
+
+ def clean(self):
+ data = self.cleaned_data
+ if not self.exhibition.associated_basket_id:
+ raise forms.ValidationError(
+ _("Cannot create loan when no basket is associated to this"
+ " exhibition."))
+ return data
+
+ def save(self):
+ basket = self.exhibition.associated_basket
+ if not basket:
+ return
+ values = {
+ "year": self.cleaned_data["qa_exhibition_start"].year,
+ "type": self.exhibition.exhibition_type.treatment_file_type,
+ "exhibition_name": self.exhibition.name,
+ "exhibition_start_date": self.cleaned_data["qa_exhibition_start"],
+ "exhibition_end_date": self.cleaned_data["qa_exhibition_end"],
+ "history_creator": self.user.user_ptr,
+ "history_modifier": self.user.user_ptr,
+ }
+ try:
+ exhibition_location = Warehouse.objects.get(
+ pk=self.cleaned_data["qa_exhibition_location"]
+ )
+ except Warehouse.DoesNotExist:
+ return
+ loan_name = f"{self.exhibition.name} | {exhibition_location}"
+ values["name"] = loan_name
+ values["exhibition_location"] = exhibition_location
+ new_basket = basket.duplicate()
+ basket_label = f"{_('Exhibition')} | {loan_name}"
+ new_basket.label = basket_label
+ new_basket.save()
+ values["associated_basket_id"] = new_basket.id
+ try:
+ values["in_charge"] = Person.objects.get(
+ pk=self.cleaned_data["qa_in_charge"]
+ )
+ except Person.DoesNotExist:
+ return
+ if self.cleaned_data.get("qa_insurance_provider", None):
+ try:
+ values["insurance_provider"] = Organization.objects.get(
+ pk=self.cleaned_data["qa_insurance_provider"]
+ )
+ except Organization.DoesNotExist:
+ return
+ try:
+ values["applicant_organisation"] = Organization.objects.get(
+ pk=self.cleaned_data["qa_applicant_organisation"]
+ )
+ except Organization.DoesNotExist:
+ return
+ obj = models.TreatmentFile.objects.create(**values)
+ self.exhibition.treatment_files.add(obj)
+ return obj