forms.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. from django import forms
  2. from django.utils.translation import gettext_lazy as _
  3. from ...admin.forms import YesNoSwitch
  4. from ..cache import clear_settings_cache
  5. class ChangeSettingsForm(forms.Form):
  6. settings = []
  7. def save(self, settings):
  8. self.save_settings(settings)
  9. self.clear_cache()
  10. def save_settings(self, settings):
  11. for setting in self.settings:
  12. setting_obj = settings[setting]
  13. new_value = self.cleaned_data.get(setting)
  14. self.save_setting(setting_obj, new_value)
  15. def save_setting(self, setting, value):
  16. setting.value = value
  17. setting.save()
  18. def clear_cache(self):
  19. clear_settings_cache()
  20. class ChangeCaptchaSettingsForm(ChangeSettingsForm):
  21. settings = [
  22. "captcha_type",
  23. "recaptcha_site_key",
  24. "recaptcha_secret_key",
  25. "qa_question",
  26. "qa_help_text",
  27. "qa_answers",
  28. ]
  29. captcha_type = forms.ChoiceField(
  30. label=_("Enable CAPTCHA"),
  31. choices=[
  32. ("no", _("No CAPTCHA")),
  33. ("re", _("reCaptcha")),
  34. ("qa", _("Question and answer")),
  35. ],
  36. widget=forms.RadioSelect(),
  37. )
  38. recaptcha_site_key = forms.CharField(
  39. label=_("Site key"), max_length=100, required=False
  40. )
  41. recaptcha_secret_key = forms.CharField(
  42. label=_("Secret key"), max_length=100, required=False
  43. )
  44. qa_question = forms.CharField(
  45. label=_("Test question"), max_length=100, required=False
  46. )
  47. qa_help_text = forms.CharField(
  48. label=_("Question help text"), max_length=250, required=False
  49. )
  50. qa_answers = forms.CharField(
  51. label=_("Valid answers"),
  52. help_text=_("Enter each answer in new line. Answers are case-insensitive."),
  53. widget=forms.Textarea({"rows": 4}),
  54. max_length=250,
  55. required=False,
  56. )
  57. def clean(self):
  58. cleaned_data = super().clean()
  59. if cleaned_data.get("captcha_type") == "re":
  60. if not cleaned_data.get("recaptcha_site_key"):
  61. self.add_error(
  62. "recaptcha_site_key",
  63. _(
  64. "You need to enter site key if "
  65. "selected CAPTCHA type is reCaptcha."
  66. ),
  67. )
  68. if not cleaned_data.get("recaptcha_secret_key"):
  69. self.add_error(
  70. "recaptcha_secret_key",
  71. _(
  72. "You need to enter secret key if "
  73. "selected CAPTCHA type is reCaptcha."
  74. ),
  75. )
  76. if cleaned_data.get("captcha_type") == "qa":
  77. if not cleaned_data.get("qa_question"):
  78. self.add_error(
  79. "qa_question",
  80. _("You need to set question if selected CAPTCHA type is Q&A."),
  81. )
  82. if not cleaned_data.get("qa_answers"):
  83. self.add_error(
  84. "qa_answers",
  85. _(
  86. "You need to set question answers if "
  87. "selected CAPTCHA type is Q&A."
  88. ),
  89. )
  90. return cleaned_data
  91. class ChangeGeneralSettingsForm(ChangeSettingsForm):
  92. settings = [
  93. "forum_name",
  94. "forum_index_title",
  95. "forum_index_meta_description",
  96. "forum_branding_display",
  97. "forum_branding_text",
  98. "forum_footnote",
  99. "email_footer",
  100. ]
  101. forum_name = forms.CharField(label=_("Forum name"), min_length=2, max_length=255)
  102. forum_index_title = forms.CharField(
  103. label=_("Title"),
  104. help_text=_("You may set a custom title on forum index by typing it here."),
  105. max_length=255,
  106. required=False,
  107. )
  108. forum_index_meta_description = forms.CharField(
  109. label=_("Meta Description"),
  110. help_text=_("Short description of your forum for internet crawlers."),
  111. max_length=255,
  112. required=False,
  113. )
  114. forum_branding_display = YesNoSwitch(
  115. label=_("Display branding"), help_text=_("Switch branding in forum's navbar.")
  116. )
  117. forum_branding_text = forms.CharField(
  118. label=_("Branding text"),
  119. help_text=_("Optional text displayed besides brand image in navbar."),
  120. max_length=255,
  121. required=False,
  122. )
  123. forum_footnote = forms.CharField(
  124. label=_("Forum footnote"),
  125. help_text=_("Short message displayed in forum footer."),
  126. max_length=300,
  127. required=False,
  128. )
  129. email_footer = forms.CharField(
  130. label=_("E-mails footer"),
  131. help_text=_(
  132. "Optional short message included at the end of e-mails sent by forum."
  133. ),
  134. max_length=255,
  135. required=False,
  136. )
  137. class ChangeThreadsSettingsForm(ChangeSettingsForm):
  138. settings = [
  139. "post_length_max",
  140. "post_length_min",
  141. "thread_title_length_max",
  142. "thread_title_length_min",
  143. ]
  144. post_length_max = forms.IntegerField(
  145. label=_("Maximum allowed post length"), min_value=0
  146. )
  147. post_length_min = forms.IntegerField(
  148. label=_("Minimum required post length"), min_value=1
  149. )
  150. thread_title_length_max = forms.IntegerField(
  151. label=_("Maximum allowed thread title length"), min_value=2, max_value=255
  152. )
  153. thread_title_length_min = forms.IntegerField(
  154. label=_("Minimum required thread title length"), min_value=2, max_value=255
  155. )
  156. class ChangeUsersSettingsForm(ChangeSettingsForm):
  157. settings = [
  158. "account_activation",
  159. "allow_custom_avatars",
  160. "avatar_upload_limit",
  161. "default_avatar",
  162. "default_gravatar_fallback",
  163. "signature_length_max",
  164. "subscribe_reply",
  165. "subscribe_start",
  166. "username_length_max",
  167. "username_length_min",
  168. ]
  169. account_activation = forms.ChoiceField(
  170. label=_("Require new accounts activation"),
  171. choices=[
  172. ("none", _("No activation required")),
  173. ("user", _("Activation token sent to user e-mail")),
  174. ("admin", _("Activation by administrator")),
  175. ("closed", _("Disable new registrations")),
  176. ],
  177. widget=forms.RadioSelect(),
  178. )
  179. username_length_min = forms.IntegerField(
  180. label=_("Minimum allowed username length"), min_value=2, max_value=20
  181. )
  182. username_length_max = forms.IntegerField(
  183. label=_("Maximum allowed username length"), min_value=2, max_value=20
  184. )
  185. allow_custom_avatars = YesNoSwitch(
  186. label=_("Allow custom avatar uploads"),
  187. help_text=_(
  188. "Turning this option off will forbid forum users from uploading custom "
  189. "avatars. Good for forums adressed at young users."
  190. ),
  191. )
  192. avatar_upload_limit = forms.IntegerField(
  193. label=_("Maximum size of uploaded avatar"),
  194. help_text=_("Enter maximum allowed file size (in KB) for avatar uploads."),
  195. min_value=0,
  196. )
  197. default_avatar = forms.ChoiceField(
  198. label=_("Default avatar"),
  199. choices=[
  200. ("dynamic", _("Individual")),
  201. ("gravatar", _("Gravatar")),
  202. ("gallery", _("Random avatar from gallery")),
  203. ],
  204. widget=forms.RadioSelect(),
  205. )
  206. default_gravatar_fallback = forms.ChoiceField(
  207. label=_("Fallback for default gravatar"),
  208. help_text=_(
  209. "Select which avatar to use when user has no gravatar associated with "
  210. "their e-mail address."
  211. ),
  212. choices=[
  213. ("dynamic", _("Individual")),
  214. ("gallery", _("Random avatar from gallery")),
  215. ],
  216. widget=forms.RadioSelect(),
  217. )
  218. signature_length_max = forms.IntegerField(
  219. label=_("Maximum allowed signature length"), min_value=10, max_value=5000
  220. )
  221. subscribe_start = forms.ChoiceField(
  222. label=_("Started threads"),
  223. choices=[
  224. ("no", _("Don't watch")),
  225. ("watch", _("Put on watched threads list")),
  226. (
  227. "watch_email",
  228. _("Put on watched threads list and e-mail user when somebody replies"),
  229. ),
  230. ],
  231. widget=forms.RadioSelect(),
  232. )
  233. subscribe_reply = forms.ChoiceField(
  234. label=_("Replied threads"),
  235. choices=[
  236. ("no", _("Don't watch")),
  237. ("watch", _("Put on watched threads list")),
  238. (
  239. "watch_email",
  240. _("Put on watched threads list and e-mail user when somebody replies"),
  241. ),
  242. ],
  243. widget=forms.RadioSelect(),
  244. )