Browse Source

Centralize DB settings in misago.conf

rafalp 6 years ago
parent
commit
83a979e605

+ 41 - 0
misago/conf/admin/__init__.py

@@ -2,6 +2,11 @@ from django.conf.urls import url
 from django.utils.translation import gettext_lazy as _
 from django.utils.translation import gettext_lazy as _
 
 
 from .views import index
 from .views import index
+from .views import (
+    ChangeCaptchaSettingsView,
+    ChangeGeneralSettingsView,
+    ChangeUsersSettingsView,
+)
 
 
 
 
 class MisagoAdminExtension:
 class MisagoAdminExtension:
@@ -10,6 +15,16 @@ class MisagoAdminExtension:
 
 
         urlpatterns.patterns("settings", url(r"^$", index, name="index"))
         urlpatterns.patterns("settings", url(r"^$", index, name="index"))
 
 
+        urlpatterns.single_pattern(
+            r"^captcha/", "captcha", "settings", ChangeCaptchaSettingsView.as_view()
+        )
+        urlpatterns.single_pattern(
+            r"^general/", "general", "settings", ChangeGeneralSettingsView.as_view()
+        )
+        urlpatterns.single_pattern(
+            r"^users/", "users", "settings", ChangeUsersSettingsView.as_view()
+        )
+
     def register_navigation_nodes(self, site):
     def register_navigation_nodes(self, site):
         site.add_node(
         site.add_node(
             name=_("Settings"),
             name=_("Settings"),
@@ -17,3 +32,29 @@ class MisagoAdminExtension:
             after="themes:index",
             after="themes:index",
             namespace="settings",
             namespace="settings",
         )
         )
+
+        site.add_node(
+            name=_("General"),
+            description=_("Change forum details like name, description or footer."),
+            parent="settings",
+            namespace="general",
+        )
+
+        site.add_node(
+            name=_("Users"),
+            description=_(
+                "Customize user accounts default behaviour and features availability."
+            ),
+            parent="settings",
+            namespace="users",
+            after="general:index",
+        )
+        site.add_node(
+            name=_("Captcha"),
+            description=_(
+                "Setup protection against automatic registrations on the site."
+            ),
+            parent="settings",
+            namespace="captcha",
+            after="users:index",
+        )

+ 223 - 0
misago/conf/admin/forms.py

@@ -1,5 +1,7 @@
 from django import forms
 from django import forms
+from django.utils.translation import gettext_lazy as _
 
 
+from ...admin.forms import YesNoSwitch
 from ..cache import clear_settings_cache
 from ..cache import clear_settings_cache
 
 
 
 
@@ -22,3 +24,224 @@ class ChangeSettingsForm(forms.Form):
 
 
     def clear_cache(self):
     def clear_cache(self):
         clear_settings_cache()
         clear_settings_cache()
