Giter Club home page Giter Club logo

django-orderable's Introduction

Django Orderable

Add manual sort order to Django objects via an abstract base class and admin classes. Project includes:

  • Abstract base Model
  • Admin class
  • Inline admin class
  • Admin templates

Demo

django-orderable demo

Installation

Grab from the PyPI:

pip install django-orderable

Add to your INSTALLED_APPS:

...
'orderable',
...

Subclass the Orderable class:

from orderable.models import Orderable


class Book(Orderable):
    ...

Subclass the appropriate Orderable admin classes:

from orderable.admin import OrderableAdmin, OrderableTabularInline


class SomeInlineClass(OrderableTabularInline):
    ...

class SomeAdminClass(OrderableAdmin):
    list_display = ('__unicode__', 'sort_order_display')
    ...

jQuery and jQuery UI are used in the Admin for the draggable UI. You may override the versions with your own (rather than using Google's CDN):

class SomeAdminClass(OrderableAdmin):
    class Media:
        extend = False
        js = (
            'path/to/jquery.js',
            'path/to/jquery.ui.js',
        )

Notes

class Meta

If your subclass of Orderable defines class Meta then make sure it subclasses Orderable.Meta one so the model is sorted by sort_order. ie:

class MyOrderable(Orderable):
    class Meta(Orderable.Meta):
        ...

Custom Managers

Similarly, if your model has a custom manager, subclass orderable.managers.OrderableManager instead of django.db.models.Manager.

Transactions

Saving orderable models invokes a fair number of database queries, and in order to avoid race conditions should be run in a transaction.

Adding Orderable to Existing Models

You will need to populate the required sort_order field. Typically this is done by adding the field in one migration with a default of 0, then creating a data migration to set the value to that of its primary key:

for obj in orm['appname.Model'].objects.all():
    obj.sort_order = obj.pk
    obj.save()

Multiple Models using Orderable

When multiple models inherit from Orderable the next() and previous() methods will look for the next/previous model with a sort order. However you'll likely want to have the various sort orders determined by a foreign key or some other predicate. The easiest way (currently) is to override the method in question.

django-orderable's People

Contributors

adam-thomas avatar christianwgd avatar codingjoe avatar col16 avatar ghickman avatar jturnbull avatar lilyfoote avatar maxpeterson avatar meshy avatar mjtamlyn avatar satendra02 avatar todd-dembrey avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

django-orderable's Issues

jQuery UI not loaded in admin

Either we should include the scripts as needed or document the need to add jQuery & jQueryUI to the base admin template.

Django 1.5 support

Fails on Django 1.5 with error:

AttributeError at /admin/
'Options' object has no attribute 'model_name'

\orderable\admin.py in get_url_name, line 43

upgrade jquery to match django

This is using a very old version of jquery which is likely now vunerable, also django seems to have jquery 3.3 already so only jquery ui should be needed, any reason this is still at the old version ?

Needs docs.

Ought to mention:

  • the Orderable model-base,
  • the OrderableAdmin admin-class,
  • the OrderableTabularInline admin-class,
  • orderable is required in INSTALLED_APPS (for templates),
  • the fact that jQuery and jQueryUI sortable are required. See #1. OBSOLETE
  • the issues with unique_together
  • a link to the CHANGELOG.

Improve efficiency of reorder_view

The reorder_view calls save on each model. Since it is dealing with a set of ids it could be more efficient to use update.

Based on #13 the algorithm could be:

  • Find the min and max of the items being reordered.
  • Check that the items being reordered fit between the min and max.
  • Move items being reordered to the end of the list.
  • Update items to be consecutive numbers between min and max.

Would it make sense to use `list_editable` to reorder?

The current implementation reorders the items by making Ajax calls to an custom admin endpoint to save the item each time the item is moved. This implementation was created before django admin supported list_editable.

An alternative approach would be to add sort_order to list_editable and use javascript to update hidden sort_order values when an item is moved. The items would be saved as a batch when the "Save" button was pressed.

While this would represent a orderable UI change, the new UI would be more consistent with the default django admin behaviour and it would be a UI that is more in common with the existing list editable orderable UI. Additionally it would also remove the custom admin endpoint in favor of leveraging the existing (well tested and maintained) Django code.

Worth considering in conjunction with #32

OrderableTabularInline

I have a OrderableTabularInline

class TeamMember_YearAdmin(OrderableTabularInline):
model = TeamMember_Year
extra = 1

With a Orderable Model:

class TeamMember_Year(Orderable):
...

Everything show up normaly in the interface, but new dragged order is not saved. Can someone please help me with this?

Thanks a lot

Is there a compelling need for the custom changelist template?

The problem with overriding admin templates is that if I want to use your app alongside another one that also has a custom changelist template I'm a bit stuck. There's no nice way round this - I usually have to pick the one that makes the smallest change and copy those changes to a template in my own app so I can then extend the other app's template.

In the case of your app - it looks like all you do to the changelist, is add in some javascript and css. This could be accomplished less intrusively (whilst still allowing the current approach in situations where it isn't problematic).

This would also make it easier for OrderableAdmin to be used as a mixin rather than a replacement for ModelAdmin.

Consider removing use of factory boy in tests

I'm really not sure it adds anything here over .objects.create().

  • We have no models which have extra fields
  • We are explicitly wanting to test the behaviour of .save() so we should be careful with it

`unique_together` doesn't work seamlessly

If your sort_order field is unique_together with something, you need to add:

def validate_unique(self, exclude=None):
    f = 'sort_order'
    exclude = [f] if not exclude and f not in exclude else exclude + [f]
    return super(MyModel, self).validate_unique(exclude)

To your model.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.