Advertisement
Guest User

Django View Manager

a guest
Dec 13th, 2019
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.13 KB | None | 0 0
  1. import inspect
  2.  
  3. from django.http import JsonResponse
  4. from django.views import View
  5. from django.views.generic import TemplateView
  6.  
  7.  
  8. class JsonContextMixin:
  9. """
  10. An extra context mixin that passes the keyword arguments received by
  11. get_json_response_data() as the JsonResponse context.
  12. """
  13.  
  14. json_extra_context: dict = None
  15.  
  16. def get_json_response_data(self, **kwargs):
  17. if self.json_extra_context is not None:
  18. kwargs.update(self.json_extra_context)
  19. return kwargs
  20.  
  21.  
  22. class WizardMemberView(JsonContextMixin, TemplateView):
  23. """
  24.  
  25. """
  26.  
  27. unique_key: str = None
  28.  
  29. def get(self, request, *args, **kwargs):
  30. response = super().get(request, *args, **kwargs)
  31. data = self.get_json_response_data(template=response.rendered_content)
  32. return JsonResponse(data, safe=False)
  33.  
  34.  
  35. class WizardBaseView(View):
  36. """
  37. A class for wizard implementation
  38. """
  39.  
  40. _view_lookup_name: str = 'target_view'
  41. _check_methods: list = ['GET', 'POST']
  42.  
  43. def __init__(self, **kwargs):
  44. super().__init__(**kwargs)
  45. self.check_members()
  46.  
  47. def check_members(self) -> None:
  48. class_members = [
  49. member for _, member in inspect.getmembers(self)
  50. if inspect.isclass(member) and issubclass(member, WizardMemberView)
  51. ]
  52. for member in class_members:
  53. member_unique_name = member.unique_name
  54. if not hasattr(self, member_unique_name):
  55. setattr(self, member_unique_name, member)
  56. else:
  57. raise RuntimeError(
  58. 'Атрибут "unique_name" : "%s" дочерних элементов должен быть уникальным в '
  59. 'пределах %s' % (member_unique_name, self.__class__.__name__)
  60. )
  61.  
  62. def dispatch(self, request, *args, **kwargs):
  63. member_view_response = self._get_member_view_response()
  64. if member_view_response:
  65. response = member_view_response
  66. else:
  67. response = super().dispatch(request, *args, **kwargs)
  68. return response
  69.  
  70. def _get_member_view_response(self) -> WizardMemberView:
  71. # get view name from view-method "QueryDict" data
  72. member_view_unique_name = None
  73. for method in self._check_methods:
  74. query_dict = getattr(self.request, method, None)
  75. if query_dict:
  76. member_view_unique_name = query_dict.get(self._view_lookup_name)
  77. if member_view_unique_name:
  78. break
  79. # get view response
  80. member_view_response = None
  81. if member_view_unique_name:
  82. target_view_class = getattr(self, member_view_unique_name, None)
  83. if target_view_class:
  84. member_view_response = target_view_class.as_view()
  85.  
  86. return member_view_response
  87.  
  88.  
  89. class WizardView(WizardBaseView):
  90. """
  91.  
  92. """
  93.  
  94. class FirstStep(WizardMemberView):
  95. pass
  96.  
  97. class SecondStep(WizardMemberView):
  98. pass
  99.  
  100. class ThirdStep(WizardMemberView):
  101. pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement