Skip to content

Commit

Permalink
added join workspace button if policy allows self joining
Browse files Browse the repository at this point in the history
  • Loading branch information
Rapolas K committed Jun 24, 2014
1 parent 88cac1c commit 67db167
Show file tree
Hide file tree
Showing 8 changed files with 208 additions and 0 deletions.
15 changes: 15 additions & 0 deletions src/ploneintranet/workspace/browser/configure.zcml
Expand Up @@ -29,4 +29,19 @@
permission="cmf.ModifyPortalContent"
/>

<browser:page
name="joinme"
for="ploneintranet.workspace.workspacefolder.IWorkspaceFolder"
class=".views.JoinView"
permission="zope2.View"
/>

<browser:viewlet
name="ploneintranet.workspace.join"
manager="plone.app.layout.viewlets.interfaces.IBelowContent"
class=".viewlets.JoinViewlet"
template="templates/joinviewlet.pt"
permission="zope2.View"
/>

</configure>
5 changes: 5 additions & 0 deletions src/ploneintranet/workspace/browser/templates/joinviewlet.pt
@@ -0,0 +1,5 @@
<div tal:condition="view/visible">
<form method="post" tal:attributes="action view/join_url">
<input type="submit" name="button.join" value="Join right here, right now" />
</form>
</div>
26 changes: 26 additions & 0 deletions src/ploneintranet/workspace/browser/viewlets.py
@@ -0,0 +1,26 @@
from collective.workspace.interfaces import IWorkspace
from plone import api
from plone.app.layout.viewlets import ViewletBase


class JoinViewlet(ViewletBase):
def in_workspace(self):
return hasattr(self.context, "acquire_workspace")

def visible(self):
if not self.in_workspace():
return False

if not self.context.join_policy == "self":
return False

user = api.user.get_current()
workspace = IWorkspace(self.context.acquire_workspace())
if user.getUserName() in workspace.members:
return False

return True

def join_url(self):
workspace = self.context.acquire_workspace()
return "%s/%s" % (workspace.absolute_url(), "joinme")
25 changes: 25 additions & 0 deletions src/ploneintranet/workspace/browser/views.py
@@ -0,0 +1,25 @@
from Products.Five.browser import BrowserView
from plone import api
from collective.workspace.interfaces import IWorkspace
from AccessControl import Unauthorized

from ploneintranet.workspace import MessageFactory as _


class JoinView(BrowserView):

def __call__(self):
if not self.context.join_policy == "self":
raise Unauthorized("No way")

field = "button.join"
if self.request.method == "POST" and field in self.request.form:
user = api.user.get_current()
workspace = IWorkspace(self.context)
workspace.add_to_team(user=user.getId())
msg = u"You are a fully qualified member of this workspace now"
api.portal.show_message(message=_(msg),
request=self.request)

referer = self.request.get("HTTP_REFERER", self.context.absolute_url())
return self.request.response.redirect(referer)
14 changes: 14 additions & 0 deletions src/ploneintranet/workspace/tests/keywords.robot
Expand Up @@ -25,3 +25,17 @@ Navigate to
Go to homepage
Click Contents In edit bar
Click link ${title}


Add workspace
[arguments] ${title}
Log in as site owner
Go to homepage
Add content item Workspace ${title}
Element should be visible xpath=//ul[@id="portal-globalnav"]/li[a="${title}"]


Maneuver to
[arguments] ${title}
Go to homepage
Click link ${title}
58 changes: 58 additions & 0 deletions src/ploneintranet/workspace/tests/test_viewlets.py
@@ -0,0 +1,58 @@
from collective.workspace.interfaces import IWorkspace
from plone import api

from ploneintranet.workspace.browser.viewlets import JoinViewlet
from ploneintranet.workspace.tests.base import BaseTestCase


class TestSelfJoinViewlet(BaseTestCase):

