views.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. from django.contrib import messages
  2. from django.shortcuts import redirect
  3. from django.utils.translation import gettext as _
  4. from ...admin.views import render
  5. from ...admin.views.generic import AdminView
  6. from ..models import Setting
  7. from .forms import (
  8. ChangeCaptchaSettingsForm,
  9. ChangeGeneralSettingsForm,
  10. ChangeThreadsSettingsForm,
  11. ChangeUsersSettingsForm,
  12. )
  13. def index(request):
  14. return render(request, "misago/admin/conf/index.html")
  15. class ChangeSettingsView(AdminView):
  16. root_link = None # Unused by change config views
  17. template_name = None
  18. form_class = None
  19. def get_template_name(self):
  20. return self.template_name
  21. def dispatch(self, request, *args, **kwargs):
  22. settings = self.get_settings(self.form_class.settings)
  23. initial = self.get_initial_form_data(settings)
  24. form = self.form_class(initial=initial)
  25. if request.method == "POST":
  26. form = self.form_class(request.POST, request.FILES, initial=initial)
  27. if form.is_valid():
  28. form.save(settings)
  29. messages.success(request, _("Changes in settings have been saved!"))
  30. return redirect(request.path_info)
  31. return self.render(request, {"form": form, "form_settings": settings})
  32. def get_settings(self, form_settings):
  33. settings = {}
  34. for setting in Setting.objects.filter(setting__in=form_settings):
  35. settings[setting.setting] = setting
  36. if len(settings) != len(form_settings):
  37. not_found_settings = list(
  38. set(settings.keys()).symmetric_difference(set(form_settings))
  39. )
  40. raise ValueError(
  41. "Some of settings defined in form could not be found: %s"
  42. % (", ".join(not_found_settings))
  43. )
  44. return settings
  45. def get_initial_form_data(self, settings):
  46. return {key: setting.value for key, setting in settings.items()}
  47. class ChangeCaptchaSettingsView(ChangeSettingsView):
  48. form_class = ChangeCaptchaSettingsForm
  49. template_name = "misago/admin/conf/captcha_settings.html"
  50. class ChangeGeneralSettingsView(ChangeSettingsView):
  51. form_class = ChangeGeneralSettingsForm
  52. template_name = "misago/admin/conf/general_settings.html"
  53. class ChangeThreadsSettingsView(ChangeSettingsView):
  54. form_class = ChangeThreadsSettingsForm
  55. template_name = "misago/admin/conf/threads_settings.html"
  56. class ChangeUsersSettingsView(ChangeSettingsView):
  57. form_class = ChangeUsersSettingsForm
  58. template_name = "misago/admin/conf/users_settings.html"