--- ImageArchive/ImageArchive.py 2005/10/26 14:57:59 1.71
+++ ImageArchive/ImageArchive.py 2006/05/15 15:57:35 1.80
@@ -3,6 +3,7 @@ genericServerPath="http://www.mpiwg-berl
from OFS.Folder import Folder
+from OFS.OrderedFolder import OrderedFolder
from OFS.SimpleItem import SimpleItem
from Globals import Persistent,package_home
from Acquisition import Implicit
@@ -22,6 +23,9 @@ import time
from threading import Thread
import Queue
import cgi
+import sys
+import zLOG
+
from AccessControl import ClassSecurityInfo, getSecurityManager
@@ -49,6 +53,8 @@ except:
tdir = "/mpiwg/temp/tmp/archivesImageServer/"
#tdir="/tmp/archivesImageServer/"
+imageExtensions=['jpg','jpeg','tif','tiff','png']
+
def splitPath(str):
str2=str.replace("\\","/")
return os.path.split(str2)[1]
@@ -284,7 +290,8 @@ class ImageDigilib(Folder,Persistent,Imp
"""get the accessright, return is string "extern" or "intern" """
return self.getRights(self.filename.split('.')[0])
-
+ security.declarePublic('isAccessible')
+
def isAccessible(self):
"""gives true if obejct is accessible taking the rights of the user into account"""
@@ -296,6 +303,13 @@ class ImageDigilib(Folder,Persistent,Imp
user=getSecurityManager().getUser()
roles=user.getRoles()
+
+
+ if self.getRightsQuery()=="":
+ #query empty then always true
+ return True
+
+
if 'Authenticated' in roles:
return True
@@ -363,12 +377,13 @@ class ImageDigilib(Folder,Persistent,Imp
def uploadImage(self,fileupload,path_name):
"""upload an Image from an Requast"""
#path_name=self.ImageStoragePath
- fn=splitPath(fileupload.filename)
+ fn = self.filename or splitPath(fileupload.filename)
filename=path_name+"/"+fn
filedata=fileupload.read()
f=open(filename,"w")
f.write(filedata)
f.close()
+ self.filename = fn
try:
os.chmod(filename,0664)
except:
@@ -479,7 +494,8 @@ class ImageDigilib(Folder,Persistent,Imp
def updateImage(self,file,rename=None,RESPONSE=None):
"""lade neues Version des Bildes"""
#teste ob Dokumenten ordner schon vorhanden
- imagePath=os.path.join(self.ImageStoragePath,self.getId())
+ #imagePath=os.path.join(self.ImageStoragePath,self.getId())
+ imagePath=os.path.join(self.ImageStoragePath,self.filename)
path=os.path.join(self.ImageStoragePath,"."+self.getId()+".dir")
if not os.path.exists(path):
@@ -490,16 +506,20 @@ class ImageDigilib(Folder,Persistent,Imp
#teste ob version schon existiert
- while os.path.exists(os.path.join(path,"V%i_%s"%(versionNumber,self.getId()))):
+ while os.path.exists(os.path.join(path,"V%i_%s"%(versionNumber,self.filename))):
versionNumber+=1
#kopieren der bestehenden Version in den Versions ordner.
- imageNewPath=os.path.join(path,"V%i_%s"%(versionNumber,self.getId()))
- os.rename(imagePath,imageNewPath)
+ imageNewPath=os.path.join(path,"V%i_%s"%(versionNumber,self.filename))
+ try:
+ #zLOG.LOG("ImageArchive:updateImage", zLOG.INFO, "rename: %s -> %s"%(imagePath,imageNewPath))
+ os.rename(imagePath,imageNewPath)
+ except:
+ zLOG.LOG("ImageArchive:updateImage", zLOG.ERROR, "rename: %s -> %s didn't work!"%(imagePath,imageNewPath))
#lesen des upload files und schreiben
filedata=file.read()
- f=open(imagePath,"w")
+ f=open(imagePath,"w") # if we wanted to have filename=id we should do it here!
f.write(filedata)
f.close()
try:
@@ -523,7 +543,8 @@ class ImageDigilib(Folder,Persistent,Imp
return "done"
-
+
+ security.declarePublic('thumb')
def thumb(self,url=None):
"""show thumb"""
thumbname=os.path.splitext(self.filename)[0]+".jpg"
@@ -597,7 +618,8 @@ def manage_AddImageDigilib(self,id,fileu
"""Add ImageCollection"""
#fileupload=self.REQUEST['fileupload']
- fn=splitPath(fileupload.filename)
+ #fn=splitPath(fileupload.filename)
+ fn = id # filename is the same as id
newObj=ImageDigilib(id,fn,meta)
self._setObject(id,newObj)
@@ -608,7 +630,7 @@ def manage_AddImageDigilib(self,id,fileu
-class ImageCollection(Folder, Persistent, Implicit,ECHO_basis):
+class ImageCollection(OrderedFolder, Persistent, Implicit,ECHO_basis):
"""Sammelordner fuer Bilder"""
meta_type="ImageCollection"
@@ -629,8 +651,28 @@ class ImageCollection(Folder, Persistent
defaultMetaString="http://fm-web.mpiwg-berlin.mpg.de:8050/FMRes/FMPJS?-db=Wissenschaftlerportraits.fp5&-layID=69&-token=25&-max=1&-format=formvwcss.htm&-mode=browse&images::filename=%s&-find" ## TEST FUER IMAGEDATENBANK WP
imgcoll_main = PageTemplateFile('zpt/overview', globals())
+ imgcoll_mainMD = PageTemplateFile('zpt/overviewMD', globals())
imgcoll_thumb = PageTemplateFile('zpt/thumb', globals())
+ imgcoll_thumbMD = PageTemplateFile('zpt/thumbMD', globals())
+
+ def getImageObject(self,name):
+ """gibt objeckt name zurueck"""
+ if hasattr(self,name):
+ return getattr(self,name)
+
+ name=os.path.splitext(name)[0]
+ for extension in imageExtensions:
+ nameExt=name+"."+extension
+ if hasattr(self,nameExt):
+ return getattr(self,nameExt)
+
+ nameExt=name+"_."+extension
+ if hasattr(self,nameExt):
+ return getattr(self,nameExt)
+
+ return getattr(self,"defaultImg")
+
def getServerPath(self):
"""get Server path"""
return getattr(self,'serverPath',genericServerPath)
@@ -785,7 +827,7 @@ class ImageCollection(Folder, Persistent
"""import metadata, if strict ist not None then only metadata will be rebuild where metadata is empty"""
for image in self.ZopeFind(self,obj_metatypes=["ImageDigilib"]):
- print image[1].getId()
+
image[1].manageMetaData(strict)
return "ok"
@@ -907,27 +949,38 @@ class ImageCollection(Folder, Persistent
try:
dom=xml.dom.minidom.parseString(xmldoc)
except:
- return xmldoc
+ return "ERROR: (%s %s) %s"%(sys.exc_info()[0],sys.exc_info()[1],xmldoc)
+
images=dom.getElementsByTagName('image')
rc=[]
fnIds={}
for image in images:
imagename=image.getElementsByTagName('imagename')[0]
+
idnr=image.getElementsByTagName('idnr')[0]
id=getText(idnr.childNodes)
- numberOfPages=image.getElementsByTagName('numberOfPages')[0]
- nopT=getText(numberOfPages.childNodes)
try:
- nop=int(nopT)
+ numberOfPages=image.getElementsByTagName('numberOfPages')[0]
except:
- nop=0
+ numberOfPages=None
+
+ if numberOfPages:
+ nopT=getText(numberOfPages.childNodes)
+ try:
+ nop=int(nopT)
+ except:
+ nop=0
+ else:
+ nop=0
+
texts=getText(imagename.childNodes).split("\n") #mehrere bilder in return getrennter liste
for text in texts:
if not text=="":
+ text=self.getImageByName(text,onlyName="yes")
try:
rc.append((str(text),id,nop))
fnIds[str(text)]=(id,nop)
@@ -940,6 +993,14 @@ class ImageCollection(Folder, Persistent
self.REQUEST.SESSION['filenames']=rc
self.REQUEST.SESSION['filenamesIds']=fnIds
+ overview=self.ZopeFind(self,obj_ids=['overview_selected.html'])
+
+ if overview:
+ return overview[0][1]()
+ else:
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview_selected.zpt')).__of__(self)
+ return pt()
+
pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview_selected.zpt')).__of__(self)
return pt()
@@ -973,10 +1034,7 @@ class ImageCollection(Folder, Persistent
else:
meta=None
- if fileName:
- fn=fileName
- else:
- fn=splitPath(fileupload.filename)
+ fn=fileName or splitPath(fileupload.filename)
manage_AddImageDigilib(self,fn,fileupload,meta=meta)
@@ -1540,7 +1598,8 @@ class ImageCollection(Folder, Persistent
"""navigation"""
#self.REQUEST.SESSION['URL']=self.REQUEST['URL0']
pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','navigation_selected.zpt')).__of__(self)
- return pt()
+
+ return pt().data
def navig_html(self):
"""navigation"""
@@ -1562,18 +1621,33 @@ class ImageCollection(Folder, Persistent
def getImageByName(self,filename,onlyName=None):
"""get filename"""
-
- fn=getattr(self,filename,None)
+ print repr(filename)
+ #FIXME: umlaute in filename
+ fn=getattr(self,repr(filename),None)
if not fn:
filenameM=filename.split(".")[0]
+
founds=self.ZopeFind(self,obj_metatypes=['ImageDigilib'])
+
+
for found in founds:
foundM=found[0].split(".")[0]
+
if filenameM.lower()==foundM.lower():
if onlyName:
return found[0]
else:
- return found[1]
+ return found[1]
+ #HACK teste noch ob am ende des filenames eventuell ein "_" und loesche das.
+ if foundM[-1]=="_":
+ foundM=foundM[0:-1]
+
+ if filenameM.lower()==foundM.lower():
+ if onlyName:
+ return found[0]
+ else:
+ return found[1]
+
if onlyName:
return filename
else:
@@ -1581,9 +1655,9 @@ class ImageCollection(Folder, Persistent
security.declareProtected('View','index_html')
- def index_html(self,fn=None):
+ def index_html(self,fn=None,generic='No'):
"""main template collection"""
-
+
if fn:
ret=[]
@@ -1597,9 +1671,15 @@ class ImageCollection(Folder, Persistent
self.REQUEST.SESSION['filenames']=ret
#self.REQUEST.SESSION['filenamesIds']=fnIds
+
+ overview=self.ZopeFind(self,obj_ids=['overview_selected.html'])
+
- pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview_selected.zpt')).__of__(self)
- return pt()
+ if overview and (generic =='No'):
+ return overview[0][1]()
+ else:
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview_selected.zpt')).__of__(self)
+ return pt()
if self.REQUEST.has_key('filename'):
filen=self.REQUEST['filename']
@@ -1616,7 +1696,7 @@ class ImageCollection(Folder, Persistent
overview=self.ZopeFind(self,obj_ids=['overview.html'])
- if overview:
+ if overview and (generic == 'No'):
return overview[0][1]()
elif hasattr(self,'templates'):
pt=self.templates.imgcoll_main.__of__(self)
@@ -1625,6 +1705,11 @@ class ImageCollection(Folder, Persistent
pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview.zpt')).__of__(self)
return pt()
+ def navigation(self):
+ """generate navigation bar"""
+
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','navigation_fragment')).__of__(self)
+ return pt()
def manage_AddImageCollectionForm(self):
"""Nothing yet"""
@@ -1640,7 +1725,7 @@ def manage_AddImageCollection(self,id,ti
RESPONSE.redirect('manage_main')
-
+
class ImageCollectionMD(ImageCollection,ZSQLExtendFolder):
"""Imageviewer and Metadata"""
meta_type="ImageCollection MD"
@@ -1655,10 +1740,210 @@ class ImageCollectionMD(ImageCollection,
)
try:
- changeZSQLExtendForm=ZSQLExtendFolder.changeZSQLExtendForm
+ changeZSQLExtendForm=ZSQLExtendFolder.changeZSQLExtendForm
except:
- pass
+ pass
+
+
+ def addImage(self):
+ """Add an Image"""
+
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addImageMD.zpt')).__of__(self)
+ return pt()
+
+ def addImage2(self,_fileupload,_fileName=None,_meta=None,_use_default=None,RESPONSE=None,**argv):
+ """Add"""
+
+ filenameKey="filename"
+ #print "FU",fileupload
+
+ if _use_default:
+ try:
+ meta=self.meta_default(_fileupload.filename)
+ except:
+ meta=None
+ else:
+ meta=None
+
+ fn=_fileName or splitPath(_fileupload.filename)
+
+ manage_AddImageDigilib(self,fn,_fileupload,meta=meta)
+
+ args[key]=_filename
+
+ self.ZSQLAdd(args=argv)
+
+ if RESPONSE:
+ return RESPONSE.redirect(self.REQUEST['URL1']+'/'+fn)
+ #return self.REQUEST['URL1']+'/'+fileupload.filename
+
+ def navig_html(self):
+ """navigation"""
+ #self.REQUEST.SESSION['URL']=self.REQUEST['URL0']
+
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','navigationMD.zpt')).__of__(self)
+ return pt()
+
+ def navig_selected_html(self):
+ """navigation"""
+ #self.REQUEST.SESSION['URL']=self.REQUEST['URL0']
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','navigation_selectedMD.zpt')).__of__(self)
+
+ return pt()
+
+ def decode(self,str):
+ """decoder"""
+ if not str:
+ return ""
+ if type(str) is StringType:
+ try:
+ return str.decode('utf-8')
+ except:
+ return str.decode('latin-1')
+ else:
+
+ return str
+
+ def standardSearch(self):
+ """standard search page"""
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','standardSearchPage.zpt')).__of__(self)
+ return pt()
+
+ def searchResultXML(self):
+ """xmlformat"""
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','searchResultXML.zpt')).__of__(self)
+ return pt()
+
+ def searchDB(self,REQUEST=None,RESPONSE=None,xml=None):
+ """search"""
+ #context.ZSQLFind(_table='vision_main')
+ urlTmp=REQUEST['URL1']
+
+ url=urlTmp+'/searchResultXML?-table=vision_main&'+REQUEST['QUERY_STRING']
+
+ if xml is None:
+ RESPONSE.redirect('xmlinput?url='+urllib.quote(url))
+ else:
+ RESPONSE.redirect(url)
+
+ def index_html(self,fn=None,selection=None,generic='No',REQUEST=None,RESPONSE=None):
+ """main template collection"""
+
+
+ mode=self.REQUEST.get('mode','view')
+ if fn:
+ ret=[]
+
+ if type(fn) is ListType:
+ """experimentell mehr als ein filename"""
+ for filename in fn:
+ if not (filename == ""):
+ ret.append((filename,'',1))
+ else:
+ ret.append((fn,'',1))
+
+ self.REQUEST.SESSION['filenames']=ret
+ #self.REQUEST.SESSION['filenamesIds']=fnIds
+
+ overview=self.ZopeFind(self,obj_ids=['overview_selected.html'])
+
+
+ if overview and (generic =='No'):
+ return overview[0][1]()
+ else:
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview_selectedMD.zpt')).__of__(self)
+ return pt()
+
+ # filename given, then only display this file
+ if self.REQUEST.has_key('filename'):
+
+ filen=self.REQUEST['filename']
+ else:
+ filen=""
+
+
+ self.REQUEST.SESSION['filename']=filen[0:]
+
+ if not self.REQUEST.SESSION['filename']=="":
+ url=getattr(self.getImageByName(self.REQUEST.SESSION['filename']),'absolute_url')()
+ if mode=="view":
+ self.REQUEST.RESPONSE.redirect(url)
+ elif mode=="download":
+ self.REQUEST.RESPONSE.redirect(url+"/download")
+
+ if self.REQUEST.has_key('showall'):
+
+ self.REQUEST.SESSION['showall']=self.REQUEST.get('showall')
+ else:
+ self.REQUEST.SESSION['showall']=self.REQUEST.SESSION.get('showall','no')
+
+
+ if selection:
+ #selection i.e. selection already stored at self.REQUEST.SESSION['filenames']
+ overview=self.ZopeFind(self,obj_ids=['overview_selected.html'])
+
+
+ if overview and (generic =='No'):#
+ print "selected"
+ print repr(overview[0][1])
+ return overview[0][1]()
+ else:
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview_selectedMD.zpt')).__of__(self)
+ return pt()
+
+
+ #no filename then show overview
+
+ overview=self.ZopeFind(self,obj_ids=['overview.html'])
+ if overview and (generic == 'No'):
+
+
+ return overview[0][1]()
+ elif hasattr(self,'templates'):
+
+ pt=self.templates.imgcoll_mainMD.__of__(self)
+ return pt()
+ else:
+
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overviewMD.zpt')).__of__(self)
+ return pt()
+
+ def nextImage(self,request,selected=None,returnFn=None):
+ """show nextimage"""
+
+ if not selected and self.REQUEST.has_key('fn'):
+ imagename=self.REQUEST['fn'].split('/')[-1]
+
+ imagename=self.getImageByName(imagename,onlyName=True)
+
+ nr=self.getObjectPosition(imagename)
+
+ objects=self.objectIds()
+ if len(objects)==nr+1:
+ return ""
+ else:
+ fn="/".join(self.REQUEST['fn'].split('/')[0:-1])+"/"+objects[nr+1]
+ return "next image"
+
+ def prevImage(self,request,selected=None,returnFn=None):
+ """show nextimage"""
+
+ if not selected and self.REQUEST.has_key('fn'):
+ imagename=self.REQUEST['fn'].split('/')[-1]
+
+ imagename=self.getImageByName(imagename,onlyName=True)
+
+ nr=self.getObjectPosition(imagename)
+
+ objects=self.objectIds()
+ if nr==0:
+ return ""
+ else:
+ fn="/".join(self.REQUEST['fn'].split('/')[0:-1])+"/"+objects[nr-1]
+ return "prev image"
+
+
def changeRightsQueryForm(self):
"""change Rights Query"""
pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','ChangeRightsQueryForm.zpt')).__of__(self)
@@ -1708,8 +1993,87 @@ class ImageCollectionMD(ImageCollection,
else:
result = ''
return result
+
+ def xmlinput(self,url):
+ """Anzeige von ausgewaehlten thumbs"""
+ #return url
+ url=urllib.unquote(url)
+ xmldoc=urllib.urlopen(url).read()
+ #return xmldoc
+ try:
+ dom=xml.dom.minidom.parseString(xmldoc)
+ except:
+ return "ERROR: (%s %s) %s"%(sys.exc_info()[0],sys.exc_info()[1],xmldoc)
+
+ images=dom.getElementsByTagName('image')
+ rc=[]
+ fnIds={}
+ for image in images:
+ imagename=image.getElementsByTagName('imagename')[0]
+
+
+
+
+ idnr=image.getElementsByTagName('idnr')[0]
+ id=getText(idnr.childNodes)
+ try:
+ numberOfPages=image.getElementsByTagName('numberOfPages')[0]
+ except:
+ numberOfPages=None
+
+ if numberOfPages:
+ nopT=getText(numberOfPages.childNodes)
+ try:
+ nop=int(nopT)
+ except:
+ nop=0
+ else:
+ nop=0
+
+ texts=getText(imagename.childNodes).split("\n") #mehrere bilder in return getrennter liste
+ for text in texts:
+ if not text=="":
+ text=self.getImageByName(text,onlyName="yes")
+ try:
+ rc.append((str(text),id,nop))
+ fnIds[str(text)]=(id,nop)
+ except:
+ rc.append((repr(text),id,nop))
+ fnIds[repr(text)]=(id,nop)
+
+
+ rc.sort()
+ self.REQUEST.SESSION['filenames']=rc
+ self.REQUEST.SESSION['filenamesIds']=fnIds
+
+ overview=self.ZopeFind(self,obj_ids=['overview_selectedMD.html'])
+
+ if overview:
+ return overview[0][1]()
+ else:
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview_selectedMD.zpt')).__of__(self)
+ return pt()
+
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview_selectedMD.zpt')).__of__(self)
+ return pt()
+
+ def selection(self):
+ """show only selected"""
+ if self.REQUEST.has_key('filename'):
+ filen=self.REQUEST['filename']
+ else:
+ filen=""
+ self.REQUEST.SESSION['filename']=filen
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','overview_selectedMD.zpt')).__of__(self)
+ return pt()
+
+ def thumblistSelectedMD(self):
+ """main template collection"""
+ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumbselectedMD.zpt')).__of__(self)
+ return pt()
+
def manage_AddImageCollectionMDForm(self):
"""Nothing yet"""
pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddImageCollectionFormMD.zpt')).__of__(self)
@@ -1863,4 +2227,4 @@ def manage_AddImageZogiLib(self,id=None,
def manage_AddImageZogiLibForm(self):
"""to be done"""
-
+
\ No newline at end of file