diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2022-07-18 11:20:39 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2022-12-12 12:23:17 +0100 |
commit | 1d325c4b42b47cc21705473dbf099c87ee20119a (patch) | |
tree | e670d785fa12943e1b857fb700308638d08c9b7d | |
parent | 88126820a6ea96d5ad1ad3eb09a1edff2b26b701 (diff) | |
download | Ishtar-1d325c4b42b47cc21705473dbf099c87ee20119a.tar.bz2 Ishtar-1d325c4b42b47cc21705473dbf099c87ee20119a.zip |
Operation wizard refactoring
-rw-r--r-- | archaeological_operations/forms.py | 184 | ||||
-rw-r--r-- | archaeological_operations/views.py | 32 | ||||
-rw-r--r-- | archaeological_operations/wizards.py | 103 | ||||
-rw-r--r-- | ishtar_common/wizards.py | 9 |
4 files changed, 64 insertions, 264 deletions
diff --git a/archaeological_operations/forms.py b/archaeological_operations/forms.py index caa19a1fb..6b5bfbd51 100644 --- a/archaeological_operations/forms.py +++ b/archaeological_operations/forms.py @@ -673,15 +673,6 @@ class OperationFormFileChoice(IshtarForm): validators=[valid_id(File)], required=False) -class OperationFormAbstract(CustomForm, IshtarForm): - form_label = _("Abstract") - form_admin_name = _("Operation - 090 - Abstract") - form_slug = "operation-090-abstract" - abstract = forms.CharField( - label=_("Abstract"), - widget=forms.Textarea(attrs={'class': 'xlarge'}), required=False) - - SLICING = (("month", _("months")), ('year', _("years")),) DATE_SOURCE = (('creation', _("Creation date")), @@ -767,6 +758,13 @@ class OperationFormGeneral(CustomForm, ManageOldType): form_slug = "operation-010-general" file_upload = True + base_models = [ + "archaeological_site", + "collaborator", + "period", + "town", + "remain", + ] associated_models = { 'scientist': Person, 'in_charge': Person, @@ -775,8 +773,13 @@ class OperationFormGeneral(CustomForm, ManageOldType): 'operation_type': models.OperationType, 'record_quality_type': models.RecordQualityType, 'report_processing': models.ReportState, - 'spatial_reference_system': SpatialReferenceSystem, + 'collaborator': Person, + 'remain': models.RemainType, + 'period': models.Period, + 'archaeological_site': models.ArchaeologicalSite, + 'town': Town, } + HEADERS['code_patriarche'] = FormHeader(_("General")) pk = forms.IntegerField(required=False, widget=forms.HiddenInput) code_patriarche = forms.CharField(label="Code PATRIARCHE", max_length=500, @@ -790,6 +793,13 @@ class OperationFormGeneral(CustomForm, ManageOldType): max_length=500, widget=forms.Textarea) address = forms.CharField(label=_("Address / Locality"), required=False, max_length=500, widget=forms.Textarea) + town = widgets.Select2MultipleField( + label=_("Towns"), + model=Town, + required=False, remote=True) + archaeological_site = widgets.Select2MultipleField( + model=models.ArchaeologicalSite, + required=False, remote=True) year = forms.IntegerField(label=_("Year"), initial=lambda: datetime.datetime.now().year, validators=[validators.MinValueValidator(1000), @@ -797,6 +807,16 @@ class OperationFormGeneral(CustomForm, ManageOldType): old_code = forms.CharField( label=_("Old code"), required=False, validators=[validators.MaxLengthValidator(200)]) + surface = forms.FloatField( + required=False, widget=widgets.AreaWidget, + label=_("Total surface (m2)"), + validators=[validators.MinValueValidator(0), + validators.MaxValueValidator(999999999)]) + virtual_operation = forms.BooleanField(required=False, + label=_("Virtual operation")) + comment = forms.CharField(label=_("Comment"), widget=forms.Textarea, + required=False) + HEADERS['scientist'] = FormHeader(_("Actors")) scientist = forms.IntegerField( label=_("Head scientist"), widget=widgets.JQueryAutoComplete( @@ -832,11 +852,9 @@ class OperationFormGeneral(CustomForm, ManageOldType): limit={'person_types': [person_type_pk_lazy('sra_agent')]}, new=True), validators=[valid_id(Person)], required=False) - surface = forms.FloatField( - required=False, widget=widgets.AreaWidget, - label=_("Total surface (m2)"), - validators=[validators.MinValueValidator(0), - validators.MaxValueValidator(999999999)]) + collaborator = widgets.Select2MultipleField( + model=Person, label=_("Collaborators"), required=False, remote=True) + HEADERS['start_date'] = FormHeader(_("Dates / Administrative")) start_date = DateField(label=_("Start date"), required=False) excavation_end_date = DateField(label=_("Excavation end date"), required=False) @@ -872,28 +890,21 @@ class OperationFormGeneral(CustomForm, ManageOldType): finds_received = forms.NullBooleanField( required=False, label=_("Finds received")) - comment = forms.CharField(label=_("Comment"), widget=forms.Textarea, - required=False) + HEADERS['scientific_documentation_comment'] = FormHeader(_("Scientific")) scientific_documentation_comment = forms.CharField( label=_("Comment about scientific documentation"), widget=forms.Textarea, required=False) record_quality_type = forms.ChoiceField(label=_("Record quality"), required=False) - virtual_operation = forms.BooleanField(required=False, - label=_("Virtual operation")) - - HEADERS['x'] = FormHeader(_("Coordinates")) - x = forms.FloatField(label=_("X"), required=False) - estimated_error_x = forms.FloatField(label=_("Estimated error for X"), - required=False) - y = forms.FloatField(label=_("Y"), required=False) - estimated_error_y = forms.FloatField(label=_("Estimated error for Y"), - required=False) - z = forms.FloatField(label=_("Z"), required=False) - estimated_error_z = forms.FloatField(label=_("Estimated error for Z"), - required=False) - spatial_reference_system = forms.ChoiceField( - label=_("Spatial Reference System"), required=False, choices=[]) + remain = widgets.Select2MultipleField( + label=_("Remain type"), required=False + ) + period = widgets.Select2MultipleField( + label=_("Period"), required=False + ) + abstract = forms.CharField( + label=_("Abstract"), + widget=forms.Textarea(attrs={'class': 'xlarge'}), required=False) FILE_FIELDS = [ 'report_delivery_date', @@ -902,17 +913,6 @@ class OperationFormGeneral(CustomForm, ManageOldType): 'cira_date', 'negative_result' ] - PROFILE_FILTER = { - 'mapping': [ - 'x', - 'y', - 'z', - 'estimated_error_x', - 'estimated_error_y', - 'estimated_error_z', - 'spatial_reference_system' - ], - } WAREHOUSE_FIELDS = [ 'documentation_deadline', 'documentation_received', @@ -924,9 +924,14 @@ class OperationFormGeneral(CustomForm, ManageOldType): FieldType('record_quality_type', models.RecordQualityType), FieldType('report_processing', models.ReportState), FieldType('spatial_reference_system', SpatialReferenceSystem), + FieldType('remain', models.RemainType, is_multiple=True), + FieldType('period', models.Period, is_multiple=True), ] def __init__(self, *args, **kwargs): + towns = None + if kwargs.get("data", None) and kwargs['data'].get("TOWNS", None): + towns = kwargs['data']['TOWNS'] super(OperationFormGeneral, self).__init__(*args, **kwargs) profile = get_current_profile() if not profile.files: @@ -937,6 +942,12 @@ class OperationFormGeneral(CustomForm, ManageOldType): self.remove_field(key) if not profile.underwater: self.fields.pop('drassm_code') + if 'collaborator' in self.fields: + self.fields['collaborator'].widget.attrs['full-width'] = True + if towns and towns != -1: + self.fields['town'].choices = [('', '--')] + towns + if 'archaeological_site' in self.fields: + self.fields['archaeological_site'].label = get_current_profile().get_site_label() def clean(self): cleaned_data = self.cleaned_data @@ -1010,11 +1021,11 @@ class OperationFormModifGeneral(OperationFormGeneral): for idx, field in enumerate(list(self.fields.items())): key, value = field if 'associated_file' in self.fields and ( - key == 'in_charge' or idx > 6): + key == 'in_charge' or idx > 8): fields['associated_file'] = self.fields.pop('associated_file') fields[key] = value if 'operation_code' in self.fields and ( - key == 'year' or idx > 5): + key == 'year' or idx > 7): fields['operation_code'] = self.fields.pop('operation_code') self.fields = fields @@ -1061,22 +1072,6 @@ class CourtOrderedSeizureForm(CustomForm, IshtarForm): ) -class CollaboratorForm(CustomForm, IshtarForm): - form_label = _("Collaborators") - form_admin_name = _("Operation - 020 - Collaborators") - form_slug = "operation-020-collaborators" - - base_models = ['collaborator'] - associated_models = {'collaborator': Person, } - collaborator = widgets.Select2MultipleField( - model=Person, label=_("Collaborators"), required=False, remote=True) - - def __init__(self, *args, **kwargs): - super(CollaboratorForm, self).__init__(*args, **kwargs) - if 'collaborator' in self.fields: - self.fields['collaborator'].widget.attrs['full-width'] = True - - class OperationFormPreventive(CustomForm, IshtarForm): form_label = _("Preventive informations - excavation") form_admin_name = _("Operation - 033 - Preventive - Excavation") @@ -1192,38 +1187,6 @@ class SelectedParcelFormSet(forms.Form): """ -class RemainForm(CustomForm, ManageOldType, forms.Form): - form_label = _("Remain types") - form_admin_name = _("Operation - 060 - Remains") - form_slug = "operation-060-remains" - - base_model = 'remain' - associated_models = {'remain': models.RemainType} - remain = widgets.Select2MultipleField( - label=_("Remain type"), required=False - ) - - TYPES = [ - FieldType('remain', models.RemainType, True), - ] - - -class PeriodForm(CustomForm, ManageOldType, forms.Form): - form_label = _("Periods") - form_admin_name = _("Operation - 070 - Periods") - form_slug = "operation-070-periods" - - base_model = 'period' - associated_models = {'period': models.Period} - period = widgets.Select2MultipleField( - label=_("Period"), required=False - ) - - TYPES = [ - FieldType('period', models.Period, True), - ] - - class ArchaeologicalSiteForm(ManageOldType): associated_models = {'period': models.Period, 'remain': models.RemainType, 'cultural_attribution': models.CulturalAttributionType, @@ -1326,41 +1289,6 @@ class ArchaeologicalSiteForm(ManageOldType): return item -class ArchaeologicalSiteBasicForm(widgets.Select2Media, IshtarForm): - form_label = _("Archaeological site") - base_model = 'archaeological_site' - associated_models = {'archaeological_site': models.ArchaeologicalSite} - archaeological_site = forms.IntegerField( - label=_("Archaeological site"), - widget=widgets.JQueryAutoComplete( - reverse_lazy('autocomplete-archaeologicalsite'), - associated_model=models.ArchaeologicalSite, - new=True), - validators=[valid_id(models.ArchaeologicalSite)], - required=False) - SITE_KEYS = {"archaeological_site": None} - - -ArchaeologicalSiteFormSet = formset_factory( - ArchaeologicalSiteBasicForm, can_delete=True, formset=FormSet) -ArchaeologicalSiteFormSet.form_label = _("Archaeological sites") -ArchaeologicalSiteFormSet.form_admin_name = _( - "Operation - 030 - Archaeological sites") -ArchaeologicalSiteFormSet.form_slug = "operation-030-archaeological-sites" -ArchaeologicalSiteFormSet.extra_form_modals = ["archaeologicalsite"] - - -class ArchaeologicalSiteSelectionForm(IshtarForm): - # TODO: used? - form_label = _("Associated archaeological sites") - archaeological_sites = forms.IntegerField( - widget=widgets.JQueryAutoComplete( - reverse_lazy('autocomplete-archaeologicalsite'), - associated_model=models.ArchaeologicalSite, new=True, - multiple=True), - label=_("Search")) - - class FinalOperationClosingForm(FinalForm): confirm_msg = " " confirm_end_msg = _("Would you like to close this operation?") diff --git a/archaeological_operations/views.py b/archaeological_operations/views.py index 468a864b8..d3bccb635 100644 --- a/archaeological_operations/views.py +++ b/archaeological_operations/views.py @@ -210,16 +210,9 @@ wizard_steps = [ ("filechoice-operation_creation", forms.OperationFormFileChoice), ("general-operation_creation", forms.OperationFormGeneral), ("judiciary-operation_creation", forms.CourtOrderedSeizureForm), - ("collaborators-operation_creation", forms.CollaboratorForm), - ("archaeologicalsite-operation_creation", forms.ArchaeologicalSiteFormSet), ("preventive-operation_creation", forms.OperationFormPreventive), ("preventivediag-operation_creation", forms.OperationFormPreventiveDiag), - ("townsgeneral-operation_creation", forms.TownFormset), - ("towns-operation_creation", forms.SelectedTownFormset), - ("remains-operation_creation", forms.RemainForm), - ("periods-operation_creation", forms.PeriodForm), ("relations-operation_creation", forms.RecordRelationsFormSet), - ("abstract-operation_creation", forms.OperationFormAbstract), ("final-operation_creation", FinalForm), ] @@ -263,12 +256,6 @@ ope_crea_condition_dict = { "arch_diagnostic", ) ), - "townsgeneral-operation_creation": wizards.has_associated_file( - "filechoice-operation_creation", negate=True - ), - "towns-operation_creation": wizards.has_associated_file( - "filechoice-operation_creation" - ), "parcelsgeneral-operation_creation": wizards.has_associated_file( "filechoice-operation_creation", negate=True ), # TODO: AFAC @@ -288,16 +275,9 @@ operation_modif_wizard_steps = [ ("selec-operation_modification", forms.OperationFormSelection), ("general-operation_modification", forms.OperationFormModifGeneral), ("judiciary-operation_modification", forms.CourtOrderedSeizureForm), - ("collaborators-operation_modification", forms.CollaboratorForm), - ("archaeologicalsite-operation_modification", forms.ArchaeologicalSiteFormSet), ("preventive-operation_modification", forms.OperationFormPreventive), ("preventivediag-operation_modification", forms.OperationFormPreventiveDiag), - ("towns-operation_modification", forms.SelectedTownFormset), - ("townsgeneral-operation_modification", forms.TownFormset), - ("remains-operation_modification", forms.RemainForm), - ("periods-operation_modification", forms.PeriodForm), ("relations-operation_modification", forms.RecordRelationsFormSet), - ("abstract-operation_modification", forms.OperationFormAbstract), ("final-operation_modification", FinalForm), ] @@ -324,18 +304,6 @@ ope_modif_condition_dict = { models.OperationType, "operation_type", ), - "townsgeneral-operation_modification": wizards.has_associated_file( - "general-operation_modification", negate=True - ), - "towns-operation_modification": wizards.has_associated_file( - "general-operation_modification" - ), - "parcelsgeneral-operation_modification": wizards.has_associated_file( - "general-operation_modification", negate=True - ), # TODO: AFAC - "parcels-operation_modification": wizards.has_associated_file( - "general-operation_modification" - ), # TODO: AFAC } operation_modification_wizard = wizards.OperationModificationWizard.as_view( diff --git a/archaeological_operations/wizards.py b/archaeological_operations/wizards.py index 7afe73442..44b3988eb 100644 --- a/archaeological_operations/wizards.py +++ b/archaeological_operations/wizards.py @@ -48,8 +48,6 @@ class OperationSearch(SearchWizard): class OperationWizard(Wizard): model = models.Operation - object_parcel_type = "operation" - parcel_step_key = "parcels" relations_step_key = "relations" # step including the current(s) town(s) town_step_keys = ["towns-", "townsgeneral-"] @@ -62,9 +60,7 @@ class OperationWizard(Wizard): def get_template_names(self): templates = super(OperationWizard, self).get_template_names() current_step = self.steps.current - if current_step.startswith(self.parcel_step_key): - templates = ["ishtar/wizard/parcels_wizard.html"] + templates - elif current_step.startswith(self.relations_step_key): + if current_step.startswith(self.relations_step_key): templates = ["ishtar/wizard/relations_wizard.html"] + templates return templates @@ -94,13 +90,8 @@ class OperationWizard(Wizard): """ context = super(OperationWizard, self).get_context_data(form, **kwargs) step = self.steps.current - if step.startswith("towns"): + if step.startswith("general"): context["TOWNS"] = self.get_towns() - elif step.startswith("parcels-") and self.get_current_file(): - # if a file is associated to the operation add the button "Add all" - context["add_all"] = True - if step.startswith("parcels") and hasattr(self, "automatic_parcel_association"): - context["automatic_parcel_association"] = self.automatic_parcel_association # reminder of the current file reminder = self.get_reminder() if reminder: @@ -121,31 +112,6 @@ class OperationWizard(Wizard): pass return sorted(towns, key=lambda x: x[1]) - def get_available_parcels(self, file): - self.automatic_parcel_association = False - parcels = [] - current_parcels = [] - operation = self.get_current_object() - if operation: - for parcel in operation.parcels.all(): - current_parcels.append( - (parcel.town, parcel.section, parcel.parcel_number) - ) - parcels.append((parcel.pk, parcel.short_label)) - try: - for parcel in file.parcels.all(): - key = (parcel.town, parcel.section, parcel.parcel_number) - if key in current_parcels: - current_parcels.pop(current_parcels.index(key)) - continue - parcels.append((parcel.pk, parcel.short_label)) - if current_parcels: - # not all operation parcel exist for the file - self.automatic_parcel_association = True - except (ValueError, ObjectDoesNotExist): - pass - return sorted(parcels, key=lambda x: x[1]) - def get_form(self, step=None, data=None, files=None): """ Manage specifics fields @@ -163,43 +129,6 @@ class OperationWizard(Wizard): # manage the dynamic choice of towns if step.startswith("towns") and hasattr(form, "management_form"): data["TOWNS"] = self.get_towns() - elif step.startswith(self.parcel_step_key) and hasattr(form, "management_form"): - file = self.get_current_file() - if file: - data["PARCELS"] = self.get_available_parcels(file) - else: - town_ids = [] - for town_step_key in self.town_step_keys: - town_form_key = town_step_key + self.url_name - town_ids = ( - self.session_get_value( - town_form_key, - self.town_input_id, - multi=self.towns_formset, - multi_value=self.multi_towns, - ) - or [] - ) - if town_ids: - towns = [] - if type(town_ids) == str: - town_ids = [town_ids] - for ids in town_ids: - for d in ids.split(","): - if d: - towns.append(d) - town_ids = towns - break - if type(town_ids) not in (list, tuple): - town_ids = [town_ids] - towns = [] - for town_id in town_ids: - try: - town = models.Town.objects.get(pk=int(town_id)) - towns.append((town.pk, str(town))) - except (ValueError, ObjectDoesNotExist): - pass - data["TOWNS"] = sorted(towns, key=lambda x: x[1]) data = data or None form = super(OperationWizard, self).get_form(step, data, files) return form @@ -267,34 +196,6 @@ class OperationWizard(Wizard): initial.update(self.__copy_fields(file, keys)) return initial - def post(self, *args, **kwargs): - request = self.request - post_data = request.POST.copy() - - # add all parcel from available in the archaeological file - if not post_data.get("add_all_parcels", None): - return super(OperationWizard, self).post(*args, **kwargs) - - file = self.get_current_file() - if not file: - return super(OperationWizard, self).post(*args, **kwargs) - parcel_form_key = self.steps.current - # parcel_form_key = "parcels-" + self.url_name - idx = -1 - # remove non relevant deleted keys - for k in post_data.keys(): - if k.startswith(parcel_form_key) and k.endswith("-DELETE"): - post_data.pop(k) - for idx, parcel in enumerate(self.get_available_parcels(file)): - parcel_pk, parcel_name = parcel - post_data["%s-%d-parcel" % (parcel_form_key, idx)] = parcel_pk - post_data[parcel_form_key + "-TOTAL_FORMS"] = idx + 2 - request.POST = post_data - return super(OperationWizard, self).post(*args, **kwargs) - - def post_save(self): - self.current_object.clean_parcel_duplicates() - class OperationModificationWizard(OperationWizard): modification = True diff --git a/ishtar_common/wizards.py b/ishtar_common/wizards.py index ba3eb4556..6e4e8544f 100644 --- a/ishtar_common/wizards.py +++ b/ishtar_common/wizards.py @@ -837,6 +837,7 @@ class Wizard(IshtarWizard): else: for r in related_model.all(): r.delete() + need_update = False for key, value in m2m: related_model = getattr(obj, key + "s") related_data = {} # used for intermediary models @@ -871,6 +872,7 @@ class Wizard(IshtarWizard): else: m2m_items[key] = related_model.all() if value not in m2m_items[key]: + need_update = True if type(value) == dict: model = related_model.model if ( @@ -1016,9 +1018,10 @@ class Wizard(IshtarWizard): related_model.add(value) # necessary to manage interaction between models like # material_index management for baseitems - obj._cached_label_checked = False - obj._post_saved_geo = False - obj.save() + if need_update: + obj = self.model.objects.get(pk=obj.pk) + obj.skip_history_when_saving = True + obj.save() # force post_save for old related m2ms (which can have been detached # from the current object) |