summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commitf7a4bd783df87aea052aba07b2a48001b6389772 (patch)
treef89afc90cf5c0465404beeb218cb1ff05020428c
parentf164cd8f9107b1c6a803fa6fe6adda52539f8b8f (diff)
downloadIshtar-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.py60
-rw-r--r--archaeological_finds/models_finds.py2
-rw-r--r--archaeological_finds/views.py42
-rw-r--r--archaeological_finds/wizards.py6
-rw-r--r--archaeological_warehouse/models.py2
-rw-r--r--archaeological_warehouse/templates/ishtar/sheet_container.html3
-rw-r--r--ishtar_common/wizards.py26
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()