--- ECHO_content/ECHO_collection.py 2004/05/10 14:18:33 1.76
+++ ECHO_content/ECHO_collection.py 2004/05/24 18:48:23 1.88
@@ -19,14 +19,18 @@ from Globals import DTMLFile
from OFS.Folder import Folder
from OFS.SimpleItem import SimpleItem
from AccessControl import ClassSecurityInfo
+from AccessControl.User import UserFolder
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:
@@ -120,9 +124,25 @@ def sendFile(self, filename, type):
self.REQUEST.RESPONSE.write(file(fn).read())
return
+class BrowserCheck:
+ """check the browsers request to find out the browser type"""
+
+ def __init__(self, zope):
+ self.ua = zope.REQUEST.get_header("HTTP_USER_AGENT")
+ self.isN4 = (string.find(self.ua, 'Mozilla/4.') > -1) and (string.find(self.ua, 'MSIE') < 0)
+ self.isIE = string.find(self.ua, 'MSIE') > -1
+ self.nav = self.ua[string.find(self.ua, '('):]
+ ie = string.split(self.nav, "; ")[1]
+ if string.find(ie, "MSIE") > -1:
+ self.versIE = string.split(ie, " ")[1]
+ self.isMac = string.find(self.ua, 'Macintosh') > -1
+ self.isWin = string.find(self.ua, 'Windows') > -1
+ self.isIEWin = self.isIE and self.isWin
+ self.isIEMac = self.isIE and self.isMac
+
def writeMetadata(url,metadict):
- """Einlesen der Metadaten und und erstellen des geänderten XML file"""
+ """Einlesen der Metadaten und und erstellen des geaenderten XML file"""
try:
geturl=""
@@ -170,7 +190,7 @@ def writeMetadata(url,metadict):
metanode.appendChild(metanodeneu)
- return dom.toxml().encode('utf-8')
+ return dom.topxml().encode('utf-8')
def readMetadata(url):
"""Methode zum Auslesen der Metadateninformation zu einer Resource
@@ -385,7 +405,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:
@@ -515,7 +550,10 @@ class ECHO_resource(Folder):
def changeECHO_resource_coords(self,coords,viewClassification,RESPONSE=None):
"""Änderung der Properties - coords"""
- try:
+ if type(coords)==StringType:
+ coords=[coords]
+
+ try:
coordsnew=[ string.split(x,",") for x in coords]
except:
coordsnew=[]
@@ -671,9 +709,15 @@ class ECHO_resource(Folder):
for referenceTypeF in self.referencetypes:
#print referenceTypeF[1].title,referenceType
- if referenceTypeF[1].title == referenceType:
+ if referenceTypeF[1].title.lower() == referenceType.lower():
#print "OK"
- bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields
+ try:
+ bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields
+ referenceType=referenceTypeF[1].title
+ except:
+ bibdata[referenceType]=referenceTypeF[1].fields
+
+
bibdata['data']=referenceTypeF[1]
self.fields=bibdata[referenceType]
for field in fieldlist:
@@ -692,8 +736,12 @@ class ECHO_resource(Folder):
for referenceTypeF in self.referencetypes:
- if referenceTypeF[1].title == referenceType:
- bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields
+ if referenceTypeF[1].title.lower() == referenceType.lower():
+ try:
+ bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields
+ referenceType=referenceTypeF[1].title
+ except:
+ bibdata[referenceType]=referenceTypeF[1].fields
bibdata['data']=referenceTypeF[1]
self.fields=bibdata[referenceType]
for field in fieldlist:
@@ -714,7 +762,7 @@ class ECHO_resource(Folder):
return "ERROR:",error
- if not (metadict['bib_type']==self.contentType):
+ if not (metadict['bib_type'].lower()==self.contentType.lower()):
self.REQUEST.SESSION['contentStorage']=metadict['bib_type']
self.REQUEST.SESSION['contentZope']=self.contentType
@@ -868,8 +916,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"""
@@ -890,6 +941,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
@@ -909,10 +961,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)
@@ -976,7 +1031,7 @@ class ECHO_collection(Folder, Persistent
return ret+""+getCollection(self)+""
def createJavaScript(self):
- """CreateJava"""
+ """OLD CreateJava"""
ret=javaScriptMain
dynamical="\n"
@@ -990,7 +1045,7 @@ class ECHO_collection(Folder, Persistent
return ret
def createJSAreas(self):
- """new version of createJavaScript"""
+ """create area calls for JavaScript"""
dynamical="\n"
for ob in self.getGraphicCoords():
if ob[5] == "area":
@@ -1000,20 +1055,37 @@ class ECHO_collection(Folder, Persistent
return dynamical
def createMapHead(self):
- """generate divs"""
+ """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 = '" + text + ""
+ 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"):
@@ -1022,18 +1094,39 @@ class ECHO_collection(Folder, Persistent
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)
+ 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 += ''
- tag += ''
+ 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
@@ -1219,6 +1312,7 @@ 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"""
@@ -1250,17 +1344,23 @@ class ECHO_collection(Folder, Persistent
def area_img(self):
"""area image"""
- return sendFile(self, 'images/red.gif', 'image/gif')
+ bt = BrowserCheck(self)
+ if bt.isIEWin 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"""
@@ -1294,9 +1394,8 @@ class ECHO_collection(Folder, Persistent
getSubCols = ECHO_helpers.getSubCols
-
-
-
+
+Globals.InitializeClass(ECHO_collection)
def manage_addECHO_collectionForm(self):
"""Add collection form"""
@@ -1317,6 +1416,7 @@ 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+(
@@ -1324,7 +1424,8 @@ class ECHO_group(ECHO_collection):
{'label':'Rerender Links','action':'ECHO_rerenderLinksMD'},
{'label':'Graphics','action':'ECHO_graphicEntry'},
)
-
+
+ security.declareProtected('View','index_html')
def index_html(self):
"""standard page"""
displayedObjects=self.ZopeFind(self,obj_metatypes=displayTypes)
@@ -1418,12 +1519,129 @@ 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)
+
class ECHO_root(Folder,Persistent,Implicit):
"""ECHO Root Folder"""
- meta_type="ECHO_root"
+ security=ClassSecurityInfo()
+
+ meta_type="ECHO_root"
+
def getImageTag(self):
"""needed by main_template"""
@@ -1700,7 +1918,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"""