123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- from django.contrib import messages
- from django.db import transaction
- from django.shortcuts import redirect
- from misago.admin.views.generic.base import AdminView
- class TargetedView(AdminView):
- def check_permissions(self, request, target):
- pass
- def get_target(self, kwargs):
- if len(kwargs) == 1:
- select_for_update = self.get_model().objects.select_for_update()
- return select_for_update.get(pk=kwargs[kwargs.keys()[0]])
- else:
- return self.get_model()()
- def get_target_or_none(self, request, kwargs):
- try:
- return self.get_target(kwargs)
- except self.get_model().DoesNotExist:
- return None
- def dispatch(self, request, *args, **kwargs):
- with transaction.atomic():
- target = self.get_target_or_none(request, kwargs)
- if not target:
- messages.error(request, self.message_404)
- return redirect(self.root_link)
- error = self.check_permissions(request, target)
- if error:
- messages.error(request, error)
- return redirect(self.root_link)
- return self.real_dispatch(request, target)
- def real_dispatch(self, request, target):
- pass
- class FormView(TargetedView):
- Form = None
- template = 'form.html'
- def create_form_type(self, request):
- return self.Form
- def initialize_form(self, FormType, request):
- if request.method == 'POST':
- return FormType(request.POST, request.FILES)
- else:
- return FormType()
- def handle_form(self, form, request):
- raise NotImplementedError(
- "You have to define your own handle_form method to handle "
- "form submissions.")
- def real_dispatch(self, request, target):
- FormType = self.create_form_type(request)
- form = self.initialize_form(FormType, request)
- if request.method == 'POST' and form.is_valid():
- response = self.handle_form(form, request)
- if response:
- return response
- elif 'stay' in request.POST:
- return redirect(request.path)
- else:
- return redirect(self.root_link)
- return self.render(request, {'form': form})
- class ModelFormView(FormView):
- message_submit = None
- def create_form_type(self, request, target):
- return self.Form
- def initialize_form(self, FormType, request, target):
- if request.method == 'POST':
- return FormType(request.POST, request.FILES, instance=target)
- else:
- return FormType(instance=target)
- def handle_form(self, form, request, target):
- form.instance.save()
- if self.message_submit:
- messages.success(request, self.message_submit % target.name)
- def real_dispatch(self, request, target):
- FormType = self.create_form_type(request, target)
- form = self.initialize_form(FormType, request, target)
- if request.method == 'POST' and form.is_valid():
- response = self.handle_form(form, request, target)
- if response:
- return response
- elif 'stay' in request.POST:
- return redirect(request.path)
- else:
- return redirect(self.root_link)
- return self.render(request, {'form': form, 'target': target})
- class ButtonView(TargetedView):
- def real_dispatch(self, request, target):
- if request.method == 'POST':
- new_response = self.button_action(request, target)
- if new_response:
- return new_response
- return redirect(self.root_link)
- def button_action(self, request, target):
- raise NotImplementedError("You have to define custom button_action.")
|