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