def test_move_rename(self): """Test move or rename""" adapter = CreateContentFixtures(self, self.layer) suffixes = WORKSPACE_GROUPS.keys() proj_id1 = 'proj_handler_test_move_rename' self.assertNotIn(proj_id1, self.portal.contentIds()) allgroups_before = self.groups_plugin.listGroupIds() proj = adapter.add_project(proj_id1, title='Project 1') proj_uid = IUUID(proj) transaction.get().commit() # necessary for rename to work below self.assertIn(proj_id1, self.portal.contentIds()) allgroups_after = self.groups_plugin.listGroupIds() self.assertEquals(len(allgroups_after) - len(allgroups_before), 3) for g in ['%s-%s' % (proj_uid, suffix) for suffix in suffixes]: assert g in allgroups_after proj.setTitle('Project 1a') self.portal.manage_renameObject(proj_id1, proj_id1 + 'a') self.assertNotIn(proj_id1, self.portal.contentIds()) # old name self.assertIn(proj_id1 + 'a', self.portal.contentIds()) # new name allgroups_postrename = self.groups_plugin.listGroupIds() self.assertEquals(len(allgroups_postrename), len(allgroups_after)) for suffix in suffixes: groupname = '%s-%s' % (proj_uid, suffix) assert groupname in allgroups_postrename # new names title_suffix = WORKSPACE_GROUPS.get(suffix).get('title') title = self.groups_plugin.getGroupInfo(groupname).get('title') expected = 'Project 1a - %s' % title_suffix self.assertEquals(title, expected) ## now create a team workspace inside the project, similarly: team_id1 = 'team1' allgroups_before = self.groups_plugin.listGroupIds() team = adapter.add_workspace_to(proj, team_id1) team_uid = IUUID(team) roster = WorkspaceRoster(team) roster.add(TEST_USER_NAME) assert TEST_USER_NAME in roster assert len(roster) == 1 transaction.get().commit() # necessary for rename to work below allgroups_after = self.groups_plugin.listGroupIds() ## necessary/sufficient: all expected groups (and only these): self.assertEquals(len(allgroups_after) - len(allgroups_before), 3) for g in ['-'.join((team_uid, s)) for s in suffixes]: assert g in allgroups_after ## now rename the team newid = team_id1 + 'a' proj.manage_renameObject(team_id1, newid) team = proj.get(newid) assert IUUID(team) == team_uid # UUID does not change # ensure that users are copied to groups on rename: roster = WorkspaceRoster(team) assert TEST_USER_NAME in roster assert len(roster) == 1 allgroups_postrename = self.groups_plugin.listGroupIds() self.assertEquals(len(allgroups_postrename), len(allgroups_after)) for g in ['-'.join((team_uid, s)) for s in suffixes]: assert g in allgroups_postrename # new names
def __init__(self, context, request): self.context = context self.request = request self.portal = getSite() self.site_members = SiteMembers(self.portal, self.request) self.mtool = getToolByName(context, 'portal_membership') self.roster = WorkspaceRoster(context) self.title = self.context.Title().decode('utf-8') self.path = '/'.join(self.context.getPhysicalPath()) self.status = IStatusMessage(self.request) self.isproject = IProjectContext.providedBy(context)
def create_workspace_groups_roles(context): site = getSite() members = ISiteMembers(site) pasgroups = members.groups roster = WorkspaceRoster(context) for group in roster.groups.values(): groupname, title = group.pas_group() if groupname not in pasgroups: pasgroups.add(groupname, title=title) else: # update title of previously existing group (edge case) pasgroups.get(groupname).title = _u(title) # bind local roles, mapping group to roles from config sync_group_roles(context, groupname) if INavigationRoot.providedBy(context): # for newly added top-level (nav root workspaces or # projects), add owner/creator as a manager. authuser = members.current() if authuser is not None: authuser = authuser.getUserName() if authuser in members: roster.add(authuser) roster.groups['managers'].add(authuser)
def handle_workspace_move_or_rename(context, event): if IObjectRemovedEvent.providedBy(event): return # not a move with new/old, but a removal -- handled elsewhere if IObjectAddedEvent.providedBy(event): return # not an add, but a move of existing site = getSite() pasgroups = ISiteMembers(site).groups roster = WorkspaceRoster(context) for workgroup in roster.groups.values(): groupname, title = workgroup.pas_group() if groupname not in pasgroups: pasgroups.add(groupname, title=title) else: pasgroups.get(groupname).title = _u(title)
def handle_workspace_removal(context, event): """Handler for IObjectRemovedEvent on a workspace""" site = getSite() if site is None: return # in case of recursive plone site removal, ignore pasgroups = ISiteMembers(site).groups roster = WorkspaceRoster(context) for group in roster.groups.values(): groupname = group.pas_group()[0] if groupname in pasgroups: pasgroups.remove(groupname) # remove group names for nested workspaces (also, by implication, # removed from the PAS group manager plugin). for workspace in get_workspaces(context): handle_workspace_removal(workspace, event=event)