list.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. from django.core.urlresolvers import reverse
  2. from django.http import Http404
  3. from django.shortcuts import render
  4. from django.views.generic import View
  5. from misago.threads.viewmodels.category import ThreadsRootCategory, ThreadsCategory, PrivateThreadsCategory
  6. from misago.threads.viewmodels.threads import ForumThreads, PrivateThreads
  7. class ListBase(View):
  8. category = None
  9. threads = None
  10. template_name = None
  11. def get(self, request, list_type=None, **kwargs):
  12. try:
  13. page = int(request.GET.get('page', 0))
  14. except (ValueError, TypeError):
  15. raise Http404()
  16. category = self.get_category(request, **kwargs)
  17. threads = self.get_threads(request, category, list_type, page)
  18. frontend_context = self.get_frontend_context(request, category, threads)
  19. request.frontend_context.update(frontend_context)
  20. template_context = self.get_template_context(request, category, threads)
  21. return render(request, self.template_name, template_context)
  22. def get_category(self, request, **kwargs):
  23. return self.category(request, **kwargs)
  24. def get_threads(self, request, category, list_type, page):
  25. return self.threads(request, category, list_type, page)
  26. def get_default_frontend_context(self):
  27. return {}
  28. def get_frontend_context(self, request, category, threads):
  29. context = self.get_default_frontend_context()
  30. context.update(category.get_frontend_context())
  31. context.update(threads.get_frontend_context())
  32. return context
  33. def get_template_context(self, request, category, threads):
  34. context = {}
  35. context.update(category.get_template_context())
  36. context.update(threads.get_template_context())
  37. return context
  38. class ForumThreads(ListBase):
  39. category = ThreadsRootCategory
  40. threads = ForumThreads
  41. template_name = 'misago/threadslist/threads.html'
  42. def get_default_frontend_context(self):
  43. return {
  44. 'THREADS_API': reverse('misago:api:thread-list'),
  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'