This package implements an algorithm similar to JIRA's lexorank, but without using buckets for rebalancing that can be used with Django projects.
Project description
django-lexorank
This package implements an algorithm similar to JIRA's lexorank, but without using buckets for rebalancing that can be used with Django projects.
Installation
pip install django-lexorank
Configuration
Add django_lexorank
to your INSTALLED_APPS
setting:
INSTALLED_APPS = [
...
"django_lexorank",
]
Usage
Defining models
To add ranking to your model, you need to inherit it from RankedModel
.
There are 2 ways of using RankedModel
:
Globally
This way, all the objects will be ranked together in the global scope.
Example:
from django_lexorank.models import RankedModel
from django.db import models
class Board(RankedModel):
name = models.CharField(max_length=255)
Per group
This way, instances of the model will be ranked separately per group.
To do that, you have to set a name of the foreign key to the group
to the order_with_respect_to
parameter of the model.
Example:
from django_lexorank.models import RankedModel
from django.db import models
class Task(RankedModel):
name = models.CharField(max_length=255)
board = models.ForeignKey("Board", on_delete=models.CASCADE, related_name="tasks")
order_with_respect_to = "board"
Field parameters
By default, new instances of the model will be ranked at the top of the list.
Rank field may accept boolean parameter insert_to_bottom
to override this behaviour.
Example:
from django_lexorank.models import RankedModel
from django_lexorank.fields import RankField
from django.db import models
class User(RankedModel):
name = models.CharField(max_length=255)
rank = RankField(insert_to_bottom=True)
Manager methods
There are 3 ways to insert models using manager methods:
model.objects.create(**kwargs)
- will use the default behaviour specified on RankField
definition.
model.objects.add_to_bottom(**kwargs)
- will insert the model at the bottom of the list.
model.objects.add_to_top(**kwargs)
- will insert the model at the top of the list.
Instance methods
obj.place_after(after_obj)
- places model instance after provided instance.
If rank length exceeds the limit after the move, rebalancing will be scheduled.
obj.place_before(before_obj)
- places model instance before provided instance.
If rank length exceeds the limit after the move, rebalancing will be scheduled.
obj.place_on_top()
- moves model instance to the bottom of the list.
If rank length exceeds the limit after the move, rebalancing will be scheduled.
obj.place_on_bottom()
- moves model instance to the bottom of the list.
If rank length exceeds the limit after the move, rebalancing will be scheduled.
obj.get_previous_object()
- return previous object in the list
obj.get_next_object()
- return next object in the list
obj.get_previous_object_rank()
- return previous object rank in the list
obj.get_next_object_rank()
- return next object rank in the list
obj.schedule_rebalancing()
- schedule rebalancing for the whole list or a group if order_with_respect_to
is set
obj.rebalance()
- rebalance the whole list or a group if order_with_respect_to
is set
obj.rebalancing_required()
- returns True
if rebalancing is required for the whole list,
or for a group if order_with_respect_to
is set
obj.rebalancing_scheduled()
- returns True
if rebalancing is scheduled for the whole list,
or for a group if order_with_respect_to
is set
Model methods
model.get_first_object()
- return first object in the list
model.get_last_object()
- return last object in the list
model.get_first_object_rank()
- return first object rank in the list
model.get_last_object_rank()
- return last object rank in the list
Rebalancing Schedule
Each time, a rank length exceeds the limit, rebalancing is scheduled for the whole list or a group,
according to the value of order_with_respect_to
parameter.
SheduledRebalancing
model can be used to create a task for rebalancing ranks.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for django_lexorank-0.1.3-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 32a2885eeff2baa32be22c4dfd99e612192bf18208df401247c429c25436b82d |
|
MD5 | 47b326ecb8c30ca7f2a1023fb4f1f3c6 |
|
BLAKE2b-256 | d32a0005bb147355d0bdadd0c90825cface94d02b8c7041d488bc97d5e89588c |