Rafał Pitoń 11 лет назад
Родитель
Сommit
88bd7bbe49

+ 11 - 8
docs/developers/acls.rst

@@ -57,6 +57,9 @@ Misago checks module for following functions:
 
 Required. This function is called when change permissions form for role is being build for view. It's expected to return Form type or none, if provider is not recognizing role type (eg. there is no sense in adding profiles visibility permissions to forums role form).
 
+.. note::
+   Misago provides custom ``YesNoSwitch`` form field that renders nice "Yes/No" switch as input. This field is simple wrapper around ``TypedChoiceField`` that coerces to ``int``. If you use use it for your permissions, make sure your ACL implementation handles their values as ``1`` or ``0``, not as ``True`` or ``False``, or your forms will break!
+
 .. warning::
    Make sure that all fields in your form have initial value, or your form will make tests suite fail because it will be unable to mock POST requests to admin forms correctly.
 
@@ -119,22 +122,22 @@ Example usage is following::
 
     user_acls = [
         {
-            'can_see': False,
-            'can_hear': False,
+            'can_see': 0,
+            'can_hear': 0,
             'max_speed': 10,
             'min_age': 16,
             'speed_limit': 50,
         },
         {
-            'can_see': True,
-            'can_hear': False,
+            'can_see': 1,
+            'can_hear': 0,
             'max_speed': 40,
             'min_age': 20,
             'speed_limit': 0,
         },
         {
-            'can_see': False,
-            'can_hear': True,
+            'can_see': 0,
+            'can_hear': 1,
             'max_speed': 80,
             'min_age': 18,
             'speed_limit': 40,
@@ -142,8 +145,8 @@ Example usage is following::
     ]
 
     defaults = {
-        'can_see': False,
-        'can_hear': False,
+        'can_see': 0,
+        'can_hear': 0,
         'max_speed': 30,
         'min_age': 18,
         'speed_limit': 60,

+ 11 - 0
docs/developers/forms.rst

@@ -49,3 +49,14 @@ ModelForm
 :py:class:`misago.core.forms.ModelForm`
 
 Wrapper for :py:class:`django.forms.ModelForm` that uses AutoStripWhitespacesMixin.
+
+
+YesNoSwitch
+-----------
+
+:py:func:`misago.core.forms.YesNoSwitch`
+
+Thin wrapper around Django's ``TypedChoiceField``. This field renders nice yes/no switch as its input.
+
+.. warning::
+   ``YesNoSwitch`` coerces to ``int``, not to ``bool``! Remember about this when writing code dealing with forms containing this field!

+ 21 - 21
misago/acl/migrations/0003_default_roles.py

@@ -25,17 +25,17 @@ def create_default_roles(apps, schema_editor):
             'misago.users.permissions.account': {
                 'name_changes_allowed': 2,
                 'name_changes_expire': 180,
-                'can_have_signature': False,
-                'allow_signature_links': False,
-                'allow_signature_images': False,
+                'can_have_signature': 0,
+                'allow_signature_links': 0,
+                'allow_signature_images': 0,
             },
 
             # profiles perms
             'misago.users.permissions.profiles': {
-                'can_search_users': True,
-                'can_see_users_emails': False,
-                'can_see_users_ips': False,
-                'can_see_hidden_users': False,
+                'can_search_users': 1,
+                'can_see_users_emails': 0,
+                'can_see_users_ips': 0,
+                'can_see_hidden_users': 0,
             },
 
             # destroy users perms
@@ -53,17 +53,17 @@ def create_default_roles(apps, schema_editor):
             'misago.users.permissions.account': {
                 'name_changes_allowed': 0,
                 'name_changes_expire': 0,
-                'can_have_signature': False,
-                'allow_signature_links': False,
-                'allow_signature_images': False,
+                'can_have_signature': 0,
+                'allow_signature_links': 0,
+                'allow_signature_images': 0,
             },
 
             # profiles perms
             'misago.users.permissions.profiles': {
-                'can_search_users': True,
-                'can_see_users_emails': False,
-                'can_see_users_ips': False,
-                'can_see_hidden_users': False,
+                'can_search_users': 1,
+                'can_see_users_emails': 0,
+                'can_see_users_ips': 0,
+                'can_see_hidden_users': 0,
             },
 
             # destroy users perms
@@ -81,17 +81,17 @@ def create_default_roles(apps, schema_editor):
             'misago.users.permissions.account': {
                 'name_changes_allowed': 5,
                 'name_changes_expire': 14,
-                'can_have_signature': True,
-                'allow_signature_links': True,
-                'allow_signature_images': False,
+                'can_have_signature': 1,
+                'allow_signature_links': 1,
+                'allow_signature_images': 0,
             },
 
             # profiles perms
             'misago.users.permissions.profiles': {
-                'can_search_users': True,
-                'can_see_users_emails': True,
-                'can_see_users_ips': True,
-                'can_see_hidden_users': True,
+                'can_search_users': 1,
+                'can_see_users_emails': 1,
+                'can_see_users_ips': 1,
+                'can_see_hidden_users': 1,
             },
 
             # destroy users perms

+ 10 - 10
misago/acl/tests/test_acl_algebra.py

@@ -37,22 +37,22 @@ class SumACLTests(TestCase):
 
         test_acls = [
             {
-                'can_see': False,
-                'can_hear': False,
+                'can_see': 0,
+                'can_hear': 0,
                 'max_speed': 10,
                 'min_age': 16,
                 'speed_limit': 50,
             },
             {
-                'can_see': True,
-                'can_hear': False,
+                'can_see': 1,
+                'can_hear': 0,
                 'max_speed': 40,
                 'min_age': 20,
                 'speed_limit': 0,
             },
             {
-                'can_see': False,
-                'can_hear': True,
+                'can_see': 0,
+                'can_hear': 1,
                 'max_speed': 80,
                 'min_age': 18,
                 'speed_limit': 40,
@@ -60,8 +60,8 @@ class SumACLTests(TestCase):
         ]
 
         defaults = {
-            'can_see': False,
-            'can_hear': False,
+            'can_see': 0,
+            'can_hear': 0,
             'max_speed': 30,
             'min_age': 18,
             'speed_limit': 60,
@@ -76,8 +76,8 @@ class SumACLTests(TestCase):
             speed_limit=algebra.greater_or_zero
             )
 
-        self.assertEqual(acl['can_see'], True)
-        self.assertEqual(acl['can_hear'], True)
+        self.assertEqual(acl['can_see'], 1)
+        self.assertEqual(acl['can_hear'], 1)
         self.assertEqual(acl['max_speed'], 80)
         self.assertEqual(acl['min_age'], 16)
         self.assertEqual(acl['speed_limit'], 0)

+ 5 - 0
misago/conf/forms.py

@@ -42,6 +42,11 @@ def basic_kwargs(setting, extra):
     if setting.description:
         kwargs['help_text'] = _(setting.description)
 
+    if setting.form_field == 'yesno':
+        # YesNoSwitch is int-base and setting is bool based
+        # this means we need to do quick conversion
+        kwargs['initial'] = 1 if kwargs['initial'] else 0
+
     if kwargs['required']:
         if kwargs.get('help_text'):
             format = {'help_text': kwargs['help_text']}

+ 0 - 5
misago/core/forms.py

@@ -13,11 +13,6 @@ def YesNoSwitch(**kwargs):
     if 'initial' not in kwargs:
         kwargs['initial'] = 0
 
-    if kwargs['initial'] == True:
-        kwargs['initial'] = 1
-    if kwargs['initial'] == False:
-        kwargs['initial'] = 0
-
     return TypedChoiceField(
         coerce=int,
         choices=((1, _("Yes")), (0, _("No"))),

+ 24 - 12
misago/forums/migrations/0003_forums_roles.py

@@ -25,8 +25,10 @@ def create_default_forums_roles(apps, schema_editor):
     pickle_permissions(see_only,
         {
             # forums perms
-            'can_see': True,
-            'can_browse': False,
+            'misago.forums.permissions': {
+                'can_see': 1,
+                'can_browse': 0,
+            },
         })
     see_only.save()
 
@@ -34,8 +36,10 @@ def create_default_forums_roles(apps, schema_editor):
     pickle_permissions(read_only,
         {
             # forums perms
-            'can_see': True,
-            'can_browse': True,
+            'misago.forums.permissions': {
+                'can_see': 1,
+                'can_browse': 1,
+            },
         })
     read_only.save()
 
@@ -43,8 +47,10 @@ def create_default_forums_roles(apps, schema_editor):
     pickle_permissions(reply_only,
         {
             # forums perms
-            'can_see': True,
-            'can_browse': True,
+            'misago.forums.permissions': {
+                'can_see': 1,
+                'can_browse': 1,
+            },
         })
     reply_only.save()
 
@@ -52,8 +58,10 @@ def create_default_forums_roles(apps, schema_editor):
     pickle_permissions(standard,
         {
             # forums perms
-            'can_see': True,
-            'can_browse': True,
+            'misago.forums.permissions': {
+                'can_see': 1,
+                'can_browse': 1,
+            },
         })
     standard.save()
 
@@ -62,8 +70,10 @@ def create_default_forums_roles(apps, schema_editor):
     pickle_permissions(standard_with_polls,
         {
             # forums perms
-            'can_see': True,
-            'can_browse': True,
+            'misago.forums.permissions': {
+                'can_see': 1,
+                'can_browse': 1,
+            },
         })
     standard_with_polls.save()
 
@@ -71,8 +81,10 @@ def create_default_forums_roles(apps, schema_editor):
     pickle_permissions(moderator,
         {
             # forums perms
-            'can_see': True,
-            'can_browse': True,
+            'misago.forums.permissions': {
+                'can_see': 1,
+                'can_browse': 1,
+            },
         })
     moderator.save()
 

+ 7 - 9
misago/users/permissions/account.py

@@ -9,6 +9,7 @@ Admin Permissions Form
 """
 class PermissionsForm(forms.Form):
     legend = _("Account settings")
+
     name_changes_allowed = forms.IntegerField(
         label=_("Allowed username changes number"),
         min_value=0,
@@ -19,14 +20,11 @@ class PermissionsForm(forms.Form):
         min_value=0,
         initial=0)
     can_have_signature = forms.YesNoSwitch(
-        label=_("Can have signature"),
-        initial=False)
+        label=_("Can have signature"))
     allow_signature_links = forms.YesNoSwitch(
-        label=_("Can put links in signature"),
-        initial=False)
+        label=_("Can put links in signature"))
     allow_signature_images = forms.YesNoSwitch(
-        label=_("Can put images in signature"),
-        initial=False)
+        label=_("Can put images in signature"))
 
 
 def change_permissions_form(role):
@@ -43,9 +41,9 @@ def build_acl(acl, roles, key_name):
     new_acl = {
         'name_changes_allowed': 0,
         'name_changes_expire': 0,
-        'can_have_signature': False,
-        'allow_signature_links': False,
-        'allow_signature_images': False,
+        'can_have_signature': 0,
+        'allow_signature_links': 0,
+        'allow_signature_images': 0,
     }
     new_acl.update(acl)
 

+ 1 - 0
misago/users/permissions/destroying.py

@@ -9,6 +9,7 @@ Admin Permissions Form
 """
 class PermissionsForm(forms.Form):
     legend = _("Destroying user accounts")
+
     can_destroy_user_newer_than = forms.IntegerField(
         label=_("Maximum age of destroyed account (in days)"),
         help_text=_("Enter zero to disable this check."),

+ 6 - 5
misago/users/permissions/profiles.py

@@ -9,9 +9,10 @@ Admin Permissions Form
 """
 class PermissionsForm(forms.Form):
     legend = _("User profiles")
+
     can_search_users = forms.YesNoSwitch(
         label=_("Can search user profiles"),
-        initial=True)
+        initial=1)
     can_see_users_emails = forms.YesNoSwitch(
         label=_("Can see members e-mails"))
     can_see_users_ips = forms.YesNoSwitch(
@@ -32,10 +33,10 @@ ACL Builder
 """
 def build_acl(acl, roles, key_name):
     new_acl = {
-        'can_search_users': False,
-        'can_see_users_emails': False,
-        'can_see_users_ips': False,
-        'can_see_hidden_users': False,
+        'can_search_users': 0,
+        'can_see_users_emails': 0,
+        'can_see_users_ips': 0,
+        'can_see_hidden_users': 0,
     }
     new_acl.update(acl)