[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