From fabd78e5be937aa495e6cd96f76257236da78fe5 Mon Sep 17 00:00:00 2001 From: Brandon Taylor Date: Sat, 6 Oct 2018 09:46:34 -0400 Subject: [PATCH] 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. --- adminsortable/models.py | 14 +++++++------- sample_project/database/test_project.sqlite | Bin 278528 -> 290816 bytes .../migrations/0003_project_isapproved.py | 18 ++++++++++++++++++ .../migrations/0004_project_isfunded.py | 18 ++++++++++++++++++ sample_project/samples/models.py | 6 ++++++ 5 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 sample_project/samples/migrations/0003_project_isapproved.py create mode 100644 sample_project/samples/migrations/0004_project_isfunded.py diff --git a/adminsortable/models.py b/adminsortable/models.py index 88e89ea..f90c8ca 100644 --- a/adminsortable/models.py +++ b/adminsortable/models.py @@ -100,35 +100,35 @@ class SortableMixin(models.Model): 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: filters.update(extra_filters) if self.sortable_foreign_key and filter_on_sortable_fk: # sfk_obj == sortable foreign key instance sfk_obj = getattr(self, self.sortable_foreign_key.name) - filters.update( - {self.sortable_foreign_key.name: sfk_obj.id}) + filters.update({ self.sortable_foreign_key.name: sfk_obj.id }) try: order_by = '-{0}'.format(self.order_field_name) \ if '{0}__lt'.format(self.order_field_name) in filters.keys() \ else self.order_field_name - obj = self.__class__.objects.filter( - **filters).order_by(order_by)[:1][0] + obj = self.__class__.objects.filter(*filter_args, **filters).order_by(order_by)[:1][0] except IndexError: obj = None 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( {'{0}__gt'.format(self.order_field_name): self._get_order_field_value()}, + filter_args, 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( {'{0}__lt'.format(self.order_field_name): self._get_order_field_value()}, + filter_args, extra_filters, filter_on_sortable_fk) diff --git a/sample_project/database/test_project.sqlite b/sample_project/database/test_project.sqlite index 944cf225d53fa5197b12a06d2813064d15e8bac5..a3372b8d7a1657af1309e577156794aab6b9d9a2 100644 GIT binary patch delta 6537 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 diff --git a/sample_project/samples/migrations/0003_project_isapproved.py b/sample_project/samples/migrations/0003_project_isapproved.py new file mode 100644 index 0000000..9df013e --- /dev/null +++ b/sample_project/samples/migrations/0003_project_isapproved.py @@ -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), + ), + ] diff --git a/sample_project/samples/migrations/0004_project_isfunded.py b/sample_project/samples/migrations/0004_project_isfunded.py new file mode 100644 index 0000000..2c0f714 --- /dev/null +++ b/sample_project/samples/migrations/0004_project_isfunded.py @@ -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), + ), + ] diff --git a/sample_project/samples/models.py b/sample_project/samples/models.py index 35b2611..89b7518 100644 --- a/sample_project/samples/models.py +++ b/sample_project/samples/models.py @@ -49,9 +49,15 @@ class Project(SimpleModel, SortableMixin): category = SortableForeignKey(Category, on_delete=models.CASCADE) description = models.TextField() + isApproved = models.BooleanField(default=False) + isFunded = models.BooleanField(default=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` @python_2_unicode_compatible