+
+
+class ChangeCaptchaSettingsForm(ChangeSettingsForm):
+    settings = [
+        "captcha_type",
+        "recaptcha_site_key",
+        "recaptcha_secret_key",
+        "qa_question",
+        "qa_help_text",
+        "qa_answers",
+    ]
+
+    captcha_type = forms.ChoiceField(
+        label=_("Enable CAPTCHA"),
+        choices=[
+            ("no", _("No CAPTCHA")),
+            ("re", _("reCaptcha")),
+            ("qa", _("Question and answer")),
+        ],
+        widget=forms.RadioSelect(),
+    )
+    recaptcha_site_key = forms.CharField(
+        label=_("Site key"), max_length=100, required=False
+    )
+    recaptcha_secret_key = forms.CharField(
+        label=_("Secret key"), max_length=100, required=False
+    )
+    qa_question = forms.CharField(
+        label=_("Test question"), max_length=100, required=False
+    )
+    qa_help_text = forms.CharField(
+        label=_("Question help text"), max_length=250, required=False
+    )
+    qa_answers = forms.CharField(
+        label=_("Valid answers"),
+        help_text=_("Enter each answer in new line. Answers are case-insensitive."),
+        widget=forms.Textarea({"rows": 4}),
+        max_length=250,
+        required=False,
+    )
+
+    def clean(self):
+        cleaned_data = super().clean()
+
+        if cleaned_data.get("captcha_type") == "re":
+            if not cleaned_data.get("recaptcha_site_key"):
+                self.add_error(
+                    "recaptcha_site_key",
+                    _(
+                        "You need to enter site key if "
+                        "selected CAPTCHA type is reCaptcha."
+                    ),
+                )
+
+            if not cleaned_data.get("recaptcha_secret_key"):
+                self.add_error(
+                    "recaptcha_secret_key",
+                    _(
+                        "You need to enter secret key if "
+                        "selected CAPTCHA type is reCaptcha."
+                    ),
+                )
+
+        if cleaned_data.get("captcha_type") == "qa":
+            if not cleaned_data.get("qa_question"):
+                self.add_error(
+                    "qa_question",
+                    _("You need to set question if selected CAPTCHA type is Q&A."),
+                )
+
+            if not cleaned_data.get("qa_answers"):
+                self.add_error(
+                    "qa_answers",
+                    _(
+                        "You need to set question answers if "
+                        "selected CAPTCHA type is Q&A."
+                    ),
+                )
+
+        return cleaned_data
+
+
+class ChangeGeneralSettingsForm(ChangeSettingsForm):
+    settings = [
+        "forum_name",
+        "forum_index_title",
+        "forum_index_meta_description",
+        "forum_branding_display",
+        "forum_branding_text",
+        "forum_footnote",
+        "email_footer",
+    ]
+
+    forum_name = forms.CharField(label=_("Forum name"), min_length=2, max_length=255)
+    forum_index_title = forms.CharField(
+        label=_("Title"),
+        help_text=_("You may set a custom title on forum index by typing it here."),
+        max_length=255,
+        required=False,
+    )
+    forum_index_meta_description = forms.CharField(
+        label=_("Meta Description"),
+        help_text=_("Short description of your forum for internet crawlers."),
+        max_length=255,
+        required=False,
+    )
+    forum_branding_display = YesNoSwitch(
+        label=_("Display branding"), help_text=_("Switch branding in forum's navbar.")
+    )
+    forum_branding_text = forms.CharField(
+        label=_("Branding text"),
+        help_text=_("Optional text displayed besides brand image in navbar."),
+        max_length=255,
+        required=False,
+    )
+    forum_footnote = forms.CharField(
+        label=_("Forum footnote"),
+        help_text=_("Short message displayed in forum footer."),
+        max_length=300,
+        required=False,
+    )
+    email_footer = forms.CharField(
+        label=_("E-mails footer"),
+        help_text=_(
+            "Optional short message included at the end of e-mails sent by forum."
+        ),
+        max_length=255,
+        required=False,
+    )
+
+
+class ChangeUsersSettingsForm(ChangeSettingsForm):
+    settings = [
+        "account_activation",
+        "allow_custom_avatars",
+        "avatar_upload_limit",
+        "default_avatar",
+        "default_gravatar_fallback",
+        "signature_length_max",
+        "subscribe_reply",
+        "subscribe_start",
+        "username_length_max",
+        "username_length_min",
+    ]
+
+    account_activation = forms.ChoiceField(
+        label=_("Require new accounts activation"),
+        choices=[
+            ("none", _("No activation required")),
+            ("user", _("Activation token sent to user e-mail")),
+            ("admin", _("Activation by administrator")),
+            ("closed", _("Disable new registrations")),
+        ],
+        widget=forms.RadioSelect(),
+    )
+    username_length_min = forms.IntegerField(
+        label=_("Minimum allowed username length"), min_value=2, max_value=20
+    )
+    username_length_max = forms.IntegerField(
+        label=_("Maximum allowed username length"), min_value=2, max_value=20
+    )
+    allow_custom_avatars = YesNoSwitch(
+        label=_("Allow custom avatar uploads"),
+        help_text=_(
+            "Turning this option off will forbid forum users from uploading custom "
+            "avatars. Good for forums adressed at young users."
+        ),
+    )
+    avatar_upload_limit = forms.IntegerField(
+        label=_("Maximum size of uploaded avatar"),
+        help_text=_("Enter maximum allowed file size (in KB) for avatar uploads."),
+        min_value=0,
+    )
+    default_avatar = forms.ChoiceField(
+        label=_("Default avatar"),
+        choices=[
+            ("dynamic", _("Individual")),
+            ("gravatar", _("Gravatar")),
+            ("gallery", _("Random avatar from gallery")),
+        ],
+        widget=forms.RadioSelect(),
+    )
+    default_gravatar_fallback = forms.ChoiceField(
+        label=_("Fallback for default gravatar"),
+        help_text=_(
+            "Select which avatar to use when user has no gravatar associated with "
+            "their e-mail address."
+        ),
+        choices=[
+            ("dynamic", _("Individual")),
+            ("gallery", _("Random avatar from gallery")),
+        ],
+        widget=forms.RadioSelect(),
+    )
+    signature_length_max = forms.IntegerField(
+        label=_("Maximum allowed signature length"), min_value=10, max_value=5000
+    )
+    subscribe_start = forms.ChoiceField(
+        label=_("Started threads"),
+        choices=[
+            ("no", _("Don't watch")),
+            ("watch", _("Put on watched threads list")),
+            (
+                "watch_email",
+                _("Put on watched threads list and e-mail user when somebody replies"),
+            ),
+        ],
+        widget=forms.RadioSelect(),
+    )
+    subscribe_reply = forms.ChoiceField(
+        label=_("Replied threads"),
+        choices=[
+            ("no", _("Don't watch")),
+            ("watch", _("Put on watched threads list")),
+            (
+                "watch_email",
+                _("Put on watched threads list and e-mail user when somebody replies"),
+            ),
+        ],
+        widget=forms.RadioSelect(),
+    )

