diff options
Diffstat (limited to 'ishtar_common/views_item.py')
-rw-r--r-- | ishtar_common/views_item.py | 154 |
1 files changed, 89 insertions, 65 deletions
diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py index 98dcd3d4c..d068fb554 100644 --- a/ishtar_common/views_item.py +++ b/ishtar_common/views_item.py @@ -35,10 +35,11 @@ from menus import Menu import models from archaeological_files.models import File -from archaeological_operations.models import Operation +from archaeological_operations.models import Operation, ArchaeologicalSite from archaeological_context_records.models import ContextRecord from archaeological_finds.models import Find, FindBasket, Treatment, \ TreatmentFile +from archaeological_warehouse.models import Warehouse logger = logging.getLogger(__name__) @@ -46,7 +47,9 @@ ENCODING = settings.ENCODING or 'utf-8' CURRENT_ITEM_KEYS = (('file', File), ('operation', Operation), + ('site', ArchaeologicalSite), ('contextrecord', ContextRecord), + ('warehouse', Warehouse), ('find', Find), ('treatmentfile', TreatmentFile), ('treatment', Treatment)) @@ -440,15 +443,16 @@ def _search_manage_search_vector(model, dct, exc_dct, request_keys): if 'search_vector' not in dct: return dct, exc_dct - # remove inside parenthesis - search_vector = \ - dct['search_vector'].replace(u'(', u'').replace(u')', u'').strip() + search_vector = dct['search_vector'] parentheses_groups = _parse_parentheses(search_vector) search_query, extra_dct, extra_exc_dct = _parse_parentheses_groups( parentheses_groups, request_keys) dct.update(extra_dct) exc_dct.update(extra_exc_dct) if search_query: + # remove inside parenthesis + search_query = \ + search_query.replace(u'(', u'').replace(u')', u'').strip() dct['extras'].append( {'where': [model._meta.db_table + ".search_vector @@ (to_tsquery(%s, %s)) = true"], @@ -760,6 +764,64 @@ def _construct_query(relation_types, dct, or_reqs, and_reqs): return query +def _manage_default_search(dct, request, model, default_name, my_base_request, + my_relative_session_names): + # an item is selected in the default menu + pinned_search = "" + if default_name in request.session and \ + request.session[default_name]: + value = request.session[default_name] + if 'basket-' in value: + try: + dct = {"basket__pk": + request.session[default_name].split('-')[-1]} + pinned_search = unicode(FindBasket.objects.get( + pk=dct["basket__pk"])) + except FindBasket.DoesNotExist: + pass + else: + try: + dct = {"pk": request.session[default_name]} + pinned_search = u'"{}"'.format( + model.objects.get(pk=dct["pk"]) + ) + except model.DoesNotExist: + pass + elif dct == (my_base_request or {}): + if not hasattr(model, 'UP_MODEL_QUERY'): + logger.warning( + "**WARN get_item**: - UP_MODEL_QUERY not defined for " + "'{}'".format(model)) + else: + # a parent item may be selected in the default menu + for name, key in my_relative_session_names: + if name in request.session and request.session[name] \ + and 'basket-' not in request.session[name] \ + and name in CURRENT_ITEM_KEYS_DICT: + up_model = CURRENT_ITEM_KEYS_DICT[name] + try: + dct.update({key: request.session[name]}) + up_item = up_model.objects.get(pk=dct[key]) + if up_item.SLUG not in model.UP_MODEL_QUERY: + logger.warning( + "**WARN get_item**: - {} not in " + "UP_MODEL_QUERY for {}'".format( + up_item.SLUG, + model)) + else: + req_key, up_attr = model.UP_MODEL_QUERY[ + up_item.SLUG] + pinned_search = u'{}="{}"'.format( + req_key, + getattr(up_item, up_attr) + ) + break + except up_model.DoesNotExist: + pass + + return dct, pinned_search + + def _format_val(val): if val is None: return u"" @@ -931,7 +993,11 @@ def get_item(model, func_name, default_name, extra_request_keys=[], exc_and_reqs, exc_or_reqs = [], [] if full == 'shortcut': - dct['cached_label__icontains'] = request.GET.get('term', None) + if model.SLUG == "warehouse": + key = 'name__icontains' + else: + key = 'cached_label__icontains' + dct[key] = request.GET.get('term', None) try: old = 'old' in request_items and int(request_items['old']) @@ -955,62 +1021,13 @@ def get_item(model, func_name, default_name, extra_request_keys=[], pinned_search = "" if 'submited' not in request_items and full != 'shortcut': - # default search - # an item is selected in the default menu - if default_name in request.session and \ - request.session[default_name]: - value = request.session[default_name] - if 'basket-' in value: - try: - dct = {"basket__pk": - request.session[default_name].split('-')[-1]} - pinned_search = unicode(FindBasket.objects.get( - pk=dct["basket__pk"])) - except FindBasket.DoesNotExist: - pass - else: - try: - dct = {"pk": request.session[default_name]} - pinned_search = u'"{}"'.format( - model.objects.get(pk=dct["pk"]) - ) - except model.DoesNotExist: - pass - elif dct == (my_base_request or {}): - if not hasattr(model, 'UP_MODEL_QUERY'): - logger.warning( - "**WARN get_item**: - UP_MODEL_QUERY not defined for " - "'{}'".format(model.__class__)) - else: - # a parent item may be selected in the default menu - for name, key in my_relative_session_names: - if name in request.session and request.session[name] \ - and 'basket-' not in request.session[name] \ - and name in CURRENT_ITEM_KEYS_DICT: - up_model = CURRENT_ITEM_KEYS_DICT[name] - try: - dct.update({key: request.session[name]}) - up_item = up_model.objects.get(pk=dct[key]) - if up_item.short_class_name not in \ - model.UP_MODEL_QUERY: - logger.warning( - "**WARN get_item**: - {} not in " - "UP_MODEL_QUERY for {}'".format( - up_item.short_class_name, - model)) - else: - req_key, up_attr = model.UP_MODEL_QUERY[ - up_item.short_class_name] - pinned_search = u'{}="{}"'.format( - req_key, - getattr(up_item, up_attr) - ) - break - except up_model.DoesNotExist: - pass - if (not dct or data_type == 'csv') \ - and func_name in request.session: + if data_type == 'csv' and func_name in request.session: dct = request.session[func_name] + else: + # default search + dct, pinned_search = _manage_default_search( + dct, request, model, default_name, my_base_request, + my_relative_session_names) else: request.session[func_name] = dct @@ -1092,7 +1109,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[], if count: return items.count() - # print(items.query) + # print(unicode(items.query).encode('utf-8')) if search_vector: # for serialization dct['search_vector'] = search_vector @@ -1130,8 +1147,12 @@ def get_item(model, func_name, default_name, extra_request_keys=[], query_table_cols[idx] = \ model.CONTEXTUAL_TABLE_COLS[contxt][col] if full == 'shortcut': - query_table_cols = ['cached_label'] - table_cols = ['cached_label'] + if model.SLUG == "warehouse": + query_table_cols = ['name'] + table_cols = ['name'] + else: + query_table_cols = ['cached_label'] + table_cols = ['cached_label'] # manage sort tables manual_sort_key = None @@ -1328,8 +1349,11 @@ def get_item(model, func_name, default_name, extra_request_keys=[], if hasattr(model, 'COL_LINK') and k in model.COL_LINK: value = link_ext_template.format(value, value) res[k] = value - if full == 'shortcut' and 'cached_label' in res: - res['value'] = res.pop('cached_label') + if full == 'shortcut': + if 'cached_label' in res: + res['value'] = res.pop('cached_label') + elif 'name' in res: + res['value'] = res.pop('name') rows.append(res) if full == 'shortcut': data = json.dumps(rows) |