Skip to content

Commit

Permalink
merge plone.app.stagingbehavior into plone.app.iterate without the
Browse files Browse the repository at this point in the history
  behavior implementation
  • Loading branch information
vangheem committed Jul 15, 2015
1 parent cd49f57 commit 642f465
Show file tree
Hide file tree
Showing 27 changed files with 828 additions and 255 deletions.
6 changes: 5 additions & 1 deletion CHANGES.rst
@@ -1,9 +1,13 @@
Changelog
=========

3.0.2 (unreleased)
3.1.0 (unreleased)
------------------

- merge plone.app.stagingbehavior into plone.app.iterate without the
behavior implementation. This is for Plone 5 iterate support
[vangheem]

- Don't remove aquisition on object for getToolByName call
[tomgross]

Expand Down
20 changes: 19 additions & 1 deletion plone/app/iterate/__init__.py
Expand Up @@ -22,7 +22,25 @@
"""
"""

import logging
from zope.i18nmessageid import MessageFactory
from plone.app.iterate import permissions # noqa

PloneMessageFactory = MessageFactory('plone')
logger = logging.getLogger('plone.app.iterate')


try:
import plone.app.relationfield # noqa
except ImportError:
logger.warn('Dexterity support for iterate is not available. '
'You must install plone.app.relationfield')


from plone.app.iterate import permissions
try:
import plone.app.stagingbehavior # noqa
logger.error('plone.app.stagingbehavior should NOT be installed with this version '
'of plone.app.iterate. You may experience problems running this configuration. '
'plone.app.iterate now has dexterity suport built-in.')
except ImportError:
pass
26 changes: 13 additions & 13 deletions plone/app/iterate/archiver.py
Expand Up @@ -30,30 +30,30 @@

import interfaces

class ContentArchiver( object ):
class ContentArchiver(object):

implements( interfaces.IObjectArchiver )
adapts( interfaces.IIterateAware )
implements(interfaces.IObjectArchiver)
adapts(interfaces.IIterateAware)

def __init__( self, context ):
def __init__(self, context):
self.context = context
self.repository = getToolByName(context, 'portal_repository')

def save( self, checkin_message ):
self.repository.save( self.context, checkin_message )
def save(self, checkin_message):
self.repository.save(self.context, checkin_message)

def isVersionable( self ):
if not self.repository.isVersionable( self.context ):
def isVersionable(self):
if not self.repository.isVersionable(self.context):
return False
return True

def isVersioned( self ):
def isVersioned(self):
archivist = getToolByName(self.context, 'portal_archivist')
version_count = len( archivist.queryHistory( self.context ) )
return bool( version_count )
version_count = len(archivist.queryHistory(self.context))
return bool(version_count)

def isModified( self ):
def isModified(self):
try:
return not self.repository.isUpToDate( self.context )
return not self.repository.isUpToDate(self.context)
except:
return False
23 changes: 17 additions & 6 deletions plone/app/iterate/browser/cancel.pt
@@ -1,7 +1,15 @@
<html metal:use-macro="here/@@standard_macros/page" i18n:domain="plone">

<div id="content" metal:fill-slot="body">

<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="plone">
<body>

<metal:content fill-slot="content">
<metal:content define-macro="content">
<article id="content">
<form action="#"
method="post"
tal:attributes="action string:${context/absolute_url}/@@content-cancel-checkout">
Expand Down Expand Up @@ -38,6 +46,9 @@
</div>

</form>
</div>
</article>
</metal:content>
</metal:content>

</html>
</body>
</html>
21 changes: 16 additions & 5 deletions plone/app/iterate/browser/checkin.pt
@@ -1,6 +1,15 @@
<html metal:use-macro="context/@@standard_macros/page" i18n:domain="plone">
<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="plone">
<body>

<div id="content" metal:fill-slot="body">
<metal:content fill-slot="content">
<metal:content define-macro="content">
<article id="content">

<form action="#"
method="post"
Expand Down Expand Up @@ -55,7 +64,9 @@
</fieldset>

</form>
</article>
</metal:content>
</metal:content>

</div>

