Another milestone on the road to Zen with Ingeniweb components
Latest version : 1.0.0

Gruf Spaces

> Group environments for elaborating and exchanging information <

About Gruf Spaces

Group environments for elaborating and exchanging information

Gruf Spaces has been designed by the INGENIWEB team.

Gruf Spaces 1.0.0 is licensed under the GNU GPL license.

Do you like this product? You can support its authors by clicking the button below:
Support This Project


No screeshots available yet.



GrufSpaces is a Plone Product that allows group members to work together in dedicated folders.

A group administrator can assign group members and visitors, and let them know by email notification.

Group members also have the possibility to send an email to all members of the group.

Further features are discussed in the GroupSpace Overview section below.


Write to for all questions about GrufSpaces


The current maintainer and core developer of GrufSpaces is Maik Röder (

Send feedback to


Required Products

  • Plone 2.1.2 upwards

  • GroupUserFolder 3.0 upwards. GrufSpaces does not work with GroupUserFolder 2.0.1, which originally came with standard installations of Plone 2.0.5. The upgrade to a new version of GroupUserFolder for Plone 2.0.5 does not cause any known problems, as there are many sites with newer versions of GroupUserFolder in production.

  • CMFPlacefulWorkflow 0.4 (For experimental GroupSpace areas, which are currently not supported officially)

    You can also check out CMFPlacefulWorkflow (plone2.2 branch) from the Collective SVN:


Installing GrufSpaces

  • Unpack it into your Zope Products Folder

  • Restart Zope

  • Use the Product Installation section of the Plone Control Panel to install GrufSpaces

    • Alternatively you can use the portal_quickinstaller to install the GrufSpaces in ZMI
  • Now you can add a GrufSpace content type through the Plone Interface.



GrufSpaces: A Plone Document that allows group members to work together in a dedicated area of the Plone site.

Behaves mostly like the standard Plone Folder. When you add a GrufSpace, you can enter the name, title, description.


You can customize the to add services to the GroupSpace at creation time.

Custom roles

The following roles are added to the Plone portal when you install GrufSpaces:

GroupMember GroupVisitor GroupAdmin GroupLeader

These roles don't appear in the security tab of the Zope root folder!

During installation, the following permissions are set in the Zope root:

'GrufSpaces: Add GroupSpaces':  Manager, Owner
'GrufSpaces: Assign GroupSpace Roles': Manager, GroupLeader, GroupAdmin, Owner
'GrufSpaces: Send Mail to GroupSpace Members': Manager, GroupLeader, GroupAdmin, GroupMember, Owner

Althgough these roles don't appear at the root, you can verify the settings like this:

http://localhost:8080/manage_roleForm?role_to_manage=GroupMember http://localhost:8080/manage_roleForm?role_to_manage=GroupVisitor http://localhost:8080/manage_roleForm?role_to_manage=GroupAdmin http://localhost:8080/manage_roleForm?role_to_manage=GroupLeader

Adapting the Workflows

When you use classic GroupSpaces without GroupSpace Areas, you'll have to take extra care about security and workflows. If you don't want to bother about the following problems, consider using GroupSpace Areas.

If you want to completely hide content inside a closed workflow, you'll have to change the standard Plone workflow. The standard Plone Workflow gives view permission to Anonymous. This is not double-checked by the catalog when cataloging the content in the GroupSpace.

To correct this, you should remove permission settings for Anonymous in the Plone workflows.

If you don't do this change, normal members of the site will be able to see content in the "recent changes" portlet, even if they are not GroupMembers.

Another important point is that all content types that can be put into a GroupSpace need to have a workflow. If a content type does not have a workflow, it is assumed that anonymous can access it, and this will make it appear in the catalog search even if it is in a closed GroupSpace.

Hiding content in closed GroupSpaces

You may want to adapt the workflows of Plone if you want to fully protect a closed workspace. Otherwise, members of your site will be able to find and navigate to objects in a closed workspace. By giving Anonymous explicit access rights, Plone is much too permissive for our purposes.

  1. In the private states of both plone_workflow and folder_workflow, deselect "Access Contents Information" and "View" permissions for Anonymous.
  2. Click on the "Update security settings" button on the bottom of the portal_workflow tool page.

Make sure to also take care of any other workflows you may have added to your site.

Specific roles tabs of GroupSpaces

System Message: WARNING/2 (<string>, line 153)

Title underline too short.

Specific roles tabs of GroupSpaces

You will notice that besides the normal tabs you find a roles tab:

This interface is used to show who has which local role in the GroupSpace, and to let you add or remove roles from users or groups. The roles tab resembles the sharing tab. The sharing tab is fine for generic tasks, but should only be used by few people who manage the site. The roles tab is easy to use by GroupSpace administrators, who may have a different profile from site administrators. Besides GroupSpace-specific documentation, you will find that you can globally define the way users and groups can be searched in this interface, in order to assign roles to them.

When assigning a role to a GroupSpace member, you can choose to send an email notification to the member by activating the checkbox "Send email notification".

Change User/Group search/selection in GroupSpace Configlet

GroupSpaces offers the possibility to change the way users and groups are searched in the roles tab. This is configured globally in the GroupSpaces configlet, which you find in the Plone site setup.

You can select whether users are searched or selected in the roles tab of GroupSpaces, and whether groups are searched or selected in the roles tab.

GroupSpaces areas

Attention: This is experimental and not supported officially. It is known not to work with Plone 2.1.x upwards, as it was originally implemented for Plone 2.0.x, and CMFPlacefulWorkflow has changed since.

When you need different security settings and publishing rules for your GroupSpaces, GroupSpace Areas are for you. GroupSpace Areas are special folders you can put into your GroupSpaces. You can switch GroupSpace areas on and off in the GrufSpaces configlet. When you switch on GroupSpace areas, the Python Script is called, which then adds the areas. Also a different workflow is used for GroupSpaces when you switch on areas.

GroupSpace areas are factory-based content types that are generated on the fly, and then used in the GroupSpace. This means that you have full control over what folderish content type you want to use by changing the behaviour in the Python Script. If you don't need this additional power, you don't have to bother about that aspect. A normal Plone Folder is going to be used.

The great thing about these areas is that they offer two levels of control over the workflow. First of all, you can change the workflow on the folder itself, and secondly you can adapt the workflow for the content of the area. This is possible with the CMFPlacefulWorkflow product, which is automatically and configured for the GrufSpace Areas.

Here is a summary of the great possibilities offered by GroupSpace areas:

Public Area

Documents that have been elaborated by the group, and are now officially available for the general public. GroupMembers can not add these documents, Publishing here is done by the GroupAdmin only.


Shared folder for GroupMembers only. Anonymous and Member can't access or edit here.


A Folder for testing purposes. For example to allow people to familiarize themselves with the available tools without disturbing anyone in the other GroupSpace areas. Documents here are private to the GroupMembers adding them.


This is a place where GroupMembers can deposit their documents for review by the GroupAdmin. The GroupAdmin is the only one who has the right to see and work on the content inside. GroupMembers can only add and view their own documents that they pasted into the box.


Documents placed in the resources folder are available for the GroupMembers as read-only versions. Only the GroupAdmin can modify and add documents here.

Using Workflow Areas

When you copy and paste an object in Plone, the security is not updated automatically. When you are using Groupspace areas, this is problematic.

For example, when you copy a private document into a workflow area, other members of the GroupSpace can not see the document.

In order to correct this problem, we need to patch the folder_paste.cpy script. Just add the markedlines in the script:

-> old_new_ids = context.manage_pasteObjects(context.REQUEST['__cp'])
from Products.CMFPlone import transaction_note

System Message: WARNING/2 (<string>, line 253)

Definition list ends without a blank line; unexpected unindent.

-> for old_new_id in old_new_ids: -> o=getattr(context, old_new_id['new_id'], None) -> o.reindexObject()

System Message: ERROR/3 (<string>, line 256)

Unexpected indentation.
transaction_note('Pasted content to %s' % (context.absolute_url())) return state.set(portal_status_message='Item(s) pasted.')


You can also use GroupSpaces inside GroupSpaces, but this is still a bit experimental, and you should only use it if you know what you are doing.

Distributing roles from a top GroupSpace to SubGroupSpaces

Florent Carlier <> is using this for a project, and was interested in distributing users from a top GroupSpace to a lower GroupSpace with a nice AJAX interface.

Check out the grufspaces_ajax layer in the skins folder. You need to manually set the layer on top of the other grufspaces layers in plone_skins.

Until this feature is fully integrated in GrufSpaces, here are the installation instructions.

  1. Put the grufspaces_ajax layer above the other grufspaces layers in portal_skins/Properties
  2. Create a GroupSpace folder with several GroupSpaces inside
  3. Desactivate role inheritance in all SubGroupSpaces
  4. Put users as usually into the top GroupSpace
  5. Drag and drop users in the roles form of the top GroupSpace to the SubGroupSpaces.

Further Information

Besides this document, it is recommended to have a look at the following files:




Released versions

Released versions of Gruf Spaces are available here. The current version is 1.0.0.

CVS version

The repository contains the up-to-date versions of our source code. In order to get the HEAD branch of GrufSpaces, use :

svn co

You can also browse the CVS with your browser.



Please take time the read the Readme


  • Wasn't GroupSpaces part of GroupUserFolder before?

    Yes, and we decided to make it an independent product.



Gruf Spaces changes


[1.0 - 2006-12-26]

  • Show email in user search of roles form using getProperty
  • Warning when no email set in preferences
  • Todd Graham contributed some bug fixes and a migration howto
    • Migration howto and fixes
    • Email form gets a default action, so it works in Safari
    • Email form cancel button takes you to GroupSpace listing
    • Rename after creation
    • Portlets pointing to content without view
  • Mauro Moura Gomes Lopes provides i18n files for brazilian portuguese

[0.7.2 - 2006-11-17]

  • Uncommented installation of property for portal_groupdata in It causes a problem with Plone 2.5.1:

    #gd_tool = getToolByName(self, 'portal_groupdata') # Prepare group data tool for delegated group member management #if not hasattr(gd_tool, 'delegated_group_member_managers'): # gd_tool._setProperty('delegated_group_member_managers', (), 'lines')

    If you need group member management delegation in Plone 2.1.x, uncomment these lines.

  • Uninstall of 'delegated_group_member_managers' property. Otherwise Plone group management remains unusable even after uninstallation of GrufSpaces in Plone 2.5.1. Thanks to Eric BREHAULT for submitting the bug report.

[0.7.1 - 2006-10-31]

  • Moving experimental skin layers to a separate directory

[0.7 - 2006-10-31]

  • Spanish translation added thanks to Gustavo González <>

  • Fix installation problem with Plone 2.5 related to rolesSeeUnpublishedContent

  • Added a groupspaces_ajax layer thanks to Florent Carlier <>

  • Now the GroupSpace content type is based on Archetypes

    You need to run the migration. Add and run the following External Method:

    id:migrate_grufspaces Title: Migrate GrufSpaces Module name: GrufSpaces.Install Function name: migrate

  • When assigning a role to a GroupSpace member, you can choose to send an email notification to the member by activating the checkbox "Send email notification".

  • added show_id method to GroupSpace for forward compatability to Plone 2.5

  • GroupVisitor doesn't need to see box.

  • Explicitly give GroupAdmin and GroupLeader permissions to avoid having to make them GroupMember as well.

  • Remove unused

  • When upgrading to the new version of GrufSpaces, it needs to be documented that the catalog needs to be refreshed (not reindexed) because the API and Indices have changed. (See Changes)

  • In the upgrade notes, also note that the following methods have disappeared:

    • listGroupSpaceMemberUsers (Now listGroupSpaceMemberIds)
    • listGroupSpaceVisitorUsers (Now listGroupSpaceVisitorIds)
  • Note that GroupAdmins and GroupLeaders are treated like GroupMembers, and that they don't need to be made GroupMembers any more.

  • listGroupSpaceMemberIds method now produces not only GroupMembers, but also GroupAdmins and GroupLeaders. This way, GroupAdmins and GroupLeaders are considered as GroupMembers. As a consequence:

    • GroupAdmins and GroupLeaders see the last changes in the portlet
  • Removing listGroupSpaceMemberUsers, which is replaced by listGroupSpaceMemberIds. Catalog is changed and refreshed.

  • Removing listGroupSpaceVisitorUsers, which is replaced by listGroupSpaceVisitorIds. Catalog is changed and refreshed.

  • Added GroupAdmin and GroupLeader in, so that the GroupAdmin and GroupLeader also get email messages sent through GroupSpaces

  • Remove unused method listMembersForDisplay on GroupSpace

  • Remove GrufSpaces configlet when uninstalling

  • Pass default_charset to mail template

  • Fix permission check in validate_GroupSpace_email.vpy

  • Start of work areas created automatically as GroupSpace infrastructure (MR)

    • use_groupspace_areas property added upon installation
    • prefs_grufspaces_form now shows option to create groupspace areas
    • add_groupspace_services optionally adds groupspace areas

[0.6 - 2005-11-05]

  • Tested with PlonePAS 0.4.1 under Plone 2.1.1
  • Now depending on GroupUserFolder 3.0 upwards
    • Now depends on the getUserName method in in GroupUserFolder, to return the unprefixed group name
  • Dropping
  • Removing addGroupMember and removeGroupMember methods
  • Split removeFromCollabRole method into removeCollabRoleFromUser and removeCollabRoleFromGroup
  • Split assignToCollabRole method into assignCollabRoleToUser and assignCollabRoleToGroup

[0.51 - 2005-10-25]

  • Removed implementation of listFolderContents, which was protected by Access Contents Information. (MR)
  • Removed implementation of __init__ and edit (MR)
  • Removed GroupSpace edit permission (MR)
  • No more implementation of getGroupId and getMemberId (MR)
  • Remove _isGroupId method (MR)
  • Remove _sendMailToGroup method (MR)
  • Remove canSendMailToGroup method (MR)
  • Remove listUserIdsInGroup method (MR)
  • Removing getUsersInGroup script (MR)
  • Use validate_title, and remove validate_GroupSpace_edit.vpy (MR)
  • remove listGroupSpaceContentTypes (MR)
  • Remove getGroupSpaceId index and method (MR)
  • Remove (MR)
  • Remove (MR)
  • (MR)
  • Remove (MR)
  • Remove (MR)
  • (MR)
  • (MR)
  • Use folder_listing macro in (MR)
  • use toLocalizedTime instead of toPortalTime (MR)
  • correction to skin layer installation (MR)
  • Fix bug in GroupSpace_rolesForm.cpt, making it impossible to assign roles to groups. (MR)
  • getCollabUsers refactoring (MR)
  • use portal_membership where appropriate (MR)
  • Added a comment on a workflow issue in the Readme.txt. A change to the Plone workflow is needed to completely close a GroupSpac. Thanks to Johannes Graumann for the feedback. (MR)

[0.5 - 2005-10-05]

  • Extending permissions for Plone 2.1 (Thanks to Marco Stadler for adding the necessary permissions to the workflow) (MR)
  • Fixed news and summary templates for Plone 2.1 (Thanks to Thierry Benita) (MR)

[0.4 - 2005-07-29]

  • Uninstall portlets correctly (MR)
  • Removed "Create new group" button. (MR)
  • search_term split into user_search_term and group_search_term (MR)
  • user search possible when no search results (MR)
  • translate validator error messages (MR)
  • functional tests work with AT sites as well as Plone sites (MR)
  • extended user and group search tests (MR)
  • Preparation for PloneSelenium (MR)
    • Adding Functional Test Python Script in grufspaces layer (MR)
    • Using PloneInstallation (MR)
    • Adding Functional Test action to PloneSelenium if existing (MR)
    • Added (NG)
  • Added getCurrentGroupSpace method (MR)
  • Make Installation work with Plone 2.1 (MR)
  • Fix bug with LDAP. Use getProperty('email') to get email instead .email. (CL)
  • Check "Add group" permission" in GroupSpace_rolesForm on "Create new group" button. (MR)
  • Added method "listVisitorIds" to complement "listMemberIds" (MR)
  • Added portlet for visitors (MR)
  • Added method and index listGroupSpaceVisitorUsers (MR)
  • Added GroupVisitor, GroupMember, GroupAdmin and GroupLeader to portal_properties/navtree_properties/rolesSeeUnpublishedContent so they can see unpublished GroupSpaces (MR)
  • i18n (MR)
  • Installing default permissions for GroupSpace roles (MR)
  • Fixed a call to manage_setLocalRoles using a tuple instead of a list, which can make it impossible to add content to a GroupSpace. (MR)
  • Readme extended with a section on how to adapt the Plone workflows for closed GroupSpaces. (MR)
  • Force reindex listGroupSpaceMemberUsers (CL)

[0.3 - 2004-06-14]

  • Release

[0.2 - 2004-05-13]

  • Implementation of the CollabSpace Interface as defined in PloneGroupSpace by Helmut Merz:

  • Changed the add permission to "GrufSpaces: Add GroupSpaces" from "Add Portal Folders", so that we can better control who is allowed to add GroupSpaces.

  • New role tab for adding new members and groups in a controlled way without being Manager or also having the role that you assign The code for this tab was taken over from the PloneGroupSpace product

    • The 'GrufSpaces: Assign GroupSpace Roles' permission allows the use of the "role" tab to change local roles for users and groups
    • The sharing tab is protected with the same permission now. It is still usefull to manage local roles that are not used for GrufSpaces.
  • Integrated a "Mail to group" feature, which consists of a page where you can type in a message that you can then send by email to all group members.

    • The 'GrufSpaces: Send Mail to GroupSpace Members' permission allows sending a mail to GroupSpace members.
    • Adding roles GroupVisitor, GroupAdmin and GroupLeader to the root
  • Added default roles in Install script (MR)

  • We now have the following new roles: (MR)

    • GroupAdmin: Responsible for the Group
    • GroupVisitor: Restricted to read-only activities in the GroupSpace
    • GroupLeader: Responsible for representing the Group to the outside
  • Inheriting GroupSpace from PloneFolder. (MR)

[v0.1 - 2004-03-09]

  • Relase 0.1

[0.0 - 2004-02-25]

  • No more group unmangling for listGroupSpaceMemberUsers index Fixing searches in all of the templates to include the groups a user belongs to. (MR)
  • The person adding a GroupSpace is not automatically becoming a GroupMember An admin is not necessarily interested to work on a GroupSpace he has to add (MR)
  • Call add_groupspace_services script during installation of GroupSpace (MR)
  • Adding script (MR)
    • This script is automatically called when a GroupSpace is created
    • It is responsible for adding additional services to a new GroupSpace
    • This script can be customized in a custom skin
  • Moved GroupSpace out of GRUF into this product (MR)

Gruf Spaces ChangeLog is also available for detailed informations.