diff options
Diffstat (limited to 'archaeological_finds/forms_treatments.py')
-rw-r--r-- | archaeological_finds/forms_treatments.py | 232 |
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 |