threadslist.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. from django.conf import settings
  2. from django.http import Http404
  3. from django.shortcuts import render
  4. from django.views.generic import View
  5. from django.utils.translation import ugettext_lazy
  6. from misago.acl import add_acl
  7. from misago.categories.models import CATEGORIES_TREE_ID, Category
  8. from misago.categories.permissions import (
  9. allow_see_category, allow_browse_category)
  10. from misago.categories.serializers import (
  11. BasicCategorySerializer, CategorySerializer)
  12. from misago.core.shortcuts import (
  13. get_object_or_404, paginate, pagination_dict, validate_slug)
  14. from misago.readtracker import threadstracker
  15. from misago.threads.serializers import ThreadSerializer
  16. from misago.threads.mixins.lists import (
  17. ThreadsListMixin, CategoryThreadsListMixin)
  18. from misago.threads.utils import add_categories_to_threads
  19. LISTS_NAMES = {
  20. 'my': ugettext_lazy("Your threads"),
  21. 'new': ugettext_lazy("New threads"),
  22. 'unread': ugettext_lazy("Unread threads"),
  23. 'subscribed': ugettext_lazy("Subscribed threads"),
  24. }
  25. class BaseList(View):
  26. template_name = 'misago/threadslist/threads.html'
  27. preloaded_data_prefix = ''
  28. def get_extra_context(self, request, category, subcategories, list_type):
  29. return {}
  30. def get(self, request, **kwargs):
  31. try:
  32. page = int(request.GET.get('page', 0))
  33. if page == 1:
  34. page = None
  35. except ValueError:
  36. raise Http404()
  37. list_type = kwargs['list_type']
  38. category = self.get_category(request, **kwargs)
  39. self.allow_see_list(request, category, list_type)
  40. subcategories = self.get_subcategories(request, category)
  41. categories = [category] + subcategories
  42. queryset = self.get_queryset(
  43. request, categories, list_type).order_by('-last_post_on')
  44. page = paginate(queryset, page, 24, 6)
  45. paginator = pagination_dict(page, include_page_range=False)
  46. if list_type in ('new', 'unread'):
  47. """we already know all threads on list are unread"""
  48. threadstracker.make_unread(page.object_list)
  49. else:
  50. threadstracker.make_threads_read_aware(
  51. request.user, page.object_list)
  52. add_categories_to_threads(categories, page.object_list)
  53. visible_subcategories = []
  54. for thread in page.object_list:
  55. if (thread.top_category and
  56. thread.top_category not in visible_subcategories):
  57. visible_subcategories.append(thread.top_category.pk)
  58. category.subcategories = []
  59. for subcategory in subcategories:
  60. if subcategory.pk in visible_subcategories:
  61. category.subcategories.append(subcategory)
  62. extra_context = self.get_extra_context(
  63. request, category, subcategories, list_type)
  64. show_toolbar = False
  65. if paginator['count']:
  66. if category.subcategories:
  67. show_toolbar = True
  68. if request.user.is_authenticated():
  69. show_toolbar = True
  70. add_acl(request.user, page.object_list)
  71. request.frontend_context.update({
  72. 'THREADS': dict(
  73. results=ThreadSerializer(page.object_list, many=True).data,
  74. subcategories=BasicCategorySerializer(
  75. category.subcategories, many=True).data,
  76. **paginator),
  77. 'CATEGORIES': CategorySerializer(categories, many=True).data,
  78. })
  79. return render(request, self.template_name, dict(
  80. category=category,
  81. show_toolbar=show_toolbar,
  82. list_type=list_type,
  83. list_name=LISTS_NAMES.get(list_type),
  84. threads=page.object_list,
  85. paginator=paginator,
  86. count=paginator['count'],
  87. **extra_context
  88. ))
  89. class ThreadsList(BaseList, ThreadsListMixin):
  90. template_name = 'misago/threadslist/threads.html'
  91. def get_category(self, request, **kwargs):
  92. return Category.objects.root_category()
  93. def get_extra_context(self, request, category, subcategories, list_type):
  94. return {
  95. 'is_index': not settings.MISAGO_CATEGORIES_ON_INDEX
  96. }
  97. class CategoryThreadsList(ThreadsList, CategoryThreadsListMixin):
  98. template_name = 'misago/threadslist/category.html'
  99. preloaded_data_prefix = 'CATEGORY_'
  100. def get_category(self, request, **kwargs):
  101. category = get_object_or_404(Category.objects.select_related('parent'),
  102. tree_id=CATEGORIES_TREE_ID,
  103. id=kwargs['category_id'],
  104. )
  105. allow_see_category(request.user, category)
  106. allow_browse_category(request.user, category)
  107. validate_slug(category, kwargs['category_slug'])
  108. return category
  109. class PrivateThreadsList(ThreadsList):
  110. template_name = 'misago/threadslist/private_threads.html'
  111. preloaded_data_prefix = 'PRIVATE_'
  112. def get_category(self, request, **kwargs):
  113. return Category.objects.private_threads()
  114. def get_subcategories(self, request, category):
  115. return []