+ 16 - 0
misago/conf/admin/tests/test_change_settings_view.py

@@ -1,5 +1,6 @@
 import pytest
 import pytest
 from django import forms
 from django import forms
+from django.urls import reverse
 
 
 from ....cache.test import assert_invalidates_cache
 from ....cache.test import assert_invalidates_cache
 from ... import SETTINGS_CACHE
 from ... import SETTINGS_CACHE
@@ -72,3 +73,18 @@ def test_view_invalidates_settings_cache_on_correct_post_request(rf, setting):
     with assert_invalidates_cache(SETTINGS_CACHE):
     with assert_invalidates_cache(SETTINGS_CACHE):
         view = View.as_view()
         view = View.as_view()
         view(rf.post("/", {setting.setting: "New Value"}))
         view(rf.post("/", {setting.setting: "New Value"}))
+
+
+def test_captcha_settings_form_renders(admin_client):
+    response = admin_client.get(reverse("misago:admin:settings:captcha:index"))
+    assert response.status_code == 200
+
+
+def test_general_settings_form_renders(admin_client):
+    response = admin_client.get(reverse("misago:admin:settings:general:index"))
+    assert response.status_code == 200
+
+
+def test_users_settings_form_renders(admin_client):
+    response = admin_client.get(reverse("misago:admin:settings:users:index"))
+    assert response.status_code == 200

+ 20 - 0
misago/conf/admin/views.py

@@ -5,6 +5,11 @@ from django.utils.translation import gettext as _
 from ...admin.views import render
 from ...admin.views import render
 from ...admin.views.generic import AdminView
 from ...admin.views.generic import AdminView
 from ..models import Setting
 from ..models import Setting
+from .forms import (
+    ChangeCaptchaSettingsForm,
+    ChangeGeneralSettingsForm,
+    ChangeUsersSettingsForm,
+)
 
 
 
 
 def index(request):
 def index(request):
@@ -47,3 +52,18 @@ class ChangeSettingsView(AdminView):
 
 
     def get_initial_form_data(self, settings):
     def get_initial_form_data(self, settings):
         return {key: setting.value for key, setting in settings.items()}
         return {key: setting.value for key, setting in settings.items()}
+
+
+class ChangeCaptchaSettingsView(ChangeSettingsView):
+    form = ChangeCaptchaSettingsForm
+    template_name = "misago/admin/conf/captcha_settings.html"
+
+
+class ChangeGeneralSettingsView(ChangeSettingsView):
+    form = ChangeGeneralSettingsForm
+    template_name = "misago/admin/conf/general_settings.html"
+
+
+class ChangeUsersSettingsView(ChangeSettingsView):
+    form = ChangeUsersSettingsForm
+    template_name = "misago/admin/conf/users_settings.html"

