--- ECHO_content/ECHO_collection.py 2004/05/07 17:09:07 1.70 +++ ECHO_content/ECHO_collection.py 2004/05/13 19:11:06 1.84 @@ -21,12 +21,15 @@ from OFS.SimpleItem import SimpleItem from AccessControl import ClassSecurityInfo from Globals import InitializeClass from Globals import DTMLFile +import Globals from Products.PageTemplates.PageTemplateFile import PageTemplateFile from Products.PageTemplates.PageTemplate import PageTemplate from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate from Globals import Persistent, package_home from Acquisition import Implicit from ECHO_helpers import displayTypes + + try: from psycopg import libpq except: @@ -45,6 +48,29 @@ import ECHO_helpers #List of different types for the graphical linking viewer viewClassificationListMaster=['view point','area'] +def checkDiffs(self,metadict): + """check differences""" + + def NoneToEmpty(obj): + if obj: + return obj + else: + return "" + + diffs={} + tags=self.findTagsFromMapping(self.contentType) + for field in tags[1]: + try: + if (NoneToEmpty(self.getFieldValue(self.getFieldTag(tags,field)))==metadict[self.getFieldTag(tags,field)]): + diffs[self.getFieldTag(tags,field)]=1 + else: + print "DIFF",field,self.getFieldValue(self.getFieldTag(tags,field)),metadict[self.getFieldTag(tags,field)] + diffs[self.getFieldTag(tags,field)]=0 + except: + diffs[self.getFieldTag(tags,field)]=0 + print "EX",field + return diffs + def content_html(self,type): """template fuer content""" #templates = self.ZopeFind(self.aq_parent,obj_ids=[type+"_template"]) @@ -89,7 +115,7 @@ def sendFile(self, filename, type): break if object: # if the object exists then send it - object() + return object.index_html(self.REQUEST.REQUEST, self.REQUEST.RESPONSE) else: # send a local file with the given content-type fn = os.path.join(package_home(globals()), filename) @@ -98,8 +124,59 @@ def sendFile(self, filename, type): return +def writeMetadata(url,metadict): + """Einlesen der Metadaten und und erstellen des geänderten XML file""" + + try: + geturl="" + for line in urllib.urlopen(url).readlines(): + geturl=geturl+line + + + except: + return (None,"Cannot open: "+url) + + try: + dom=xml.dom.minidom.parseString(geturl) + except: + return (None,"Cannot parse: "+url+"
"+geturl) + + metanodes=dom.getElementsByTagName('bib') + + if not metanodes: + metanodes=dom.getElementsByTagName('archimedes') + + metanode=metanodes[0] + + for metaData in metadict.keys(): + print metaData,metanode + try: + nodeOld=metanode.getElementsByTagName(metaData) + except: + nodeOld=None + + if nodeOld: + metanode.removeChild(nodeOld[0]).unlink() + else: + # try also old writing rule - instead of _: + try: + nodeOld=metanode.getElementsByTagName(re.sub('_','-',metaData)) + except: + nodeOld=None + + if nodeOld: + metanode.removeChild(nodeOld[0]).unlink() + + metanodeneu=dom.createElement(metaData) + metanodetext=dom.createTextNode(unicode(metadict[metaData],"utf8")) + metanodeneu.appendChild(metanodetext) + metanode.appendChild(metanodeneu) + + + return dom.topxml().encode('utf-8') + def readMetadata(url): - """Methoden zum Auslesen der Metadateninformation zu einer Resource + """Methode zum Auslesen der Metadateninformation zu einer Resource Vorerst noch Typ bib""" metadict={} @@ -134,11 +211,11 @@ def readMetadata(url): for node in metacontent: try: - metadict[node.tagName.lower()]=getText(node.childNodes) + metadict[re.sub('-','_',node.tagName.lower())]=getText(node.childNodes) except: """nothing""" - #print metadict + return metadict,"" @@ -311,7 +388,22 @@ class ECHO_resource(Folder): return self.viewClassification else: return "" - + + def getFullTextXML(self,noredirect=None): + """getFullTextXML""" + try: + fh=urllib.urlopen(self.metalink) + dom=xml.dom.minidom.parse(fh) + texttools=dom.getElementsByTagName('texttool') + text=texttools[0].getElementsByTagName('text') + texturl=getText(text[0].childNodes) + if not noredirect: + self.REQUEST.RESPONSE.redirect(texturl) + else: + return texturl + except: + return None + def getCredits(self): """Ausgabe der credits""" if self.credits: @@ -343,10 +435,15 @@ class ECHO_resource(Folder): def getCoords(self): - try: - return [string.join(x,",") for x in self.coords] - except: - return [] + """gibt coordinaten als String zurück und löscht zugleich einträge die keine Koordinaten sind, letzteres zur korrektur der Eingabe der alten version""" + retList=[] + if hasattr(self,'coords'): + for x in self.coords: + if len(x)>1: + retList.append(string.join(x,",")) + return retList + + def getContentType(self): try: @@ -354,19 +451,135 @@ class ECHO_resource(Folder): except: return "" + def getCopyrightType(self): + try: + return self.copyrightType + except: + return "" + + def getRenderingType(self): + try: + return self.renderingType + except: + return "" + def ECHO_resource_config(self): """Main configuration""" if not hasattr(self,'weight'): self.weight="" - if not hasattr(self,'coords'): - self.coords=[] - print "vorher",self.coords pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resource.zpt').__of__(self) return pt() + def ECHO_resource_config_main(self): + """Main configuration""" + + if not hasattr(self,'weight'): + self.weight="" + + pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resource_main.zpt').__of__(self) + return pt() + + def ECHO_resource_config_coords(self): + """Coords configuration """ + + pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resource_coords.zpt').__of__(self) + return pt() + + def ECHO_resource_config_credits(self): + """Main configuration""" + + pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resource_credits.zpt').__of__(self) + return pt() + + def ECHO_resource_config_metadata(self): + """Main configuration""" + + if (hasattr(self,'metadata')) and not (hasattr(self,'metaDataHash')): + self.metaDataHash={} + self.contentType=self.bib_type + for data in self.metadata: + data_neu=re.sub('-','_',data) + self.metaDataHash[data_neu]=getattr(self,data) + #print data_neu, getattr(self,data) + #print self.metaDataHash,self.metadata + + pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_resource_metadata.zpt').__of__(self) + return pt() + + + + + def changeECHO_resource_main(self,metalink,link,title,label,description,contentType,renderingType,weight,resourceID,RESPONSE=None): + """Änderung der Properties""" + self.resourceID=resourceID + self.title=title + self.label=label + self.description=description + + self.contentType=contentType + self.renderingType=renderingType + self.weight=weight + + self.link=link + self.metalink=metalink + + if RESPONSE is not None: + RESPONSE.redirect('manage_main') + + + def changeECHO_resource_coords(self,coords,viewClassification,RESPONSE=None): + """Änderung der Properties - coords""" + + if type(coords)==StringType: + coords=[coords] + + try: + coordsnew=[ string.split(x,",") for x in coords] + except: + coordsnew=[] + + self.coords=coordsnew[0:] + self.viewClassification=viewClassification + + if RESPONSE is not None: + RESPONSE.redirect('manage_main') + + def changeECHO_resource_credits(self,credits,responsible,copyrightType,RESPONSE=None): + """Änderung der Properties""" + self.credits=credits + self.responsible=responsible + self.copyrightType=copyrightType + + if RESPONSE is not None: + RESPONSE.redirect('manage_main') + + + def changeECHO_resource_metadata(self,RESPONSE=None): + """change metadata""" + tags=self.findTagsFromMapping(self.contentType) + self.OSAS_meta={} + for field in tags[1]: + try: + self.metaDataHash[self.getFieldTag(tags,field)]=self.REQUEST.form[self.getFieldTag(tags,field)] + self.OSAS_meta[self.getFieldTag(tags,field)]=self.REQUEST.form['OSAS_%s'%self.getFieldTag(tags,field)] + except: + """nothing""" + + return urllib.urlopen('http://xserve02.mpiwg-berlin.mpg.de:18880/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/newMetaXML')).read() + + if RESPONSE is not None: + RESPONSE.redirect('manage_main') + + + def newMetaXML(self): + """new index.meta""" + self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml') + return writeMetadata(self.metalink,self.OSAS_meta) + + def changeECHO_resource(self,metalink,link,title,label,description,contentType,responsible,weight,viewClassification="",coords=None,credits=None,RESPONSE=None): """Änderung der Properties""" @@ -386,10 +599,13 @@ class ECHO_resource(Folder): manage_options = Folder.manage_options+( - {'label':'Main Config','action':'ECHO_resource_config'}, - {'label':'Metadata','action':'ECHO_getResourceMD'}, - {'label':'Graphics','action':'ECHO_graphicEntry'}, - ) + {'label':'Main Config','action':'ECHO_resource_config_main'}, + {'label':'Change Credits & Copyright','action':'ECHO_resource_config_credits'}, + {'label':'Change Metadata','action':'ECHO_resource_config_metadata'}, + {'label':'Change Coords','action':'ECHO_resource_config_coords'}, + {'label':'Add coords','action':'ECHO_graphicEntry'}, + {'label':'Sync Metadata','action':'ECHO_getResourceMD'}, + ) def getOverview(self): """overview graphics""" @@ -417,6 +633,98 @@ class ECHO_resource(Folder): if RESPONSE is not None: RESPONSE.redirect('ECHO_graphicEntry') + + def isDefinedInThisSet(self,fields,field): + """checks if field is defined in fields""" + if (fields[0].has_key(field)) and not (fields[0][field]==""): + return 1 + else: + + return 0 + + def getFieldLabel(self,fields,field): + """get labels""" + try: + ret =fields[0][field] + if ret == "": + return field + else: + return ret + except: + return field + + + + def getFieldTag(self,fields,field): + """get labels""" + try: + ret =fields[0][field] + if ret == "": + return field + else: + return ret + except: + return field + + + + def getFieldValue(self,field): + """get value""" + #print field + try: + + ret=self.metaDataHash[field] + if ret == "": + return None + else: + return ret + except: + return None + + def findLabelsFromMapping(self,referenceType): + """gib hash mit label -> generic zurueck""" + self.referencetypes=self.ZopeFind(self.standardMD) + #print "RT",referenceType + + bibdata={} + retdata={} + fieldlist=self.standardMD.fieldList + + for referenceTypeF in self.referencetypes: + #print referenceTypeF[1].title,referenceType + if referenceTypeF[1].title == referenceType: + #print "OK" + bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields + bibdata['data']=referenceTypeF[1] + self.fields=bibdata[referenceType] + for field in fieldlist: + retdata[field]=referenceTypeF[1].getValue(field)[1] + #print retdata,fieldlist + return retdata,fieldlist + + def findTagsFromMapping(self,referenceType): + """gib hash mit label -> generic zurueck""" + self.referencetypes=self.ZopeFind(self.standardMD) + + + bibdata={} + retdata={} + fieldlist=self.standardMD.fieldList + + for referenceTypeF in self.referencetypes: + + if referenceTypeF[1].title == referenceType: + bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields + bibdata['data']=referenceTypeF[1] + self.fields=bibdata[referenceType] + for field in fieldlist: + retdata[field]=referenceTypeF[1].getValue(field)[0] + + return retdata,fieldlist + + + + def ECHO_getResourceMD(self,template="yes"): """Einlesen der Metadaten und Anlegen dieser Metadaten als Informationen zur Resource""" (metadict, error)=readMetadata(self.metalink) @@ -424,19 +732,26 @@ class ECHO_resource(Folder): if not error=="": #Fehler beim Auslesen des Metafiles - return "ERROR:",error - for key in metadict.keys():#Hinzufügen der Felder + return "ERROR:",error + - setattr(self,key,metadict[key].encode('ascii','replace')) - + if not (metadict['bib_type']==self.contentType): + self.REQUEST.SESSION['contentStorage']=metadict['bib_type'] + self.REQUEST.SESSION['contentZope']=self.contentType - self.metadata=metadict.keys() + return PageTemplateFile('Products/ECHO_content/zpt/ECHO_getResourceMDErrorContentType.zpt').__of__(self)() + + self.REQUEST.SESSION['metadict']=metadict - self.label=self.generate_label() - + self.REQUEST.SESSION['diffs']=checkDiffs(self,metadict) + + if template=="yes": pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_resourceMD.zpt').__of__(self) return pt() + + + def ECHO_getMD(self,item): """Ausgabe der MD""" @@ -574,8 +889,11 @@ class ECHO_link(ECHO_externalLink): def content_html(self): - """template fuer content""" - return content_html(self,'link') + """template fuer link""" + if hasattr(self,"link_template"): + return content_html(self,'link') + else: + return content_html(self,'collection') def manage_addECHO_linkForm(self): """Form for external Links""" @@ -596,6 +914,7 @@ def manage_addECHO_link(self,id,title,la class ECHO_collection(Folder, Persistent, Implicit): """ECHO Collection""" + security=ClassSecurityInfo() meta_type='ECHO_collection' viewClassificationList=viewClassificationListMaster @@ -615,10 +934,13 @@ class ECHO_collection(Folder, Persistent """title""" return self.label.encode('utf-8') + + def createRessourcesFromXMLForm(self): """form""" pt=PageTemplateFile('Products/ECHO_content/zpt/createRessourcesFromXMLForm.zpt').__of__(self) return pt() + def createRessourcesFromXML(self,fileupload): """read an XML file for generating resources""" dom=xml.dom.minidom.parse(fileupload) @@ -683,21 +1005,65 @@ class ECHO_collection(Folder, Persistent def createJavaScript(self): """CreateJava""" - #ret=javaScriptMain - ret="" + ret=javaScriptMain dynamical="\n" for ob in self.getGraphicCoords(): if ob[4][4] == "": - #dynamical+="""Coords.push(new Coord('%s', Img, %s));\n"""%(ob[1],ob[0]) + dynamical+="""Coords.push(new Coord('%s', Img, %s));\n"""%(ob[1],ob[0]) + else: + dynamical+="""Coords.push(new Coord('%s', Img, %s));//%s\n"""%(ob[1],ob[0],ob[4][4]) + dynamical+="ShowArrow(new getObj('i.%s'),Img,%s);\n"%(ob[1],ob[0]) + ret+=javaHandler%dynamical + return ret + + def createJSAreas(self): + """new version of createJavaScript""" + dynamical="\n" + for ob in self.getGraphicCoords(): + if ob[5] == "area": dynamical+="""addArea('%s', 'overview', %s, 'area');\n"""%(ob[1],ob[0]) else: dynamical+="""addArea('%s', 'overview', %s, 'arrow');\n"""%(ob[1],ob[0]) - #dynamical+="""Coords.push(new Coord('%s', Img, %s));//%s\n"""%(ob[1],ob[0],ob[4][4]) - #dynamical+="ShowArrow(new getObj('i.%s'),Img,%s);\n"%(ob[1],ob[0]) - #ret+=javaHandler%dynamical - ret+=dynamical - return ret + return dynamical + + def createMapHead(self): + """generate divs""" + pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/ECHO_content_map_frag_js')).__of__(self) + return pt() + + def createMapLink(self, ob, text=None): + """generate map link""" + id = ob[1] + link = ob[1] + if text == None: + text = ob[2] + tag = '" + return tag + + def createMapAux(self, ob, arrowsrc="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/servlet/Scaler/?dw=15&fn=icons/pfeil"): + """generate map link image, text and other stuff""" + id = ob[1] + link = ob[1] + vtype = ob[5] + ctype = ob[3].contentType + + tag = ''%(id,id,id,link) + if vtype == "view point": + rot = ob[4][4] + tag += ''%(id,arrowsrc,rot) + else: + tag += '%s\n"""%(contentType[0],contentType[0]) else: @@ -1121,7 +1486,60 @@ class ECHO_root(Folder,Persistent,Implic except: """nothing""" - return retStr + return retStr + + def renderingTypeSelector_HTML(self,selected=None): + """give type selector""" + if not selected: + retStr="%s
"""%(strUrl,word) str=retStr if str: @@ -1234,12 +1650,12 @@ class ECHO_root(Folder,Persistent,Implic def link2html(self,str): """link2html fuer VLP muss hier noch raus""" if str: - print str + #print str str=re.sub("\&","&",str) dom=xml.dom.minidom.parseString(""+str+"") links=dom.getElementsByTagName("link") - print "link",links + #print "link",links for link in links: link.tagName="a" ref=link.getAttribute("ref") @@ -1312,7 +1728,79 @@ class ECHO_root(Folder,Persistent,Implic ret.append((collection[0].getId(),collection[1].getId(),collection[2])) return ret - + def getResourcesHTML(self,viewerType=None,filter=None): + """gebe all ressourcen aus""" + + def sortHTML(x,y): + return cmp(x[1].title,y[1].title) + + ret="""

