[Plone-IT] Plone & mechanize (REPOST)

luigi scarso luigi.scarso a gmail.com
Gio 29 Gen 2009 15:44:43 UTC


2009/1/26 Fabrizio Reale <fabrizio.reale a redomino.com>

> Ciao,
> > Per il momento sto testando il mio "approccio alla zopectl" .
>
> Mi fai capire, per favore, come mai ti piace questa strada?
> Io l'ho usata solo per debug e quindi sono interessato ad
> eventuali vantaggi che ho trascurato.
>


Questo "fa" il task di cui ho bisogno:
1) crea una folder   (localArgs.arg[1])
2) ci mette dentro un file (localArgs.arg[2])
3) ci mette dentro un file (localArgs.arg[3])

L'ho testato in 10 task concorrenti con  un desktop Dell
AMD Athlon(tm) 64 X2 Dual Core Processor 4800+
cpu MHz         : 1000.000
cache size      : 512 KB
1GByte di memoria

e non "perde" pezzi.

Il decorator
entryExit(f)
dovrebbe isolare la parte di gestione dell'accesso a ZODB
dalle funzioni che fanno il lavoro
(mkdir, copy)

La chiarezza e' tutto dire.
#
#
#
#


import sys
import os
##
import AccessControl.SecurityManagement
from pprint import pprint as pprint
from ZODB.POSException import ConflictError
from Testing import makerequest
import transaction
import random
import time
## localArgs  is from upload-zopectl.sh
## really bad way to pass arguments ?
import localArgs



## Utility
def _last_node_frompath(node,path):
    node = site
    for attr in path.split('/'):
        if len(attr) == 0: continue
        node = getattr(node,attr)
    return node



## Decorator
def entryExit(f):
    def new_f(*argv,**kv):
        Limit = 30
        last_t = 1.0
        for j in range(0,Limit):
            try:
                #savepoint = transaction.savepoint()
                print " ** Entering", f.__name__
                res = f(*argv,**kv)
                print " ** Exited", f.__name__
                return res
            except ConflictError:
                #savepoint.rollback()
                if (j+1) == Limit: raise
                else:      pass
            except Exception ,e :
                #savepoint.rollback()
                print "Exception",e ,
                last_t = random.uniform(1.1,2.1) * last_t
                print " sleep", last_t
                time.sleep( last_t )
    new_f.__name__ = f.__name__
    return new_f

#hmm no decorator
#@entryExit
#
def login_admin(app):
    site = makerequest.makerequest(app)
    admin = site.acl_users.getUser('admin')
    AccessControl.SecurityManagement.newSecurityManager(None,admin)
    return site


@entryExit
def logout():
    pass



@entryExit
def mkdir(site ,path='/Plone/Members/testuser',title='sample02',desc='foo'):
    site._p_jar.sync()
    node = site
    for attr in path.split('/'):
        if len(attr) == 0: continue
        node = getattr(node,attr)
    folder = node.invokeFactory("Folder", id=title,title=title)
    node = getattr(node,title)
    node.reindexObject()
    transaction.commit()
    site._p_jar.sync()
    return folder


@entryExit
def copy(site
,path='/Plone/Members/testuser/sample02',title='sample',src=''):
    site._p_jar.sync()
    folder = _last_node_frompath(site,path)
    content_type = os.path.splitext(title)[1]
    ##
    if content_type == '.pdf' :

folder.invokeFactory('File',id=title,title=title,format='application/pdf',content_type='application/pdf',)
        print 'pdf'
    elif content_type == '.swf' :

folder.invokeFactory('File',id=title,title=title,format='application/x-shockwave-flash',content_type='application/x-shockwave-flash',)
        print 'swf'
    else:
        folder.invokeFactory('File',id=title,title=title,)
    file1 = open(src,'rb').read()
    content = getattr(folder,title)
    content.edit(file=file1)
    if content_type == '.swf' :
        content.setFilename(title)
    content.reindexObject()
    transaction.commit()
    site._p_jar.sync()
    return content


###############
from Zope2.Startup.run import configure
configure(os.environ['CONFIG_FILE'])
import Zope2
#
print "TRY ",localArgs.arg[1]
app = None
Limit = 30
last_t = 1.0
for j in range(0,Limit):
    try:
        print "Try app : " ,j
        app = Zope2.app()
        break
    except ConflictError:
        if (j+1) == Limit: raise
        else:      pass
    except Exception ,e :
        print "Exception",e ,
        last_t = random.uniform(1.1,2.1) * last_t
        print " sleep", last_t
        time.sleep( last_t )
#
site = login_admin(app)
pprint( site.Plone )
basepath = '/Plone/Members/testuser'
title = localArgs.arg[1]
folder = mkdir(site=site, path=basepath, title=title, desc='')
#
path=basepath+'/'+title
#
target_file = localArgs.arg[2]
dest = os.path.basename(target_file)
copy(site=site, path=path, title=dest,src=target_file)
#
target_file = localArgs.arg[3]
dest = os.path.basename(target_file)
copy(site=site, path=path, title=dest,src=target_file)





-- 
luigi
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.plone.org/pipermail/plone-plone-it/attachments/20090129/1effdc15/attachment.html>


Maggiori informazioni sulla lista Plone-IT