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