list.py 1.6 KB

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