Пример #1
0
    def __init__(self, model, field, column_id, query_params,
                 ordering_query_param):
        self.model = model
        self.field_name = field

        self.order_field = None
        if self.field_name.startswith("_") and self.field_name != "__str__":
            raise SmartListException(
                "Cannot use underscore(_) variables/functions in smart lists")
        try:
            self.model_field = self.model._meta.get_field(self.field_name)
            self.order_field = self.field_name
        except FieldDoesNotExist:
            self.model_field = None
            try:
                field = getattr(self.model, self.field_name)
                if callable(field) and getattr(field, 'admin_order_field',
                                               False):
                    self.order_field = getattr(field, 'admin_order_field')
                if callable(field) and getattr(field, 'alters_data', False):
                    raise SmartListException(
                        "Cannot use a function that alters data in smart list")
            except AttributeError:
                self.order_field = self.field_name
                pass  # This is most likely a .values() query set

        if self.order_field:
            self.order = SmartOrder(query_params=query_params,
                                    column_id=column_id,
                                    ordering_query_param=ordering_query_param)
        else:
            self.order = None
Пример #2
0
 def get_ordering(self):
     custom_order = self.request.GET.get(self.ordering_query_parameter_name)
     if custom_order:
         order_list = custom_order.split(".")
         ordering = []
         for i, order in enumerate(order_list, start=1):
             prefix = ''
             try:
                 if order.startswith("-"):
                     prefix = '-'
                     order = int(order[1:])
                 else:
                     order = int(order)
                 field_name, render_function, label = normalize_list_display_item(
                     self.list_display[order - 1])
                 sc = SmartColumn(
                     model=self.model,
                     field=field_name,
                     column_id=i,
                     query_params=self.request.GET,
                     ordering_query_param=self.
                     ordering_query_parameter_name,
                     label=label,
                     render_function=render_function,
                 )
                 ordering.append('{}{}'.format(prefix, sc.order_field))
             except (ValueError, IndexError) as e:
                 raise SmartListException("Illegal ordering")
         return ordering
     return self.ordering
Пример #3
0
 def render_link(self):
     if not hasattr(self.object, 'get_absolute_url'):
         raise SmartListException(
             "Please make sure your model {} implements get_absolute_url()".
             format(type(self.object)))
     return format_html('<td><a href="{}">{}</a></td>',
                        self.object.get_absolute_url(),
                        self.format(self.get_value()))
Пример #4
0
    def get_value(self):
        if self.column.render_function:
            value = self.column.render_function(self.object)
            if not isinstance(value, SafeText):
                raise SmartListException(
                    'You need to provide instance of django.utils.safestring.SafeText not {}. Ensure that all user input was sanitized.'.format(
                        type(value)
                    )
                )
        elif isinstance(self.object, dict):
            value = self.object.get(self.column.field_name)
        else:
            field = getattr(self.object, self.column.field_name) if self.column.field_name else None
            if callable(field):
                value = field if getattr(field, 'do_not_call_in_templates', False) else field()
            else:
                display_function = getattr(self.object, 'get_%s_display' % self.column.field_name, False)
                value = display_function() if display_function else field

        return value
Пример #5
0
 def get_ordering(self):
     custom_order = self.request.GET.get(self.ordering_query_parameter_name)
     if custom_order:
         order_list = custom_order.split(".")
         ordering = []
         for i, order in enumerate(order_list, start=1):
             prefix = ''
             try:
                 if order.startswith("-"):
                     prefix = '-'
                     order = int(order[1:])
                 else:
                     order = int(order)
                 sc = SmartColumn(self.model, self.list_display[order - 1],
                                  i, self.request.GET,
                                  self.ordering_query_parameter_name)
                 ordering.append('{}{}'.format(prefix, sc.order_field))
             except (ValueError, IndexError) as e:
                 raise SmartListException("Illegal ordering")
         return ordering
     return self.ordering