--- ECHO_content/ECHO_collection.py 2004/05/07 18:04:29 1.72 +++ ECHO_content/ECHO_collection.py 2004/05/10 08:44:19 1.73 @@ -45,6 +45,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"]) @@ -98,8 +121,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.toxml().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 +208,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,"" @@ -343,10 +417,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 +433,131 @@ 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""" + + 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) + 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://localhost:8080/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.absolute_url()+'/newMetaXML',self.metalink)).read() + + if RESPONSE is not None: + RESPONSE.redirect('manage_main') + + + def newMetaXML(self): + 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 +577,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 +611,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 +710,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""" @@ -733,6 +1026,7 @@ class ECHO_collection(Folder, Persistent return ret security.declarePublic('ECHO_rerenderLinksMD') + def ECHO_rerenderLinksMD(self,obj=None): """Rerender all Links""" if not obj: @@ -743,7 +1037,7 @@ class ECHO_collection(Folder, Persistent for entry in entries: if entry[1].meta_type == 'ECHO_resource': entry[1].ECHO_getResourceMD(template="no") - print "rerender",entry[1].getId() + #print "rerender",entry[1].getId() else: self.ECHO_rerenderLinksMD(entry[1]) @@ -1112,7 +1406,7 @@ class ECHO_root(Folder,Persistent,Implic retStr="