[Checkins] SVN: AccessControl/trunk/src/AccessControl/ decorators for public, private, protected

Florian Friesdorf flo at chaoflow.net
Thu Nov 17 03:25:09 UTC 2011


Log message for revision 123398:
  decorators for public, private, protected

Changed:
  U   AccessControl/trunk/src/AccessControl/SecurityInfo.py
  U   AccessControl/trunk/src/AccessControl/tests/testClassSecurityInfo.py

-=-
Modified: AccessControl/trunk/src/AccessControl/SecurityInfo.py
===================================================================
--- AccessControl/trunk/src/AccessControl/SecurityInfo.py	2011-11-17 03:25:00 UTC (rev 123397)
+++ AccessControl/trunk/src/AccessControl/SecurityInfo.py	2011-11-17 03:25:08 UTC (rev 123398)
@@ -104,6 +104,26 @@
         """Declare the object to be associated with a permission."""
         self._setaccess(('',), permission_name)
 
+    public__roles__=ACCESS_PRIVATE
+    def public(self, func):
+        """Decorate a function to be publicly accessible."""
+        self.declarePublic(self, func.__name__)
+        return func
+
+    private__roles__=ACCESS_PRIVATE
+    def private(self, func):
+        """Decorate a function to be inaccessible to restricted code."""
+        self.declarePrivate(self, func.__name__)
+        return func
+
+    protected__roles__=ACCESS_PRIVATE
+    def protected(self, permission_name):
+        """Return a decorator to associate a function with a permission."""
+        def decor(func):
+            self.declareProtected(permission_name, func.__name__)
+            return func
+        return decor
+
     setPermissionDefault__roles__=ACCESS_PRIVATE
     def setPermissionDefault(self, permission_name, roles):
         """Declare default roles for a permission"""

Modified: AccessControl/trunk/src/AccessControl/tests/testClassSecurityInfo.py
===================================================================
--- AccessControl/trunk/src/AccessControl/tests/testClassSecurityInfo.py	2011-11-17 03:25:00 UTC (rev 123397)
+++ AccessControl/trunk/src/AccessControl/tests/testClassSecurityInfo.py	2011-11-17 03:25:08 UTC (rev 123398)
@@ -62,6 +62,20 @@
             def protected(self, REQUEST=None):
                 """ """
 
+            # same with decorators
+
+            @security.public
+            def public_new(self, REQUEST=None):
+                """ """
+
+            @security.private
+            def private_new(self, REQUEST=None):
+                """ """
+
+            @security.protected('Test permission')
+            def protected_new(self, REQUEST=None):
+                """ """
+
         # Do class initialization.
         InitializeClass(Test)
 
@@ -78,6 +92,21 @@
         for item in ('Manager', 'Role A', 'Role B', 'Role C'):
             self.failUnless(item in imPermissionRole)
 
+        # functions exist, i.e. decorators returned them
+        self.assertEqual(object.public_new.__name__, 'public_new')
+        self.assertEqual(object.private_new.__name__, 'private_new')
+        self.assertEqual(object.protected_new.__name__, 'protected_new')
+
+        # roles for functions have been set via decorators
+        self.assertEqual(object.public_new__roles__, None)
+        self.assertEqual(object.private_new__roles__, ())
+        imPermissionRole = [r for r in object.protected_new__roles__
+                            if not r.endswith('_Permission')]
+        self.failUnless(len(imPermissionRole) == 4)
+
+        for item in ('Manager', 'Role A', 'Role B', 'Role C'):
+            self.failUnless(item in imPermissionRole)
+
         # Make sure that a permission defined without accompanying method
         # is still reflected in __ac_permissions__
         self.assertEquals([t for t in Test.__ac_permissions__ if not t[1]],



More information about the checkins mailing list