Q: adding products, weird behavior
---- =_NextPart_000_01BE9BCA.1CD36B40 Hello, I'm trying to get a product straight, but I can't find how to add it's objects programatically the right way(tm). As explained somewhere (to make things worse, I can't find where I learned that anymore) I wrote a "manage_addDCDocument" method in my module, which, AFAIK, should be become a Folder method, in the hope I could use it like any other e. g., manage_addFile. When I add such an object via the web, I can actually derive instances of it (even though I've been wondering, which weird operations I have to perform inside the object constructor, to find the correct DestinationURL) but now I tried to use a script derived from load_site.py I see "manage_addDCDocument Not Found" error. The load_site.py adds new objects like this: call(object.manage_addFile, id=name, file='') Where object points to the folder, within which the new File object is to be placed. I couldn't make head or tail of the code surrounding the problem, base on wild guess (actually reading the manage_addXYZFom code of ZClass products) I found the following kludge to work around the problem. It's so terribly ugly... I beg for help: o_kludge = object.__class__(object.url+'/manage_addProduct/docstore', # ==> F***^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ username=object.username, password=object.password) call(o_kludge.manage_addDCDocument, id=name, data='') This o_kludge object shouldn't been needed. What might I have missed? For reference I attach 3 files: __init__.py : the product initialization DCDocument.py : the object class I want to use (mirrors the hirarchy in the file system and provides dublin core meta data in rdf format) docstore.py : command line tool to store and retrieve files. Any help appreciated. /Jerry -- You can have it done fast, you can have it done cheap, and you can have it done well. --- But you can only have two of those at once. ---- =_NextPart_000_01BE9BCA.1CD36B40 Content-Type: text/plain; name="__init__.py" # have fun from Globals import HTMLFile import DCDocument, Feature, User import sys from zLOG import LOG def initialize(context): perm = 'Add DCDocuments' try: context.registerClass( Feature.Feature, permission='Add IBM Features', constructors=[Feature.manage_addFeature], #icon='' ) except: print "%s: %s" % (sys.exc_type, sys.exc_value) print 'scheisse' try: context.registerClass( User.IBMUserFolder, constructors= (User.manage_addUserFolder,), permission='Add Users', #icon='' ) except: print "%s: %s" % (sys.exc_type, sys.exc_value) print 'scheisse' context.registerClass( DCDocument.DCDocument, permission=perm, constructors=(DCDocument.manage_addDCDocumentForm, DCDocument.manage_addDCDocument), #icon='' ) context.registerBaseClass(DCDocument.DCDocument) ---- =_NextPart_000_01BE9BCA.1CD36B40 Content-Type: text/plain; name="DCDocument.py" """ We add documentation here the other day. """ from OFS.Folder import Folder import Globals import ExtensionClass import DocumentTemplate from Globals import HTML, HTMLFile, MessageDialog from DateTime import DateTime import os, string from zLOG import LOG def manage_addDCDocument(self, id, file='', REQUEST=None): """ Create a DCDocument """ if type(file) is not type(''): file=file.read() self._setObject(id, DCDocument(id, data=file, REQUEST=REQUEST)) return self.manage_main(self, REQUEST, update_menu=1) manage_main=HTMLFile('documentEdit', globals()) manage_addDCDocumentForm=HTMLFile('addDCDocumentForm', globals()) # This should be somewhere else! def _dropPathSep(path): if path[-1] == os.sep: return path[:-1] return path the_publisher = 'IBM Deutschland GmbH' the_rights = 'all rights reserved' class DCDocument(Folder): """ jojo """ meta_type = 'DCDocument' description = '' index_html=None # Prevent accidental acquisition _properties=({'id':'title', 'type':'string', 'mode':'w'}, {'id':'creator', 'type':'string', 'mode':'w'}, # The subject should better be 'tokens' type {'id':'subject', 'type':'string', 'mode':'w'}, {'id':'description', 'type':'text', 'mode':'w'}, {'id':'publisher', 'type':'string', 'mode':'w'}, #{'id':'contributor', 'type':'string', 'mode':'w'}, {'id':'date', 'type':'date', 'mode':''}, #{'id':'type', 'type':'string', 'mode':'w'}, #{'id':'format', 'type':'string', 'mode':'w'}, {'id':'identifier', 'type':'string', 'mode':''}, #{'id':'source', 'type':'string', 'mode':'w'}, #{'id':'language', 'type':'string', 'mode':'w'}, #{'id':'relation', 'type':'string', 'mode':'w'}, #{'id':'coverage', 'type':'string', 'mode':'w'}, {'id':'rights', 'type':'string', 'mode':'w'}, ) _dc_properties = _properties def _init_identifier_ininit(self, id, REQUEST): self.id=id self.parents = REQUEST['PARENTS'] self.parents.reverse() self.parents=self.parents[2:-2] psv=map(lambda i: i.id, self.parents) self._setPropValue('identifier', string.join(psv, '/') + '/' + id) def _init_other(self, REQUEST): self._setPropValue('creator', `REQUEST.AUTHENTICATED_USER`) self._setPropValue('date', DateTime().Date()) self._setPropValue('publisher', the_publisher) self._setPropValue('rights', the_rights) self.locked = None self.manage_changeProperties(REQUEST) def __init__(self, id, data=None, REQUEST=None): self._init_identifier_ininit(id, REQUEST) self._init_other(REQUEST) if REQUEST: self.data=REQUEST['data'] else: self.data=data if type(self.data) is not type(''): self.data=self.data.read() self._saveData() self._saveProperties() return '' def __str__(self): return self.data def _SavePath(self, ext='.sgml', base='/tmp'): dirname = os.path.join(base, string.join(map(lambda i: i.id, self.parents), '/')) if not os.path.exists(dirname): os.makedirs(dirname) return os.path.join(dirname, self.id) + ext def _saveData(self, ext='.sgml'): path = self._SavePath(ext=ext) try: f=open(path, 'wb') except: raise f.write(self.__str__()) f.close() def _saveProperties(self, ext='.rdf'): path = self._SavePath(ext=ext) try: f=open(path, 'w') except: raise f.write(self.RDF()) f.close() def get_size(self): return len(self.__str__()) def PrincipiaSearchSource(self): "Support for searching - the document's contents are searched." LOG('Hier', 0, self.data) return self.data _rdf_header= """<?xml version="1.0" ?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.0/"
""" def RDF(self, REQUEST=None): ' returns the properties as xml ' md=self._rdf_header helpvariable=map(lambda i: i.id, self.parents) md = md + ' <rdf:Description about="/' + getattr(self, 'identifier') + '">\n' for p in self._dc_properties: n = p['id'] try: v = getattr(self, n) except AttributeError: v = None if v and v != '': md=(md + ' <dc:' + n + '>' + DocumentTemplate.DT_Util.html_quote(v) + '</dc:' + n + '>\n') md = (md +' <dc:date>' + self.bobobase_modification_time().Date() + '</dc:date>\n') if REQUEST is not None: REQUEST.RESPONSE.setHeader('Content-Type', 'text/xml') return md+' </rdf:Description>\n</rdf:RDF>\n' _size_changes={ 'Bigger': (5,5), 'Smaller': (-5,-5), 'Narrower': (0,-5), 'Wider': (0,5), 'Taller': (5,0), 'Shorter': (-5,0), } def _er(self,SUBMIT,dtpref_cols,dtpref_rows,REQUEST): dr,dc = self._size_changes[SUBMIT] rows=max(1,string.atoi(dtpref_rows)+dr) cols=max(40,string.atoi(dtpref_cols)+dc) e=(DateTime('GMT') + 365).rfc822() resp=REQUEST['RESPONSE'] resp.setCookie('dtpref_rows',str(rows),path='/',expires=e) resp.setCookie('dtpref_cols',str(cols),path='/',expires=e) def manage_edit(self, data, SUBMIT='Change',dtpref_cols='50', dtpref_rows='20', REQUEST=None): """ tbc """ if `REQUEST.AUTHENTICATED_USER` == 'Anonymous User': REQUEST.RESPONSE.setStatus(403) return MessageDialog(title="Nicht authorisiert", message="Nicht authorisiert") if `REQUEST.AUTHENTICATED_USER` != self.locked: REQUEST.RESPONSE.setStatus(423) return MessageDialog(title="Object locked", message=(getattr(self, 'identifier') + " ist gelocked durch " + `self.locked`)) if self._size_changes.has_key(SUBMIT): self._er(SUBMIT,dtpref_cols,dtpref_rows,REQUEST) if type(data) is not type(''): data=data.read() self.data=data self._saveData() self.locked=None if REQUEST: REQUEST.RESPONSE.redirect(REQUEST['URL1'] + '/manage_editForm') def manage_getLock(self, REQUEST): " tbc " if `REQUEST.AUTHENTICATED_USER` == 'Anonymous User': REQUEST.RESPONSE.setStatus(403) return MessageDialog(title="Nicht authorisiert", message="Nicht authorisiert") if not hasattr(self, 'locked') or self.locked is None or `REQUEST.AUTHENTICATED_USER` == self.locked: self.locked = `REQUEST.AUTHENTICATED_USER` REQUEST.RESPONSE.redirect(REQUEST['URL1'] + '/manage_editForm') def manage_unLock(self, REQUEST): # " tbc " if `REQUEST.AUTHENTICATED_USER` == 'Anonymous User': REQUEST.RESPONSE.setStatus(403) return MessageDialog(title="Nicht authorisiert", message="Nicht authorisiert") if `REQUEST.AUTHENTICATED_USER` == self.locked: self.locked = None REQUEST.RESPONSE.redirect(REQUEST['URL1'] + '/manage_editForm') def manage_editProperties(self, REQUEST): """ edit the PRoperties and write the copy into the meta file """ Folder.manage_editProperties(self, REQUEST) self._saveProperties() def index_html(self, REQUEST, RESPONSE): """ render the document, i.e., give away the plain text """ if REQUEST: REQUEST.RESPONSE.setHeader('Content-Type', 'text/xml') return self.data manage_editForm=HTMLFile('documentEdit', globals()) manage_options=( {'label':'Contents', 'action':'manage_editForm'}, {'label':'Children', 'action':'manage_main'}, {'label':'View', 'action':''}, {'label':'Properties', 'action':'manage_propertiesForm'}, {'label':'Import/Export', 'action':'manage_importExportForm'}, {'label':'Security', 'action':'manage_access'}, {'label':'Undo', 'action':'manage_UndoForm'}, #{'label':'Find', 'action':'manage_findFrame', 'target':'manage_main'}, ) __ac_permissions__=( ('View management screens', ('manage_editForm', 'manage', 'manage_main', 'manage_uploadForm', 'PrincipiaSearchSource')), ('Change DCDocuments', ('manage_edit', 'manage_upload', 'PUT')), ('View', ('__call__', '')), ) Globals.default__class_init__(DCDocument) ---- =_NextPart_000_01BE9BCA.1CD36B40 Content-Type: text/plain; name="docstore.py" #!/usr/bin/python import sys, getopt, os, posix, string usage = """docstore {get|ext|put|create} id...""" passwordfile = '/.priv/docstore-password' url = 'http://dev.ffm.tc:9080/ffm.tc' verbose = 1 def main(): try: cmd = sys.argv[1] except IndexError: print usage sys.exit(1) opts, args = getopt.getopt(sys.argv[2:], '') if not args: print usage sys.exit(1) sys.path.insert(0,'./lib/python') import ZPublisher.Client global ServerError ServerError=ZPublisher.Client.ServerError user = os.environ['USER'] try: f = open(os.environ['HOME']+passwordfile) password = f.read() except IOError: print sys.argv[0] + " can't read " + passwordfile sys.exit(1) object=ZPublisher.Client.Object(url, username=user, password=password) for f in args: if cmd == 'ext' or cmd == 'get': get_file(object, cmd, f) elif cmd == 'put': upload_file(object, cmd, f) elif cmd == 'create': upload_file(object, cmd, f) elif cmd == 'unlock': print "Unlock unwork" elif cmd == 'locate': print "locate unwork" elif cmd == 'ls': print 'ls unwork' else: print usage 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': raise sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2] def get_file(object, cmd, f): dir, name = os.path.split(f) root, ext = os.path.splitext(name) if ext in ('.sgml', '.text', '.txt'): name = root object = object.__class__(object.url+'/'+name, username=object.username, password=object.password) if cmd == 'get': call(object.manage_getLock) try: posix.chmod(f, 0644) except: pass out = open(f, "w") data = object.index_html()[1] out.write(data) out.close() #n, e = os.path.splitext(f) #out = open(n + '.rdf', 'w') #data = object.RDF()[1] #out.write(data) #out.close() def upload_file(object, cmd, f): if os.path.isdir(f): return upload_dir(object, cmd, f) dir, name = os.path.split(f) root, ext = os.path.splitext(name) if ext in ('file', 'dir'): ext='' else: if ext and ext[0] in '.': ext=ext[1:] if ext and globals().has_key('upload_'+ext): if verbose: print 'upload_'+ext, f return globals()['upload_'+ext](object, cmd, f) if verbose: print 'skip_file', f, ext #call(object.manage_addFile, id=name, file=open(f)) def upload_dir(object, cmd, f): if verbose: print 'upload_dir', f dir, name = os.path.split(f) if cmd == 'create': o_kludge = object.__class__(object.url+'/manage_addProduct/docstore', username=object.username, password=object.password) call(o_kludge.manage_addDCDocument, id=name, data='') object=object.__class__(object.url+'/'+name, username=object.username, password=object.password) for n in os.listdir(f): upload_file(object, cmd, os.path.join(f,n)) def upload_sgml(object, cmd, f): dir, name = os.path.split(f) name, ext = os.path.splitext(name) input=open(f) input=input.read() if cmd == 'create': o_kludge = object.__class__(object.url+'/manage_addProduct/docstore', username=object.username, password=object.password) call(o_kludge.manage_addDCDocument, id=name, data=input) else: object=object.__class__(object.url+'/'+name, username=object.username, password=object.password) call(object.manage_edit, data=input) posix.chmod(f, 0444) upload_txt=upload_sgml upload_text=upload_sgml upload_tex=upload_sgml def upload_ps(object, cmd, f): dir, name = os.path.split(f) call(object.manage_addFile, id=name, file=open(f)) upload_eps=upload_ps upload_fig=upload_ps def upload_gif(object, cmd, 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() ---- =_NextPart_000_01BE9BCA.1CD36B40--
participants (1)
-
Joerg Wittenberger