diff options
| -rw-r--r-- | archaeological_context_records/forms.py | 30 | ||||
| -rw-r--r-- | archaeological_files/forms.py | 32 | ||||
| -rw-r--r-- | archaeological_files/templates/ishtar/wizard/wizard_file_deletion.html | 14 | ||||
| -rw-r--r-- | archaeological_files/views.py | 4 | ||||
| -rw-r--r-- | archaeological_files/wizards.py | 42 | ||||
| -rw-r--r-- | ishtar_common/forms.py | 31 | 
6 files changed, 84 insertions, 69 deletions
| 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 %} +<h3>{% trans "Associated operations" %}</h3> +<ul class='list'> +{% for item in current_object.operations.all %} +  <li>{{person}} <a class='display_details_inline' href="#" +                    onclick='load_window("{% url "show-operation" item.pk "" %}")'><i class="fa fa-info-circle" aria-hidden="true"></i></a></li>{% endfor %} +</ul> +{% 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' | 
