Browse Source

YesNoSwitch handling cleanup.

Rafał Pitoń 11 years ago
parent
commit
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).
 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::
 .. 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.
    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 = [
     user_acls = [
         {
         {
-            'can_see': False,
-            'can_hear': False,
+            'can_see': 0,
+            'can_hear': 0,
             'max_speed': 10,
             'max_speed': 10,
             'min_age': 16,
             'min_age': 16,
             'speed_limit': 50,
             'speed_limit': 50,
         },
         },
         {
         {
-            'can_see': True,
-            'can_hear': False,
+            'can_see': 1,
+            'can_hear': 0,
             'max_speed': 40,
             'max_speed': 40,
             'min_age': 20,
             'min_age': 20,
             'speed_limit': 0,
             'speed_limit': 0,
         },
         },
         {
         {
-            'can_see': False,
-            'can_hear': True,
+            'can_see': 0,
+            'can_hear': 1,
             'max_speed': 80,
             'max_speed': 80,
             'min_age': 18,
             'min_age': 18,
             'speed_limit': 40,
             'speed_limit': 40,
@@ -142,8 +145,8 @@ Example usage is following::
     ]
     ]
 
 
     defaults = {
     defaults = {
-        'can_see': False,
-        'can_hear': False,
+        'can_see': 0,
+        'can_hear': 0,
         'max_speed': 30,
         'max_speed': 30,
         'min_age': 18,
         'min_age': 18,
         'speed_limit': 60,
         'speed_limit': 60,

+ 11 - 0
docs/developers/forms.rst

@@ -49,3 +49,14 @@ ModelForm
 :py:class:`misago.core.forms.ModelForm`
 :py:class:`misago.core.forms.ModelForm`
 
 
 Wrapper for :py:class:`django.forms.ModelForm` that uses AutoStripWhitespacesMixin.
 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': {
             'misago.users.permissions.account': {
                 'name_changes_allowed': 2,
                 'name_changes_allowed': 2,
                 'name_changes_expire': 180,
                 '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
             # profiles perms
             'misago.users.permissions.profiles': {
             '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
             # destroy users perms
@@ -53,17 +53,17 @@ def create_default_roles(apps, schema_editor):
             'misago.users.permissions.account': {
             'misago.users.permissions.account': {
                 'name_changes_allowed': 0,
                 'name_changes_allowed': 0,
                 'name_changes_expire': 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
             # profiles perms
             'misago.users.permissions.profiles': {
             '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
             # destroy users perms
@@ -81,17 +81,17 @@ def create_default_roles(apps, schema_editor):
             'misago.users.permissions.account': {
             'misago.users.permissions.account': {
                 'name_changes_allowed': 5,
                 'name_changes_allowed': 5,
                 'name_changes_expire': 14,
                 '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
             # profiles perms
             'misago.users.permissions.profiles': {
             '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
             # destroy users perms

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

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

+ 5 - 0
misago/conf/forms.py

@@ -42,6 +42,11 @@ def basic_kwargs(setting, extra):
     if setting.description:
     if setting.description:
         kwargs['help_text'] = _(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['required']:
         if kwargs.get('help_text'):
         if kwargs.get('help_text'):
             format = {'help_text': kwargs['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:
     if 'initial' not in kwargs:
         kwargs['initial'] = 0
         kwargs['initial'] = 0
 
 
-    if kwargs['initial'] == True:
-        kwargs['initial'] = 1
-    if kwargs['initial'] == False:
-        kwargs['initial'] = 0
-
     return TypedChoiceField(
     return TypedChoiceField(
         coerce=int,
         coerce=int,
         choices=((1, _("Yes")), (0, _("No"))),
         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,
     pickle_permissions(see_only,
         {
         {
             # forums perms
             # forums perms
-            'can_see': True,
-            'can_browse': False,
+            'misago.forums.permissions': {
+                'can_see': 1,
+                'can_browse': 0,
+            },
         })
         })
     see_only.save()
     see_only.save()
 
 
@@ -34,8 +36,10 @@ def create_default_forums_roles(apps, schema_editor):
     pickle_permissions(read_only,
     pickle_permissions(read_only,
         {
         {
             # forums perms
             # forums perms
-            'can_see': True,
-            'can_browse': True,
+            'misago.forums.permissions': {
+                'can_see': 1,
+                'can_browse': 1,
+            },
         })
         })
     read_only.save()
     read_only.save()
 
 
@@ -43,8 +47,10 @@ def create_default_forums_roles(apps, schema_editor):
     pickle_permissions(reply_only,
     pickle_permissions(reply_only,
         {
         {
             # forums perms
             # forums perms
-            'can_see': True,
-            'can_browse': True,
+            'misago.forums.permissions': {
+                'can_see': 1,
+                'can_browse': 1,
+            },
         })
         })
     reply_only.save()
     reply_only.save()
 
 
@@ -52,8 +58,10 @@ def create_default_forums_roles(apps, schema_editor):
     pickle_permissions(standard,
     pickle_permissions(standard,
         {
         {
             # forums perms
             # forums perms
-            'can_see': True,
-            'can_browse': True,
+            'misago.forums.permissions': {
+                'can_see': 1,
+                'can_browse': 1,
+            },
         })
         })
     standard.save()
     standard.save()
 
 
@@ -62,8 +70,10 @@ def create_default_forums_roles(apps, schema_editor):
     pickle_permissions(standard_with_polls,
     pickle_permissions(standard_with_polls,
         {
         {
             # forums perms
             # forums perms
-            'can_see': True,
-            'can_browse': True,
+            'misago.forums.permissions': {
+                'can_see': 1,
+                'can_browse': 1,
+            },
         })
         })
     standard_with_polls.save()
     standard_with_polls.save()
 
 
@@ -71,8 +81,10 @@ def create_default_forums_roles(apps, schema_editor):
     pickle_permissions(moderator,
     pickle_permissions(moderator,
         {
         {
             # forums perms
             # forums perms
-            'can_see': True,
-            'can_browse': True,
+            'misago.forums.permissions': {
+                'can_see': 1,
+                'can_browse': 1,
+            },
         })
         })
     moderator.save()
     moderator.save()
 
 

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

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

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

@@ -9,6 +9,7 @@ Admin Permissions Form
 """
 """
 class PermissionsForm(forms.Form):
 class PermissionsForm(forms.Form):
     legend = _("Destroying user accounts")
     legend = _("Destroying user accounts")
+
     can_destroy_user_newer_than = forms.IntegerField(
     can_destroy_user_newer_than = forms.IntegerField(
         label=_("Maximum age of destroyed account (in days)"),
         label=_("Maximum age of destroyed account (in days)"),
         help_text=_("Enter zero to disable this check."),
         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):
 class PermissionsForm(forms.Form):
     legend = _("User profiles")
     legend = _("User profiles")
+
     can_search_users = forms.YesNoSwitch(
     can_search_users = forms.YesNoSwitch(
         label=_("Can search user profiles"),
         label=_("Can search user profiles"),
-        initial=True)
+        initial=1)
     can_see_users_emails = forms.YesNoSwitch(
     can_see_users_emails = forms.YesNoSwitch(
         label=_("Can see members e-mails"))
         label=_("Can see members e-mails"))
     can_see_users_ips = forms.YesNoSwitch(
     can_see_users_ips = forms.YesNoSwitch(
@@ -32,10 +33,10 @@ ACL Builder
 """
 """
 def build_acl(acl, roles, key_name):
 def build_acl(acl, roles, key_name):
     new_acl = {
     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)
     new_acl.update(acl)