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.