From 9bc84067d77593eea56656e52a98ef34119faaa9 Mon Sep 17 00:00:00 2001 From: ikame Date: Wed, 26 Feb 2014 22:04:44 +0100 Subject: [PATCH] Fix neighbors fetching in user stories * Order the received queryset if it doesn't have ordering. * Do not order UserStory model by "ref" because the query: `queryset.filter(Q(project__gt=1) | Q(order__gt=2) | Q(ref__gt=26))` give the wrong result. We need to use the query: `queryset.filter(Q(project__gt=1) | Q(order__gt=2))` because in SQL there's no short-circuiting. --- taiga/base/models.py | 5 ++++- taiga/projects/userstories/models.py | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/taiga/base/models.py b/taiga/base/models.py index 5ae1c683..e30d6c76 100644 --- a/taiga/base/models.py +++ b/taiga/base/models.py @@ -22,12 +22,14 @@ class NeighborsMixin: """ if queryset is None: queryset = type(self).objects.get_queryset() + if not self._get_queryset_order_by(queryset): + queryset = queryset.order_by(*self._meta.ordering) queryset = queryset.filter(~Q(id=self.id)) return self._get_previous_neighbor(queryset), self._get_next_neighbor(queryset) def _get_queryset_order_by(self, queryset): - return queryset.query.order_by or [self._meta.pk.name] + return queryset.query.order_by or [] def _field(self, field): return getattr(self, field.lstrip("-")) @@ -57,6 +59,7 @@ class NeighborsMixin: def _get_next_neighbor(self, queryset): conds = [{"{}__{}".format(*self._filter(field, "gt", "lt")): self._field(field)} for field in self._get_queryset_order_by(queryset)] + try: return queryset.filter(self._or(conds))[0] except IndexError: diff --git a/taiga/projects/userstories/models.py b/taiga/projects/userstories/models.py index e68aa3ea..a03e8f65 100644 --- a/taiga/projects/userstories/models.py +++ b/taiga/projects/userstories/models.py @@ -100,7 +100,7 @@ class UserStory(NeighborsMixin, WatchedMixin, BlockedMixin, models.Model): class Meta: verbose_name = "user story" verbose_name_plural = "user stories" - ordering = ["project", "order", "ref"] + ordering = ["project", "order"] unique_together = ("ref", "project") permissions = ( ("view_userstory", "Can view user story"),