+ 0 - 19
misago/core/admin/__init__.py

@@ -1,19 +0,0 @@
-from django.conf.urls import url
-from django.utils.translation import gettext_lazy as _
-
-from .views import ChangeGeneralSettingsView
-
-
-class MisagoAdminExtension:
-    def register_urlpatterns(self, urlpatterns):
-        urlpatterns.single_pattern(
-            r"^general/", "general", "settings", ChangeGeneralSettingsView.as_view()
-        )
-
-    def register_navigation_nodes(self, site):
-        site.add_node(
-            name=_("General"),
-            description=_("Change forum details like name, description or footer."),
-            parent="settings",
-            namespace="general",
-        )

+ 0 - 54
misago/core/admin/forms.py

@@ -1,54 +0,0 @@
-from django import forms
-from django.utils.translation import gettext_lazy as _
-
-from ...admin.forms import YesNoSwitch
-from ...conf.admin.forms import ChangeSettingsForm
-
-
-class ChangeGeneralSettingsForm(ChangeSettingsForm):
-    settings = [
-        "forum_name",
-        "forum_index_title",
-        "forum_index_meta_description",
-        "forum_branding_display",
-        "forum_branding_text",
-        "forum_footnote",
-        "email_footer",
-    ]
-
-    forum_name = forms.CharField(label=_("Forum name"), min_length=2, max_length=255)
-    forum_index_title = forms.CharField(
-        label=_("Title"),
-        help_text=_("You may set a custom title on forum index by typing it here."),
-        max_length=255,
-        required=False,
-    )
-    forum_index_meta_description = forms.CharField(
-        label=_("Meta Description"),
-        help_text=_("Short description of your forum for internet crawlers."),
-        max_length=255,
-        required=False,
-    )
-    forum_branding_display = YesNoSwitch(
-        label=_("Display branding"), help_text=_("Switch branding in forum's navbar.")
-    )
-    forum_branding_text = forms.CharField(
-        label=_("Branding text"),
-        help_text=_("Optional text displayed besides brand image in navbar."),
-        max_length=255,
-        required=False,
-    )
-    forum_footnote = forms.CharField(
-        label=_("Forum footnote"),
-        help_text=_("Short message displayed in forum footer."),
-        max_length=300,
-        required=False,
-    )
-    email_footer = forms.CharField(
-        label=_("E-mails footer"),
-        help_text=_(
-            "Optional short message included at the end of e-mails sent by forum."
-        ),
-        max_length=255,
-        required=False,
-    )

+ 0 - 6
misago/core/admin/tests.py

@@ -1,6 +0,0 @@
-from django.urls import reverse
-
-
-def test_general_settings_form_renders(admin_client):
-    response = admin_client.get(reverse("misago:admin:settings:general:index"))
-    assert response.status_code == 200

+ 0 - 7
misago/core/admin/views.py

@@ -1,7 +0,0 @@
-from ...conf.admin.views import ChangeSettingsView
-from .forms import ChangeGeneralSettingsForm
-
-
-class ChangeGeneralSettingsView(ChangeSettingsView):
-    form = ChangeGeneralSettingsForm
-    template_name = "misago/admin/core/general_settings.html"

+ 0 - 0
misago/templates/misago/admin/users/captcha_settings.html → misago/templates/misago/admin/conf/captcha_settings.html


+ 0 - 0
misago/templates/misago/admin/core/general_settings.html → misago/templates/misago/admin/conf/general_settings.html


+ 0 - 0
misago/templates/misago/admin/users/users_settings.html → misago/templates/misago/admin/conf/users_settings.html


+ 0 - 28
misago/users/admin/__init__.py

@@ -16,7 +16,6 @@ from .views.ranks import (
     RanksList,
     RanksList,
     RankUsers,
     RankUsers,
 )
 )
-from .views.settings import ChangeCaptchaSettingsView, ChangeUsersSettingsView
 from .views.users import EditUser, NewUser, UsersList
 from .views.users import EditUser, NewUser, UsersList
 
 
 djadmin.site.register(model_or_iterable=get_user_model(), admin_class=UserAdminModel)
 djadmin.site.register(model_or_iterable=get_user_model(), admin_class=UserAdminModel)
