list.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. from django.conf import settings
  2. from django.http import Http404
  3. from django.shortcuts import render
  4. from django.urls import reverse
  5. from django.views.generic import View
  6. from misago.core.shortcuts import get_int_or_404
  7. from misago.threads.viewmodels import (
  8. ForumThreads, PrivateThreads, PrivateThreadsCategory, ThreadsCategory, ThreadsRootCategory)
  9. class ListBase(View):
  10. category = None
  11. threads = None
  12. template_name = None
  13. def get(self, request, list_type=None, **kwargs):
  14. page = get_int_or_404(request.GET.get('page', 0))
  15. category = self.get_category(request, **kwargs)
  16. threads = self.get_threads(request, category, list_type, page)
  17. frontend_context = self.get_frontend_context(request, category, threads)
  18. request.frontend_context.update(frontend_context)
  19. template_context = self.get_template_context(request, category, threads)
  20. return render(request, self.template_name, template_context)
  21. def get_category(self, request, **kwargs):
  22. return self.category(request, **kwargs)
  23. def get_threads(self, request, category, list_type, page):
  24. return self.threads(request, category, list_type, page)
  25. def get_frontend_context(self, request, category, threads):
  26. context = self.get_default_frontend_context()
  27. context.update(category.get_frontend_context())
  28. context.update(threads.get_frontend_context())
  29. return context
  30. def get_default_frontend_context(self):
  31. return {}
  32. def get_template_context(self, request, category, threads):
  33. context = self.get_default_template_context()
  34. context.update(category.get_template_context())
  35. context.update(threads.get_template_context())
  36. return context
  37. def get_default_template_context(self):
  38. return {}
  39. class ForumThreads(ListBase):
  40. category = ThreadsRootCategory
  41. threads = ForumThreads
  42. template_name = 'misago/threadslist/threads.html'
  43. def get_default_frontend_context(self):
  44. return {
  45. 'MERGE_THREADS_API': reverse('misago:api:thread-merge'),
  46. }
  47. class CategoryThreads(ForumThreads):
  48. category = ThreadsCategory
  49. template_name = 'misago/threadslist/category.html'
  50. def get_category(self, request, **kwargs):
  51. category = super(CategoryThreads, self).get_category(request, **kwargs)
  52. if not category.level:
  53. raise Http404() # disallow root category access
  54. return category
  55. class PrivateThreads(ListBase):
  56. category = PrivateThreadsCategory
  57. threads = PrivateThreads
  58. template_name = 'misago/threadslist/private_threads.html'