From eb58fad63f8f41b275303b3c3e9e5fc75c963d80 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Sat, 14 Sep 2019 09:44:45 +0200 Subject: Archaeological files: multiple del - redir --- archaeological_context_records/forms.py | 30 ++-------------- archaeological_files/forms.py | 32 +++++++++-------- .../ishtar/wizard/wizard_file_deletion.html | 14 ++++++++ archaeological_files/views.py | 4 +-- archaeological_files/wizards.py | 42 +++++++++------------- ishtar_common/forms.py | 31 ++++++++++++++++ 6 files changed, 84 insertions(+), 69 deletions(-) create mode 100644 archaeological_files/templates/ishtar/wizard/wizard_file_deletion.html diff --git a/archaeological_context_records/forms.py b/archaeological_context_records/forms.py index fef256b68..72877c2e2 100644 --- a/archaeological_context_records/forms.py +++ b/archaeological_context_records/forms.py @@ -35,7 +35,7 @@ from archaeological_context_records import models from ishtar_common.forms import FinalForm, FormSet, \ reverse_lazy, get_form_selection, ManageOldType, CustomForm, \ FieldType, CustomFormSearch, IshtarForm, FormHeader, HistorySelect, \ - MultiSearchForm + MultiSearchForm, LockForm from ishtar_common.forms_common import get_town_field from archaeological_operations.forms import OperationSelect, ParcelField, \ RecordRelationsForm as OpeRecordRelationsForm, RecordRelationsFormSetBase @@ -113,32 +113,8 @@ class RecordSelect(HistorySelect): ids.append('ope_relation_types_{}'.format(idx)) return ids -class BaseRecordFormSelection(object): - pk_key = None - def clean(self): - cleaned_data = self.cleaned_data - print(self.cleaned_data, self.pk_key) - if self.pk_key not in cleaned_data or not cleaned_data[self.pk_key]: - raise forms.ValidationError(_(u"You should at least select one " - u"context record.")) - pks = self.cleaned_data[self.pk_key] - if isinstance(pks, int): - pks = [pks] - else: - pks = pks.split(",") - for pk in pks: - try: - cr = models.ContextRecord.objects.get(pk=pk) - except models.ContextRecord.DoesNotExist: - raise forms.ValidationError(_("Invalid selection.")) - if cr.locked: - raise forms.ValidationError(_("This context record is locked " - "for edition.")) - return self.cleaned_data - - -class RecordFormSelection(BaseRecordFormSelection, CustomFormSearch): +class RecordFormSelection(LockForm, CustomFormSearch): SEARCH_AND_SELECT = True form_label = _("Context record search") pk_key = 'pk' @@ -155,7 +131,7 @@ class RecordFormSelection(BaseRecordFormSelection, CustomFormSearch): validators=[valid_id(models.ContextRecord)]) -class RecordFormMultiSelection(BaseRecordFormSelection, MultiSearchForm): +class RecordFormMultiSelection(LockForm, MultiSearchForm): form_label = _("Context record search") associated_models = {'pks': models.ContextRecord} pk_key = 'pks' diff --git a/archaeological_files/forms.py b/archaeological_files/forms.py index 640e2cab1..4d8ab749a 100644 --- a/archaeological_files/forms.py +++ b/archaeological_files/forms.py @@ -30,14 +30,15 @@ from django.utils.translation import ugettext_lazy as _ from django.utils.safestring import mark_safe from ishtar_common.models import Person, Organization, \ - valid_id, Department, person_type_pks_lazy, \ + valid_id, valid_ids, Department, person_type_pks_lazy, \ person_type_pk_lazy, organization_type_pks_lazy from archaeological_operations.models import ActType, AdministrativeAct, \ OperationType from . import models from ishtar_common.forms import FinalForm, get_now, reverse_lazy, TableSelect, \ - ManageOldType, CustomForm, FieldType, IshtarForm, HistorySelect + ManageOldType, CustomForm, FieldType, IshtarForm, HistorySelect, \ + MultiSearchForm, LockForm, CustomFormSearch from ishtar_common.forms_common import get_town_field from archaeological_operations.forms import AdministrativeActForm, \ AdministrativeActOpeFormSelection, SLICING, AdministrativeActModifForm, \ @@ -123,7 +124,7 @@ class FileSelect(HistorySelect): ('', '--')] + list(settings.ISHTAR_DPTS) -class FileFormSelection(forms.Form): +class FileFormSelection(LockForm, CustomFormSearch): SEARCH_AND_SELECT = True form_label = _("Archaeological file search") associated_models = {'pk': models.File} @@ -136,18 +137,19 @@ class FileFormSelection(forms.Form): source_full=reverse_lazy('get-file-full')), validators=[valid_id(models.File)]) - def clean(self): - cleaned_data = self.cleaned_data - if 'pk' not in cleaned_data or not cleaned_data['pk']: - raise forms.ValidationError(_(u"You should select a file.")) - pk = self.cleaned_data["pk"] - try: - file = models.File.objects.get(pk=pk) - except models.File.DoesNotExist: - raise forms.ValidationError(_("Invalid selection.")) - if file.locked: - raise forms.ValidationError(_("This file is locked for edition.")) - return self.cleaned_data + +class FileFormMultiSelection(LockForm, MultiSearchForm): + form_label = _("Archaeological file search") + associated_models = {'pks': models.File} + + pk = forms.CharField( + label="", required=False, + widget=widgets.DataTable( + reverse_lazy('get-file'), + FileSelect, models.File, + multiple_select=True, + source_full=reverse_lazy('get-file-full')), + validators=[valid_ids(models.File)]) DATE_SOURCE = (('creation', _(u"Creation date")), diff --git a/archaeological_files/templates/ishtar/wizard/wizard_file_deletion.html b/archaeological_files/templates/ishtar/wizard/wizard_file_deletion.html new file mode 100644 index 000000000..a29436e1d --- /dev/null +++ b/archaeological_files/templates/ishtar/wizard/wizard_file_deletion.html @@ -0,0 +1,14 @@ +{% extends "ishtar/wizard/delete_wizard.html" %} +{% load i18n %} +{% block "detailled_extra_info" %} + +{% if current_object.operations.count %} +

{% trans "Associated operations" %}

+ +{% endif %} + +{% endblock %} diff --git a/archaeological_files/views.py b/archaeological_files/views.py index 08f875d54..a23475c3e 100644 --- a/archaeological_files/views.py +++ b/archaeological_files/views.py @@ -160,7 +160,7 @@ file_closing_wizard = FileClosingWizard.as_view( label=_(u"File closing"), url_name='file_closing',) file_deletion_wizard = FileDeletionWizard.as_view( - [('selec-file_deletion', forms.FileFormSelection), + [('selec-file_deletion', forms.FileFormMultiSelection), ('final-file_deletion', forms.FinalFileDeleteForm)], label=_(u"File deletion"), url_name='file_deletion',) @@ -171,7 +171,7 @@ def file_delete(request, pk): return HttpResponseRedirect("/") FileDeletionWizard.session_set_value( - request, 'selec-file_deletion', 'pk', pk, reset=True) + request, 'selec-file_deletion', 'pks', pk, reset=True) return redirect(reverse('file_deletion', kwargs={'step': 'final-file_deletion'})) diff --git a/archaeological_files/wizards.py b/archaeological_files/wizards.py index 9f1f59a4b..c1aaf9037 100644 --- a/archaeological_files/wizards.py +++ b/archaeological_files/wizards.py @@ -20,15 +20,14 @@ from django.conf import settings from django.core.exceptions import ObjectDoesNotExist from django.db.models import Max -from django.shortcuts import render from django.utils.translation import ugettext_lazy as _ from ishtar_common.forms import reverse_lazy -from ishtar_common.wizards import ClosingWizard, SearchWizard +from ishtar_common.wizards import ClosingWizard, SearchWizard, \ + MultipleDeletionWizard from archaeological_operations.wizards import OperationWizard,\ OperationAdministrativeActWizard -from archaeological_operations.models import AdministrativeAct, Parcel, \ - Operation +from archaeological_operations.models import AdministrativeAct, Parcel from . import models @@ -42,6 +41,7 @@ class FileWizard(OperationWizard): parcel_step_key = 'parcels-' town_step_keys = ['towns-'] wizard_done_window = reverse_lazy('show-file') + redirect_url = "file_modification" def get_extra_model(self, dct, m2m, form_list): dct = super(FileWizard, self).get_extra_model(dct, m2m, form_list) @@ -110,34 +110,26 @@ class FileModificationWizard(FileWizard): modification = True +FILE_FIELDS = ['year', 'numeric_reference', 'internal_reference', + 'file_type', 'in_charge', 'general_contractor', 'creation_date', + 'reception_date', 'total_surface', 'total_developed_surface', + 'address', 'address_complement', 'postal_code', 'comment'] + + class FileClosingWizard(ClosingWizard): model = models.File - fields = ['year', 'numeric_reference', 'internal_reference', - 'file_type', 'in_charge', 'general_contractor', 'creation_date', - 'reception_date', 'total_surface', 'total_developed_surface', - 'address', 'address_complement', 'postal_code', 'comment'] + fields = FILE_FIELDS if settings.COUNTRY == 'fr': fields += ['saisine_type', 'permit_reference'] fields += ['towns'] -class FileDeletionWizard(FileClosingWizard): - def get_formated_datas(self, forms): - datas = super(FileDeletionWizard, self).get_formated_datas(forms) - datas.append((_("Associated operations"), [])) - for operation in Operation.objects.filter( - associated_file=self.current_obj).all(): - - if operation.end_date: - datas[-1][1].append(('', str(operation))) - return datas - - def done(self, form_list, **kwargs): - obj = self.get_current_object() - for operation in Operation.objects.filter(associated_file=obj).all(): - operation.delete() - obj.delete() - return render(self.request, 'ishtar/wizard/wizard_delete_done.html', {}) +class FileDeletionWizard(MultipleDeletionWizard, FileClosingWizard): + model = models.File + redirect_url = "file_deletion" + fields = FILE_FIELDS + wizard_templates = { + 'final-file_deletion': 'ishtar/wizard/wizard_file_deletion.html'} class FileAdministrativeActWizard(OperationAdministrativeActWizard): diff --git a/ishtar_common/forms.py b/ishtar_common/forms.py index 5be5deafe..973a61228 100644 --- a/ishtar_common/forms.py +++ b/ishtar_common/forms.py @@ -384,6 +384,37 @@ class CustomFormSearch(forms.Form): self.fields['pk'].widget.user = user +class LockForm(object): + associated_models = {} + + def clean(self): + cleaned_data = self.cleaned_data + pk_key = None + if hasattr(self, "pk_key"): + pk_key = self.pk_key + elif len(self.associated_models.keys()) == 1: + pk_key = list(self.associated_models.keys())[0] + if not pk_key: + raise NotImplementedError("pk_key must be set") + if pk_key not in cleaned_data or not cleaned_data[pk_key]: + raise forms.ValidationError(_(u"You should select an item.")) + model = self.associated_models[pk_key] + pks = self.cleaned_data[pk_key] + if isinstance(pks, int): + pks = [pks] + else: + pks = pks.split(",") + for pk in pks: + try: + item = model.objects.get(pk=pk) + except model.DoesNotExist: + raise forms.ValidationError(_("Invalid selection.")) + if item.locked: + raise forms.ValidationError(_("This item is locked " + "for edition.")) + return self.cleaned_data + + class MultiSearchForm(CustomFormSearch): SEARCH_AND_SELECT = True pk_key = 'pks' -- cgit v1.2.3