diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2017-03-21 19:18:15 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2017-03-21 19:18:15 +0100 |
commit | f7a4bd783df87aea052aba07b2a48001b6389772 (patch) | |
tree | f89afc90cf5c0465404beeb218cb1ff05020428c | |
parent | f164cd8f9107b1c6a803fa6fe6adda52539f8b8f (diff) | |
download | Ishtar-f7a4bd783df87aea052aba07b2a48001b6389772.tar.bz2 Ishtar-f7a4bd783df87aea052aba07b2a48001b6389772.zip |
Finds search: conditionnal search (warehouse module available) for warehouses and containers (refs #3416)
-rw-r--r-- | archaeological_finds/forms.py | 60 | ||||
-rw-r--r-- | archaeological_finds/models_finds.py | 2 | ||||
-rw-r--r-- | archaeological_finds/views.py | 42 | ||||
-rw-r--r-- | archaeological_finds/wizards.py | 6 | ||||
-rw-r--r-- | archaeological_warehouse/models.py | 2 | ||||
-rw-r--r-- | archaeological_warehouse/templates/ishtar/sheet_container.html | 3 | ||||
-rw-r--r-- | ishtar_common/wizards.py | 26 |
7 files changed, 108 insertions, 33 deletions
diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py index 1e45ca4b3..09d23a3bc 100644 --- a/archaeological_finds/forms.py +++ b/archaeological_finds/forms.py @@ -77,7 +77,8 @@ __all__ = [ 'SourceTreatmentFileFormSelection', 'TreatmentSourceFormSelection', 'TreatmentFileSourceFormSelection', 'RecordFormSelection', 'FindForm', 'DateForm', 'DatingFormSet', - 'FindSelect', 'FindFormSelection', 'MultipleFindFormSelection', + 'FindSelect', 'FindFormSelection', 'FindFormSelectionWarehouseModule', + 'MultipleFindFormSelection', 'MultipleFindFormSelectionWarehouseModule', 'FindMultipleFormSelection', 'check_form', 'check_exist', 'check_not_exist', 'check_value', 'check_type_field', 'check_type_not_field', 'check_treatment', 'ResultFindForm', 'ResultFindFormSet', @@ -350,19 +351,6 @@ class FindSelect(TableSelect): label=_(u"Search within related operations"), choices=[], widget=widgets.CheckboxSelectMultiple) datings__period = forms.ChoiceField(label=_(u"Period"), choices=[]) - # TODO search by warehouse - container__location = forms.IntegerField( - label=_(u"Warehouse (location)"), - widget=widgets.JQueryAutoComplete( - reverse_lazy('autocomplete-warehouse'), - associated_model=Warehouse), - validators=[valid_id(Warehouse)]) - container__responsible = forms.IntegerField( - label=_(u"Warehouse (responsible)"), - widget=widgets.JQueryAutoComplete( - reverse_lazy('autocomplete-warehouse'), - associated_model=Warehouse), - validators=[valid_id(Warehouse)]) material_types = forms.ChoiceField(label=_(u"Material type"), choices=[]) object_types = forms.ChoiceField(label=_(u"Object type"), choices=[]) preservation_to_considers = forms.ChoiceField( @@ -424,6 +412,23 @@ class FindSelect(TableSelect): return ids +class FindSelectWarehouseModule(FindSelect): + container__location = forms.IntegerField( + label=_(u"Warehouse (location)"), + widget=widgets.JQueryAutoComplete( + reverse_lazy('autocomplete-warehouse'), + associated_model=Warehouse), + validators=[valid_id(Warehouse)]) + container__responsible = forms.IntegerField( + label=_(u"Warehouse (responsible)"), + widget=widgets.JQueryAutoComplete( + reverse_lazy('autocomplete-warehouse'), + associated_model=Warehouse), + validators=[valid_id(Warehouse)]) + container__index = forms.IntegerField(label=_(u"Container ID")) + container__reference = forms.IntegerField(label=_(u"Container ref.")) + + class FindFormSelection(forms.Form): form_label = _("Find search") associated_models = {'pk': models.Find} @@ -437,6 +442,16 @@ class FindFormSelection(forms.Form): validators=[valid_id(models.Find)]) +class FindFormSelectionWarehouseModule(FindFormSelection): + pk = forms.IntegerField( + label="", required=False, + widget=widgets.JQueryJqGrid( + reverse_lazy('get-find'), + FindSelectWarehouseModule, models.Find, + source_full=reverse_lazy('get-find-full')), + validators=[valid_id(models.Find)]) + + class MultipleFindFormSelection(forms.Form): form_label = _("Find search") associated_models = {'pk': models.Find} @@ -451,15 +466,28 @@ class MultipleFindFormSelection(forms.Form): validators=[valid_id(models.Find)]) +class MultipleFindFormSelectionWarehouseModule(MultipleFindFormSelection): + pk = forms.IntegerField( + label="", required=False, + widget=widgets.JQueryJqGrid( + reverse_lazy('get-find'), + FindSelectWarehouseModule, models.Find, + multiple_select=True, + source_full=reverse_lazy('get-find-full')), + validators=[valid_id(models.Find)]) + + class FindMultipleFormSelection(forms.Form): form_label = _(u"Upstream finds") associated_models = {'finds': models.Find} associated_labels = {'finds': _(u"Finds")} + # using FindSelectWarehouseModule because this form is only used with + # the warehouse module activated finds = forms.CharField( label="", required=False, widget=widgets.JQueryJqGrid( - reverse_lazy('get-find'), FindSelect, models.Find, multiple=True, - multiple_cols=[2, 3, 4]), + reverse_lazy('get-find'), FindSelectWarehouseModule, models.Find, + multiple=True, multiple_cols=[2, 3, 4]), validators=[valid_ids(models.Find)]) def clean(self): diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index 1d4d6e369..c54fd1ed9 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -573,6 +573,8 @@ class Find(BaseHistorizedItem, ImageModel, OwnPerms, ShortMenuItem): 'image__isnull': 'image__isnull', 'container__location': 'container__location__pk', 'container__responsible': 'container__responsible__pk', + 'container__index': 'container__index', + 'container__reference': 'container__reference', } EXTRA_REQUEST_KEYS.update( dict( diff --git a/archaeological_finds/views.py b/archaeological_finds/views.py index 0b9cb8952..03094cbb0 100644 --- a/archaeological_finds/views.py +++ b/archaeological_finds/views.py @@ -28,7 +28,7 @@ from django.utils.translation import ugettext_lazy as _ from django.views.generic import TemplateView from django.views.generic.edit import CreateView, FormView -from ishtar_common.models import IshtarUser +from ishtar_common.models import IshtarUser, get_current_profile from archaeological_operations.models import AdministrativeAct from ishtar_common.forms import FinalForm @@ -117,6 +117,15 @@ show_findbasket = show_item(models.FindBasket, 'findbasket') display_findbasket = display_item(models.FindBasket, show_url='show-find/basket-') + +def check_warehouse_module(self): + return get_current_profile().warehouse + + +def check_not_warehouse_module(self): + return not check_warehouse_module(self) + + find_creation_steps = [ ('selecrecord-find_creation', RecordFormSelectionTable), ('find-find_creation', FindForm), @@ -129,17 +138,32 @@ find_creation_wizard = FindWizard.as_view( label=_(u"New find"), url_name='find_creation',) +find_search_condition_dict = { + 'general-find_search': check_not_warehouse_module, + 'generalwarehouse-find_search': check_warehouse_module, +} + find_search_wizard = SearchWizard.as_view([ - ('general-find_search', FindFormSelection)], + ('general-find_search', FindFormSelection), + ('generalwarehouse-find_search', FindFormSelectionWarehouseModule)], label=_(u"Find search"), - url_name='find_search',) + url_name='find_search', + condition_dict=find_search_condition_dict +) + +find_modification_condition_dict = { + 'selec-find_modification': check_not_warehouse_module, + 'selecw-find_modification': check_warehouse_module, +} find_modification_wizard = FindModificationWizard.as_view([ ('selec-find_modification', FindFormSelection), + ('selecw-find_modification', FindFormSelectionWarehouseModule), ('selecrecord-find_modification', RecordFormSelection), ('find-find_modification', FindForm), ('dating-find_modification', DatingFormSet), ('final-find_modification', FinalForm)], + condition_dict=find_modification_condition_dict, label=_(u"Find modification"), url_name='find_modification',) @@ -152,9 +176,16 @@ def find_modify(request, pk): reverse('find_modification', kwargs={'step': 'selecrecord-find_modification'})) +find_deletion_condition_dict = { + 'selec-find_deletion': check_not_warehouse_module, + 'selecw-find_deletion': check_warehouse_module, +} + find_deletion_wizard = FindDeletionWizard.as_view([ ('selec-find_deletion', FindFormSelection), + ('selecw-find_deletion', FindFormSelectionWarehouseModule), ('final-find_deletion', FindDeletionForm)], + condition_dict=find_deletion_condition_dict, label=_(u"Find deletion"), url_name='find_deletion',) @@ -256,7 +287,10 @@ class SelectItemsInBasket(IshtarMixin, LoginRequiredMixin, TemplateView): except models.FindBasket.DoesNotExist: raise PermissionDenied context['basket'] = self.basket - context['form'] = MultipleFindFormSelection() + if get_current_profile().warehouse: + context['form'] = MultipleFindFormSelectionWarehouseModule() + else: + context['form'] = MultipleFindFormSelection() context['add_url'] = reverse('add_iteminbasket') context['list_url'] = reverse('list_iteminbasket', kwargs={'pk': self.basket.pk}) diff --git a/archaeological_finds/wizards.py b/archaeological_finds/wizards.py index 96a83e582..43fe6262f 100644 --- a/archaeological_finds/wizards.py +++ b/archaeological_finds/wizards.py @@ -74,7 +74,11 @@ class FindWizard(Wizard): class FindModificationWizard(FindWizard): modification = True - filter_owns = {'selec-find_modification': ['pk']} + main_item_select_keys = ('selec-', 'selecw-') + filter_owns = { + 'selec-find_modification': ['pk'], + 'selecw-find_modification': ['pk'], + } class FindDeletionWizard(DeletionWizard): diff --git a/archaeological_warehouse/models.py b/archaeological_warehouse/models.py index d3671adf2..d1918f46a 100644 --- a/archaeological_warehouse/models.py +++ b/archaeological_warehouse/models.py @@ -183,7 +183,7 @@ class Container(LightHistorizedItem, ImageModel): null=True, blank=True) cached_location = models.CharField(_(u"Cached location"), max_length=500, null=True, blank=True) - index = models.IntegerField(u"Index", default=0) + index = models.IntegerField(u"ID", default=0) external_id = models.TextField(_(u"External ID"), blank=True, null=True) auto_external_id = models.BooleanField( _(u"External ID is set automatically"), default=False) diff --git a/archaeological_warehouse/templates/ishtar/sheet_container.html b/archaeological_warehouse/templates/ishtar/sheet_container.html index 38bb79b4f..7845da2c1 100644 --- a/archaeological_warehouse/templates/ishtar/sheet_container.html +++ b/archaeological_warehouse/templates/ishtar/sheet_container.html @@ -12,12 +12,13 @@ <p class="window-refs">{{ item.reference|default:"" }}</p> <p class="window-refs">{{ item.container_type|default:"" }}</p> +<p class="window-refs">{{ item.responsible.name }} - {{ item.index }}</p> {% include "ishtar/blocks/sheet_external_id.html" %} <ul class='form-flex'> {% field_li_detail "Responsible warehouse" item.responsible %} - {% include "ishtar/blocks/sheet_creation_section.html" %} {% field_li_detail "Location (warehouse)" item.location %} + {% include "ishtar/blocks/sheet_creation_section.html" %} </ul> {% field "Location" item.precise_location %} {% field "Comment" item.comment "<pre>" "</pre>" %} diff --git a/ishtar_common/wizards.py b/ishtar_common/wizards.py index 874b68eae..7950bcc7e 100644 --- a/ishtar_common/wizards.py +++ b/ishtar_common/wizards.py @@ -132,6 +132,7 @@ class Wizard(NamedUrlWizardView): current_object_key = 'pk' ignore_init_steps = [] file_storage = default_storage + main_item_select_keys = ('selec-',) saved_args = {} # argument to pass on object save @@ -217,8 +218,9 @@ class Wizard(NamedUrlWizardView): dct = {'current_step_label': self.form_list[current_step].form_label, 'wizard_label': self.label, 'current_object': self.get_current_object(), - 'is_search': current_step.startswith('selec-') - if current_step else False + 'is_search': bool( + [k for k in self.main_item_select_keys + if current_step.startswith(k)]) if current_step else False } context.update(dct) if step == current_step: @@ -1004,20 +1006,24 @@ class Wizard(NamedUrlWizardView): def get_current_object(self): """Get the current object for an instancied wizard""" current_obj = None - main_form_key = 'selec-' + self.url_name - try: - idx = self.session_get_value(main_form_key, self.current_object_key) - idx = int(idx) - current_obj = self.model.objects.get(pk=idx) - except(TypeError, ValueError, ObjectDoesNotExist): - pass + for key in self.main_item_select_keys: + main_form_key = key + self.url_name + try: + idx = int(self.session_get_value(main_form_key, + self.current_object_key)) + current_obj = self.model.objects.get(pk=idx) + break + except(TypeError, ValueError, ObjectDoesNotExist): + pass return current_obj def get_form_initial(self, step, data=None): current_obj = self.get_current_object() current_step = self.steps.current request = self.request - if step.startswith('selec-') and step in self.form_list \ + step_is_main_select = bool([k for k in self.main_item_select_keys + if step.startswith(k)]) + if step_is_main_select and step in self.form_list \ and 'pk' in self.form_list[step].associated_models: model_name = self.form_list[step]\ .associated_models['pk'].__name__.lower() |