[Zope] ZSyncer.0.3.1 patch

Andy andy@agmweb.ca
Tue, 19 Jun 2001 07:14:44 -0700


Hi Joseph,

Thanks for the patch! I will look over it soon. Gregor and I actually
started off a SourceForge project for ZSyncer which would be perfect for
this sort of thing. If you are interested let us know and we will include
you in the project, http://sourceforge.net/projects/zsyncer/

Cheers.

----- Original Message -----
From: "Joseph Wayne Norton" <norton@arseed.co.jp>
To: <andym@ActiveState.com>
Cc: <zope@zope.org>; <pms@arseed.co.jp>
Sent: Monday, June 18, 2001 8:31 PM
Subject: [Zope] ZSyncer.0.3.1 patch


>
> Andy -
>
> I have made a patch to ZSyncer 0.3.1 that will constrain ZSyncer to
> operate "relative to" and "only at and below" the level in which the
> ZSyncer object has been installed. I also added https as a valid
> prefix in the _check_http method.
>
> This is useful to me because I can synchronize different staging areas
> such as production, test, and development across different zope servers
> and even within the same zope server.  The behavior of the current
> version should be identical if the Zsyncer object is installed in the
> root folder.
>
> For example, I installed 2 ZSyncers at the following urls:
>
>         http:/www.foo.com/vhosts/xyz.com/prd/zsyncer
>
>         http:/www.foo.com/vhosts/xyz.com/tst/zsyncer
>
> and specified the first url as the destination for the tst zsyncer.
>
> Or similarly using different zope servers:
>
>         http:/www.foo.com/vhosts/xyz.com/prd/zsyncer
>
>         http:/tst.foo.com/vhosts/xyz.com/prd/zsyncer
>
> Although I haven't investigated yet, the ZSyncer could simply use
> "native" method calls instead of xmlrpc if the source and destination
> ZSyncer object reside on the same zope server.
>
> Please review and incorporate this patch if you feel that is is
> applicable to you and others.
>
> regards,
>
> - joe n
>
>
> diff -c --recursive ZSyncer/ZSyncer.py ZSyncer-new/ZSyncer.py
> *** ZSyncer/ZSyncer.py  Sat Jun  2 19:24:39 2001
> --- ZSyncer-new/ZSyncer.py      Tue Jun 19 11:15:14 2001
> ***************
> *** 15,20 ****
> --- 15,21 ----
>   # needed for diff
>   from OFS.History import html_diff, replace
>   from string import join, split, atoi, strip
> + from re import sub
>   from DocumentTemplate.DT_Util import html_quote
>   from DocumentTemplate.DT_Var import url_quote_plus
>   from types import StringType
> ***************
> *** 154,160 ****
>
>       def manage_srcXMLRPC(self, obj_path):
>           """ Get a src from an object (if allowed) suitable for diffing
"""
> !         try: obj = self.restrictedTraverse(obj_path)
>           except KeyError: return 404
>
>           c = getSecurityManager().checkPermission
> --- 155,161 ----
>
>       def manage_srcXMLRPC(self, obj_path):
>           """ Get a src from an object (if allowed) suitable for diffing
"""
> !         try: obj = self._restrictedTraverse(obj_path)
>           except KeyError: return 404
>
>           c = getSecurityManager().checkPermission
> ***************
> *** 169,175 ****
>           if type(obj_path) == type('string'): obj_path =
string.split(obj_path, '/')
>
>           # object lets try finding the parent
> !         try: parent = self.restrictedTraverse(obj_path[:-1])
>           except KeyError: return 404
>
>           # lets check they are allowed to do this
> --- 170,176 ----
>           if type(obj_path) == type('string'): obj_path =
string.split(obj_path, '/')
>
>           # object lets try finding the parent
> !         try: parent = self._restrictedTraverse(obj_path[:-1])
>           except KeyError: return 404
>
>           # lets check they are allowed to do this
> ***************
> *** 208,219 ****
>           ''' Gets a list of the objects '''
>           obs = {}
>           # go find the folder, then iterate through the subject
> !         for ob in self.restrictedTraverse(string.split(folders,
'/')).objectValues():
>               # we dont to sync ZSyncers, that way leads much confusion
>               if ob.meta_type != 'ZSyncer':
>                   o = {}
>                   o['id'] = ob.getId()
> !                 o['path'] = ob.getPhysicalPath()
>                   o['title'] = ob.title_or_id()
>                   o['meta_type'] = ob.meta_type
>                   o['icon'] = ob.icon
> --- 209,220 ----
>           ''' Gets a list of the objects '''
>           obs = {}
>           # go find the folder, then iterate through the subject
> !         for ob in self._restrictedTraverse(string.split(folders,
'/')).objectValues():
>               # we dont to sync ZSyncers, that way leads much confusion
>               if ob.meta_type != 'ZSyncer':
>                   o = {}
>                   o['id'] = ob.getId()
> !                 o['path'] = self._getPhysicalPath(ob)
>                   o['title'] = ob.title_or_id()
>                   o['meta_type'] = ob.meta_type
>                   o['icon'] = ob.icon
> ***************
> *** 297,303 ****
>
>       def _check_http(self, v):
>           # so people can get away with leaving http:// off :)
> !         if v[:7] != 'http://': v = 'http://%s' % v
>           return v
>
>       def _get_time(self):
> --- 298,304 ----
>
>       def _check_http(self, v):
>           # so people can get away with leaving http:// off :)
> !         if v[:7] != 'http://' and v[:8] != 'https://': v = 'http://%s' %
v
>           return v
>
>       def _get_time(self):
> ***************
> *** 336,349 ****
>       def _exportXMLRPC(self, object=None, dest_url=None, add_in=1):
>           """exports an object"""
>           # go get the object
> !         obj = self.restrictedTraverse(object)
>           data = StringIO()
>           obj._p_jar.exportFile(obj._p_oid, data)
>
>           # do xml-rpc
>           serverconn = self._serverConn(self._check_http(dest_url))
> !         try: result =
serverconn.manage_addXMLRPC(self._encode(data.getvalue()),
obj.getPhysicalPath(), add_in)
>           except: return 500
>
>           # return result
>           return result
> --- 337,362 ----
>       def _exportXMLRPC(self, object=None, dest_url=None, add_in=1):
>           """exports an object"""
>           # go get the object
> !         obj = self._restrictedTraverse(object)
>           data = StringIO()
>           obj._p_jar.exportFile(obj._p_oid, data)
>
>           # do xml-rpc
>           serverconn = self._serverConn(self._check_http(dest_url))
> !         try: result =
serverconn.manage_addXMLRPC(self._encode(data.getvalue()),
self._getPhysicalPath(obj), add_in)
>           except: return 500
>
>           # return result
>           return result
> +
> +     def _restrictedTraverse(self, path):
> +         base = join(self.getParentNode().getPhysicalPath(), '/')
> +         if type(path) == type('string'):
> +             base = base + path
> +         elif path != ['']:
> +             base = base + join(path, '/')
> +         return self.restrictedTraverse(split(base, '/'))
> +
> +     def _getPhysicalPath(self, obj):
> +         base = join(self.getParentNode().getPhysicalPath(), '/')
> +         return split(sub('^' + base, '', join(obj.getPhysicalPath(),
'/')), '/')
>
>
>
>
>
>
> _______________________________________________
> Zope maillist  -  Zope@zope.org
> http://lists.zope.org/mailman/listinfo/zope
> **   No cross posts or HTML encoding!  **
> (Related lists -
>  http://lists.zope.org/mailman/listinfo/zope-announce
>  http://lists.zope.org/mailman/listinfo/zope-dev )