diff options
Diffstat (limited to 'ishtar_common/views_item.py')
| -rw-r--r-- | ishtar_common/views_item.py | 60 | 
1 files changed, 39 insertions, 21 deletions
diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py index 71890fa6e..f34b2357f 100644 --- a/ishtar_common/views_item.py +++ b/ishtar_common/views_item.py @@ -133,22 +133,25 @@ def display_item(model, extra_dct=None, show_url=None):      return func -def show_item(model, name, extra_dct=None): +def show_item(model, name, extra_dct=None, model_for_perms=None):      def func(request, pk, **dct): -        allowed, own = check_model_access_control(request, model) +        check_model = model +        if model_for_perms: +            check_model = model_for_perms +        allowed, own = check_model_access_control(request, check_model)          if not allowed:              return HttpResponse('', content_type="application/xhtml")          q = model.objects          if own:              if not hasattr(request.user, 'ishtaruser'): -                return HttpResponse('NOK') +                return HttpResponse('')              query_own = model.get_query_owns(request.user.ishtaruser)              if query_own:                  q = q.filter(query_own).distinct()          try:              item = q.get(pk=pk)          except ObjectDoesNotExist: -            return HttpResponse('NOK') +            return HttpResponse('')          doc_type = 'type' in dct and dct.pop('type')          url_name = u"/".join(reverse('show-' + name, args=['0', '']                                       ).split('/')[:-2]) + u"/" @@ -879,11 +882,13 @@ DEFAULT_ROW_NUMBER = 10  EXCLUDED_FIELDS = ['length'] -def get_item(model, func_name, default_name, extra_request_keys=[], -             base_request=None, bool_fields=[], reversed_bool_fields=[], -             dated_fields=[], associated_models=[], relative_session_names=[], -             specific_perms=[], own_table_cols=None, relation_types_prefix={}, -             do_not_deduplicate=False): +def get_item(model, func_name, default_name, extra_request_keys=None, +             base_request=None, bool_fields=None, reversed_bool_fields=None, +             dated_fields=None, associated_models=None, +             relative_session_names=None, specific_perms=None, +             own_table_cols=None, relation_types_prefix=None, +             do_not_deduplicate=False, model_for_perms=None, +             alt_query_own=None):      """      Generic treatment of tables @@ -903,6 +908,8 @@ def get_item(model, func_name, default_name, extra_request_keys=[],      :param do_not_deduplicate: duplication of id can occurs on large queryset a      mecanism of deduplication is used. But duplicate ids can be normal (for      instance for record_relations view). +    :param model_for_perms: use another model to check permission +    :param alt_query_own: name of alternate method to get query_own      :return:      """      def func(request, data_type='json', full=False, force_own=False, @@ -914,10 +921,15 @@ def get_item(model, func_name, default_name, extra_request_keys=[],          if 'type' in dct:              data_type = dct.pop('type')          if not data_type: -            EMPTY = '[]'              data_type = 'json' +        if data_type == "json": +            EMPTY = '[]' -        allowed, own = check_model_access_control(request, model, +        model_to_check = model +        if model_for_perms: +            model_to_check = model_for_perms + +        allowed, own = check_model_access_control(request, model_to_check,                                                    available_perms)          if not allowed:              return HttpResponse(EMPTY, content_type='text/plain') @@ -933,13 +945,16 @@ def get_item(model, func_name, default_name, extra_request_keys=[],              q = models.IshtarUser.objects.filter(user_ptr=request.user)              if not q.count():                  return HttpResponse(EMPTY, content_type='text/plain') -            query_own = model.get_query_owns(q.all()[0]) +            if alt_query_own: +                query_own = getattr(model, alt_query_own)(q.all()[0]) +            else: +                query_own = model.get_query_owns(q.all()[0])          # get defaults from model          if not extra_request_keys and hasattr(model, 'EXTRA_REQUEST_KEYS'):              my_extra_request_keys = copy(model.EXTRA_REQUEST_KEYS)          else: -            my_extra_request_keys = copy(extra_request_keys) +            my_extra_request_keys = copy(extra_request_keys or [])          if base_request is None and hasattr(model, 'BASE_REQUEST'):              if callable(model.BASE_REQUEST):                  my_base_request = model.BASE_REQUEST(request) @@ -952,32 +967,35 @@ def get_item(model, func_name, default_name, extra_request_keys=[],          if not bool_fields and hasattr(model, 'BOOL_FIELDS'):              my_bool_fields = model.BOOL_FIELDS[:]          else: -            my_bool_fields = bool_fields[:] +            my_bool_fields = bool_fields[:] if bool_fields else []          if not reversed_bool_fields and hasattr(model, 'REVERSED_BOOL_FIELDS'):              my_reversed_bool_fields = model.REVERSED_BOOL_FIELDS[:]          else: -            my_reversed_bool_fields = reversed_bool_fields[:] +            my_reversed_bool_fields = reversed_bool_fields[:] \ +                if reversed_bool_fields else []          if not dated_fields and hasattr(model, 'DATED_FIELDS'):              my_dated_fields = model.DATED_FIELDS[:]          else: -            my_dated_fields = dated_fields[:] +            my_dated_fields = dated_fields[:] if dated_fields else []          if not associated_models and hasattr(model, 'ASSOCIATED_MODELS'):              my_associated_models = model.ASSOCIATED_MODELS[:]          else: -            my_associated_models = associated_models[:] +            my_associated_models = associated_models[:] \ +                if associated_models else []          if not relative_session_names and hasattr(model,                                                    'RELATIVE_SESSION_NAMES'):              my_relative_session_names = model.RELATIVE_SESSION_NAMES[:]          else: -            my_relative_session_names = relative_session_names[:] +            my_relative_session_names = relative_session_names[:] \ +                if relative_session_names else []          if not relation_types_prefix and hasattr(model,                                                   'RELATION_TYPES_PREFIX'):              my_relation_types_prefix = copy(model.RELATION_TYPES_PREFIX)          else: -            my_relation_types_prefix = copy(relation_types_prefix) +            my_relation_types_prefix = copy(relation_types_prefix) \ +                if relation_types_prefix else {} -        fields = [model._meta.get_field(k) -                  for k in get_all_field_names(model)] +        fields = [model._meta.get_field(k) for k in get_all_field_names(model)]          request_keys = dict([              (field.name,  | 
