Skip to content

Commit

Permalink
Merge pull request #42 from ploneintranet/feature/workspace_tiled_mock
Browse files Browse the repository at this point in the history
Feature/workspace tiled mock
  • Loading branch information
Alessandro Pisa committed Jan 8, 2015
2 parents cc06ae6 + cbf6152 commit e5634e1
Show file tree
Hide file tree
Showing 6 changed files with 185 additions and 99 deletions.
8 changes: 8 additions & 0 deletions src/ploneintranet/workspace/browser/configure.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,14 @@
<include package="plone.app.portlets" />
<include package="collective.workspace" />

<browser:page
name="view"
for="ploneintranet.workspace.workspacefolder.IWorkspaceFolder"
class="..workspace.WorkspaceView"
permission="zope2.View"
template="templates/workspace.pt"
/>

<browser:page
name="policies"
for="ploneintranet.workspace.workspacefolder.IWorkspaceFolder"
Expand Down
31 changes: 31 additions & 0 deletions src/ploneintranet/workspace/browser/templates/workspace.pt
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
xmlns:tal="http://xml.zope.org/namespaces/tal"
xmlns:metal="http://xml.zope.org/namespaces/metal"
xmlns:i18n="http://xml.zope.org/namespaces/i18n"
lang="en"
metal:use-macro="context/main_template/macros/master"
i18n:domain="ploneintranet.workspace">

<body class="view-secure">
<metal:content fill-slot="content"
tal:define="workspace view/workspace; workspace_url python:'/'+workspace.absolute_url(1)">
<h1 id="workspace-name">
<!-- Next link is to lead to landing state of current workspace -->
<a href="{{page.url}}" tal:attributes="href workspace_url" tal:content="workspace/Title">{{ page.workspace_name }}</a>
</h1>

<div class="ws-baggage-handling-regulations dark-theme" id="application-body">

<div id="document-body" tal:attributes="data-tile string:${workspace_url}/@@activitystream.tile?network=1">
Add here the tile for the activity stream
</div>

<aside class="sidebar left tagging-off" id="sidebar" tal:attributes="data-tile string:${workspace_url}/@@sidebar.tile">
</aside>

</div>
<nav class="navigation workspace-tabs" id="workspace-tabs" data-tile="${workspace_url}/@@workspace.tabs.tile" />

</metal:content>
</body>
</html>
40 changes: 2 additions & 38 deletions src/ploneintranet/workspace/browser/tiles/workspaces.py
Original file line number Diff line number Diff line change
@@ -1,55 +1,19 @@
# -*- coding: utf-8 -*-
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from plone import api
from plone.memoize.view import memoize
from plone.tiles import Tile
from ploneintranet.workspace.utils import my_workspaces


class WorkspacesTile(Tile):

index = ViewPageTemplateFile("templates/workspaces.pt")

def get_workspace_activities(self, brain, limit=1):
''' Return the workspace activities sorted by reverse chronological
order
Regarding the time value:
- the datetime value contains the time in international format
(machine readable)
- the title value contains the absolute date and time of the post
'''
# BBB: this is a mock!!!!
return [
{
'subject': 'Charlotte Holzer',
'verb': 'published',
'object': 'Proposal draft V1.0 # This is a mock!!!',
'time': {
'datetime': '2008-02-14',
'title': '5 October 2015, 18:43',
}
}
][:limit]

@memoize
def workspaces(self):
''' The list of my workspaces
'''
pc = api.portal.get_tool('portal_catalog')
brains = pc(
portal_type="ploneintranet.workspace.workspacefolder",
sort_on="modified",
sort_order="reversed",
)
workspaces = [
{
'title': brain.Title,
'description': brain.Description,
'url': brain.getURL(),
'activities': self.get_workspace_activities(brain),
} for brain in brains
]
return workspaces
return my_workspaces(self.context)

def render(self):
return self.index()
Expand Down
116 changes: 62 additions & 54 deletions src/ploneintranet/workspace/tests/workspace.robot
Original file line number Diff line number Diff line change
Expand Up @@ -12,61 +12,69 @@ Test Teardown Close all browsers

*** Test Cases ***

Site Administrator can add example user as member of workspace
Log in as site owner
Add workspace Example Workspace
Maneuver to Example Workspace
Click Link jquery=a:contains('View full Roster')
Input text edit-roster-user-search Example User
Click button Search users
# I outcomment these tests as they were written for barceloneta.
# We need to
# a) Rewrite them for ploneintranet.theme and
# b) Move them to ploneintranet.suite so that we can test
# for all integrated packages.
# We don't delete them yet so that we have a reference
# [pilz]

Site Administrator can modify policies
Log in as site owner
Add workspace Policy Workspace
Maneuver to Policy Workspace
${url} Get Location
Go to ${url}/policies
Select From List jquery=select[name="form.widgets.external_visibility:list"] private
Click button Ok
# Site Administrator can add example user as member of workspace
# Log in as site owner
# Add workspace Example Workspace
# Maneuver to Example Workspace
# Click Link jquery=a:contains('View full Roster')
# Input text edit-roster-user-search Example User
# Click button Search users

Site Administrator can edit roster
Log in as site owner
Add workspace Example Workspace
Maneuver to Example Workspace
Click Link jquery=a:contains('View full Roster')
Input text edit-roster-user-search test
Click button Search users
Click button Save
# Site Administrator can modify policies
# Log in as site owner
# Add workspace Policy Workspace
# Maneuver to Policy Workspace
# ${url} Get Location
# Go to ${url}/policies
# Select From List jquery=select[name="form.widgets.external_visibility:list"] private
# Click button Ok

