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.
remotes/origin/enhancement/email-actions
ikame 2014-02-26 22:04:44 +01:00
parent e9dfbe7378
commit 9bc84067d7
2 changed files with 5 additions and 2 deletions

View File

@ -22,12 +22,14 @@ class NeighborsMixin:
""" """
if queryset is None: if queryset is None:
queryset = type(self).objects.get_queryset() 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)) queryset = queryset.filter(~Q(id=self.id))
return self._get_previous_neighbor(queryset), self._get_next_neighbor(queryset) return self._get_previous_neighbor(queryset), self._get_next_neighbor(queryset)
def _get_queryset_order_by(self, 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): def _field(self, field):
return getattr(self, field.lstrip("-")) return getattr(self, field.lstrip("-"))
@ -57,6 +59,7 @@ class NeighborsMixin:
def _get_next_neighbor(self, queryset): def _get_next_neighbor(self, queryset):
conds = [{"{}__{}".format(*self._filter(field, "gt", "lt")): self._field(field)} conds = [{"{}__{}".format(*self._filter(field, "gt", "lt")): self._field(field)}
for field in self._get_queryset_order_by(queryset)] for field in self._get_queryset_order_by(queryset)]
try: try:
return queryset.filter(self._or(conds))[0] return queryset.filter(self._or(conds))[0]
except IndexError: except IndexError:

View File

@ -100,7 +100,7 @@ class UserStory(NeighborsMixin, WatchedMixin, BlockedMixin, models.Model):
class Meta: class Meta:
verbose_name = "user story" verbose_name = "user story"
verbose_name_plural = "user stories" verbose_name_plural = "user stories"
ordering = ["project", "order", "ref"] ordering = ["project", "order"]
unique_together = ("ref", "project") unique_together = ("ref", "project")
permissions = ( permissions = (
("view_userstory", "Can view user story"), ("view_userstory", "Can view user story"),