Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import inspect
- from django.http import JsonResponse
- from django.views import View
- from django.views.generic import TemplateView
- class JsonContextMixin:
- """
- An extra context mixin that passes the keyword arguments received by
- get_json_response_data() as the JsonResponse context.
- """
- json_extra_context: dict = None
- def get_json_response_data(self, **kwargs):
- if self.json_extra_context is not None:
- kwargs.update(self.json_extra_context)
- return kwargs
- class WizardMemberView(JsonContextMixin, TemplateView):
- """
- """
- unique_key: str = None
- def get(self, request, *args, **kwargs):
- response = super().get(request, *args, **kwargs)
- data = self.get_json_response_data(template=response.rendered_content)
- return JsonResponse(data, safe=False)
- class WizardBaseView(View):
- """
- A class for wizard implementation
- """
- _view_lookup_name: str = 'target_view'
- _check_methods: list = ['GET', 'POST']
- def __init__(self, **kwargs):
- super().__init__(**kwargs)
- self.check_members()
- def check_members(self) -> None:
- class_members = [
- member for _, member in inspect.getmembers(self)
- if inspect.isclass(member) and issubclass(member, WizardMemberView)
- ]
- for member in class_members:
- member_unique_name = member.unique_name
- if not hasattr(self, member_unique_name):
- setattr(self, member_unique_name, member)
- else:
- raise RuntimeError(
- 'Атрибут "unique_name" : "%s" дочерних элементов должен быть уникальным в '
- 'пределах %s' % (member_unique_name, self.__class__.__name__)
- )
- def dispatch(self, request, *args, **kwargs):
- member_view_response = self._get_member_view_response()
- if member_view_response:
- response = member_view_response
- else:
- response = super().dispatch(request, *args, **kwargs)
- return response
- def _get_member_view_response(self) -> WizardMemberView:
- # get view name from view-method "QueryDict" data
- member_view_unique_name = None
- for method in self._check_methods:
- query_dict = getattr(self.request, method, None)
- if query_dict:
- member_view_unique_name = query_dict.get(self._view_lookup_name)
- if member_view_unique_name:
- break
- # get view response
- member_view_response = None
- if member_view_unique_name:
- target_view_class = getattr(self, member_view_unique_name, None)
- if target_view_class:
- member_view_response = target_view_class.as_view()
- return member_view_response
- class WizardView(WizardBaseView):
- """
- """
- class FirstStep(WizardMemberView):
- pass
- class SecondStep(WizardMemberView):
- pass
- class ThirdStep(WizardMemberView):
- pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement