[Zope] porting from Python Methods to PythonScripts in 2.3.0;LoginManager too

Jim Washington jwashin@vt.edu
Mon, 29 Jan 2001 14:54:01 -0500


The text of an external method for converting Python Methods to Python
Scripts was posted to the list a while back.  I forget who because I
just copied and pasted at the time.  Anyway, credit to whoever, and
apologies for not having the name.

I took that and made something that works for me as a Python Script.
(Though my Methods have been rather simple...)

Standard caveats, YMMV, etc, but it does a quick pass on the Methods in
the folder where it is and makes Scripts from them when you hit the
'test' tab, saving the old ones as methodname.old.  It's not perfect
(e.g., it will import random if you use whrandom); it's just a bit
easier than manually editing (copy, paste, edit) for the same
functionality.  It would be pretty easy to recurse all folders and
change them all, but I am not that bold yet.  It seems debugged enough
to post.  I am sure someone will let me know if otherwise.  

-- Jim Washington

#### begin code

import string
ids = container.objectIds('Python Method')
#what suffix do we want on the old Methods?
oldscriptsuffix='.old'
#replace all self. with the following:
#change to context if needed
newself = 'container'
#for future programmatic use just to be certain no extra dots
if string.find(newself,'.') >= 0:
  newself = string.replace(newself,'.','')
for method_id in ids:
  method_id = string.strip(method_id)
#get the Method and its title
  method = container[method_id]
  title = method.title
#FTPget does not require external method!
  thebody = method.manage_FTPget()
#get the params
  eop = string.find(thebody,'</params>')
  params = thebody[8:eop]
  params = string.replace(params,' ','')
  params = string.replace(params,'self,','')
  params = string.rstrip(string.replace(params,'self',''))
  body = thebody[eop+10:]
#get the body
  newbodylist = []
  splitbody = string.split(body,'\n')
#do imports as needed
#bug: random will be imported if you use whrandom
  for animport in ['string','whrandom','random','math']:
    if string.find(body,animport+'.') >= 0:
      newbodylist.append('import ' + animport)
  for k in splitbody:
#this would be a good place for re; put container where self was
    newstring = string.replace(k,'self.',newself + '.')
#bug: might miss 'self [' wish re were available
    newstring = string.replace(newstring,'self[', newself + '.')
    newbodylist.append(string.rstrip(newstring))
  body = string.join(newbodylist,'\n')
# uncomment to see the raw data
#  print 'params = "%s"' % params
#  print 'body is:\n"%s"' % body
  
#rename the old and create the new.  don't do more than once.
  if method_id [-len(oldscriptsuffix):] <> oldscriptsuffix:
    container.manage_renameObject(method_id,method_id+oldscriptsuffix)
   
container.manage_addProduct['PythonScripts'].manage_addPythonScript(method_id)
    newscript = container[method_id]
    newscript.ZPythonScript_setTitle(title)
    newscript.ZPythonScript_edit(params, body)
    print 'converted: \t%s' % method_id

if len(printed) < 9:
  print "No methods to convert"
return printed

#### end code

Evan Simpson wrote:
> 
> From: "Fred Yankowski" <fred@ontosys.com>
> > + Don't copy over SiteAccess and PythonMethods.
> > + Delete the PythonMethods product from the Control_Panel/Products
> >   management folder.
> >
> > Will I have to manually convert each existing Python Method to
> > a PythonScript, or are they essentially the same type?
> 
> They are radically different types, and can therefore live in the same Zope,
> side-by-side, without conflicting.  There is no automatic conversion
> process.  Simply keep PythonMethods installed, and replace individual
> Methods with Scripts as you feel the need.