generic.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. from django.contrib import messages
  2. from django.core.paginator import Paginator, EmptyPage
  3. from django.shortcuts import redirect
  4. from django.views.generic import View
  5. from misago.core.exceptions import ExplicitFirstPage
  6. from misago.admin import site
  7. from misago.admin.views import render
  8. class AdminBaseMixin(object):
  9. """
  10. Admin mixin abstraciton used for configuring admin CRUD views.
  11. Takes following attributes:
  12. Model = Model instance
  13. message_404 = string used in "requested item not found" messages
  14. root_link = name of link leading to root action (eg. list of all items
  15. template_dir = directory with templates
  16. """
  17. Model = None
  18. message_404 = None
  19. root_link = None
  20. template_dir = None
  21. def get_model(self):
  22. return self.Model
  23. class AdminView(View):
  24. def final_template(self):
  25. return '%s/%s' % (self.template_dir, self.template)
  26. def get_target(self, target):
  27. Model = self.get_model()
  28. return Model.objects.get(id=target)
  29. def _get_target(self, request, kwargs):
  30. """
  31. get_target is called by view to fetch item from DB
  32. """
  33. Model = self.get_model()
  34. try:
  35. return self.get_target(target)
  36. except Model.DoesNotExist:
  37. messages.error(request, self.message_404)
  38. return redirect(self.root_link)
  39. def render(self, request, context=None):
  40. context = context or {}
  41. context['root_link'] = self.root_link
  42. return render(request, self.final_template(), context)
  43. class ItemsList(AdminView):
  44. template = 'list.html'
  45. items_per_page = 0
  46. def get_queryset(self):
  47. return self.get_model().objects.all()
  48. def paginate_items(self, context, page):
  49. try:
  50. page = int(page)
  51. if page == 1:
  52. raise ExplicitFirstPage()
  53. elif page == 0:
  54. page = 1
  55. except ValueError:
  56. page_no = 1
  57. context['paginator'] = Paginator(context['items'],
  58. self.items_per_page,
  59. allow_empty_first_page=True)
  60. context['page'] = context['paginator'].page(page)
  61. context['items'] = context['page'].object_list
  62. def filter_items(self, request, context):
  63. pass
  64. def dispatch(self, request, *args, **kwargs):
  65. context = {
  66. 'items': self.get_queryset(),
  67. 'paginator': None,
  68. 'page': None,
  69. }
  70. if self.items_per_page:
  71. self.paginate_items(context, kwargs.get('page', 0))
  72. return self.render(request, context)
  73. class FormView(AdminView):
  74. template = 'form.html'
  75. def dispatch(self, request, *args, **kwargs):
  76. pass
  77. class ButtonView(AdminView):
  78. def get(self, request, *args, **kwargs):
  79. pass
  80. def post(self, request, *args, **kwargs):
  81. pass