list.py 2.6 KB

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