list.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from rest_framework.response import Response
  2. from ....core.shortcuts import get_int_or_404
  3. from ...viewmodels import (
  4. ForumThreads,
  5. PrivateThreads,
  6. PrivateThreadsCategory,
  7. ThreadsCategory,
  8. ThreadsRootCategory,
  9. )
  10. class ThreadsList:
  11. threads = None
  12. def __call__(self, request, **kwargs):
  13. page = get_int_or_404(request.query_params.get("page", 0))
  14. if page == 1:
  15. page = 0 # api allows explicit first page
  16. list_type = request.query_params.get("list", "all")
  17. category = self.get_category(request, pk=request.query_params.get("category"))
  18. threads = self.get_threads(request, category, list_type, page)
  19. return Response(self.get_response_json(request, category, threads)["THREADS"])
  20. def get_category(self, request, pk=None):
  21. raise NotImplementedError(
  22. "Threads list has to implement get_category(request, pk=None)"
  23. )
  24. def get_threads(self, request, category, list_type, page):
  25. return self.threads( # pylint: disable=not-callable
  26. request, category, list_type, page
  27. )
  28. def get_response_json(self, request, category, threads):
  29. return threads.get_frontend_context()
  30. class ForumThreadsList(ThreadsList):
  31. threads = ForumThreads
  32. def get_category(self, request, pk=None):
  33. if pk:
  34. return ThreadsCategory(request, pk=pk)
  35. return ThreadsRootCategory(request)
  36. class PrivateThreadsList(ThreadsList):
  37. threads = PrivateThreads
  38. def get_category(self, request, pk=None):
  39. return PrivateThreadsCategory(request)
  40. threads_list_endpoint = ForumThreadsList()
  41. private_threads_list_endpoint = PrivateThreadsList()