formsbuttons.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. from django.contrib import messages
  2. from django.db import transaction
  3. from django.shortcuts import redirect
  4. from misago.admin.views.generic.base import AdminView
  5. class TargetedView(AdminView):
  6. def check_permissions(self, request, target):
  7. pass
  8. def get_target(self, kwargs):
  9. if len(kwargs) == 1:
  10. select_for_update = self.get_model().objects.select_for_update()
  11. return select_for_update.get(pk=kwargs[kwargs.keys()[0]])
  12. else:
  13. return self.get_model()()
  14. def get_target_or_none(self, request, kwargs):
  15. try:
  16. return self.get_target(kwargs)
  17. except self.get_model().DoesNotExist:
  18. return None
  19. def dispatch(self, request, *args, **kwargs):
  20. with transaction.atomic():
  21. target = self.get_target_or_none(request, kwargs)
  22. if not target:
  23. messages.error(request, self.message_404)
  24. return redirect(self.root_link)
  25. error = self.check_permissions(request, target)
  26. if error:
  27. messages.error(request, error)
  28. return redirect(self.root_link)
  29. return self.real_dispatch(request, target)
  30. def real_dispatch(self, request, target):
  31. pass
  32. class FormView(TargetedView):
  33. Form = None
  34. template = 'form.html'
  35. def create_form_type(self, request):
  36. return self.Form
  37. def initialize_form(self, FormType, request):
  38. if request.method == 'POST':
  39. return FormType(request.POST, request.FILES)
  40. else:
  41. return FormType()
  42. def handle_form(self, form, request):
  43. raise NotImplementedError(
  44. "You have to define your own handle_form method to handle "
  45. "form submissions.")
  46. def real_dispatch(self, request, target):
  47. FormType = self.create_form_type(request)
  48. form = self.initialize_form(FormType, request)
  49. if request.method == 'POST' and form.is_valid():
  50. response = self.handle_form(form, request)
  51. if response:
  52. return response
  53. elif 'stay' in request.POST:
  54. return redirect(request.path)
  55. else:
  56. return redirect(self.root_link)
  57. return self.render(request, {'form': form})
  58. class ModelFormView(FormView):
  59. message_submit = None
  60. def create_form_type(self, request, target):
  61. return self.Form
  62. def initialize_form(self, FormType, request, target):
  63. if request.method == 'POST':
  64. return FormType(request.POST, request.FILES, instance=target)
  65. else:
  66. return FormType(instance=target)
  67. def handle_form(self, form, request, target):
  68. form.instance.save()
  69. if self.message_submit:
  70. messages.success(request, self.message_submit % target.name)
  71. def real_dispatch(self, request, target):
  72. FormType = self.create_form_type(request, target)
  73. form = self.initialize_form(FormType, request, target)
  74. if request.method == 'POST' and form.is_valid():
  75. response = self.handle_form(form, request, target)
  76. if response:
  77. return response
  78. elif 'stay' in request.POST:
  79. return redirect(request.path)
  80. else:
  81. return redirect(self.root_link)
  82. return self.render(request, {'form': form, 'target': target})
  83. class ButtonView(TargetedView):
  84. def real_dispatch(self, request, target):
  85. if request.method == 'POST':
  86. new_response = self.button_action(request, target)
  87. if new_response:
  88. return new_response
  89. return redirect(self.root_link)
  90. def button_action(self, request, target):
  91. raise NotImplementedError("You have to define custom button_action.")