Site User can join self managed workspace
Log in as site owner
Add workspace Demo Workspace
Logout
Go to homepage
Element should not be visible jquery=a:contains('Demo Workspace')
Log in as site owner
Maneuver to Demo Workspace
${url} Get Location
Go to ${url}/policies
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 now
Logout
Log in as site owner
Go to homepage
Maneuver to Demo Workspace
Click Link jquery=a:contains('View full Roster')
Element should be visible xpath=//table[@id="edit-roster"]/tbody/tr/td[normalize-space()="test_user_1_"]
# Site Administrator can edit roster
# Log in as site owner
# Add workspace Example Workspace
# Maneuver to Example Workspace
# Click Link jquery=a:contains('View full Roster')
# Input text edit-roster-user-search test
# Click button Search users
# Click button Save

Sharing Tab is usable
Log in as site owner
Add workspace Demo Workspace
Maneuver to Demo Workspace
Go To ${PLONE_URL}/demo-workspace/@@sharing
Input text sharing-user-group-search test
Click button sharing-search-button
Element should be visible xpath=//table[@id="user-group-sharing"]/tbody/tr/td[normalize-space()="test_user_1_ (test-user)"]
# Site User can join self managed workspace
# Log in as site owner
# Add workspace Demo Workspace
# Logout
# Go to homepage
# Element should not be visible jquery=a:contains('Demo Workspace')
# Log in as site owner
# Maneuver to Demo Workspace
# ${url} Get Location
# Go to ${url}/policies
# 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 now
# Logout
# Log in as site owner
# Go to homepage
# Maneuver to Demo Workspace
# Click Link jquery=a:contains('View full Roster')
# Element should be visible xpath=//table[@id="edit-roster"]/tbody/tr/td[normalize-space()="test_user_1_"]

# Sharing Tab is usable
# Log in as site owner
# Add workspace Demo Workspace
# Maneuver to Demo Workspace
# Go To ${PLONE_URL}/demo-workspace/@@sharing
# Input text sharing-user-group-search test
# Click button sharing-search-button
# Element should be visible xpath=//table[@id="user-group-sharing"]/tbody/tr/td[normalize-space()="test_user_1_ (test-user)"]
71 changes: 71 additions & 0 deletions src/ploneintranet/workspace/utils.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
from Acquisition import aq_chain
from BTrees.OOBTree import OOBTree
from ploneintranet.workspace.workspacefolder import IWorkspaceFolder
from Products.CMFCore.interfaces import ISiteRoot
from plone import api
from zope.annotation import IAnnotations
Expand Down Expand Up @@ -35,3 +37,72 @@ def send_email(recipient,
sender=sender,
subject=subject,
body=message)


def parent_workspace(context):
""" Return containing workspace
Returns None if not found.
"""
if IWorkspaceFolder.providedBy(context):
return context
for parent in aq_chain(context):
if IWorkspaceFolder.providedBy(parent):
return parent


def in_workspace(context):
return IWorkspaceFolder.providedBy(parent_workspace(context))


def escape_id_to_class(cid):
""" We use workspace ids as classes to style them.
if a workspace has dots in its name, this is not usable as a class
name. We have to escape that. We might need to do more to them, so this
became a utility function.
"""
return cid.replace('.', '-')


def get_workspace_activities(brain, limit=1):
''' Return the workspace activities sorted by reverse chronological
order
Regarding the time value:
- the datetime value contains the time in international format
(machine readable)
- the title value contains the absolute date and time of the post
'''
# BBB: this is a mock!!!!
return [
{
'subject': 'Charlotte Holzer',
'verb': 'published',
'object': 'Proposal draft V1.0 # This is a mock!!!',
'time': {
'datetime': '2008-02-14',
'title': '5 October 2015, 18:43',
}
}
][:limit]


def my_workspaces(context):
''' The list of my workspaces
'''
pc = api.portal.get_tool('portal_catalog')
brains = pc(
portal_type="ploneintranet.workspace.workspacefolder",
sort_on="modified",
sort_order="reversed",
)
workspaces = [
{
'id': brain.getId,
'title': brain.Title,
'description': brain.Description,
'url': brain.getURL(),
'activities': get_workspace_activities(brain),
'class': escape_id_to_class(brain.getId),
} for brain in brains
]
return workspaces
18 changes: 11 additions & 7 deletions src/ploneintranet/workspace/workspace.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,18 @@
from plone.memoize.view import memoize
from Products.Five.browser import BrowserView
from interfaces import IWorkspaceState
from ploneintranet.workspace.workspacefolder import IWorkspaceFolder
from ploneintranet.workspace.utils import parent_workspace
from plone import api

from Acquisition import aq_chain

class WorkspaceView(BrowserView):
"""
Default View of the workspace
"""

def workspace(self):
# return the related workspace
return parent_workspace(self.context)


class WorkspaceState(BrowserView):
Expand All @@ -18,11 +26,7 @@ class WorkspaceState(BrowserView):
@memoize
def workspace(self):
# Attempt to acquire the current workspace
if IWorkspaceFolder.providedBy(self.context):
return self.context
for parent in aq_chain(self.context):
if IWorkspaceFolder.providedBy(parent):
return parent
return parent_workspace(self.context)

@memoize
def state(self):
Expand Down

0 comments on commit e5634e1

Please sign in to comment.