Commit 693a53df authored by Hanno Schlichting's avatar Hanno Schlichting

Merged r110490:110491 from 2.12 branch

parent 1525a9fe
......@@ -15,7 +15,6 @@
$Id$
"""
from Acquisition import aq_base
from Acquisition import aq_inner
from Acquisition import aq_parent
from AccessControl import getSecurityManager
......@@ -30,6 +29,7 @@ import transaction
from ZopeUndo.Prefix import Prefix
from zope.interface import implements
class UndoSupport(ExtensionClass.Base):
implements(IUndoSupport)
......@@ -37,8 +37,8 @@ class UndoSupport(ExtensionClass.Base):
security = ClassSecurityInfo()
manage_options=(
{'label':'Undo', 'action':'manage_UndoForm',
'help':('OFSP','Undo.stx')},
{'label': 'Undo', 'action': 'manage_UndoForm',
'help': ('OFSP', 'Undo.stx')},
)
security.declareProtected(undo_changes, 'manage_UndoForm')
......@@ -47,20 +47,25 @@ class UndoSupport(ExtensionClass.Base):
globals(),
PrincipiaUndoBatchSize=20,
first_transaction=0,
last_transaction=20
last_transaction=20,
)
def get_request_var_or_attr(self, name, default):
if hasattr(self, 'REQUEST'):
REQUEST=self.REQUEST
if REQUEST.has_key(name): return REQUEST[name]
if hasattr(self, name): v=getattr(self, name)
else: v=default
REQUEST[name]=v
if REQUEST.has_key(name):
return REQUEST[name]
if hasattr(self, name):
v = getattr(self, name)
else:
v = default
REQUEST[name] = v
return v
else:
if hasattr(self, name): v=getattr(self, name)
else: v=default
if hasattr(self, name):
v = getattr(self, name)
else:
v = default
return v
security.declareProtected(undo_changes, 'undoable_transactions')
......@@ -69,57 +74,60 @@ class UndoSupport(ExtensionClass.Base):
PrincipiaUndoBatchSize=None):
if first_transaction is None:
first_transaction=self.get_request_var_or_attr(
first_transaction = self.get_request_var_or_attr(
'first_transaction', 0)
if PrincipiaUndoBatchSize is None:
PrincipiaUndoBatchSize=self.get_request_var_or_attr(
PrincipiaUndoBatchSize = self.get_request_var_or_attr(
'PrincipiaUndoBatchSize', 20)
if last_transaction is None:
last_transaction=self.get_request_var_or_attr(
last_transaction = self.get_request_var_or_attr(
'last_transaction',
first_transaction+PrincipiaUndoBatchSize)
spec={}
spec = {}
# A user is allowed to undo transactions that were initiated
# by any member of a user folder in the place where the user
# is defined.
user = getSecurityManager().getUser()
if hasattr(user, 'aq_parent'):
path = '/'.join(user.aq_parent.getPhysicalPath()[1:-1])
user_parent = aq_parent(user)
if user_parent is not None:
path = '/'.join(user_parent.getPhysicalPath()[1:-1])
else:
path=''
if path: spec['user_name']=Prefix(path)
path = ''
if path:
spec['user_name'] = Prefix(path)
if getattr(aq_parent(aq_inner(self)), '_p_jar', None) == self._p_jar:
# We only want to undo things done here (and not in mounted
# databases)
opath='/'.join(self.getPhysicalPath())
opath = '/'.join(self.getPhysicalPath())
else:
# Special case: at the root of a database,
# allow undo of any path.
opath = None
if opath: spec['description']=Prefix(opath)
if opath:
spec['description'] = Prefix(opath)
r = self._p_jar.db().undoInfo(
first_transaction, last_transaction, spec)
for d in r:
d['time']=t=DateTime(d['time'])
d['time'] = t = DateTime(d['time'])
desc = d['description']
tid=d['id']
tid = d['id']
if desc:
desc = desc.split()
d1=desc[0]
d1 = desc[0]
desc = ''.join(desc[1:])
if len(desc) > 60: desc = desc[:56]+' ...'
if len(desc) > 60:
desc = desc[:56] + ' ...'
tid = "%s %s %s %s" % (encode64(tid), t, d1, desc)
else:
tid = "%s %s" % (encode64(tid), t)
d['id']=tid
d['id'] = tid
return r
......@@ -136,7 +144,8 @@ class UndoSupport(ExtensionClass.Base):
tid=decode64(tid[0])
undo(tid)
if REQUEST is None: return
if REQUEST is None:
return
REQUEST['RESPONSE'].redirect("%s/manage_UndoForm" % REQUEST['URL1'])
return ''
......@@ -147,13 +156,17 @@ InitializeClass(UndoSupport)
import binascii
def encode64(s, b2a=binascii.b2a_base64):
if len(s) < 58: return b2a(s)
r=[]; a=r.append
if len(s) < 58:
return b2a(s)
r = []
a = r.append
for i in range(0, len(s), 57):
a(b2a(s[i:i+57])[:-1])
return ''.join(r)
def decode64(s, a2b=binascii.a2b_base64):
__traceback_info__=len(s), `s`
return a2b(s+'\n')
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment