[Zope] uploading documents to Zope
Joachim Schmitz
perry@ac-copy.net
Thu, 15 Jul 1999 15:10:38 +0200 (CEST)
On Wed, 14 Jul 1999, Paul Everitt wrote:
>
> Joachim--
>
> Zope2 has a utility that can be used with older sites that you outta
> take a look at. It's in the utilities directory and it's called
> load_site.py.
>
> It will load the contents of a directory into a folder in Zope,
> converting images to Images, directories to Folders, etc. Just get the
> source release for alpha4 and grap the script.
>
> If you have luck with it, please let the list know what you thought of
> it!
>
> --Paul
here is my extended version of load_site.py: which allows to modify a Zope
dtml-document from the command line like:
load_site.py -u user:pw -v -9 -e http://xxx.yyy.net/Zope/Folder test.dtml
This exchanges the content of document test in folder /Zope/Folder with
the content of test.dtml on your local disc.
to keep the title-property intact this small modification of DTMLMethod.py
in the OFS-directory is necessary:
in method manage_edit around line 235 change
self.title= title
to
if len(title) > 1: self.title=title
here is load_site.py
#!/usr/bin/python
##############################################################################
#
# Zope Public License (ZPL) Version 1.0
# -------------------------------------
#
# Copyright (c) Digital Creations. All rights reserved.
#
# This license has been certified as Open Source(tm).
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# 1. Redistributions in source code must retain the above copyright
# notice, this list of conditions, and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
#
# 3. Digital Creations requests that attribution be given to Zope
# in any manner possible. Zope includes a "Powered by Zope"
# button that is installed by default. While it is not a license
# violation to remove this button, it is requested that the
# attribution remain. A significant investment has been put
# into Zope, and this effort will continue if the Zope community
# continues to grow. This is one way to assure that growth.
#
# 4. All advertising materials and documentation mentioning
# features derived from or use of this software must display
# the following acknowledgement:
#
# "This product includes software developed by Digital Creations
# for use in the Z Object Publishing Environment
# (http://www.zope.org/)."
#
# In the event that the product being advertised includes an
# intact Zope distribution (with copyright and license included)
# then this clause is waived.
#
# 5. Names associated with Zope or Digital Creations must not be used to
# endorse or promote products derived from this software without
# prior written permission from Digital Creations.
#
# 6. Modified redistributions of any form whatsoever must retain
# the following acknowledgment:
#
# "This product includes software developed by Digital Creations
# for use in the Z Object Publishing Environment
# (http://www.zope.org/)."
#
# Intact (re-)distributions of any official Zope release do not
# require an external acknowledgement.
#
# 7. Modifications are encouraged but must be packaged separately as
# patches to official Zope releases. Distributions that do not
# clearly separate the patches from the original work must be clearly
# labeled as unofficial distributions. Modifications which do not
# carry the name Zope may be packaged in any form, as long as they
# conform to all of the clauses above.
#
#
# Disclaimer
#
# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
#
# This software consists of contributions made by Digital Creations and
# many individuals on behalf of Digital Creations. Specific
# attributions are listed in the accompanying credits file.
#
##############################################################################
"""Load a Zope site from a collection of files or directories
"""
usage=""" [options] url file .....
where options are:
-p path
Path to ZPublisher
-u user:password
Credentials
-v
Run in verbose mode.
-9
Use *old* zope method names.
"""
import sys, getopt, os, string
ServerError=''
verbose=0
old=0
edit=0
def main():
user, password = 'superuser', '123'
opts, args = getopt.getopt(sys.argv[1:], 'p:u:ev9')
global verbose
global old
global edit
for o, v in opts:
if o=='-p':
d, f = os.path.split(v)
if f=='ZPublisher': sys.path.insert(0,d)
else: sys.path.insert(0,v)
elif o=='-u':
v = string.split(v,':')
user, password = v[0], string.join(v[1:],':')
elif o=='-v': verbose=1
elif o=='-9': old=1
elif o=='-e': edit=1
if not args:
print sys.argv[0]+usage
sys.exit(1)
url=args[0]
files=args[1:]
import ZPublisher.Client
global ServerError
ServerError=ZPublisher.Client.ServerError
object=ZPublisher.Client.Object(url, username=user, password=password)
if edit:
for f in files: edit_file(object, f)
else:
for f in files: upload_file(object, f)
def call(f, *args, **kw):
# Call a function ignoring redirect bci errors.
try: apply(f,args, kw)
except ServerError, v:
if str(v)[:1] != '3':
print v
raise sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2]
def upload_file(object, f):
if os.path.isdir(f): return upload_dir(object, f)
dir, name = os.path.split(f)
root, ext = os.path.splitext(name)
if ext in ('file', 'dir'): ext=''
else:
ext=string.lower(ext)
if ext and ext[0] in '.': ext=ext[1:]
if ext and globals().has_key('upload_'+ext):
if verbose: print 'upload_'+ext, f, root
return globals()['upload_'+ext](object, f)
if verbose: print 'upload_file', f, ext
call(object.manage_addFile, id=name, file=open(f))
def upload_dir(object, f):
if verbose: print 'upload_dir', f
dir, name = os.path.split(f)
call(object.manage_addFolder, id=name)
object=object.__class__(object.url+'/'+name,
username=object.username,
password=object.password)
for n in os.listdir(f):
upload_file(object, os.path.join(f,n))
def upload_html(object, f):
dir, name = os.path.split(f)
root, ext = os.path.splitext(name)
f=open(f)
# There is a Document bugs that causes file uploads to fail.
# Waaa. This will be fixed in 1.10.2.
f=f.read()
if old:
call(object.manage_addDocument, id=root, file=f)
else:
call(object.manage_addDTMLDocument, id=root, file=f)
upload_htm=upload_html
def edit_file(object, f):
dir, name = os.path.split(f)
root, ext = os.path.splitext(name)
if verbose: print 'edit_file', f
object=object.__class__(object.url+'/'+root,
username=object.username,
password=object.password)
call(object.manage_edit, data=open(f).read()
,title="")
def upload_dtml(object, f):
dir, name = os.path.split(f)
root, ext = os.path.splitext(name)
if old:
call(object.manage_addDocument, id=root, file=open(f))
else:
call(object.manage_addDTMLDocument, id=root, file=f)
def upload_gif(object, f):
dir, name = os.path.split(f)
call(object.manage_addImage, id=name, file=open(f))
upload_jpg=upload_gif
upload_png=upload_gif
if __name__=='__main__': main()
Gruß
Joachim Schmitz
WWW-Consultant
email: js@ac-copy.net
tel: +49-241-89491-0
fax: +49-241-89491-29