Add Positional Arguments to Get Next/Previous

Added filter_args array argument to be passed to get_next/previous methods.
Added extra boolean fields to project model for testing.
master
Brandon Taylor 2018-10-06 09:46:34 -04:00
parent 2688003ac9
commit fabd78e5be
5 changed files with 49 additions and 7 deletions

View File

@ -100,35 +100,35 @@ class SortableMixin(models.Model):
super(SortableMixin, self).save(*args, **kwargs) super(SortableMixin, self).save(*args, **kwargs)
def _filter_objects(self, filters, extra_filters, filter_on_sortable_fk): def _filter_objects(self, filters, filter_args, extra_filters, filter_on_sortable_fk):
if extra_filters: if extra_filters:
filters.update(extra_filters) filters.update(extra_filters)
if self.sortable_foreign_key and filter_on_sortable_fk: if self.sortable_foreign_key and filter_on_sortable_fk:
# sfk_obj == sortable foreign key instance # sfk_obj == sortable foreign key instance
sfk_obj = getattr(self, self.sortable_foreign_key.name) sfk_obj = getattr(self, self.sortable_foreign_key.name)
filters.update( filters.update({ self.sortable_foreign_key.name: sfk_obj.id })
{self.sortable_foreign_key.name: sfk_obj.id})
try: try:
order_by = '-{0}'.format(self.order_field_name) \ order_by = '-{0}'.format(self.order_field_name) \
if '{0}__lt'.format(self.order_field_name) in filters.keys() \ if '{0}__lt'.format(self.order_field_name) in filters.keys() \
else self.order_field_name else self.order_field_name
obj = self.__class__.objects.filter( obj = self.__class__.objects.filter(*filter_args, **filters).order_by(order_by)[:1][0]
**filters).order_by(order_by)[:1][0]
except IndexError: except IndexError:
obj = None obj = None
return obj return obj
def get_next(self, extra_filters={}, filter_on_sortable_fk=True): def get_next(self, filter_args=[], extra_filters={}, filter_on_sortable_fk=True):
return self._filter_objects( return self._filter_objects(
{'{0}__gt'.format(self.order_field_name): self._get_order_field_value()}, {'{0}__gt'.format(self.order_field_name): self._get_order_field_value()},
filter_args,
extra_filters, filter_on_sortable_fk) extra_filters, filter_on_sortable_fk)
def get_previous(self, extra_filters={}, filter_on_sortable_fk=True): def get_previous(self, filter_args=[], extra_filters={}, filter_on_sortable_fk=True):
return self._filter_objects( return self._filter_objects(
{'{0}__lt'.format(self.order_field_name): self._get_order_field_value()}, {'{0}__lt'.format(self.order_field_name): self._get_order_field_value()},
filter_args,
extra_filters, filter_on_sortable_fk) extra_filters, filter_on_sortable_fk)

View File

@ -0,0 +1,18 @@
# Generated by Django 2.1 on 2018-10-06 12:57
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('samples', '0002_auto_20180319_2117'),
]
operations = [
migrations.AddField(
model_name='project',
name='isApproved',
field=models.BooleanField(default=False),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 2.1 on 2018-10-06 13:01
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('samples', '0003_project_isapproved'),
]
operations = [
migrations.AddField(
model_name='project',
name='isFunded',
field=models.BooleanField(default=False),
),
]

View File

@ -49,9 +49,15 @@ class Project(SimpleModel, SortableMixin):
category = SortableForeignKey(Category, on_delete=models.CASCADE) category = SortableForeignKey(Category, on_delete=models.CASCADE)
description = models.TextField() description = models.TextField()
isApproved = models.BooleanField(default=False)
isFunded = models.BooleanField(default=False)
order = models.PositiveIntegerField(default=0, editable=False) order = models.PositiveIntegerField(default=0, editable=False)
def get_next(self):
return super(Project, self).get_next(
filter_args=[models.Q(isApproved=True) | models.Q(isFunded=True)])
# Registered as a tabular inline on `Project` # Registered as a tabular inline on `Project`
@python_2_unicode_compatible @python_2_unicode_compatible