Annotation of OSAS/OSA_system/OSAS_show.py, revision 1.7
1.1 dwinter 1: # Classes for displaying, browsing and organizing the archive
2:
1.4 dwinter 3:
1.2 dwinter 4: import addFolder
1.1 dwinter 5: from OFS.Folder import Folder
6: from OFS.SimpleItem import SimpleItem
7: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
8: from Products.PageTemplates.PageTemplate import PageTemplate
9:
10: class OSAS_ShowOnline(SimpleItem):
11: """OnlineBrowser"""
12: def __init__(self,id):
13: """initialize a new instance"""
14: self.id = id
15:
16: meta_type="OSAS_ShowOnline"
17:
18: def index_html(self):
19: """main view"""
1.5 dwinter 20: pt=PageTemplateFile('Products/OSA_system/OSAS_ViewFiles.zpt').__of__(self)
1.1 dwinter 21: return pt()
22:
23: def getfilesystem2(self,start,reload=0):
24: """load filesystem"""
25:
26: k=filesystem2(start,1)
27: return k
28:
29: def tree(self,start):
30: """get the filetree"""
31: k=browse(start)
32: return k
33:
34: def path_to_link_view(self,path):
35: """generates navigation bar for viewfiles"""
36: return path_to_link_view(self.REQUEST['URL'],path)
37:
38: def isdigilib2(self,path):
39: """check if digilib"""
40: return isdigilib2(path)
41:
42: def changeName(self,name):
43: return changeName(name)
44:
45: def hasMetafile(self,path):
46: return hasMetafile(path)
47:
48: def getMetafile(self,path):
49: return getMetafile(path)
50:
51: def toggle_view(self,path,file):
52: """Oeffnen bzw. schließen der Subfolders"""
53: self.tree(path).toggle(path,file)
54: return self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+"?path="+path)
55:
56: def manage_AddOSAS_ShowOnlineForm(self):
57: """interface for adding the OSAS_root"""
1.5 dwinter 58: pt=PageTemplateFile('Products/OSA_system/AddOSAS_ShowOnline.zpt').__of__(self)
1.1 dwinter 59: return pt()
60:
61: def manage_AddOSAS_ShowOnline(self,id,RESPONSE=None):
62: """add the OSAS_root"""
63: newObj=OSAS_ShowOnline(id)
64: self._setObject(id,newObj)
65: if RESPONSE is not None:
66: RESPONSE.redirect('manage_main')
67:
68:
1.2 dwinter 69: class OSAS_StoreOnline(SimpleItem):
70: """Webfrontend für das Storagesystem"""
71: def __init__(self,id):
72: """initialize a new instance"""
73: self.id = id
74:
75: meta_type="OSAS_StoreOnline"
76:
1.4 dwinter 77:
1.2 dwinter 78: def index_html(self):
79: """main view"""
1.5 dwinter 80: pt=PageTemplateFile('Products/OSA_system/OSAS_StoreFiles.zpt').__of__(self)
1.2 dwinter 81: return pt()
82:
1.4 dwinter 83: def readContexts(self,path):
84: """Zeige Contexte"""
1.6 dwinter 85: if os.path.exists(path+"/index.meta"):
1.7 ! dwinter 86:
1.6 dwinter 87: return readContexts(path)
1.7 ! dwinter 88:
1.6 dwinter 89: else:
1.7 ! dwinter 90:
1.6 dwinter 91: return []
1.4 dwinter 92:
1.2 dwinter 93: def getfilesystem2(self,start,reload=0):
94: """load filesystem"""
95:
96: k=filesystem2(start,1)
97: return k
98:
99: def tree(self,start):
100: """get the filetree"""
101: k=browse(start)
102: return k
103:
104: def path_to_link_store(self,path):
105: """generates navigation bar for viewfiles"""
106: return path_to_link_store(self.REQUEST['URL'],path)
107:
108: def isdigilib2(self,path):
109: """check if digilib"""
110: return isdigilib2(path)
111:
112: def changeName(self,name):
113: return changeName(name)
114:
115: def hasMetafile(self,path):
116: return hasMetafile(path)
117:
118: def getMetafile(self,path):
119: return getMetafile(path)
120:
121: def toggle_view(self,path,file):
122: """Oeffnen bzw. schließen der Subfolders"""
123: self.tree(path).toggle(path,file)
124: return self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+"?path="+path)
125:
126: def isFolder(self,path):
127: """Test ob Eintrag ein Folder ist"""
128: return isFolder(self,path)
129:
130: def isScannedDocument(self,path):
131: """Test ob Eintrag ein Folder ist"""
132: return isScannedDocument(self,path)
133:
134: def isFullText(self,path,folder_name):
135: """Test ob Eintrag ein Folder ist"""
136: return isFullText(path,folder_name)
137:
138: def addFolderForm(self,path):
139: """add a new path"""
1.5 dwinter 140: pt=PageTemplateFile('Products/OSA_system/OSAS_addFolder.zpt').__of__(self)
1.2 dwinter 141: return pt()
142:
143: def date(self):
144: return strftime("%d.%m.%Y",localtime())
145:
146: def addFolder(self,path,folder_name,description,archive_creation_date,creator):
147: """add the folder to the filesystem and write the metadata files"""
148: return addFolder.addFolder(self,path,folder_name,description,archive_creation_date,creator)
149:
150: def EditIndex(self,path):
151: """Editiere das Index Metafile"""
152: try:
153: dom=xml.dom.minidom.parse(path+"/index.meta")
154: indexmeta=dom.toxml()
155: except:
156: indexmeta=""
157: self.REQUEST.SESSION['indexmeta']=indexmeta
158: self.REQUEST.SESSION['path']=path
1.5 dwinter 159: newtemplate=PageTemplateFile('Products/OSA_system/editindex').__of__(self)
1.2 dwinter 160: return newtemplate()
161:
162: def EditIndex2(self):
163: """Sichern der Aenderungen in Index.meta"""
164: if not self.REQUEST.has_key('fileupload'):
165: #newtext=urllib.unquote(self.REQUEST['indexmeta'])
166: newtext=self.REQUEST['indexmeta']
1.3 dwinter 167:
1.2 dwinter 168: else:
169: self.file_name=self.REQUEST['fileupload'].filename
170: #newtext=self.REQUEST.form['fileupload'].read()
171: # HACK DW
172: newtext=self.REQUEST['indexmeta']
173:
174: indexmeta=file(self.REQUEST.SESSION['path']+"/index.meta","w")
175: indexmeta.writelines(newtext)
176: return self.REQUEST.response.redirect(self.REQUEST['URL1']+"?path="+self.REQUEST.SESSION['path'])
177:
1.3 dwinter 178: def add_metafile(self):
179: """nothing"""
1.5 dwinter 180: pt=PageTemplateFile('Products/OSA_system/OSAS_addmetadata.zpt').__of__(self)
1.3 dwinter 181: return pt()
1.4 dwinter 182:
1.2 dwinter 183:
184: def manage_AddOSAS_StoreOnlineForm(self):
185: """interface for adding the OSAS_root"""
1.5 dwinter 186: pt=PageTemplateFile('Products/OSA_system/AddOSAS_StoreOnline.zpt').__of__(self)
1.2 dwinter 187: return pt()
188:
189: def manage_AddOSAS_StoreOnline(self,id,RESPONSE=None):
190: """add the OSAS_root"""
191: newObj=OSAS_StoreOnline(id)
192: self._setObject(id,newObj)
193: if RESPONSE is not None:
194: RESPONSE.redirect('manage_main')
195:
1.1 dwinter 196:
197:
198:
1.4 dwinter 199: def readContexts(path):
200: """ReadContext from index.meta"""
201: dom=xml.dom.minidom.parse(path+"/index.meta")
202: nodes=dom.getElementsByTagName('context')
203: ret=[]
204:
1.7 ! dwinter 205:
1.4 dwinter 206: for node in nodes:
1.7 ! dwinter 207: try:
! 208: link=getText(node.getElementsByTagName('link')[0].childNodes)
! 209: name=getText(node.getElementsByTagName('name')[0].childNodes)
! 210: ret.append((link,name))
! 211: except:
! 212: """nothing"""
1.4 dwinter 213: return ret
214:
215:
1.1 dwinter 216: ### Ab hier Baustelle
217:
218:
219: from types import *
220: import urllib
221: import os
222: import sys
223: import re
224: from AccessControl import ClassSecurityInfo
225: from AccessControl.Role import RoleManager
226: from Acquisition import Implicit
227: from Globals import Persistent
228: from time import strptime
229: from time import strftime
230: import time
231: import os.path
232: import dircache
233: import xml.dom.minidom
234: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
235: from Products.PageTemplates.PageTemplate import PageTemplate
236: import tempfile
237: tempfile.tempdir="/var/tmp/archiver"
238:
239: exclusion=[".HSResource","lost+found","Network Trash Folder","TheFindByContentFolder","TheVolumeSettingsFolder"]
240: class fsentry(Implicit, Persistent, RoleManager):
241: """File entry class"""
242: path = ""
243: user = ""
244: month = ""
245: date =""
246: time = ""
247:
248: security=ClassSecurityInfo()
249: def __init__(self,extpath):
250: """initialize class"""
251: extpath=os.path.abspath(re.search(r"(.*)\n",extpath).group(1))
252: self.all=extpath
253: self.path=extpath
254: self.user=""
255: self.mtime=os.path.getmtime(extpath)
256:
257:
258: security.declarePublic('getPath')
259: def getPath(self):
260: """Ausgabe von path"""
261: return self.path
262:
263: security.declarePublic('getUser')
264: def getUser(self):
265: """Ausgabe von user"""
266: return self.user
267:
268: security.declarePublic('getDate')
269: def getDate(self):
270: """Ausgabe von Date"""
271: return strftime("%Y%m%d%H%M",time.gmtime(self.mtime))
272:
273: security.declarePublic('getDate')
274: def getID(self):
275: """Ausgabe einer eindeutigen Sortierbaren ID"""
276: return self.getDate()+self.getPath()
277:
278: security.declarePublic('getTime')
279: def getTime(self):
280: """Ausgabe von path"""
281: return self.time
282: security.declarePublic('getAll')
283: def getAll(self):
284: """Ausgabe von path"""
285: return self.all
286:
287: class filesystem(Implicit, Persistent, RoleManager):
288: """store filesystem"""
289: node={}
290: hasindex={}
291: security=ClassSecurityInfo()
292:
293: def getfs(self,start):
294: """load filessystem"""
295: f = os.popen("find "+ start+" -name '*' ","r")
296: lines = f.readlines()
297:
298: return lines
299:
300: def loadfs(self,start):
301: """analyse filesystem"""
302: for line in self.getfs(start):
303:
304: g=re.search(r"(.*/)(.*)\n",line)
305: if not g==None:
306: path=g.group(1)
307: file=g.group(2)
308: if self.node.has_key(path):
309: elements=self.node[path]
310: elements.append(file)
311: self.node[path]=elements
312: else:
313: self.node[path]=[file]
314: if (file=="index.meta") | (file=="meta"):
315: self.hasindex[path]="1"
316:
317: def __init__(self,start,reload=0):
318: if reload==1:
319: self.node={}
320: self.hasindex={}
321: self.loadfs(start)
322:
323:
324: security.declarePublic('getNode')
325: def getNode(self):
326: return self.node
327:
328: security.declarePublic('getKeys')
329: def getKeys(self):
330: return self.node.keys()
331:
332: security.declarePublic('clearnode')
333: def clearnode(self):
334: self.node={}
335: return 0
336:
337: security.declarePublic('hasIndex')
338: def hasIndex(self,path):
339:
340: return self.hasindex.has_key(path)
341:
342:
343: def onlyIndex_old(self):
344: """return only files with archive material"""
345: j={}
346: for k in self.node:
347: if self.hasindex.has_key(k):
348: if len(self.node[k])>1:
349: if (len(self.node[k])==2) & ('meta' not in self.node[k]):
350: j[k]=self.node[k]
351: elif (len(self.node[k])==2) & ('meta' in self.node[k]):
352: """ nothing """
353: else:
354: j[k]=self.node[k]
355: return j
356:
357: def archive_the_path(self,path):
358: """parse indexmeta and return digilib path"""
359: try:
360: #f = os.popen("cat "+path+"/index.meta","r")
361: f =file(path+"/index.meta","r")
362:
363: lines = f.read()
364:
365: try:
366: dom = xml.dom.minidom.parseString(lines)
367: if getText(dom.getElementsByTagName("content-type")[0].childNodes)=="folder":
368: """folder nicht archivieren"""
369: return 0
370: else:
371: archive_storage_date=getText(dom.getElementsByTagName("archive-storage-date")[0].childNodes)
372:
373: if archive_storage_date=="":
374:
375: """leer also archivieren"""
376: return 1
377: else:
378: """nicht archivieren"""
379: return 0
380: except:
381: """kein tag also archivieren"""
382: return 1
383: except:
384: """kein index.meta also nicht archivieren"""
385: return 0
386:
387: security.declarePublic('onlyIndex')
388: def onlyIndex(self):
389: """return only files with archive material (archive-storage-date not set)"""
390: j={}
391:
392: for k in self.node:
393: if self.archive_the_path(k):
394: j[k]=self.node[k]
395: return j
396: security.declarePublic('getImageDirs')
397: def getImageDirs(self,dom,path):
398: dirs=dom.getElementsByTagName("dir")
399: dirback=[]
400: for dir in dirs:
401: temp=getText(dir.getElementsByTagName("name")[0].childNodes)
402: temp2=re.search(r"(.*)/mpiwg/online/(.*)",path+"/"+temp)
403: if not temp2==None:
404: try:
405: dirback.append(temp2.group(2))
406: except:
407: """nothing"""
408: else:
409: dirback.append(temp)
410: return dirback
411:
412:
413:
414:
415: security.declarePublic('digilib')
416: def digilib(self, path):
417: """check if folder is a container for digilib files"""
418: if self.hasindex.has_key(path+"/"):
419: return(self.parseIndexMeta(path))
420: else:
421: return "NO"
422:
423:
424:
425:
426: security.declarePublic('isdigilib')
427: def isdigilib(self, path):
428: """return number of possible image directories usefull for digilib"""
429: if self.hasindex.has_key(path+"/"):
430: return(len(self.parseIndexMeta(path)))
431: else:
432: return 0
433:
434: security.declarePublic('parseIndexMeta')
435: def parseIndexMeta(self,k):
436: """parse indexmeta and return digilib path"""
437: f = os.popen("cat "+k+"/index.meta","r")
438: lines = f.read()
439:
440: try:
441: dom = xml.dom.minidom.parseString(lines)
442: content_type=getText(dom.getElementsByTagName("content-type")[0].childNodes)
443: if (content_type=="scanned-document") or (content_type=="scanned document"):
444: dirs=self.getImageDirs(dom,k)
445:
446: return dirs
447: except:
448: return []
449:
450:
451: class filesystem2(Implicit, Persistent, RoleManager):
452: """store filesystem"""
453: node={}
454: hasindex={}
455: security=ClassSecurityInfo()
456:
457: def getfs(self,start):
458: """load filessystem"""
459: f = os.popen("find "+ start+" -name '*' ","r")
460: lines = f.readlines()
461:
462: return lines
463:
464: def loadfs(self,start):
465: """analyse filesystem"""
466: for line in self.getfs(start):
467:
468: g=re.search(r"(.*/)(.*)\n",line)
469: if not g==None:
470: try:
471: path=g.group(1)
472: file=g.group(2)
473: except:
474: """nothing"""
475: if self.node.has_key(path):
476: elements=self.node[path]
477: elements.append(file)
478: self.node[path]=elements
479: else:
480: self.node[path]=[file]
481: if (file=="index.meta") | (file=="meta"):
482: self.hasindex[path]="1"
483:
484: def __init__(self,start,reload=0):
485: """nothing"""
486:
487:
488: security.declarePublic('getImageDirs')
489: def getImageDirs(self,dom,path):
490: dirs=dom.getElementsByTagName("dir")
491: dirback=[]
492: for dir in dirs:
493: temp=getText(dir.getElementsByTagName("name")[0].childNodes)
494: temp2=re.search(r"(.*)/mpiwg/online/(.*)",path+"/"+temp)
495: if not temp2==None:
496: try:
497: dirback.append(temp2.group(2))
498: except:
499: """nothing"""
500: else:
501: dirback.append(temp)
502: return dirback
503:
504:
505: security.declarePublic('digilib')
506: def digilib(self, path):
507: """check if folder is a container for digilib files"""
508: if os.path.exists(path+"/index.meta"):
509: return(self.parseIndexMeta(path))
510: else:
511: return "NO"
512:
513: security.declarePublic('isdigilib')
514: def isdigilib(self, path):
515: if os.path.exists(path+"/index.meta"):
516: return(len(self.parseIndexMeta(path)))
517: else:
518: return 0
519: security.declarePublic('parseIndexMeta')
520: def parseIndexMeta(self,k):
521: """parse indexmeta and return digilib path"""
522: f = os.popen("cat "+k+"/index.meta","r")
523: lines = f.read()
524:
525: try:
526: dom = xml.dom.minidom.parseString(lines)
527: content_type=getText(dom.getElementsByTagName("content-type")[0].childNodes)
528: if content_type=="scanned-document":
529: dirs=self.getImageDirs(dom,k)
530:
531: return dirs
532: except:
533: return []
534:
535:
536: class browse(Implicit, Persistent, RoleManager):
537:
538: security=ClassSecurityInfo()
539: tree={}
540: toggledict={}
541:
542: def filterExcluded(self,dir):
543: ret=[]
544: for item in dir:
545: if not item in exclusion:
546: ret.append(item)
547: return ret
548:
549: def __init__(self,startpath):
550: self.tree={}
551: self.tree[startpath]=self.filterExcluded(dircache.listdir(startpath))
552:
553: security.declarePublic('getTree')
554: def getTree(self,path):
555: if self.tree.has_key(path):
556: return self.tree[path]
557: else:
558: self.tree[path]=self.filterExcluded(dircache.listdir(path))
559: return self.tree[path]
560:
561: security.declarePublic('isDirectory')
562: def isDirectory(self,path,file):
563: return os.path.isdir(os.path.abspath(path+"/"+file))
564:
565: security.declarePublic('toggle')
566: def toggle(self,tmppath,file):
567: path=tmppath+"/"+file
568:
569: if self.toggledict.has_key(path):
570: if self.toggledict[path]==0:
571: self.toggledict[path]=1
572:
573: else:
574: self.toggledict[path]=0
575:
576: else:
577: self.toggledict[path]=4
578:
579:
580: security.declarePublic('isToggle')
581: def isToggle(self,tmppath,file):
582: path=tmppath+"/"+file
583:
584: if self.toggledict.has_key(path):
585:
586: return self.toggledict[path]
587: else:
588:
589: return 0
590:
591:
592: def getfs(start):
593: """return filesystem"""
594: f = os.popen("find "+ start+" -name '*'","r")
595: lines = f.readlines()
596: return lines
597:
598: def showall(start):
599: lines = getfs(start)
600: for line in lines:
601: print line
602: return 0
603:
604: def entries(start):
605: """retrun list of entries of a filesystem"""
606: i=0
607: fs=[]
608: lines=getfs(start)
609: for line in lines:
610: try:
611: if os.path.exists(os.path.abspath(re.search(r"(.*)\n",line).group(1))):
612: fs.append(fsentry(line))
613: i=i+1
614: except:
615: """nothing"""
616: return fs
617:
618: def getfilesystem(start,reload=0):
619: """load filesystem"""
620:
621: k=filesystem(start,1)
622: return k
623:
624:
625:
626: def sort_by_date(fs):
627: """sorts lists of fileentries"""
628: ls=[]
629: dict={}
630: for k in fs:
631: ls.append(k.getID())
632: dict[k.getID()]=k
633: ls.sort()
634: ls.reverse()
635: ret=[]
636: for j in ls:
637: ret.append(dict[j])
638: return ret
639:
640: def path_to_link(path):
641: """generates navigation bar for showfiles"""
642: string=""
643:
644: tmppath=os.path.dirname(path)
645: i=0
646: pathes=[[path, os.path.basename(path)]]
647:
648: while not (len(tmppath)==1):
649:
650: i=i+1
651: if i>20: break
652:
653: pathes.append([tmppath, os.path.basename(tmppath)])
654: tmppath=os.path.dirname(tmppath)
655:
656: while i>=0:
657: string=string+"<a href=showfiles?path="+pathes[i][0]+">"+pathes[i][1]+"</a>/"
658:
659: i=i-1
660: return string
661:
662: def path_to_link_view(URL,path):
663: """generates navigation bar for viewfiles"""
664: string=""
665:
666: tmppath=os.path.dirname(path)
667: i=0
668: pathes=[[path, os.path.basename(path)]]
669:
670: while not (len(tmppath)==1):
671:
672: i=i+1
673: if i>20: break
674:
675: pathes.append([tmppath, os.path.basename(tmppath)])
676: tmppath=os.path.dirname(tmppath)
677:
678: while i>=0:
679: string=string+"<a href="+URL+"?path="+pathes[i][0]+">"+pathes[i][1]+"</a>/"
680:
681: i=i-1
682: return string
683:
1.2 dwinter 684: def path_to_link_store(URL,path):
1.1 dwinter 685: """generates navigation bar for viewfiles"""
686: string=""
687:
688: tmppath=os.path.dirname(path)
689: i=0
690: pathes=[[path, os.path.basename(path)]]
691:
692: while not (len(tmppath)==1):
693:
694: i=i+1
695: if i>20: break
696:
697: pathes.append([tmppath, os.path.basename(tmppath)])
698: tmppath=os.path.dirname(tmppath)
699:
700: while i>=0:
1.2 dwinter 701: string=string+"<a href="+URL+"?path="+pathes[i][0]+">"+pathes[i][1]+"</a>/"
1.1 dwinter 702:
703: i=i-1
704: return string
705:
706:
707: class Error(Implicit, Persistent, RoleManager):
708:
709: error=[]
710: security=ClassSecurityInfo()
711: def __init__(self,initerror):
712: self.error=initerror[0:]
713:
714: security.declarePublic('getError')
715: def getError(self):
716: return self.error
717:
718: class metacheck(Implicit, Persistent, RoleManager):
719: lines=[]
720: security=ClassSecurityInfo()
721: def parsearchive(self,str):
722: """parse for error"""
723: retstr=''
724:
725: if not len(str)==0:
726: for line in str:
727: retstr=retstr+line+"<br>"
728: check=re.search(r"(.*):(.*)",line)
729: if check.group(1)=='ABORT':
730: error="error"
731: elif check.group(1)=='DONE':
732: error="ok"
733: else:
734: error="running"
735:
736: return [retstr,error]
737: else:
738: return ['','running']
739: def __init__(self,path):
740: """archive the documents in path"""
741: self.lines=[]
742:
743: if type(path)==StringType:
744: f = os.popen("/usr/local/mpiwg/archive/metacheck "+path,"r")
745: self.lines.append(Error([path,self.parsearchive(f.readlines())]))
746: else:
747: for singlepath in path:
748: f = os.popen("/usr/local/mpiwg/archive/metacheck "+singlepath,"r")
749: self.lines.append(Error([singlepath,self.parsearchive(f.readlines())]))
750: security.declarePublic('messages')
751:
752: def messages(self):
753: return self.lines
754:
755:
756:
757:
758: class archive(Implicit, Persistent, RoleManager):
759: lines=[]
760: security=ClassSecurityInfo()
761: def parsearchive(self,str):
762: """parse for error"""
763: retstr=''
764:
765: if not len(str)==0:
766: for line in str:
767: retstr=retstr+line+"<br>"
768: check=re.search(r"(.*):(.*)",line)
769: if check.group(1)=='ABORT':
770: error="error"
771: elif check.group(1)=='DONE':
772: error="ok"
773: else:
774: error="running"
775:
776: return [retstr,error]
777: else:
778: return ['','running']
779:
780: def __init__(self,path,session):
781: """archive the documents in path"""
782: self.lines=[]
783: self.filenames={}
784: session['archiver']=self
785:
786:
787: if type(path)==StringType:
788: self.filenames[path]=tempfile.mktemp()
789: f = os.popen("/usr/local/mpiwg/archive/archiver "+path+" > "+self.filenames[path]+" &","r")
790: else:
791: for singlepath in path:
792: self.filenames[singlepath]=tempfile.mktemp()
793: f = os.popen("/usr/local/mpiwg/archive/archiver "+singlepath+" > "+self.filenames[singlepath]+" &","r")
794:
795: security.declarePublic('messages')
796: def messages(self):
797: self.lines=[]
798: for path in self.filenames.keys():
799:
800: self.lines.append(Error([path,self.parsearchive(open(self.filenames[path],"r").readlines())]))
801: return self.lines
802:
803:
804: def evalext(str):
805: return eval(str)
806:
807: def storeerror(ret,path,context,i):
808: session=context.REQUEST.SESSION
809: session['error%i'%i]=ret
810: session['path%i'%i]=path
811:
812: return 'error?number=%i'%i
813:
814: def geterror(str,context):
815: session=context.REQUEST.SESSION
816: return session[str]
817:
818: def readfile(path):
819:
820: ret=""
821: f=open(path,'r')
822: for g in f.readlines():
823: ret=ret+g
824: return ret
825:
826: def writefile(self,path,txt,REQUEST):
827: f=open(path,'w')
828: f.write(txt)
829: f.close()
830: rval=self.aq_acquire('archive2')
831: return rval()
832:
833:
834: def metachecker(self,path):
835: """check the metadata the documents in path"""
836: self.REQUEST.SESSION['path']=self.REQUEST['path']
837: return metacheck(path)
838:
839: def archiver(self,path):
840: """archive the documents in path"""
841: tmp=archive(path,self.REQUEST.SESSION)
842: return self.REQUEST.RESPONSE.redirect('archive4')
843:
844: def getText(nodelist):
845:
846: rc = ""
847: for node in nodelist:
848: if node.nodeType == node.TEXT_NODE:
849: rc = rc + node.data
850: return rc
851:
852: def getBib(nodelist):
853: rc= "<table border='0'>"
1.3 dwinter 854:
1.1 dwinter 855: for node in nodelist:
856:
857: if node.nodeType == node.ELEMENT_NODE:
858: """nothing"""
859: rc = rc+"<tr><td valign='right'>"+str(node.nodeName)+":</td><td> "+getText(node.childNodes)+"</td></tr>"
860: #print rc
861: return rc+"</table>"
862:
863: def getMetafile(path):
864: """get index.meta"""
865: html=[]
866: if not os.path.exists(path+"/index.meta"):
867:
868: return "NO_METADATA"
869: else:
870: f = os.popen("cat "+path+"/index.meta","r")
871: lines = f.read()
872: dom = xml.dom.minidom.parseString(lines)
873: name=getText(dom.getElementsByTagName("name")[0].childNodes)
874: creator=getText(dom.getElementsByTagName("creator")[0].childNodes)
875: creation_date=getText(dom.getElementsByTagName("archive-creation-date")[0].childNodes)
876: description=getText(dom.getElementsByTagName("description")[0].childNodes)
877: try:
878: type=getText(dom.getElementsByTagName("content-type")[0].childNodes)
879: except:
880: type=""
881: if type=="scanned document":
882: html="<h3>Document: "+name+"</h3>"
883: elif type=="folder":
884: html="<h3>Folder: "+name+"</h3>"
885: else:
886: html="<h3>Document: "+name+"</h3>"
887:
888: html=html+"<p><i>created by: "+creator+" at: "+creation_date+"</i></p>"
889: html=html+"<h4>Description</h4><p>"+description+"</p>"
890: try:
891: bib = dom.getElementsByTagName("meta")[0].getElementsByTagName("bib")[0]
892: if bib.attributes.has_key('type'):
893: html=html+"<h4>Info ("+bib.attributes['type'].value+")</h4>"
894: else:
895: html=html+"<h4>Info</h4>"
896: html=html+getBib(bib.childNodes)
1.3 dwinter 897:
1.1 dwinter 898: except:
899: """none"""
900:
901: # html=html.encode('utf-8','replace')+getBib(bib.childNodes).encode('utf-8','replace')
902:
903: return html
904:
905: def hasMetafile(path):
906: """get index.meta"""
907: return os.path.exists(path+"/index.meta")
908: #return path
909:
910: def isdigilib2(path):
911: """check if folder is candidate for digilib without metadata"""
912: try:
913: dir=os.listdir(path)
914:
915: imagesuffixes=['.gif','.jpg','.jpeg','.png','.tiff','.tif','.JPG','.TIFF','.TIF']
916: ret=""
917: for a in dir:
918:
919: suffix=os.path.splitext(a)
920:
921: if suffix[1] in imagesuffixes:
922: return 1
923:
924: try:
925: dom=xml.dom.minidom.parse(os.path.split(path)[0]+"/index.meta")
926: for node in dom.getElementsByTagName("dir"):
927:
928: if getText(node.getElementsByTagName("content-type")[0].childNodes)=="images":
929:
930: if getText(node.getElementsByTagName("name")[0].childNodes)==os.path.split(path)[1]:
931: return 1
932: return 0
933: except:
934:
935: return 0
936:
937:
938:
939:
940:
941: except:
942: return 0
943:
944: def isFullText(path,folder_name):
945: """check if foldername in path is full text"""
946: try:
947: dom=xml.dom.minidom.parse(path+"/index.meta")
948: for node in dom.getElementsByTagName("dir"):
949:
950: if getText(node.getElementsByTagName("content-type")[0].childNodes)=="fulltext":
951:
952: if getText(node.getElementsByTagName("name")[0].childNodes)==folder_name:
953: return 1
954: return 0
955: except:
956:
957: return 0
958:
959:
960: def isPresentation(path,folder_name):
961: """check if foldername in path is full text"""
962: try:
963: dom=xml.dom.minidom.parse(path+"/index.meta")
964: #print dom.toxml()
965: for dirnode in dom.getElementsByTagName("dir"):
966: try:
967:
968: if getText(dirnode.getElementsByTagName('content-type')[0].childNodes)=='presentation':
969: if getText(dirnode.getElementsByTagName("name")[0].childNodes)==folder_name:
970: return 1
971: except:
972: """nothing"""
973: return 0
974: except:
975:
976: return 0
977:
978:
979:
980:
981:
982: def changeName(path):
983: try:
984: temp2=re.search(r"(.*)/mpiwg/online/(.*)",path)
985: if temp2==None:
986: return "digifiles/"+re.search(r"(.*)/mpiwg/production/docuserver/(.*)",path).group(2)
987: else:
988: return temp2.group(2)
989: except: # hack - im archivbereich keine online darstellung gibt jetzt ein no zurück.
990: return "NO"
991:
992:
993: def test(self):
994: self.i=1
995: #newtemplate=PageTemplateFile('/usr/local/mpiwg/Zope/Extensions/test').__of__(self)
996: self.manage_addProduct['OFSP'].manage_addDTMLMethod('neu','neu')
997: self.getattr('neu').manage_edit('HELLO','neu')
998: return "ok"
999:
1000:
1001: class ls(Implicit, Persistent, RoleManager):
1002: """File entry class"""
1003: path = ""
1004: user = ""
1005: month = ""
1006: date =""
1007: time = ""
1008:
1009: security=ClassSecurityInfo()
1010:
1011: def __init__(self,start):
1012: self.outfile=tempfile.mktemp()
1013: start['outfile']=self
1014: os.popen("ls -R / >"+self.outfile+" &","r")
1015:
1016:
1017: security.declarePublic('read')
1018: def read(self):
1019: return self.f.read()
1020: security.declarePublic('retself')
1021: def retself(self):
1022: return self
1023: security.declarePublic('all')
1024: def all(self):
1025: ret=""
1026: for g in self.f:
1027: ret=ret+g
1028: return ret
1029:
1030: security.declarePublic('printOutfile')
1031: def printOutfile(self):
1032: while not os.path.exists(self.outfile):
1033: """nothing"""
1034: return open(self.outfile).readlines()
1035:
1036: class overview(Implicit,Persistent, RoleManager):
1037: dir=[]
1038: resources={}
1039: security=ClassSecurityInfo()
1040:
1041: def __init__(self,path):
1042: dir=os.listdir(path)
1043:
1044: for file in dir:
1045: self.resources[self.getResource(path,file)]=path+"/"+file
1046:
1047:
1048: def getResource(self,path,filename):
1049: f=file(path+"/"+filename,'r')
1050:
1051: for line in f.readlines():
1052:
1053: if line[0:4]=="INFO":
1054: if line[6:14]=="resource":
1055: return line
1056: return "error"
1057:
1058: def parsearchive(self,str):
1059: """parse for error"""
1060: retstr=''
1061:
1062: if not len(str)==0:
1063: for line in str:
1064: retstr=retstr+line+"<br>"
1065: check=re.search(r"(.*):(.*)",line)
1066: if check.group(1)=='ABORT':
1067: error="error"
1068: elif check.group(1)=='DONE':
1069: error="ok"
1070: else:
1071: error="running"
1072:
1073: return [retstr,error]
1074: else:
1075: return ['','running']
1076:
1077: security.declarePublic('messages')
1078: def messages(self):
1079: self.lines=[]
1080: for name in self.resources.keys():
1081: path=self.resources[name]
1082:
1083: self.lines.append(Error([name,self.parsearchive(open(path,"r").readlines())]))
1084: return self.lines
1085:
1086: security.declarePublic('printResource')
1087: def printResource(self):
1088: return self.resources
1089:
1090: def getoverview(path):
1091:
1092: return overview(path)
1093:
1094:
1095: def ls_test(self):
1096: tmp=ls(self.REQUEST.SESSION)
1097: return self.REQUEST.RESPONSE.redirect('next')
1098:
1099: def storeFile(self,something):
1100: self.REQUEST.SESSION['something']=something
1101: return 1
1102:
1103: def getFile(self):
1104: return self.REQUEST.SESSION['something']
1105:
1106: def isFolder(self,path):
1107: """returns TRUE, wenn path ein Folder ist in den weitere Objekte Folder oder Dokumente gelegt werden dürfen"""
1108: return not isScannedDocument(self,path) # vorläufig sind alle Documente die keine scanned documente sind folder.
1109:
1110: def isScannedDocument(self,path):
1111: """returns TRUE, wenn path der Stammordner eines gescannten Documents ist"""
1112: try:
1113: f = file(path+"/index.meta","r")
1114: lines = f.read()
1115:
1116: try:
1117: dom = xml.dom.minidom.parseString(lines)
1118: content_type=getText(dom.getElementsByTagName("content-type")[0].childNodes)
1119: if (content_type=="scanned-document") or (content_type=="scanned document"):
1120: return 1
1121: else:
1122: return 0
1123: except:
1124: return 0
1125: except:
1126: return 0
1127:
1128: from time import localtime,strftime
1129:
1130: def date(self):
1131: return strftime("%d.%m.%Y",localtime())
1132:
1133:
1134:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>