list.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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 misago.core.shortcuts import get_int_or_404
  6. from misago.threads.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. page = get_int_or_404(request.GET.get("page", 0))
  19. category = self.get_category(request, **kwargs)
  20. threads = self.get_threads(request, category, list_type, page)
  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)
  27. def get_threads(self, request, category, list_type, page):
  28. return self.threads(request, category, list_type, page)
  29. def get_frontend_context(self, request, category, threads):
  30. context = self.get_default_frontend_context()
  31. context.update(category.get_frontend_context())
  32. context.update(threads.get_frontend_context())
  33. return context
  34. def get_default_frontend_context(self):
  35. return {}
  36. def get_template_context(self, request, category, threads):
  37. context = self.get_default_template_context()
  38. context.update(category.get_template_context())
  39. context.update(threads.get_template_context())
  40. return context
  41. def get_default_template_context(self):
  42. return {}
  43. class ForumThreadsList(ThreadsList):
  44. category = ThreadsRootCategory
  45. threads = ForumThreads
  46. template_name = "misago/threadslist/threads.html"
  47. def get_default_frontend_context(self):
  48. return {"MERGE_THREADS_API": reverse("misago:api:thread-merge")}
  49. class CategoryThreadsList(ForumThreadsList):
  50. category = ThreadsCategory
  51. template_name = "misago/threadslist/category.html"
  52. def get_category(self, request, **kwargs):
  53. category = super().get_category(request, **kwargs)
  54. if not category.level:
  55. raise Http404() # disallow root category access
  56. return category
  57. class PrivateThreadsList(ThreadsList):
  58. category = PrivateThreadsCategory
  59. threads = PrivateThreads
  60. template_name = "misago/threadslist/private_threads.html"