--- ECHO_content/ECHO_collection.py 2010/10/13 13:10:19 1.310 +++ ECHO_content/ECHO_collection.py 2013/08/05 08:20:10 1.310.2.12 @@ -9,11 +9,7 @@ class ECHO_externalLink contains informa """ -try: - from reportlab.pdfgen import canvas - from reportlab.lib.pagesizes import A4 -except: - print "PDF generation will not work" + import urlparse import string @@ -40,6 +36,8 @@ from Globals import Persistent, package_ from Acquisition import Implicit from Products.ZCatalog.CatalogPathAwareness import CatalogAware from Products.ZCTextIndex.ZCTextIndex import manage_addLexicon +import ECHO_helpers +from Acquisition import aq_parent try: from Products.MetaDataProvider.MetaDataClient import MetaDataClient except: @@ -49,11 +47,11 @@ import urllib2 import cgi import smtplib import time -from Ft.Xml.Domlette import NonvalidatingReader -from Ft.Xml.Domlette import PrettyPrint, Print -from Ft.Xml import EMPTY_NAMESPACE - -import Ft.Xml.XPath +#from Ft.Xml.Domlette import NonvalidatingReader +#from Ft.Xml.Domlette import PrettyPrint, Print +#from Ft.Xml import EMPTY_NAMESPACE +# +#import Ft.Xml.XPath import cStringIO import sys @@ -83,11 +81,13 @@ except: pass from ECHO_movie import * -import vlp_xmlhelpers #TODO: vlp elemente aus echo herausnehmen +#import vlp_xmlhelpers #TODO: vlp elemente aus echo herausnehmen import xmlrpclib import logging +from ECHO_root import ECHO_root + #ersetzt logging.info def logger(txt,method,txt2): """logging""" @@ -544,6 +544,10 @@ class ECHO_link(ECHO_externalLink): {'label':'add links config','action':'ECHO_link_addLinksForm'}, ) + def getMDValueSimpleSearchField(self): + """returns value for simple search""" + return " ".join([self.getTitle(),self.getDescription()]) + def ECHO_link_addLinksForm(self): """Main configuration""" @@ -697,6 +701,8 @@ class ECHO_collection(CatalogAware, Fold meta_type='ECHO_collection' default_catalog='resourceCatalog' + rootMetaTypes = ['ECHO_root', 'ECHO_main', 'ECHO_nav'] + # viewClassificationList=viewClassificationListMaster displayTypes=displayTypes @@ -709,12 +715,11 @@ class ECHO_collection(CatalogAware, Fold return crumbs[0][2].getId() p = self - sec = None # descend parents to the root (and remember the last id) - while p is not None and p.meta_type != 'ECHO_root' and p.meta_type!='ECHO_main' and p.meta_type!='ECHO_nav': + while p is not None and p.meta_type not in self.rootMetaTypes: sec = p.getId() - p = p.aq_parent + p = aq_parent(p.context) return sec @@ -728,12 +733,21 @@ class ECHO_collection(CatalogAware, Fold sec = None subsec = None # descend parents to the root (and remember the last id) - while p is not None and p.meta_type != 'ECHO_root' and p.meta_type!='ECHO_main' and p.meta_type!='ECHO_nav': + while p is not None and p.meta_type not in self.rootMetaTypes: subsec = sec sec = p.getId() - p = p.aq_parent + p = aq_parent(p.context) return subsec + + + def getCrumb(self): + """returns breadcrumb for this object""" + return ECHO_helpers.getCrumb(self) + + def getHierCrumbs(self): + """returns a list of hierarchical breadcrumbs from self to the ECHO_root""" + return ECHO_helpers.getHierCrumbs(self) def exportImportObjects_html(self,RESPONSE): @@ -910,6 +924,46 @@ class ECHO_collection(CatalogAware, Fold return ret+"" + def getExportCollectionsAsJSON(self,metatypes=['ECHO_resource'],REQUEST=None): + import json + ret = self.getExport(metatypes=metatypes) + + if REQUEST: + REQUEST.response.setHeader("Content-type", "text/json; charset=utf-8") + + return json.dumps(ret) + + def getExport(self,metatypes=['ECHO_resource'],REQUEST=None): + + """JSON export collection content""" + import json + ret={} + #contents=self.ZopeFind(self,obj_metatypes=['ECHO_group','ECHO_resource','ECHO_collection']) + contents=self.ZopeFind(self,obj_metatypes=metatypes) + + ret['description']=self.getDescription(); + ret['title']=self.getTitle(); + ret['label']=self.getLabel(); + ret['content']=[] + ret['echo_path']=self.absolute_url().replace(self.echo_pages.absolute_url(),'') + + + for content in contents: + + ret['content'].append(content[1].getDRI(type="mpiwg")) + + return ret + + + + def getDRI(self,type="escidoc"): + """sofar cho collections don't have dris + therefore return the path""" + + return self.absolute_url().replace(self.echo_pages.absolute_url(),'') + + + def changeLabels(self): """change form""" @@ -1078,39 +1132,18 @@ class ECHO_collection(CatalogAware, Fold if RESPONSE is not None: RESPONSE.redirect('manage_main') - def changeViewerTemplateSetsForm(self): + + def changeViewerForm(self): """change the viewer template set""" - pt=zptFile(self, 'zpt/changeViewerTemplateSet') + pt=zptFile(self, 'zpt/changeECHOViewer') return pt() - - def getViewerTemplateSets(self,obj_ids=None,RESPONSE=None): - """Get the ViewerTemplateSet title for configuration""" - ret=[] - - try: - viewerTemplateSets=self.ZopeFind(self.viewerTemplateSets,obj_metatypes=['OSAS_viewerTemplateSet'],obj_ids=obj_ids)#assumes viewerTemplateSets folder somewhere in the hierarchie. - - for viewerTemplateSet in viewerTemplateSets: - ret.append((viewerTemplateSet[1].title,viewerTemplateSet[0],viewerTemplateSet[1])) - - return ret - - except: - return [('no ViewerTemplateSetfolders','')] - + def getTextToolsField(self,name,default=''): - """Lese viewerTemplateSet der Collection not implemented yet!""" + """Lese text tool field der Collection not implemented yet!""" return default - def isSelectedViewerTemplateSet(self,obj,id): - """is ausgewaehlt""" - - if self.REQUEST['viewerTemplateSet']==id: - return 1 - else: - return None def changeViewer(self,newViewer,REQUEST=None,RESPONSE=None): """changes all ressources to the newViewer""" @@ -1134,38 +1167,7 @@ class ECHO_collection(CatalogAware, Fold if RESPONSE is not None: RESPONSE.write("

