views.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. ChangeAnalyticsSettingsForm,
  9. ChangeCaptchaSettingsForm,
  10. ChangeGeneralSettingsForm,
  11. ChangeOAuth2SettingsForm,
  12. ChangeThreadsSettingsForm,
  13. ChangeUsersSettingsForm,
  14. )
  15. def index(request):
  16. return render(request, "misago/admin/conf/index.html")
  17. class ChangeSettingsView(AdminView):
  18. root_link = None # Unused by change config views
  19. template_name = None
  20. form_class = None
  21. def get_template_name(self, request):
  22. return self.template_name
  23. def dispatch(self, request, *args, **kwargs):
  24. settings = self.get_settings(self.form_class.settings)
  25. initial = self.get_initial_form_data(settings)
  26. form = self.form_class(request=request, initial=initial)
  27. if request.method == "POST":
  28. form = self.form_class(
  29. request.POST, request.FILES, request=request, initial=initial
  30. )
  31. if form.is_valid():
  32. form.save(settings)
  33. messages.success(request, _("Settings have been saved."))
  34. return redirect(request.path_info)
  35. return self.render(request, {"form": form, "form_settings": settings})
  36. def get_settings(self, form_settings):
  37. settings = {}
  38. for setting in Setting.objects.filter(setting__in=form_settings):
  39. settings[setting.setting] = setting
  40. if len(settings) != len(form_settings):
  41. not_found_settings = list(
  42. set(settings.keys()).symmetric_difference(set(form_settings))
  43. )
  44. raise ValueError(
  45. "Some of settings defined in form could not be found: %s"
  46. % (", ".join(not_found_settings))
  47. )
  48. return settings
  49. def get_initial_form_data(self, settings):
  50. return {key: setting.value for key, setting in settings.items()}
  51. class ChangeAnalyticsSettingsView(ChangeSettingsView):
  52. form_class = ChangeAnalyticsSettingsForm
  53. template_name = "misago/admin/conf/analytics_settings.html"
  54. class ChangeCaptchaSettingsView(ChangeSettingsView):
  55. form_class = ChangeCaptchaSettingsForm
  56. template_name = "misago/admin/conf/captcha_settings.html"
  57. class ChangeGeneralSettingsView(ChangeSettingsView):
  58. form_class = ChangeGeneralSettingsForm
  59. template_name = "misago/admin/conf/general_settings.html"
  60. class ChangeOAuth2SettingsView(ChangeSettingsView):
  61. form_class = ChangeOAuth2SettingsForm
  62. template_name = "misago/admin/conf/oauth2_settings.html"
  63. class ChangeThreadsSettingsView(ChangeSettingsView):
  64. form_class = ChangeThreadsSettingsForm
  65. template_name = "misago/admin/conf/threads_settings.html"
  66. class ChangeUsersSettingsView(ChangeSettingsView):
  67. form_class = ChangeUsersSettingsForm
  68. template_name = "misago/admin/conf/users_settings.html"