diff options
Diffstat (limited to 'ishtar_common/views_item.py')
-rw-r--r-- | ishtar_common/views_item.py | 152 |
1 files changed, 103 insertions, 49 deletions
diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py index cfb7a42c3..7c6cbc24a 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)) @@ -132,7 +135,7 @@ def show_item(model, name, extra_dct=None): return HttpResponse('NOK') query_own = model.get_query_owns(request.user.ishtaruser) if query_own: - q = q.filter(query_own) + q = q.filter(query_own).distinct() try: item = q.get(pk=pk) except ObjectDoesNotExist: @@ -440,12 +443,16 @@ def _search_manage_search_vector(model, dct, exc_dct, request_keys): if 'search_vector' not in dct: return dct, exc_dct - parentheses_groups = _parse_parentheses(dct['search_vector'].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"], @@ -757,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"" @@ -837,7 +902,10 @@ def get_item(model, func_name, default_name, extra_request_keys=[], else: my_extra_request_keys = copy(extra_request_keys) if base_request is None and hasattr(model, 'BASE_REQUEST'): - my_base_request = copy(model.BASE_REQUEST) + if callable(model.BASE_REQUEST): + my_base_request = model.BASE_REQUEST(request) + else: + my_base_request = copy(model.BASE_REQUEST) elif base_request is not None: my_base_request = copy(base_request) else: @@ -922,13 +990,22 @@ def get_item(model, func_name, default_name, extra_request_keys=[], request_items = dct_request_items - dct = my_base_request + base_query = None + if isinstance(my_base_request, Q): + base_query = my_base_request + dct = {} + else: + dct = my_base_request excluded_dct = {} and_reqs, or_reqs = [], [] 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']) @@ -952,45 +1029,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 = unicode(model._meta.verbose_name) \ - + u" - " + unicode( - model.objects.get(pk=dct["pk"])) - except model.DoesNotExist: - pass - elif dct == (my_base_request or {}): - # 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]}) - pinned_search = unicode(up_model._meta.verbose_name) \ - + u" - " + unicode( - up_model.objects.get(pk=dct[key])) - 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 @@ -1062,6 +1107,8 @@ def get_item(model, func_name, default_name, extra_request_keys=[], # print(query) items = model.objects.filter(query) + if base_query: + items = items.filter(base_query) if exc_query: items = items.exclude(exc_query) @@ -1072,7 +1119,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 @@ -1110,8 +1157,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 @@ -1308,8 +1359,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) |