Done

") - def changeViewerTemplateSets(self,project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix,RESPONSE=None): - """change the templates""" - - resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1) - - for resource in resources: - - resource[1].changeViewerTemplateSet(project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix) - - if RESPONSE is not None: - RESPONSE.redirect('manage_main') - - - def setStartpageFolderForm(self): - """Form for changing the startpage""" - - - pt=zptFile(self, 'zpt/ChangeECHO_resourceStartPageFolder.zpt') - pt.content_type="text/html" - return pt() - - def setStartpageFolder(self,startpage=None,RESPONSE=None): - """change the templates""" - - resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1) - - for resource in resources: - - resource[1].setStartPage(startpage) - - if RESPONSE is not None: - RESPONSE.redirect('manage_main') + def copyTitleToInfoXMLFolder(self,RESPONSE=None): """copy title into the title field of info.xml @@ -1200,17 +1202,7 @@ class ECHO_collection(CatalogAware, Fold if RESPONSE is not None: RESPONSE.redirect('manage_main') - def reloadMetaDataFromStorageWarning(self,RESPONSE=None): - """warning""" - pt=zptFile(self, 'zpt/reloadMetaDataFromStorageWarning.zpt') - pt.content_type="text/html" - return pt() - - def reloadMetaDataFromStorage(self,RESPONSE=None): - """copy metadata from the storage to ECHO""" - - return reloadMetaDataFromStorage(self,RESPONSE) - + def getPartnerCopyright(self,name,sonst="generic"): """gibt generisches copyright eines partners aus, sonst behalte jetzige einsteillung""" @@ -1443,11 +1435,8 @@ class ECHO_collection(CatalogAware, Fold {'label':'Export/Import Objects','action':'exportImportObjects_html'}, {'label':'Graphic Coords','action':'ECHO_graphicEntry'}, {'label':'create resources from XML','action':'createRessourcesFromXMLForm'}, - {'label':'Set Startpage','action':'setStartpageFolderForm'}, - {'label':'Change Viewer Templates and Image Viewer','action':'changeViewerTemplateSetsForm'}, - {'label':'Reload Metadata','action':'reloadMetaDataFromStorageWarning'}, + {'label':'Change Image Viewer','action':'changeViewerForm'}, {'label':'ImportCollection','action':'importCollection'}, - {'label':'Copy MD for indexing and search','action':'copySearchFields'}, {'label':'Change access rights', 'action':'changeAccessRightsCollectionForm'}, ) @@ -1462,7 +1451,7 @@ class ECHO_collection(CatalogAware, Fold if not hasattr(self,'sortfield'): self.sortfield="weight" - pt=zptFile(self, 'zpt/ChangeECHO_collection.zpt') + pt=zptFile(self, 'zpt/ChangeECHO_Collection.zpt') return pt() @@ -1506,8 +1495,15 @@ class ECHO_collection(CatalogAware, Fold def showOverview(self): """overview""" - if 'ECHO_overview.html' in self.__dict__.keys(): - return getattr(self,'ECHO_overview.html')() + # use ECHO_overview.html template in this instance + if 'ECHO_overview.html' in self: + return self['ECHO_overview.html']() + + # use ECHO_overview_main template in path + if hasattr(self, 'ECHO_overview_main'): + return getattr(self, 'ECHO_overview_main')() + + # use template from Product pt=zptFile(self, 'zpt/ECHO_content_overview.zpt') return pt() @@ -1516,23 +1512,35 @@ class ECHO_collection(CatalogAware, Fold def index_html(self): """standard page""" if self.ZCacheable_isCachingEnabled(): - result = self.ZCacheable_get() if result is not None: # Got a cached value. return result - - if 'index.html' in self.__dict__.keys(): - ret=getattr(self,'index.html')() - - elif 'overview' in self.__dict__.keys(): + + # old Zope 2.9 method + #if 'index.html' in self.__dict__.keys(): + # ret=getattr(self,'index.html')() + + # use Zope 2.12 IContainer for child access + if 'index.html' in self: + # use index.html template if it exists + ret = self['index.html']() + + elif 'overview' in self: + # use red-rectangle template when there's an 'overview' ret=self.showOverview() + + # use getattr for acquisition elif hasattr(self,'collection_index_template'): - ret=self.collection_index_template() + # use 'collection_index_template' in acquisition path + ret=self.collection_index_template() + elif hasattr(self,'main_index_template'): - + # use 'main_index_template' in acquisition path ret=self.main_index_template.__of__(self)(self.main_template) + else: + # use template from Product pt=zptFile(self, 'zpt/ECHO_main_index_template_standard.zpt') pt.content_type="text/html" ret=pt.render() @@ -1561,8 +1569,8 @@ class ECHO_collection(CatalogAware, Fold def area_img(self): """area image""" - bt = BrowserCheck(self) - if bt.isIE or bt.isN4: + bt = browserType(self) + if bt['isIE'] or bt['isN4']: return sendFile(self, 'images/red.gif', 'image/gif') else: return sendFile(self, 'images/reda.png', 'image/png') @@ -1618,6 +1626,37 @@ class ECHO_collection(CatalogAware, Fold return [x.absolute_url() for x in self.getSubCols(searchSimple=searchSimple)] + def exportPageTemplateContents(self,REQUEST=None): + """hole nur den inhalt aus page templates""" + + import json + import base64 + from BeautifulSoup import BeautifulSoup + + + ret={} + #contents=self.ZopeFind(self,obj_metatypes=['ECHO_group','ECHO_resource','ECHO_collection']) + contents=self.ZopeFind(self,obj_metatypes=['Page Template'],search_sub=1) + #contents=self.ZopeFind(self) + + + for content in contents: + colId = content[1].absolute_url().replace(self.absolute_url(),'') + + html=content[1].render() + parsed = BeautifulSoup(html) + + + cnt = parsed.findAll(attrs={'class':'stage'}) + if len(cnt) > 0: #sollte nur einen gebenbt: + ret[colId]=base64.b64encode(cnt[0].prettify()) + + if REQUEST: + REQUEST.response.setHeader("Content-type", "text/json; charset=utf-8") + + + return json.dumps(ret) + Globals.InitializeClass(ECHO_collection) def manage_addECHO_collectionForm(self): @@ -1910,895 +1949,6 @@ def createNode(self,descrs,node): return "XX" -class ECHO_root(Folder,Persistent,Implicit): - """ECHO Root Folder""" - - security=ClassSecurityInfo() - - meta_type="ECHO_root" - management_page_charset="utf-8" - - getSubCols = ECHO_helpers.getSubCols - - manage_options=Folder.manage_options+( - {'label':'Main Config','action':'ECHO_copyright_configForm'}, - {'label':'Reload Metadata','action':'reloadMetaDataFromStorageWarning'}, - {'label':'Change Weights','action':'changeWeights'}, - {'label':'Generate from RDF','action':'generateFromRDFForm'}, - {'label':'update Resource Catalog','action':'updateResourceCatalog'}, - {'label':'Copy MD for indexing and search','action':'copySearchFields'}, -) - - - - - def getECHORootURL(self): - return self.absolute_url() - - def getECHORoot(self): - return self - - def copySearchFields(self,RESPONSE=None): - """copys < metadatafields to the object""" - resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1) - - for resource in resources: - - resource[1].copySearchFields() - - if RESPONSE is not None: - RESPONSE.redirect('manage_main') - - def mod_re_sub(self,pattern,replace,string): - """re.sub aus mod re zur Verfuegung stellen""" - return re.sub(pattern,replace,string) - - def findObjectFromFulltext(self,existUri): - ''' - - @param url: - @param existUri: - ''' - - if existUri: - #TODO: at the moment assume that the filename is unique, the whole has to changed to a system of ids. - filename=existUri.split("/")[-1] - - founds=self.resourceCatalog.search({'fullTextUrl':os.path.splitext(filename)[0]}) - - ret=[(found.title,found.getObject().absolute_url(),found.getObject().aq_parent.absolute_url()) for found in founds] - - return ret - - def reindex(self,RESPONSE=None): - """indiziere alle Objecte neu""" - - if RESPONSE: - RESPONSE.write("") - - resources=self.ZopeFind(self,obj_metatypes=["ECHO_resource"], search_sub=1) - - for resource in resources: - resource[1].reindex() - #print "

done %s

\n" - if RESPONSE: - RESPONSE.write("

done %s

\n"%resource[0]) - - if RESPONSE: - RESPONSE.write("

ok

\n") - - - def setLanguage(self,lang): - """Set language cookie""" - self.REQUEST.RESPONSE.setCookie('lang_exhibition',lang,path="/") - - def switchLanguage(self): - """Set language cookie""" - if self.getLanguage()=="en": - lang="de" - else: - lang="en" - - self.REQUEST.RESPONSE.setCookie('lang_exhibition',lang,path="/") - self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']) - - def getLanguage(self): - """get language cookie""" - lang= self.REQUEST.cookies.get('lang_exhibition','de') - if lang == '': - lang="de" - return lang - - def getContentOverviewTemplate(self): - """produces overview template with macro""" - pt = zptObjectOrFile(self, 'content_overview_template') - return pt - - def mapstyle_css(self): - """send mapstyle.css""" - sendFile(self, 'html/ECHO_mapstyle.css', 'text/css') - - - ###Cdli adds -> have to be removed - def getTablet(self,item): - #print "getTablet" - try: - read=urllib.urlopen("http://enlil.museum.upenn.edu/cgi-bin/cdlget.plx?item=%s&project=ncdl"%item).read() - read=re.sub("\[search\]","search",read) - return read[read.find("")+6:read.rfind("")] - except: - return "

Sorry no connection to the data server enlil.museum.upenn.edu

" - #return "http://enlil.museum.upenn.edu/cgi-bin/cdlget.plx?item=%s&project=ncdl" - ###END CDLI add - - - def URLquote(self, text): - """urllib.quote fuer Michael""" - return urllib.quote(text) - - - def checkResource(self,id): - """checks if a resource is in the tree, gives back none or list of resources""" - if not id: - id="" - splitted=id.split("/") - id=splitted[len(splitted)-1] - if hasattr(self,"_v_checkResource") and self._v_checkResource.has_key(id): #existiert ein cache und id ist bereits drin? - return self._v_checkResource[id] - - else: - resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],obj_ids=[id],search_sub=1) - - if not hasattr(self,"_v_checkResource"): self._v_checkResource={}#lege cache an falls nicht existent - if resources: - self._v_checkResource[id]=resources[0:] # slicing to be sure that data is stabil - else: - self._v_checkResource[id]=None - - return self._v_checkResource[id] - - def sendForm(self,fromaddr,content,server='mail.mpiwg-berlin.mpg.de'): - """sendform""" - toaddrs=["dwinter@mpiwg-berlin.mpg.de"] - - msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n" - % (fromaddr, ", ".join(toaddrs),"testsub")) - server = smtplib.SMTP(server) - #server.set_debuglevel(1) - msg=msg+content - server.sendmail(fromaddr, toaddrs, msg) - server.quit() - - def generateFromRDFForm(self): - """change form""" - pt=zptFile(self, 'zpt/generateFromRDFForm') - pt.content_type="text/html" - return pt() - - def generateFromRDF(self,file,startNode="/Cuneiform Corpus"): - - """generate from RDF""" - - global seqs - seqs={} - global descrs - descrs={} - global key - key="" - global value - value="" - - def getEdges(seqs,urn): - """edges""" - ret=[] - return seqs[urn] - - def createSubs(self,seqs,descrs,urn,level=0): - """create subs""" - for edge in getEdges(seqs,urn): - cn=createNode(self,descrs,edge) - if cn[0]=="CDLI_group": - createSubs(cn[1],seqs,descrs,cn[2],level+1) - return - - def start_element(name,attrs): - - global seqs - global descrs - global key - global value - seq="" - if name=="rdf:Seq": - key=attrs.get('rdf:about') - try: # teste ob liste - x=seqs[key][0] - except: - - seqs[key]=[] - - - elif name=="rdf:Description": - key=attrs.get('rdf:about') - - - elif name=="rdf:li": - name=attrs.get('rdf:resource') - seqs[key].append(name) - - elif name=="echonavigation:type": - value="type" - - elif name=="echonavigation:name": - value="name" - elif name=="echonavigation:linkClickable": - value="linkClickable" - - def end_element(name): - """nothing""" - key="" - value="" - - def char_data(data): - """nothing""" - - data=re.sub("\n","",data) - try: - if descrs[key].has_key(value): - descrs[key][value]+=data - else: - descrs[key][value]=data - except: - - descrs[key]={} - descrs[key][value]=data - - p = xml.parsers.expat.ParserCreate() - - p.StartElementHandler = start_element - p.EndElementHandler = end_element - p.CharacterDataHandler = char_data - - - p.ParseFile(file) - self.REQUEST.RESPONSE.write("

Start

") - createSubs(self,seqs,descrs,startNode) - self.REQUEST.RESPONSE.write("

done

") - #print "done" - - - return "done" - - - - - def changeWeightsInCollection(self): - """change all lables of a collection""" - ret="" - argv=self.REQUEST.form - - resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_link','ECHO_externalLink']) - for resource in resources: - - try: - ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"
" - resource[1].weight=argv[resource[1].getId()][0:] - except: - pass - return ret - - def changeWeights(self): - """change form""" - pt=zptFile(self, 'zpt/changeWeightForm') - pt.content_type="text/html" - return pt() - - - def reloadMetaDataFromStorageWarning(self,RESPONSE=None): - """warning""" - pt=zptFile(self, 'zpt/reloadMetaDataFromStorageWarning.zpt') - pt.content_type="text/html" - return pt() - - def reloadMetaDataFromStorage(self,RESPONSE=None): - """reload MD from Storage""" - - return reloadMetaDataFromStorage(self,RESPONSE) - - def getRDF(self,urn=None): - """rdf of the collection""" - - contents=self.ZopeFind(self,obj_metatypes=['ECHO_group','ECHO_resource','ECHO_collection']) - - ret=getRDFDescription(self,self.absolute_url(),urn=urn) - - li="""\n""" - - - for content in contents: - ret+=content[1].getRDF()+"\n" - - ret+="""\n"""%urn - for content in contents: - nurn=content[1].absolute_url() - ret+=li%nurn - return ret+"" - - - def showContent(self,path): - """return content/html""" - - return ECHO_helpers.urlopen(path+"/content_html").read() - - def getImageViewers(self): - """images""" - viewers=self.ZopeFind(self.standardImageViewer,obj_metatypes=['OSAS_ViewerObject']) - return viewers - - - def getBibTag(self,tag,content): - """get field tag for index-meta-generation""" - if not content or content=="": - return "" - ret="<%s>"%tag - #ret+=urllib.quote(content) - ret+=content - - ret+=""%tag - return ret - - def getValueFromClass(self,field,found): - """ret attribute if existing""" - try: - - - return getattr(found,field)#.decode('ascii','ignore') - - - - except: - logging.error("can't: decode: %s"%repr(field)) - logging.error(" %s %s"%(sys.exc_info()[0],sys.exc_info()[1])) - return "" - - security.declarePublic('getImageTag') - def getImageTag(self): - """needed by main_template""" - return "" - - secondaryLink="" #needed by main_template - secondaryLinkTitle="" #needed by main_template - - def getBgcolour(self): - """hack""" - return "#dddddd" - - security.declareProtected('View','contentTypeSelector_HTML') - def contentTypeSelector_HTML(self,selected=None): - """give type selector""" - if not selected: - retStr="