views.py 2.8 KB

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