@@ -70,14 +69,6 @@ class MisagoAdminExtension:
             url(r"^delete/(?P<pk>\d+)/$", DeleteRank.as_view(), name="delete"),
             url(r"^delete/(?P<pk>\d+)/$", DeleteRank.as_view(), name="delete"),
         )
         )
 
 
-        # Settings
-        urlpatterns.single_pattern(
-            r"^users/", "users", "settings", ChangeUsersSettingsView.as_view()
-        )
-        urlpatterns.single_pattern(
-            r"^captcha/", "captcha", "settings", ChangeCaptchaSettingsView.as_view()
-        )
-
     def register_navigation_nodes(self, site):
     def register_navigation_nodes(self, site):
         site.add_node(
         site.add_node(
             name=_("Users"), icon="fa fa-users", after="index", namespace="users"
             name=_("Users"), icon="fa fa-users", after="index", namespace="users"
@@ -98,22 +89,3 @@ class MisagoAdminExtension:
             after="users:index",
             after="users:index",
             namespace="ranks",
             namespace="ranks",
         )
         )
-
-        site.add_node(
-            name=_("Users"),
-            description=_(
-                "Customize user accounts default behaviour and features availability."
-            ),
-            parent="settings",
-            namespace="users",
-            after="general:index",
-        )
-        site.add_node(
-            name=_("Captcha"),
-            description=_(
-                "Setup protection against automatic registrations on the site."
-            ),
-            parent="settings",
-            namespace="captcha",
-            after="users:index",
-        )

+ 0 - 172
misago/users/admin/forms.py

@@ -683,175 +683,3 @@ class FilterDataDownloadsForm(forms.Form):
             )
             )
 
 
         return queryset
         return queryset
