src/pyams_security/property.py
changeset 42 07229ac2497b
parent 2 94e76f8e9828
child 158 0f9c64c65e5f
--- a/src/pyams_security/property.py	Wed May 20 12:31:27 2015 +0200
+++ b/src/pyams_security/property.py	Wed Jun 17 09:59:18 2015 +0200
@@ -18,7 +18,7 @@
 # import interfaces
 from pyams_security.interfaces import IRole, IProtectedObject, IPrincipalInfo, IRoleProtectedObject
 from pyams_security.schema import IRoleField
-from zope.schema.interfaces import IField
+from zope.schema.interfaces import IField, ISet
 
 # import packages
 
@@ -53,12 +53,15 @@
         return protection.get_principals(self.__role_id)
 
     def __set__(self, instance, value):
-        if value is None:
-            value = set()
-        elif isinstance(value, str):
-            value = set(value.split(','))
-        value = set(map(lambda x: x.id if IPrincipalInfo.providedBy(x) else x, value))
         field = self.__field.bind(instance)
+        if ISet.providedBy(field):
+            if value is None:
+                value = set()
+            elif isinstance(value, str):
+                value = set(value.split(','))
+            value = set(map(lambda x: x.id if IPrincipalInfo.providedBy(x) else x, value))
+        else:
+            value = value.id if IPrincipalInfo.providedBy(value) else value
         field.validate(value)
         if field.readonly:
             raise ValueError("Field {0} is readonly!".format(self.__name))
@@ -67,6 +70,8 @@
             raise ValueError("Can't use role properties on object not providing "
                              "IRoleProtectedObject interface!")
         old_principals = protection.get_principals(self.__role_id)
+        if not isinstance(value, set):
+            value = {value}
         added = value - old_principals
         removed = old_principals - value
         for principal_id in added: