def changelist_view(self, request, extra_context=None): """ If the model that inherits Sortable has more than one object, its sort order can be changed. This view adds a link to the object_tools block to take people to the view to change the sorting. """ try: qs_method = getattr(self, 'get_queryset', self.queryset) except AttributeError: qs_method = self.get_queryset if get_is_sortable(qs_method(request)): self.change_list_template = \ self.sortable_change_list_with_sort_link_template self.is_sortable = True if extra_context is None: extra_context = {} extra_context.update({ 'change_list_template_extends': self.change_list_template_extends, 'sorting_filters': [sort_filter[0] for sort_filter in getattr(self.model, 'sorting_filters', [])] }) return super(SortableAdminBase, self).changelist_view(request, extra_context=extra_context)
def get_queryset(self, request): qs = super(SortableInlineBase, self).get_queryset(request) if get_is_sortable(qs): self.model.is_sortable = True else: self.model.is_sortable = False return qs
def queryset(self, request): qs = super(SortableInlineBase, self).queryset(request) if get_is_sortable(qs): self.model.is_sortable = True else: self.model.is_sortable = False return qs
def changelist_view(self, request, extra_context=None): """ If the model that inherits Sortable has more than one object, its sort order can be changed. This view adds a link to the object_tools block to take people to the view to change the sorting. """ # apply any filters via the querystring filters = self.get_querystring_filters(request) # Check if the filtered queryset contains more than 1 item # to enable sort link queryset = self.get_queryset(request).filter(**filters) self.is_sortable = False if get_is_sortable(queryset): self.change_list_template = \ self.sortable_change_list_with_sort_link_template self.is_sortable = True if extra_context is None: extra_context = {} extra_context.update({ 'change_list_template_extends': self.change_list_template_extends, 'sorting_filters': [sort_filter[0] for sort_filter in getattr(self.model, 'sorting_filters', [])], 'is_sortable': self.is_sortable }) return super(SortableAdminBase, self).changelist_view(request, extra_context=extra_context)
def queryset(self, request): qs = super(ComponentInline, self).queryset( request).exclude(title__icontains='2') if get_is_sortable(qs): self.model.is_sortable = True else: self.model.is_sortable = False return qs
def test_is_not_sortable(self): """ A model should only become sortable if it has more than record to sort. """ self.create_category() self.assertFalse(get_is_sortable(Category.objects.all()), 'Category only has one record. It should not be sortable.')
def changelist_view(self, request, extra_context=None): """ If the model that inherits Sortable has more than one object, its sort order can be changed. This view adds a link to the object_tools block to take people to the view to change the sorting. """ if get_is_sortable(self.queryset(request)): self.change_list_template = \ self.sortable_change_list_with_sort_link_template self.is_sortable = True return super(SortableAdminBase, self).changelist_view(request, extra_context=extra_context)
def changelist_view(self, request, extra_context=None): """ If the model that inherits Sortable has more than one object, its sort order can be changed. This view adds a link to the object_tools block to take people to the view to change the sorting. """ if get_is_sortable(self.queryset(request)): self.change_list_template = \ self.sortable_change_list_with_sort_link_template self.is_sortable = True if extra_context is None: extra_context = {} extra_context.update({ 'change_list_template_extends': self.change_list_template_extends }) return super(SortableAdminBase, self).changelist_view(request, extra_context=extra_context)
def changelist_view(self, request, extra_context=None): """ If the model that inherits Sortable has more than one object, its sort order can be changed. This view adds a link to the object_tools block to take people to the view to change the sorting. """ # get sort group index from querystring sort_filter_index = request.GET.get('sort_filter') if get_is_sortable(self.queryset(request)): self.change_list_template = \ self.sortable_change_list_with_sort_link_template self.is_sortable = True if extra_context is None: extra_context = {} extra_context.update({ 'change_list_template_extends': self.change_list_template_extends, 'sorting_filters': [sort_filter[0] for sort_filter in self.model.sorting_filters] }) return super(SortableAdminBase, self).changelist_view(request, extra_context=extra_context)
def sort_view(self, request): """ Custom admin view that displays the objects as a list whose sort order can be changed via drag-and-drop. """ opts = self.model._meta has_perm = request.user.has_perm("{}.{}".format(opts.app_label, opts.get_change_permission())) # get sort group index from querystring if present sort_filter_index = request.GET.get("sort_filter") filters = {} if sort_filter_index: try: filters = self.model.sorting_filters[int(sort_filter_index)][1] except (IndexError, ValueError): pass # Apply any sort filters to create a subset of sortable objects objects = self.queryset(request).filter(**filters) # Determine if we need to regroup objects relative to a # foreign key specified on the model class that is extending Sortable. # Legacy support for 'sortable_by' defined as a model property sortable_by_property = getattr(self.model, "sortable_by", None) # `sortable_by` defined as a SortableForeignKey sortable_by_fk = self._get_sortable_foreign_key() sortable_by_class_is_sortable = get_is_sortable(objects) if sortable_by_property: # backwards compatibility for < 1.1.1, where sortable_by was a # classmethod instead of a property try: sortable_by_class, sortable_by_expression = sortable_by_property() except (TypeError, ValueError): sortable_by_class = self.model.sortable_by sortable_by_expression = sortable_by_class.__name__.lower() sortable_by_class_display_name = sortable_by_class._meta.verbose_name_plural elif sortable_by_fk: # get sortable by properties from the SortableForeignKey # field - supported in 1.3+ sortable_by_class_display_name = sortable_by_fk.rel.to._meta.verbose_name_plural sortable_by_class = sortable_by_fk.rel.to sortable_by_expression = sortable_by_fk.name.lower() else: # model is not sortable by another model sortable_by_class = ( sortable_by_expression ) = sortable_by_class_display_name = sortable_by_class_is_sortable = None if sortable_by_property or sortable_by_fk: # Order the objects by the property they are sortable by, # then by the order, otherwise the regroup # template tag will not show the objects correctly objects = objects.order_by(sortable_by_expression, "order") try: verbose_name_plural = opts.verbose_name_plural.__unicode__() except AttributeError: verbose_name_plural = opts.verbose_name_plural context = { "title": u"Drag and drop {0} to change display order".format(capfirst(verbose_name_plural)), "opts": opts, "app_label": opts.app_label, "has_perm": has_perm, "objects": objects, "group_expression": sortable_by_expression, "sortable_by_class": sortable_by_class, "sortable_by_class_is_sortable": sortable_by_class_is_sortable, "sortable_by_class_display_name": sortable_by_class_display_name, } return render(request, self.sortable_change_list_template, context)
def sort_view(self, request): """ Custom admin view that displays the objects as a list whose sort order can be changed via drag-and-drop. """ opts = self.model._meta has_perm = request.user.has_perm('{0}.{1}'.format(opts.app_label, opts.get_change_permission())) objects = self.queryset(request) # Determine if we need to regroup objects relative to a # foreign key specified on the model class that is extending Sortable. # Legacy support for 'sortable_by' defined as a model property sortable_by_property = getattr(self.model, 'sortable_by', None) # `sortable_by` defined as a SortableForeignKey sortable_by_fk = self._get_sortable_foreign_key() sortable_by_class_is_sortable = get_is_sortable(objects) if sortable_by_property: # backwards compatibility for < 1.1.1, where sortable_by was a # classmethod instead of a property try: sortable_by_class, sortable_by_expression = \ sortable_by_property() except (TypeError, ValueError): sortable_by_class = self.model.sortable_by sortable_by_expression = sortable_by_class.__name__.lower() sortable_by_class_display_name = sortable_by_class._meta \ .verbose_name_plural elif sortable_by_fk: # get sortable by properties from the SortableForeignKey # field - supported in 1.3+ sortable_by_class_display_name = sortable_by_fk.rel.to \ ._meta.verbose_name_plural sortable_by_class = sortable_by_fk.rel.to sortable_by_expression = sortable_by_fk.name.lower() else: # model is not sortable by another model sortable_by_class = sortable_by_expression = \ sortable_by_class_display_name = \ sortable_by_class_is_sortable = None if sortable_by_property or sortable_by_fk: # Order the objects by the property they are sortable by, # then by the order, otherwise the regroup # template tag will not show the objects correctly objects = objects.order_by(sortable_by_expression, 'order') try: verbose_name_plural = opts.verbose_name_plural.__unicode__() except AttributeError: verbose_name_plural = opts.verbose_name_plural context = { 'title': u'Drag and drop {0} to change display order'.format( capfirst(verbose_name_plural)), 'opts': opts, 'app_label': opts.app_label, 'has_perm': has_perm, 'objects': objects, 'group_expression': sortable_by_expression, 'sortable_by_class': sortable_by_class, 'sortable_by_class_is_sortable': sortable_by_class_is_sortable, 'sortable_by_class_display_name': sortable_by_class_display_name, 'sortable_javascript_includes_template': self.sortable_javascript_includes_template } return render(request, self.sortable_change_list_template, context)
def test_is_sortable(self): self.create_category() self.create_category(title='Category 2') self.assertTrue(get_is_sortable(Category.objects.all()), 'Category has more than one record. It should be sortable.')
def get_queryset(self, request): queryset = super(TransortableBaseInline, self).get_queryset(request) self.model.is_sortable = get_is_sortable(queryset) return queryset
def sort_view(self, request): """ Custom admin view that displays the objects as a list whose sort order can be changed via drag-and-drop. """ opts = self.model._meta has_perm = request.user.has_perm('{0}.{1}'.format( opts.app_label, opts.get_change_permission())) objects = self.queryset(request) # Determine if we need to regroup objects relative to a # foreign key specified on the model class that is extending Sortable. # Legacy support for 'sortable_by' defined as a model property sortable_by_property = getattr(self.model, 'sortable_by', None) # `sortable_by` defined as a SortableForeignKey sortable_by_fk = self._get_sortable_foreign_key() sortable_by_class_is_sortable = get_is_sortable(objects) if sortable_by_property: # backwards compatibility for < 1.1.1, where sortable_by was a # classmethod instead of a property try: sortable_by_class, sortable_by_expression = \ sortable_by_property() except (TypeError, ValueError): sortable_by_class = self.model.sortable_by sortable_by_expression = sortable_by_class.__name__.lower() sortable_by_class_display_name = sortable_by_class._meta \ .verbose_name_plural elif sortable_by_fk: # get sortable by properties from the SortableForeignKey # field - supported in 1.3+ sortable_by_class_display_name = sortable_by_fk.rel.to \ ._meta.verbose_name_plural sortable_by_class = sortable_by_fk.rel.to sortable_by_expression = sortable_by_fk.name.lower() else: # model is not sortable by another model sortable_by_class = sortable_by_expression = \ sortable_by_class_display_name = \ sortable_by_class_is_sortable = None if sortable_by_property or sortable_by_fk: # Order the objects by the property they are sortable by, # then by the order, otherwise the regroup # template tag will not show the objects correctly objects = objects.order_by(sortable_by_expression, 'order') try: verbose_name_plural = opts.verbose_name_plural.__unicode__() except AttributeError: verbose_name_plural = opts.verbose_name_plural context = { 'title': u'Drag and drop {0} to change display order'.format( capfirst(verbose_name_plural)), 'opts': opts, 'app_label': opts.app_label, 'has_perm': has_perm, 'objects': objects, 'group_expression': sortable_by_expression, 'sortable_by_class': sortable_by_class, 'sortable_by_class_is_sortable': sortable_by_class_is_sortable, 'sortable_by_class_display_name': sortable_by_class_display_name, 'sortable_javascript_includes_template': self.sortable_javascript_includes_template } return render(request, self.sortable_change_list_template, context)