-
-
-class ChangeUsersSettingsForm(ChangeSettingsForm):
-    settings = [
-        "account_activation",
-        "allow_custom_avatars",
-        "avatar_upload_limit",
-        "default_avatar",
-        "default_gravatar_fallback",
-        "signature_length_max",
-        "subscribe_reply",
-        "subscribe_start",
-        "username_length_max",
-        "username_length_min",
-    ]
-
-    account_activation = forms.ChoiceField(
-        label=_("Require new accounts activation"),
-        choices=[
-            ("none", _("No activation required")),
-            ("user", _("Activation token sent to user e-mail")),
-            ("admin", _("Activation by administrator")),
-            ("closed", _("Disable new registrations")),
-        ],
-        widget=forms.RadioSelect(),
-    )
-    username_length_min = forms.IntegerField(
-        label=_("Minimum allowed username length"), min_value=2, max_value=20
-    )
-    username_length_max = forms.IntegerField(
-        label=_("Maximum allowed username length"), min_value=2, max_value=20
-    )
-    allow_custom_avatars = YesNoSwitch(
-        label=_("Allow custom avatar uploads"),
-        help_text=_(
-            "Turning this option off will forbid forum users from uploading custom "
-            "avatars. Good for forums adressed at young users."
-        ),
-    )
-    avatar_upload_limit = forms.IntegerField(
-        label=_("Maximum size of uploaded avatar"),
-        help_text=_("Enter maximum allowed file size (in KB) for avatar uploads."),
-        min_value=0,
-    )
-    default_avatar = forms.ChoiceField(
-        label=_("Default avatar"),
-        choices=[
-            ("dynamic", _("Individual")),
-            ("gravatar", _("Gravatar")),
-            ("gallery", _("Random avatar from gallery")),
-        ],
-        widget=forms.RadioSelect(),
-    )
-    default_gravatar_fallback = forms.ChoiceField(
-        label=_("Fallback for default gravatar"),
-        help_text=_(
-            "Select which avatar to use when user has no gravatar associated with "
-            "their e-mail address."
-        ),
-        choices=[
-            ("dynamic", _("Individual")),
-            ("gallery", _("Random avatar from gallery")),
-        ],
-        widget=forms.RadioSelect(),
-    )
-    signature_length_max = forms.IntegerField(
-        label=_("Maximum allowed signature length"), min_value=10, max_value=5000
-    )
-    subscribe_start = forms.ChoiceField(
-        label=_("Started threads"),
-        choices=[
-            ("no", _("Don't watch")),
-            ("watch", _("Put on watched threads list")),
-            (
-                "watch_email",
-                _("Put on watched threads list and e-mail user when somebody replies"),
-            ),
-        ],
-        widget=forms.RadioSelect(),
-    )
-    subscribe_reply = forms.ChoiceField(
-        label=_("Replied threads"),
-        choices=[
-            ("no", _("Don't watch")),
-            ("watch", _("Put on watched threads list")),
-            (
-                "watch_email",
-                _("Put on watched threads list and e-mail user when somebody replies"),
-            ),
-        ],
-        widget=forms.RadioSelect(),
-    )
-
-
-class ChangeCaptchaSettingsForm(ChangeSettingsForm):
-    settings = [
-        "captcha_type",
-        "recaptcha_site_key",
-        "recaptcha_secret_key",
-        "qa_question",
-        "qa_help_text",
-        "qa_answers",
-    ]
-
-    captcha_type = forms.ChoiceField(
-        label=_("Enable CAPTCHA"),
-        choices=[
-            ("no", _("No CAPTCHA")),
-            ("re", _("reCaptcha")),
-            ("qa", _("Question and answer")),
-        ],
-        widget=forms.RadioSelect(),
-    )
-    recaptcha_site_key = forms.CharField(
-        label=_("Site key"), max_length=100, required=False
-    )
-    recaptcha_secret_key = forms.CharField(
-        label=_("Secret key"), max_length=100, required=False
-    )
-    qa_question = forms.CharField(
-        label=_("Test question"), max_length=100, required=False
-    )
-    qa_help_text = forms.CharField(
-        label=_("Question help text"), max_length=250, required=False
-    )
-    qa_answers = forms.CharField(
-        label=_("Valid answers"),
-        help_text=_("Enter each answer in new line. Answers are case-insensitive."),
-        widget=forms.Textarea({"rows": 4}),
-        max_length=250,
-        required=False,
-    )
-
-    def clean(self):
-        cleaned_data = super().clean()
-
-        if cleaned_data.get("captcha_type") == "re":
-            if not cleaned_data.get("recaptcha_site_key"):
-                self.add_error(
-                    "recaptcha_site_key",
-                    _(
-                        "You need to enter site key if "
-                        "selected CAPTCHA type is reCaptcha."
-                    ),
-                )
-
-            if not cleaned_data.get("recaptcha_secret_key"):
-                self.add_error(
-                    "recaptcha_secret_key",
-                    _(
-                        "You need to enter secret key if "
-                        "selected CAPTCHA type is reCaptcha."
-                    ),
-                )
-
-        if cleaned_data.get("captcha_type") == "qa":
-            if not cleaned_data.get("qa_question"):
-                self.add_error(
-                    "qa_question",
-                    _("You need to set question if selected CAPTCHA type is Q&A."),
-                )
-
-            if not cleaned_data.get("qa_answers"):
-                self.add_error(
-                    "qa_answers",
-                    _(
-                        "You need to set question answers if "
-                        "selected CAPTCHA type is Q&A."
-                    ),
-                )
-
-        return cleaned_data

+ 0 - 11
misago/users/admin/tests/test_settings_pages.py

@@ -1,11 +0,0 @@
-from django.urls import reverse
-
-
-def test_captcha_settings_form_renders(admin_client):
-    response = admin_client.get(reverse("misago:admin:settings:captcha:index"))
-    assert response.status_code == 200
-
-
-def test_user_settings_form_renders(admin_client):
-    response = admin_client.get(reverse("misago:admin:settings:users:index"))
-    assert response.status_code == 200

+ 0 - 12
misago/users/admin/views/settings.py

@@ -1,12 +0,0 @@
-from ....conf.admin.views import ChangeSettingsView
-from ..forms import ChangeCaptchaSettingsForm, ChangeUsersSettingsForm
-
-
-class ChangeUsersSettingsView(ChangeSettingsView):
-    form = ChangeUsersSettingsForm
-    template_name = "misago/admin/users/users_settings.html"
-
-
-class ChangeCaptchaSettingsView(ChangeSettingsView):
-    form = ChangeCaptchaSettingsForm
-    template_name = "misago/admin/users/captcha_settings.html"