diff options
| -rw-r--r-- | archaeological_warehouse/forms.py | 45 | ||||
| -rw-r--r-- | archaeological_warehouse/views.py | 11 | ||||
| -rw-r--r-- | archaeological_warehouse/wizards.py | 25 | ||||
| -rw-r--r-- | ishtar_common/forms.py | 37 | ||||
| -rw-r--r-- | ishtar_common/wizards.py | 16 | 
5 files changed, 75 insertions, 59 deletions
| diff --git a/archaeological_warehouse/forms.py b/archaeological_warehouse/forms.py index facc94467..88a355bad 100644 --- a/archaeological_warehouse/forms.py +++ b/archaeological_warehouse/forms.py @@ -27,7 +27,7 @@ from django.forms.formsets import formset_factory  from django.utils.translation import ugettext_lazy as _  from ishtar_common.models import Person, valid_id, Town, \ -    SpatialReferenceSystem, Organization, OrganizationType +    SpatialReferenceSystem, Organization, valid_ids  from archaeological_operations.models import ArchaeologicalSite  from archaeological_context_records.models import ContextRecord  from archaeological_finds.models import TreatmentType, FindBasket, \ @@ -43,7 +43,7 @@ from bootstrap_datepicker.widgets import DatePicker  from ishtar_common.forms import name_validator, reverse_lazy, \      get_form_selection, ManageOldType, FinalForm, FormSet, \      CustomForm, FieldType, HistorySelect, FormHeader, TableSelect, \ -    CustomFormSearch +    CustomFormSearch, MultiSearchForm, LockForm  from ishtar_common.forms_common import get_town_field  from archaeological_finds.forms import FindMultipleFormSelection, \      SelectFindBasketForm @@ -110,7 +110,7 @@ class WarehouseSelect(CustomForm, TableSelect):              models.WarehouseType.get_help() -class WarehouseFormSelection(CustomFormSearch): +class WarehouseFormSelection(LockForm, CustomFormSearch):      SEARCH_AND_SELECT = True      form_label = _("Warehouse search")      associated_models = {'pk': models.Warehouse} @@ -122,20 +122,18 @@ class WarehouseFormSelection(CustomFormSearch):              WarehouseSelect, models.Warehouse, gallery=True, map=True),          validators=[valid_id(models.Warehouse)]) -    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 an item.")) -        pk = self.cleaned_data["pk"] -        try: -            item = models.Warehouse.objects.get(pk=pk) -        except models.Warehouse.DoesNotExist: -            raise forms.ValidationError(_("Invalid selection.")) -        print(item) -        if item.locked: -            raise forms.ValidationError(_("This warehouse is locked for " -                                          "edition.")) -        return self.cleaned_data + +class WarehouseFormMultiSelection(LockForm, MultiSearchForm): +    form_label = _("Warehouse search") +    associated_models = {'pks': models.Warehouse} +    pk = forms.CharField( +        label="", required=False, +        widget=widgets.DataTable( +            reverse_lazy('get-warehouse'), +            WarehouseSelect, models.Warehouse, gallery=True, map=True, +            multiple_select=True +        ), +        validators=[valid_ids(models.Warehouse)])  class WarehouseForm(CustomForm, ManageOldType, forms.Form): @@ -452,14 +450,23 @@ ContainerFormSelection = get_form_selection(      models.Container, ContainerSelect, 'get-container',      _(u"You should select a container."), new=True,      new_message=_(u"Add a new container"), -    base_form_select=CustomFormSearch +    base_form_select=(LockForm, CustomFormSearch)  )  MainContainerFormSelection = get_form_selection(      'ContainerFormSelection', _(u"Container search"), 'pk',      models.Container, ContainerSelect, 'get-container',      _(u"You should select a container."), gallery=True, map=True, -    base_form_select = CustomFormSearch +    base_form_select=CustomFormSearch +) + + +MainContainerFormMultiSelection = get_form_selection( +    'ContainerFormSelection', _(u"Container search"), 'pks', +    models.Container, ContainerSelect, 'get-container', +    _(u"You should select a container."), gallery=True, map=True, +    alt_pk_field="pk", +    multi=True, base_form_select=(LockForm, MultiSearchForm)  ) diff --git a/archaeological_warehouse/views.py b/archaeological_warehouse/views.py index f997be842..55d764ec7 100644 --- a/archaeological_warehouse/views.py +++ b/archaeological_warehouse/views.py @@ -31,7 +31,8 @@ from archaeological_warehouse.forms import WarehouseForm, ContainerForm, \      ContainerFormSelection, BasePackagingForm, WarehouseFormSelection, \      WarehouseModifyForm, SelectedDivisionFormset, WarehouseDeletionForm, \      MainContainerFormSelection, ContainerModifyForm, LocalisationForm, \ -    ContainerDeletionForm, ContainerSelect, WarehouseSelect +    ContainerDeletionForm, ContainerSelect, WarehouseSelect, \ +    MainContainerFormMultiSelection, WarehouseFormMultiSelection  from ishtar_common.forms import FinalForm  from ishtar_common.views import QABaseLockView, wizard_is_available @@ -160,7 +161,7 @@ def warehouse_modify(request, pk):  warehouse_deletion_wizard = WarehouseDeletionWizard.as_view([ -    ('selec-warehouse_deletion', WarehouseFormSelection), +    ('selec-warehouse_deletion', WarehouseFormMultiSelection),      ('final-warehouse_deletion', WarehouseDeletionForm)],      label=_(u"Warehouse deletion"),      url_name='warehouse_deletion',) @@ -172,7 +173,7 @@ def warehouse_delete(request, pk):          return HttpResponseRedirect("/")      wizard_url = 'warehouse_deletion'      WarehouseDeletionWizard.session_set_value( -        request, 'selec-' + wizard_url, 'pk', pk, reset=True) +        request, 'selec-' + wizard_url, 'pks', pk, reset=True)      return redirect(          reverse(wizard_url, kwargs={'step': 'final-' + wizard_url})) @@ -221,7 +222,7 @@ def container_modify(request, pk):  container_deletion_wizard = ContainerDeletionWizard.as_view([ -    ('selec-container_deletion', MainContainerFormSelection), +    ('selec-container_deletion', MainContainerFormMultiSelection),      ('final-container_deletion', ContainerDeletionForm)],      label=_(u"Container deletion"),      url_name='container_deletion',) @@ -233,7 +234,7 @@ def container_delete(request, pk):          return HttpResponseRedirect("/")      wizard_url = 'container_deletion'      ContainerDeletionWizard.session_set_value( -        request, 'selec-' + wizard_url, 'pk', pk, reset=True) +        request, 'selec-' + wizard_url, 'pks', pk, reset=True)      return redirect(          reverse(wizard_url, kwargs={'step': 'final-' + wizard_url})) diff --git a/archaeological_warehouse/wizards.py b/archaeological_warehouse/wizards.py index 7476eb2b7..302045e2f 100644 --- a/archaeological_warehouse/wizards.py +++ b/archaeological_warehouse/wizards.py @@ -17,10 +17,11 @@  # See the file COPYING for details. -from django.shortcuts import render +from django.http import HttpResponseRedirect +from django.shortcuts import render, reverse  from ishtar_common.forms import reverse_lazy -from ishtar_common.wizards import Wizard, DeletionWizard, SearchWizard +from ishtar_common.wizards import Wizard, SearchWizard, MultipleDeletionWizard  from archaeological_finds.wizards import TreatmentWizard  from archaeological_finds.models import Treatment, TreatmentType @@ -75,6 +76,7 @@ class PackagingWizard(TreatmentWizard):  class WarehouseWizard(Wizard):      model = models.Warehouse      wizard_done_window = reverse_lazy('show-warehouse') +    redirect_url = "warehouse_modification"      def save_model(self, dct, m2m, whole_associated_models, form_list,                     return_object): @@ -98,6 +100,7 @@ class WarehouseModificationWizard(Wizard):          'divisions-warehouse_modification':              'ishtar/wizard/wizard_warehouse_divisions.html',      } +    redirect_url = "warehouse_modification"      def get_form_kwargs(self, step=None):          kwargs = super(WarehouseModificationWizard, self).get_form_kwargs(step) @@ -110,8 +113,9 @@ class WarehouseModificationWizard(Wizard):          return kwargs -class WarehouseDeletionWizard(DeletionWizard): +class WarehouseDeletionWizard(MultipleDeletionWizard):      model = models.Warehouse +    redirect_url = "warehouse_deletion"  class ContainerWizard(Wizard): @@ -124,6 +128,7 @@ class ContainerWizard(Wizard):      }      ignore_init_steps = ['localisation']      wizard_done_window = reverse_lazy('show-container') +    redirect_url = "container_modification"      def get_form_kwargs(self, step=None):          kwargs = super(ContainerWizard, self).get_form_kwargs(step) @@ -145,7 +150,7 @@ class ContainerWizard(Wizard):          Save the localisation          """          super(ContainerWizard, self).done(form_list) -        dct = {} +        obj = None          for idx, form in enumerate(form_list):              if not form.is_valid():                  return self.render(form) @@ -167,18 +172,20 @@ class ContainerWizard(Wizard):                          )                      localisation.reference = form.cleaned_data[div_name]                      localisation.save() -            dct = {'item': container} +            obj = container              self.current_object = container -            # force evaluation of lazy urls -            dct['wizard_done_window'] = str(self.wizard_done_window) -        return render(self.request, self.wizard_done_template, dct) +        url = reverse(self.redirect_url) +        if obj: +            url += "?open_item={}".format(obj.pk) +        return HttpResponseRedirect(url)  class ContainerModificationWizard(ContainerWizard):      modification = True -class ContainerDeletionWizard(DeletionWizard): +class ContainerDeletionWizard(MultipleDeletionWizard):      model = models.Container      fields = ['container_type', 'reference', 'comment', 'location', 'index',                'cached_label'] +    redirect_url = "container_deletion" diff --git a/ishtar_common/forms.py b/ishtar_common/forms.py index 973a61228..a2e7a4fd1 100644 --- a/ishtar_common/forms.py +++ b/ishtar_common/forms.py @@ -748,7 +748,9 @@ def get_form_selection(          class_name, label, key, model, base_form, get_url,          not_selected_error=_(u"You should select an item."), new=False,          new_message=_(u"Add a new item"), get_full_url=None, -        gallery=False, map=False, base_form_select=None): +        gallery=False, map=False, multi=False, base_form_select=None, +        alt_pk_field=None +    ):      """      Generate a class selection form          class_name -- name of the class @@ -774,31 +776,28 @@ def get_form_selection(          widget_kwargs['gallery'] = True      if map:          widget_kwargs['map'] = models.profile_mapping() -    attrs[key] = forms.IntegerField( +    if multi: +        widget_kwargs['multiple_select'] = True +        field = forms.CharField +        valid = models.valid_ids +    else: +        field = forms.IntegerField +        valid = models.valid_id + +    if alt_pk_field: +        key = alt_pk_field +    attrs[key] = field(          label="", required=False, -        validators=[models.valid_id(model)], +        validators=[valid(model)],          widget=widgets.DataTable(reverse_lazy(get_url), base_form, model,                                   **widget_kwargs)) -    def clean(self): -        cleaned_data = self.cleaned_data -        if self._main_key not in cleaned_data \ -           or not cleaned_data[self._main_key]: -            raise forms.ValidationError(self._not_selected_error) - -        pk = self.cleaned_data[self._main_key] -        try: -            item = model.objects.get(pk=pk) -        except model.DoesNotExist: -            raise forms.ValidationError(_("Invalid selection.")) -        if hasattr(item, "locked") and item.locked: -            raise forms.ValidationError(_("This item is locked for edition.")) -        return cleaned_data -    attrs['clean'] = clean      attrs['SEARCH_AND_SELECT'] = True      if not base_form_select:          base_form_select = forms.Form -    return type(class_name, (base_form_select,), attrs) +    if not isinstance(base_form_select, (tuple, list)): +        base_form_select = (base_form_select,) +    return type(class_name, base_form_select, attrs)  def get_data_from_formset(data): diff --git a/ishtar_common/wizards.py b/ishtar_common/wizards.py index f36976684..7802f82cb 100644 --- a/ishtar_common/wizards.py +++ b/ishtar_common/wizards.py @@ -959,13 +959,15 @@ class Wizard(IshtarWizard):              url = reverse(self.redirect_url)              if self.open_created_in_redirect:                  url += "?open_item={}".format(obj.pk) -            return HttpResponseRedirect(url) - -        # force evaluation of lazy urls -        wizard_done_window = str(self.wizard_done_window) -        if wizard_done_window: -            dct['wizard_done_window'] = wizard_done_window -        res = render(self.request, self.wizard_done_template, dct) +            res = HttpResponseRedirect(url) +            if not return_object: +                return res +        else: +            # force evaluation of lazy urls +            wizard_done_window = str(self.wizard_done_window) +            if wizard_done_window: +                dct['wizard_done_window'] = wizard_done_window +            res = render(self.request, self.wizard_done_template, dct)          return return_object and (obj, res) or res      def get_deleted(self, keys): | 