</html>
</body>
</html>
39 changes: 17 additions & 22 deletions plone/app/iterate/browser/control.py
Expand Up @@ -20,16 +20,14 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##################################################################

from plone.memoize.view import memoize

from AccessControl import getSecurityManager
from Acquisition import aq_inner
from Products.Five.browser import BrowserView
from Products.Archetypes.interfaces import IReferenceable
import Products.CMFCore.permissions

from Products.Five.browser import BrowserView
from plone.app.iterate import interfaces
from plone.app.iterate.relation import WorkingCopyRelation
from plone.app.iterate.interfaces import ICheckinCheckoutPolicy
from plone.app.iterate.interfaces import IWorkingCopy
from plone.memoize.view import memoize


class Control(BrowserView):
Expand All @@ -38,12 +36,6 @@ class Control(BrowserView):
This is a public view, referenced in action condition expressions.
"""

def get_original(self, context):
if IReferenceable.providedBy(context):
refs = context.getRefs(WorkingCopyRelation.relationship)
if refs:
return refs[0]

def checkin_allowed(self):
"""Check if a checkin is allowed
"""
Expand All @@ -57,12 +49,15 @@ def checkin_allowed(self):
if not archiver.isVersionable():
return False

original = self.get_original(context)
if not IWorkingCopy.providedBy(context):
return False

policy = ICheckinCheckoutPolicy(context)
original = policy.getBaseline()
if original is None:
return False

if not checkPermission(
Products.CMFCore.permissions.ModifyPortalContent, original):
if not checkPermission(Products.CMFCore.permissions.ModifyPortalContent, original):
return False

return True
Expand All @@ -75,19 +70,17 @@ def checkout_allowed(self):
if not interfaces.IIterateAware.providedBy(context):
return False

if not IReferenceable.providedBy(context):
return False

archiver = interfaces.IObjectArchiver(context)
if not archiver.isVersionable():
return False

# check if there is an existing checkout
if len(context.getBRefs(WorkingCopyRelation.relationship)) > 0:
policy = ICheckinCheckoutPolicy(context)

if policy.getWorkingCopy() is not None:
return False

# check if its is a checkout
if len(context.getRefs(WorkingCopyRelation.relationship)) > 0:
if policy.getBaseline() is not None:
return False

return True
Expand All @@ -97,4 +90,6 @@ def cancel_allowed(self):
"""Check to see if the user can cancel the checkout on the
given working copy
"""
return self.get_original(aq_inner(self.context)) is not None
policy = ICheckinCheckoutPolicy(self.context)
original = policy.getBaseline()
return original is not None
38 changes: 17 additions & 21 deletions plone/app/iterate/browser/diff.py
Expand Up @@ -6,30 +6,26 @@
from Products.Five.browser import BrowserView

from plone.app.iterate.interfaces import IWorkingCopy, IBaseline
from plone.app.iterate.relation import WorkingCopyRelation
from plone.app.iterate.interfaces import ICheckinCheckoutPolicy

class DiffView( BrowserView ):

def __init__( self, context, request ):
self.context = context
self.request = request
if IBaseline.providedBy( self.context ):
self.baseline = context
self.working_copy = context.getBackReferences( WorkingCopyRelation.relationship )[0]
elif IWorkingCopy.providedBy( self.context ):
self.working_copy = context
self.baseline = context.getReferences( WorkingCopyRelation.relationship )[0]
class DiffView(BrowserView):

def __call__(self):
policy = ICheckinCheckoutPolicy(self.context)
if IBaseline.providedBy(self.context):
self.baseline = self.context
self.working_copy = policy.getWorkingCopy()
elif IWorkingCopy.providedBy(self.context):
self.working_copy = self.context
self.baseline = policy.getBaseline()
else:
raise AttributeError("Invalid Context")
return self.index()

def diffs( self ):
def diffs(self):
diff = getToolByName(self.context, 'portal_diff')
return diff.createChangeSet( self.baseline,
self.working_copy,
id1="Baseline",
id2="Working Copy" )





return diff.createChangeSet(self.baseline,
self.working_copy,
id1="Baseline",
id2="Working Copy")

0 comments on commit 642f465

Please sign in to comment.