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