quick search:
 

changing add permissions with archetypes

Submitted by: hazmat2
Last Edited: 2006-03-02

Category: CMF

Average rating is: 4.0 out of 5 (2 ratings)

Description:
slightly complicated example of how to register different permissions for multiple content types in a single archetypes product. makes use of some config dictionaries to setup content type -> permission mapping.


Source (Text):
#################################
# utiilty functions                
class ContentPermMap(dict):

    def __setitem__(self, key, value):
        if key in self:
            values = self[key]
            if isinstance( values, str):
                values = [values]
            elif isinstance(values, tuple):
                values = list(value)

            if value is None or values is None:
                values = None
            elif isinstance(value, str ):
                values.append( value )
            elif isinstance(value, (list, tuple)):
                values.extend( list(value ) )
            else:
                raise SyntaxError("Unknown %r %r%"(values, value))
            value = values

        super(ContentPermMap, self).__setitem__(key, value)


def separateTypesByPerm( at_types,
                         content_types,
                         constructors,
                         permission_map ):

    res = {}

    default_perm = None
    used_types = []


    for permission in permission_map:
        portal_types = permission_map[ permission ]

        if portal_types is None:
            # default perm
            default_perm = permission
            continue

        types_for_perm = res.setdefault( permission, [])

        for idx, atype in enumerate(at_types):
            pt = atype['klass'].portal_type
            if pt in portal_types:
                assert pt not in used_types
                types_for_perm.append(
                    ( content_types[idx],
                      constructors[idx] )
                    )
                used_types.append( pt )


    if not default_perm:
        return res

    # handle default add permission 
    types_for_perm = res.setdefault( default_perm , [] )

    for idx, atype in enumerate(at_types ):
        pt = atype['klass'].portal_type
        if not pt in used_types:
            types_for_perm.append(
                ( content_types[idx],
                  constructors[idx] )
                )

    return res


#################################
# Permissions Module
AddFooPermission = 'Add Foo Member'
AddBarPermission = 'Add Bar Member'

ContentPermissionMap = ContentPermMap()
ContentPermissionMap[ AddFooPermission ] = 'FooMember'
ContentPermissionMap[ AddBarPermission ] = 'BarMember'
# our way of saying all the other content types should get this permission
ContentPermissionMap[ CMFPerms.AddPortalContent ] =  None



#################################
# initialize function in __init__ Module

def initialize( context ):
    my_types = atapi.listTypes(config.PROJECTNAME)
    content_types, constructors, ftis = atapi.process_types( my_types,
                                                             config.PROJECTNAME)

    # separate out the content types so we can register them in groups
    # based on permissions

    type_map = utils.separateTypesByPerm(
        my_types,
        content_types,
        constructors,
        permissions.ContentPermissionMap
        )

    for permission in type_map:
        factory_info = type_map[ permission ]
        content_types = tuple([fi[0] for fi in factory_info])
        constructors  = tuple([fi[1] for fi in factory_info])

        cmf_utils.ContentInit(
            config.PROJECTNAME + ' Content',
            content_types      = content_types,
            permission         = permission,
            extra_constructors = constructors,
            fti                = ftis,
            ).initialize(context)

Comments:

No Comments