Resources in ECHO

""" + + resources = self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1) + ret+="""

Found %i resources

"""%len(resources) + resources.sort(sortHTML) + for resource in resources: + echo_url=resource[1].absolute_url() + + if hasattr(resource[1],'title'): + title=resource[1].title + else: + title="None" + if filter: + if re.search(filter,title): + ret+="""\n

%s

"""%(echo_url,title) + else: + ret+="""\n

%s

"""%(echo_url,title) + + ret +="""\n""" + + #self.REQUEST.RESPONSE.setHeader("Content-Type", "text/html") + #self.REQUEST.RESPONSE.write(ret) + return ret + + def getResourcesXML(self,viewerType=None,filter=None): + """gebe all ressourcen aus""" + ret=""" + """ + for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1): + + echo_url=resource[1].absolute_url() + if hasattr(resource[1],'link'): + viewer_url=resource[1].link + else: + viewer_url="NO URL" + if filter: + if re.search(filter,viewer_url): + ret+="""\n"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?')) + else: + ret+="""\n"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?')) + ret +="""\n""" + + self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml") + self.REQUEST.RESPONSE.write(ret) + + def getFullTextsXML(self,viewerType=None,filter=None): + """gebe all ressourcen aus""" + ret=""" + """ + for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1): + + echo_url=resource[1].absolute_url() + if resource[1].getFullTextXML(noredirect="yes"): + if hasattr(resource[1],'link'): + viewer_url=echo_url+"/getFullTextXML" + else: + viewer_url="NO URL" + if filter: + if re.search(filter,viewer_url): + ret+="""\n"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?')) + else: + ret+="""\n"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?')) + ret +="""\n""" + print ret + + self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml") + self.REQUEST.RESPONSE.write(ret) def manage_addECHO_root(self,id,title,RESPONSE=None): """Add an ECHO_root"""