"
+ collections+=""
collections+=getCollection(element,depth)+"\n"
except:
"""nothing"""
@@ -682,7 +1948,7 @@ class ECHO_collection(Folder, Persistent
return ret+""+getCollection(self)+""
def createJavaScript(self):
- """CreateJava"""
+ """OLD CreateJava"""
ret=javaScriptMain
dynamical="\n"
@@ -696,14 +1962,90 @@ class ECHO_collection(Folder, Persistent
return ret
def createJSAreas(self):
- """CreateJava"""
+ """create area calls for JavaScript"""
dynamical="\n"
for ob in self.getGraphicCoords():
- if ob[5] == "area":
+ 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])
return dynamical
+
+ def createMapHead(self):
+ """create javascript include and script tags for head"""
+ pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/ECHO_content_map_frag_js')).__of__(self)
+ return pt()
+
+ def createMapImg(self):
+ """generate img-tag for map"""
+ bt = BrowserCheck(self)
+ tag = ""
+ src = self.REQUEST['URL1'] + "/overview"
+ if bt.isN4:
+ tag += ''%src
+ else:
+ tag += ''%src
+ return tag
+
+ def createMapLink(self, ob, text=None):
+ """generate map link"""
+ bt = BrowserCheck(self)
+ id = ob[1]
+ link = ob[1]
+ if text == None:
+ text = ob[2]
+ tag = ""
+ if bt.isN4:
+ tag += '" + text + ""
+ else:
+ tag = '" + text + ""
+ 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
+ bt = BrowserCheck(self)
+ tag = ""
+
+ if bt.isN4:
+ tag += ''%(id,id,id)
+ if vtype == "view point":
+ rot = ob[4][4]
+ tag += ''%(link,arrowsrc,rot)
+ else:
+ tag += ''
+ tag += ''
+ else:
+ tag = ''%(id,id,id,link)
+ if vtype == "view point":
+ rot = ob[4][4]
+ if bt.isIEWin and bt.versIE > 5:
+ tag += ''%(id,arrowsrc,rot,arrowsrc,rot)
+ else:
+ tag += ''%(id,arrowsrc,rot)
+ else:
+ if bt.isIEWin:
+ tag += '
'
+ tag += ''
+ return tag
+
security.declarePublic('getCreditObject')
def getCreditObject(self,name):
@@ -733,24 +2075,21 @@ class ECHO_collection(Folder, Persistent
return ret
security.declarePublic('ECHO_rerenderLinksMD')
- def ECHO_rerenderLinksMD(self,obj=None):
- """Rerender all Links"""
- if not obj:
- obj = self
-
- entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection'])
- for entry in entries:
- if entry[1].meta_type == 'ECHO_resource':
- entry[1].ECHO_getResourceMD(template="no")
- print "rerender",entry[1].getId()
- else:
- self.ECHO_rerenderLinksMD(entry[1])
-
-
- return "Rerenderd all links to resources in: "+self.title
+ def ECHO_rerenderLinksMDWarning(self):
+ """change form"""
+ pt=PageTemplateFile('Products/ECHO_content/zpt/rerenderLinksWarning').__of__(self)
+ pt.content_type="text/html"
+ return pt()
+
+
+ def ECHO_rerenderLinksMD(self,obj=None,types=['title','label']):
+ """Rerender all Links"""
+ return ECHO_rerenderLinksMD(self,obj,types)
+
+
security.declarePublic('ECHO_newViewerLink')
@@ -765,7 +2104,7 @@ class ECHO_collection(Folder, Persistent
return []
def __init__(self,id,title,label,description,contentType,responsible,credits,weight,sortfield,coords,secondaryLinkTitle,secondaryLink,imageTag="",bgcolour=""):
- #print "CO",coords
+
self.id = id
"""Festlegen der ID"""
@@ -785,12 +2124,19 @@ class ECHO_collection(Folder, Persistent
self.bgcolour=bgcolour
- manage_options = Folder.manage_options+(
+ manage_options = Folder.manage_options+ Cacheable.manage_options+(
{'label':'Main Config','action':'ECHO_collection_config'},
- {'label':'Rerender Links','action':'ECHO_rerenderLinksMD'},
+ {'label':'Change Labels','action':'changeLabels'},
+ {'label':'Change Titles','action':'changeTitles'},
+ {'label':'Change Weights','action':'changeWeights'},
+ {'label':'Rerender Labels and Titles','action':'ECHO_rerenderLinksMDWarning'},
{'label':'Graphics','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':'ImportCollection','action':'updateCollection'},
+ {'label':'Copy MD for indexing and search','action':'copySearchFields'},
)
def getOverview(self):
@@ -849,7 +2195,7 @@ class ECHO_collection(Folder, Persistent
else:
return "#dddddd"
- def changeECHO_collection(self,title,label,description,contentType,responsible,weight,secondaryLink,secondaryLinkTitle,credits=None,sortfield="weight",coords=None,RESPONSE=None,imageTag="",bgcolour="",viewClassification=None):
+ def changeECHO_collection(self,title,label,description,contentType,responsible,weight,secondaryLink,secondaryLinkTitle,credits=None,sortfield="weight",coords=None,RESPONSE=None,imageTag="",bgcolour="",viewClassification=None,location=None,isAlwaysClickable=None):
"""Aenderung der Properties"""
self.secondaryLink=secondaryLink
@@ -857,6 +2203,8 @@ class ECHO_collection(Folder, Persistent
self.imageTag=imageTag
self.bgcolour=bgcolour
self.viewClassification=viewClassification
+ self.location=location
+ self.isAlwaysClickable=isAlwaysClickable
if coords:
coordsnew=[ string.split(x,",") for x in coords]
@@ -876,9 +2224,15 @@ class ECHO_collection(Folder, Persistent
if RESPONSE is not None:
RESPONSE.redirect('manage_main')
- security.declarePublic('index_html')
-
+ def setAlwaysClickable(self,flag="yes"):
+ """set clickable"""
+ if flag=="yes":
+ self.isAlwaysClickable="yes"
+ else:
+ self.isAlwaysClickable=None
+ return flag
+
def showOverview(self):
"""overview"""
if 'ECHO_overview.html' in self.__dict__.keys():
@@ -886,27 +2240,38 @@ class ECHO_collection(Folder, Persistent
pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_content_overview.zpt').__of__(self)
return pt()
+ security.declareProtected('View','index_html')
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():
- return getattr(self,'index.html')()
+ ret=getattr(self,'index.html')()
elif 'overview' in self.__dict__.keys():
- return self.showOverview()
+ ret=self.showOverview()
elif hasattr(self,'collection_index_template'):
- return self.collection_index_template()
+ ret=self.collection_index_template()
elif hasattr(self,'main_index_template'):
- return self.main_index_template()
-
- pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_main_index_template_standard.zpt').__of__(self)
- pt.content_type="text/html"
- return pt()
+ ret=self.main_index_template()
+ else:
+ pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_main_index_template_standard.zpt').__of__(self)
+ pt.content_type="text/html"
+ ret=pt.render()
- def content_html(self):
+ self.ZCacheable_set(ret)
+ return ret
+
+ def content_html(self,**argv):
"""template fuer content"""
- return content_html(self,'collection')
+ #print "NN",argv
+ return ECHO_basis.content_html(self,'collection')
def getCredits(self):
"""Ausgabe der credits"""
@@ -917,20 +2282,24 @@ class ECHO_collection(Folder, Persistent
def area_img(self):
"""area image"""
- sendFile(self, 'images/red.gif', 'image/gif')
- return
+ bt = BrowserCheck(self)
+ if bt.isIE or bt.isN4:
+ return sendFile(self, 'images/red.gif', 'image/gif')
+ else:
+ return sendFile(self, 'images/reda.png', 'image/png')
+
+ def trans_img(self):
+ """empty image"""
+ return sendFile(self, 'images/trans.gif', 'image/gif')
def hl_lib_js(self):
"""javascript"""
- sendFile(self, 'js/hl_lib.js', 'text/plain')
- return
+ return sendFile(self, 'js/hl_lib.js', 'text/plain')
def js_lib_js(self):
"""javascript"""
- sendFile(self, 'js/js_lib.js', 'text/plain')
- return
+ return sendFile(self, 'js/js_lib.js', 'text/plain')
-
def getGraphicCoords(self):
"""Give list of coordinates"""
subColTypes=['ECHO_collection','ECHO_resource']
@@ -963,9 +2332,8 @@ class ECHO_collection(Folder, Persistent
getSubCols = ECHO_helpers.getSubCols
-
-
-
+
+Globals.InitializeClass(ECHO_collection)
def manage_addECHO_collectionForm(self):
"""Add collection form"""
@@ -986,14 +2354,48 @@ def manage_addECHO_collection(self,id,ti
class ECHO_group(ECHO_collection):
"""ECHO Gruppe"""
+ security=ClassSecurityInfo()
meta_type="ECHO_group"
manage_options = Folder.manage_options+(
{'label':'Main Config','action':'ECHO_group_config'},
- {'label':'Rerender Links','action':'ECHO_rerenderLinksMD'},
+ {'label':'Rerender Links','action':'ECHO_rerenderLinksMDWarning'},
{'label':'Graphics','action':'ECHO_graphicEntry'},
)
+
+ security.declareProtected('View','index_html')
+ def showRDF(self):
+ """showrdf"""
+ self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
+ ret="""\n\n"""
+ ret+=self.getRDF(urn="echo:collectionroot")+"\n"
+
+ ret+=""""""
+
+ return ret
+
+ 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)
+
+
+ if not urn:
+ urn=self.absolute_url()
+ 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 index_html(self):
"""standard page"""
displayedObjects=self.ZopeFind(self,obj_metatypes=displayTypes)
@@ -1032,7 +2434,7 @@ class ECHO_group(ECHO_collection):
return pt()
def changeECHO_group(self,title,label,description,contentType,responsible,weight,secondaryLink,secondaryLinkTitle,credits=None,sortfield="weight",coords=None,RESPONSE=None,imageTag="",bgcolour="",logo=""):
- """Änderung der Properties"""
+ """Änderung der Properties"""
self.secondaryLink=secondaryLink
self.secondaryLinkTitle=secondaryLinkTitle
@@ -1065,7 +2467,7 @@ class ECHO_group(ECHO_collection):
def content_html(self):
"""template fuer content"""
- return content_html(self,'group')
+ return ECHO_basis.content_html(self,'group')
@@ -1087,12 +2489,407 @@ def manage_addECHO_group(self,id,title,l
if RESPONSE is not None:
RESPONSE.redirect('manage_main')
+Globals.InitializeClass(ECHO_group)
+
+class ECHO_userFolder(UserFolder):
+ """User folder for Intranet"""
+ _domain_auth_mode=1 # Identification via domain
+ meta_type="ECHO_userFolder"
+ def authenticate(self, name, password, request):
+ emergency = self._emergency_user
+ if name is None:
+ return None
+ if emergency and name==emergency.getUserName():
+ user = emergency
+ else:
+ user = self.getUser(name)
+ if user is not None and user.authenticate(password, request):
+ return user
+ else:
+ return None
+
+ def domainSpecMatch(self,spec, request):
+ host=''
+ addr=''
+
+ # Fast exit for the match-all case
+ if len(spec) == 1 and spec[0] == '*':
+ return 1
+
+ if request.has_key('REMOTE_HOST'):
+ host=request['REMOTE_HOST']
+
+ if request.has_key('REMOTE_ADDR'):
+ addr=request['REMOTE_ADDR']
+
+ if request.has_key('HTTP_X_FORWARDED_FOR'):
+ addr=request['HTTP_X_FORWARDED_FOR']
+
+
+ if not host and not addr:
+ return 0
+
+ if not host:
+ try: host=socket.gethostbyaddr(addr)[0]
+ except: pass
+ if not addr:
+ try: addr=socket.gethostbyname(host)
+ except: pass
+
+
+ _host=host.split('.')
+ _addr=addr.split('.')
+ _hlen=len(_host)
+ _alen=len(_addr)
+
+ for ob in spec:
+ sz=len(ob)
+ _ob=ob.split('.')
+ _sz=len(_ob)
+
+ mo = addr_match(ob)
+ if mo is not None:
+ if mo.end(0)==sz:
+ fail=0
+ for i in range(_sz):
+ a=_addr[i]
+ o=_ob[i]
+ if (o != a) and (o != '*'):
+ fail=1
+ break
+ if fail:
+ continue
+ return 1
+
+ mo = host_match(ob)
+ if mo is not None:
+ if mo.end(0)==sz:
+ if _hlen < _sz:
+ continue
+ elif _hlen > _sz:
+ _item=_host[-_sz:]
+ else:
+ _item=_host
+ fail=0
+ for i in range(_sz):
+ h=_item[i]
+ o=_ob[i]
+ if (o != h) and (o != '*'):
+ fail=1
+ break
+ if fail:
+ continue
+ return 1
+ return 0
+
+Globals.default__class_init__(ECHO_userFolder)
+
+
+
+def manage_addECHO_userFolder(self,dtself=None,REQUEST=None,**ignored):
+ """add a user folder """
+ f=ECHO_userFolder()
+ self=self.this()
+ try: self._setObject('acl_users', f)
+ except: return MessageDialog(
+ title ='Item Exists',
+ message='This object already contains a User Folder',
+ action ='%s/manage_main' % REQUEST['URL1'])
+ self.__allow_groups__=f
+ if REQUEST is not None:
+ REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main')
+
+def manage_addECHO_userFolderForm(self):
+ """add a user folder form"""
+ return manage_addECHO_userFolder(self)
+
+
+
+def createNode(self,descrs,node):
+ name=descrs[node]['name']
+ type=descrs[node]['type']
+ urn=node
+ #print " will create",node.encode('utf-8')
+ id=re.sub('[^a-zA-Z0-9]','',name).encode('ascii','ignore')
+ #print "id",id
+ #print type
+ #self.REQUEST.RESPONSE.write("%s
\n"%id)
+ if type=="CDLI_group":
+
+ try:
+ manage_addECHO_collection(self,id,name,name,"","","","","")
+
+ except:
+ self.REQUEST.RESPONSE.write("
Error%s
\n"%id)
+
+ self.REQUEST.RESPONSE.write("Creates:%s
\n"%getattr(self,id).absolute_url())
+
+ return type,getattr(self,id),urn
+
+ if type=="CDLI_item":
+ try:
+ manage_addECHO_resource(self,id,name,name,"","",urn,"","")
+ except:
+ self.REQUEST.RESPONSE.write("Error%s
\n"%id)
+ self.REQUEST.RESPONSE.write("Creates:%s
\n"%getattr(self,id).absolute_url())
+
+
+ return "XX"
+
+
class ECHO_root(Folder,Persistent,Implicit):
"""ECHO Root Folder"""
+
+ security=ClassSecurityInfo()
+
meta_type="ECHO_root"
+ ###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 checkResource(self,id):
+ """checks if a resource is in the tree, gives back none or list of resources"""
+ 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=PageTemplateFile('Products/ECHO_content/zpt/generateFromRDFForm').__of__(self)
+ 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:
+ """not"""
+ return ret
+
+ def changeWeights(self):
+ """change form"""
+ pt=PageTemplateFile('Products/ECHO_content/zpt/changeWeightForm').__of__(self)
+ pt.content_type="text/html"
+ return pt()
+ 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'},
+
+)
+
+
+ def showRDF(self):
+ """showrdf"""
+ self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
+ ret="""\n\n"""
+ ret+=self.getRDF(urn="echo:collectionroot")+"\n"
+
+ ret+=""""""
+ return ret
+
+
+ def reloadMetaDataFromStorageWarning(self,RESPONSE=None):
+ """warning"""
+ pt=PageTemplateFile('Products/ECHO_content/zpt/reloadMetaDataFromStorageWarning.zpt').__of__(self)
+ 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 für index-meta-generation"""
+ if not content or content=="":
+ return ""
+ ret="<%s>"%tag
+ #ret+=urllib.quote(content)
+ ret+=content
+
+ ret+="%s>"%tag
+ return ret
+
+ def getValueFromClass(self,field,found):
+ """retattribute falss existing"""
+ try:
+
+ return getattr(found,field).decode('ascii','ignore')
+ except:
+ return ""
def getImageTag(self):
"""needed by main_template"""
@@ -1112,7 +2909,7 @@ class ECHO_root(Folder,Persistent,Implic
retStr="