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): |