Provide a simple API to create automatic groups in Plone.
Project description
Overview
This package provide a simple API to create automatic groups in Plone. Automatic groups are users groups that have its member set automaticaly calculated. The AuthenticatedMembers group is an example automatic group, created by Plone.
Creating an automatic group is simple:
Create a class implementing IMembershipCriteria. This class define a criteria to decied whether an user belongs or not to the group.
Call utils.create_auto_group passing an instance of IMembershipCriteria and other info about the group.
Inside the utils module there are other useful functions.
Example usage
Use case: we want to create an automatic group containing all users whose ID begins with an ‘r’ letter.
First we create a class implementing IMembershipCriteria:
>>> from collective.autogroup.interfaces import IMembershipCriteria >>> from zope.interface import implements >>> class MembershipCriteria(object): ... implements(IMembershipCriteria) ... def __call__(self, principal): ... return principal.getId()[0] == 'r'
Now we create the auto group using this criteria:
>>> from Products.CMFCore.utils import getToolByName >>> from collective.autogroup.utils import create_auto_group >>> group_name = 'r_users' >>> group_title = 'Members of r_users' >>> create_auto_group( ... acl_users=self.portal.acl_users, ... criteria=MembershipCriteria(), ... group_name=group_name, ... title=group_title, ... ) >>> gtool = getToolByName(self.portal, 'portal_groups') >>> group = gtool.getGroupById(group_name) >>> group is not None True
The group should be empty for now, since we don’t have any users matching the criteria:
>>> len(group.getAllGroupMemberIds()) 0
Create some users and see what happens:
>>> user1 = self.add_user('ronaldo') >>> user2 = self.add_user('romario') >>> user3 = self.add_user('tostao') >>> sorted(group.getGroupMemberIds()) ['romario', 'ronaldo'] >>> group_name in user1.getGroups() True >>> group_name in user2.getGroups() True >>> group_name in user3.getGroups() False
About the group title
Check this out:
>>> not group.getProperty('title') True
It seems the title of the group is empty, even though we set the title to group_title when we called create_auto_group. It turns out prefs_groups_overview and other Plone templates do not call group.getProperty to get the group title. Even the AuthenticatedUsers group (created by Plone) does not have the title property set:
>>> not gtool.getGroupById('AuthenticatedUsers').getProperty('title') True
The prefs_groups_overview template uses the following method to get the group title:
>>> search_results = self.portal.acl_users.searchGroups(id=group_name) >>> search_results[0]['title'] == group_title True
To change the title of an automatic group we should not call group.setProperty, it will not work. The correct way is change the description property of the correspondent PAS plugin (yes, it’s the description property, not title). Fortunately this package provides a function that makes this job easier:
>>> from collective.autogroup.utils import (set_auto_group_title, ... get_auto_group_title) >>> new_title = group_title + '_new' >>> set_auto_group_title(self.acl_users, group_name, new_title) >>> search_results = self.portal.acl_users.searchGroups(id=group_name) >>> search_results[0]['title'] == new_title True >>> get_auto_group_title(self.acl_users, group_name) == new_title True
It can also be done through ZMI.
Credits
Rafael Oliveira <rafaelbco@gmail.com>: Author.
Changelog
0.1b1 - 15feb2010
First release.