threads.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. from misago.acl import add_acl
  2. from misago.core.shortcuts import paginate
  3. from misago.readtracker import threadstracker
  4. from misago.threads.models import Label
  5. __all__ = ['Threads']
  6. class Threads(object):
  7. def __init__(self, user):
  8. self.pinned_count = 0
  9. self.user = user
  10. self.filter_by = None
  11. self.sort_by = '-last_post_on'
  12. def filter(self, filter_by):
  13. self.filter_by = filter_by
  14. def sort(self, sort_by):
  15. self.sort_by = sort_by
  16. def list(self, page=0):
  17. queryset = self.get_queryset()
  18. queryset = queryset.order_by(self.sort_by)
  19. pinned_qs = queryset.filter(is_pinned=True)
  20. threads_qs = queryset.filter(is_pinned=False)
  21. self._page = paginate(threads_qs, page, 20, 10)
  22. self._paginator = self._page.paginator
  23. threads = []
  24. for thread in pinned_qs:
  25. threads.append(thread)
  26. self.pinned_count += 1
  27. for thread in self._page.object_list:
  28. threads.append(thread)
  29. self.label_threads(threads, Label.objects.get_cached_labels())
  30. self.make_threads_read_aware(threads)
  31. return threads
  32. def get_queryset(self):
  33. raise NotImplementedError("classes inheriting from Threads helper "
  34. "must define custom get_queryset method")
  35. def filter_threads(self, queryset):
  36. return queryset
  37. def label_threads(self, threads, labels=None):
  38. if labels:
  39. labels_dict = dict([(label.pk, label) for label in labels])
  40. else:
  41. labels_dict = Label.objects.get_cached_labels_dict()
  42. for thread in threads:
  43. thread.label = labels_dict.get(thread.label_id)
  44. def make_threads_read_aware(self, threads):
  45. threadstracker.make_read_aware(self.user, threads)
  46. error_message = ("threads list has to be loaded via call to list() before "
  47. "pagination data will be available")
  48. @property
  49. def paginator(self):
  50. try:
  51. return self._paginator
  52. except AttributeError:
  53. raise AttributeError(self.error_message)
  54. @property
  55. def page(self):
  56. try:
  57. return self._page
  58. except AttributeError:
  59. raise AttributeError(self.error_message)
  60. def count(self):
  61. return self.pinned_count + self.paginator.count