threads.py 2.4 KB

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