Skip to content

Commit

Permalink
Once user deleted from the site, it is also deleted from all the work…
Browse files Browse the repository at this point in the history
…spaces where he belongs
  • Loading branch information
Rapolas K committed Jun 13, 2014
1 parent e549e97 commit b06003a
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 43 deletions.
9 changes: 9 additions & 0 deletions src/ploneintranet/workspace/configure.zcml
Expand Up @@ -44,11 +44,20 @@
handler=".subscribers.participation_policy_changed"
/>

<!-- Subscribe to accepted token event which is fired
when user clicks on the link in received email-->
<subscriber
for="ploneintranet.invitations.events.ITokenAccepted"
handler=".subscribers.invitation_accepted"
/>

<!-- Subscribe to user removed event, and delete him
from all workspaces where he is a member -->
<subscriber
for="Products.PluggableAuthService.interfaces.events.IPrincipalDeletedEvent"
handler=".subscribers.user_deleted_from_site_event"
/>

<adapter
for="ploneintranet.workspace.workspacefolder.IWorkspaceFolder"
provides="collective.workspace.interfaces.IWorkspace"
Expand Down
20 changes: 20 additions & 0 deletions src/ploneintranet/workspace/subscribers.py
Expand Up @@ -7,6 +7,9 @@
from ploneintranet.workspace.utils import get_storage


WORKSPACE_INTERFACE = 'collective.workspace.interfaces.IHasWorkspace'


def workspace_added(ob, event):
"""
when a workspace is created, we add the creator to
Expand Down Expand Up @@ -75,3 +78,20 @@ def invitation_accepted(event):
'Welcome to our family, Stranger',
request,
)


def user_deleted_from_site_event(event):
""" Remove deleted user from all the workspaces where he
is a member """
userid = event.principal

catalog = api.portal.get_tool('portal_catalog')
query = {'object_provides': WORKSPACE_INTERFACE}

query['workspace_members'] = userid
workspaces = [
IWorkspace(b._unrestrictedGetObject())
for b in catalog.unrestrictedSearchResults(query)
]
for workspace in workspaces:
workspace.remove_from_team(userid)
43 changes: 0 additions & 43 deletions src/ploneintranet/workspace/tests/test_forms.py
Expand Up @@ -153,49 +153,6 @@ def create_user(self, name="testuser", password="secret"):
)
return user

def test_non_existing_member_is_not_transferred(self):
self.login_as_portal_owner()

provideAdapter(adapts=(Interface, IBrowserRequest),
provides=Interface,
factory=TransferMembershipForm,
name="transfer")
ws = api.content.create(
self.portal,
"ploneintranet.workspace.workspacefolder",
"alejandro-workspace",
title="Alejandro workspace")

names = "Dima Nikita Alex Vlad Sergey".split()
for name in names:
IWorkspace(ws).add_to_team(
user=self.create_user(name=name).getId())

# subtracting admin from members list
self.assertEqual(len(names), len(list(IWorkspace(ws).members))-1)

other_ws = api.content.create(
self.portal,
"ploneintranet.workspace.workspacefolder",
"isabella-workspace",
"Isabella Workspace",)

api.user.delete(username="Dima")
self.assertEqual(len(names), len(list(IWorkspace(ws).members))-1)

# make a move
request = self.make_request(api.content.get_uuid(other_ws), True)
form = api.content.get_view('transfer',
context=ws,
request=request)
form.update()
data, errors = form.extractData()
self.assertEqual(len(errors), 0)

self.assertEqual(
len(names)-1, len(list(IWorkspace(other_ws).members))-1)
self.assertEqual(0, len(list(IWorkspace(ws).members)))

def test_transfer_form(self):
""" Check that the transfer form can copy/move users
to another workspace """
Expand Down
39 changes: 39 additions & 0 deletions src/ploneintranet/workspace/tests/test_subscribers.py
@@ -0,0 +1,39 @@
from plone import api
from collective.workspace.interfaces import IWorkspace

from ploneintranet.workspace.tests.base import BaseTestCase


class TestUserDeletion(BaseTestCase):
""" Test user deletion from site (not a workspace) """

def setUp(self):
super(TestUserDeletion, self).setUp()
self.login_as_portal_owner()

self.ws = api.content.create(
self.portal,
"ploneintranet.workspace.workspacefolder",
"alejandro-workspace",
title="Alejandro workspace")

def test_user_deletion_from_site_removes_from_workspace(self):
username = "johnsmith"
api.user.create(
email="user@example.org",
username=username,
password="doesntmatter",
)

# there shouldn't be any minus admin user in workspace
self.assertEqual(0, len(list(IWorkspace(self.ws).members))-1)

# lets add one user
self.add_user_to_workspace(username, self.ws)
self.assertEqual(1, len(list(IWorkspace(self.ws).members))-1)

# now lets remove a user from the site
api.user.delete(username)

# and this user should be gone from workspace as well
self.assertEqual(0, len(list(IWorkspace(self.ws).members))-1)

0 comments on commit b06003a

Please sign in to comment.