def setUp(self):
super(TestSelfJoinViewlet, self).setUp()
self.login_as_portal_owner()
self.workspace = api.content.create(
self.portal,
"ploneintranet.workspace.workspacefolder",
"demo-workspace",
title="Demo Workspace")
self.folder = api.content.create(
self.workspace,
"Folder",
"inner-one",
title="Inner folder")
self.user = api.user.create(
email="demo@example.org",
username="demo",
password="demon",
)

def test_viewlet_invisible_while_not_in_workspace(self):
self.workspace.join_policy = "self"
self.workspace.visibility = "open"
viewlet = JoinViewlet(self.portal, self.request, None, None)
self.assertFalse(viewlet.visible())

def test_viewlet_invisible_in_other_than_self_join_policy(self):
viewlet = JoinViewlet(self.folder, self.request, None, None)
self.assertTrue(viewlet.in_workspace())
self.assertFalse(viewlet.visible())

def test_viewlet_invisible_if_user_is_member(self):
self.workspace.join_policy = "self"
self.workspace.visibility = "open"
viewlet = JoinViewlet(self.folder, self.request, None, None)
IWorkspace(self.workspace).add_to_team(user="demo")
self.login("demo")
self.assertFalse(viewlet.visible())

def test_viewlet_visibility(self):
viewlet = JoinViewlet(self.folder, self.request, None, None)
self.workspace.join_policy = "self"
self.workspace.visibility = "open"
self.login("demo")
self.assertTrue(viewlet.visible())

def test_viewlet(self):
viewlet = JoinViewlet(self.folder, self.request, None, None)
url = "%s/%s" % (self.workspace.absolute_url(), "joinme")
self.assertEqual(viewlet.join_url(), url)
42 changes: 42 additions & 0 deletions src/ploneintranet/workspace/tests/test_views.py
@@ -0,0 +1,42 @@
from AccessControl import Unauthorized
from ploneintranet.workspace.browser.views import JoinView
from collective.workspace.interfaces import IWorkspace
from plone import api
from ploneintranet.workspace.tests.base import BaseTestCase


class TestSelfJoin(BaseTestCase):

def setUp(self):
super(TestSelfJoin, self).setUp()
self.portal = self.layer["portal"]
self.request = self.layer["request"]

self.login_as_portal_owner()
self.workspace = api.content.create(
self.portal,
"ploneintranet.workspace.workspacefolder",
"demo-workspace",
title="Demo Workspace")
self.user = api.user.create(
email="demo@example.org",
username="demo",
password="demon",
)

def test_user_can_join(self):
self.workspace.join_policy = "self"
self.workspace.visibility = "open"
self.request.method = "POST"
self.request.form = {"button.join": True}
self.request["HTTP_REFERER"] = "someurl"
self.login("demo")
view = JoinView(self.workspace, self.request)
response = view()
self.assertEqual("someurl", response)
self.assertIn("demo", IWorkspace(self.workspace).members)

def test_user_cant_join_if_policy_is_not_self(self):
self.login("demo")
view = JoinView(self.workspace, self.request)
self.assertRaises(Unauthorized, view)
23 changes: 23 additions & 0 deletions src/ploneintranet/workspace/tests/workspace.robot
Expand Up @@ -40,3 +40,26 @@ Site Administrator can edit roster
Click button Search users
Click button Save

Site User can join self managed workspace
Add workspace Demo Workspace
Log in as test user
Go to homepage
Element should not be visible xpath=//ul[@id=portal-globalnav]/li/a[text()='Demo Workspace']
Logout
Log in as site owner
Go to homepage
Navigate to Demo Workspace
Click Policies In edit bar
Select From List xpath=//select[@name="form.widgets.external_visibility:list"] open
Select From List xpath=//select[@name="form.widgets.join_policy:list"] self
Click button Ok
Logout
Log in as test user
Maneuver to Demo Workspace
Click button Join right here, right now
Logout
Log in as site owner
Go to homepage
Navigate to Demo Workspace
Click Roster In edit bar
Element should be visible xpath=//table[@id="edit-roster"]/tbody/tr/td[normalize-space()="test_user_1_"]

0 comments on commit 67db167

Please sign in to comment.