1: """ Methoden und Klassen fuer den MPIWG Archiver
2: 20040303 Zur Zeit nur angepasst and das System des MPIWG
3: nächste schritte: Konfigurierbarkeit der Metadaten / Konfigurierbarkeit der Server
4:
5: """
6:
7: from OFS.Image import Image
8: from OFS.Folder import Folder
9: from OFS.SimpleItem import SimpleItem
10: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
11: from Products.PageTemplates.PageTemplate import PageTemplate
12: from AccessControl import ClassSecurityInfo
13: from Globals import InitializeClass,Persistent,package_home
14: from Acquisition import Implicit
15: from OSAS_show import *
16: from OSAS_helpers import *
17: from types import *
18:
19: import os.path
20: import os
21: import OSAS_ids
22: import archive #Baustelle
23: import time
24:
25: class OSAS_archiveInbox(SimpleItem,Persistent,Implicit):
26: """Inbox"""
27:
28: meta_type="OSAS_archiveInbox"
29: pathes=[]
30:
31: def __init__(self,id,title):
32: """init"""
33: self.id=id
34: self.title=title
35: self.pathes=[]
36:
37: def addPath(self,path,RESPONSE=None):
38: """add a path"""
39: today=time.localtime()
40: temp=self.pathes[0:]
41: temp.append([path,today])
42: self.pathes=temp[0:]
43: if RESPONSE:
44: RESPONSE.redirect("index_html")
45:
46: def index_html(self):
47: """main"""
48: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','OSAS_archiveInboxIndex.zpt')).__of__(self)
49: return pt()
50:
51: def manage_AddOSAS_archiveInboxForm(self):
52: """interface for adding the OSAS_root"""
53: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddOSAS_archiveInbox.zpt')).__of__(self)
54: return pt()
55:
56:
57: def manage_AddOSAS_archiveInbox(self,id,title="",RESPONSE=None):
58: """add the OSAS_root"""
59: if title=="":
60: title=id
61:
62: newObj=OSAS_archiveInbox(id, title)
63: self._setObject(id,newObj)
64: if RESPONSE is not None:
65: RESPONSE.redirect('manage_main')
66:
67:
68:
69: class OSAS_metadataOrganizer(SimpleItem,Persistent,Implicit):
70: """Eingabe von Metadaten"""
71:
72: meta_type="OSAS_metadataOrganizer"
73: mediaTypes=["image","video","text","audio","data"]
74: acquisitionTypes=["Image-Acquisition"]
75: mediaToAcquisition={"image":"Image-Acquisition"}
76: metaDataSets={'Image-Acquisition': [('device','opt'),('image-type','opt'),('production-comment','opt')]}
77: imgData={'image':[('dpi','req')]}
78:
79: bibDataSets={'Book':[('author','opt'),('year','opt'),('title','opt'),('series editor','opt'),('series title','opt'),('series volume','opt'),('number of pages','opt'),('city','opt'),('publisher','opt'),('edition','opt'),('number of volumes','opt'),('translator','opt'),('ISBN ISSN','opt')],
80: 'Journal Article':[('author','opt'),('year','opt'),('title','opt'),('journal','opt'),('volume','opt'),('issue','opt'),('pages','opt'),('alternate journal','opt'),('call number','opt')],
81: 'Manuscript':[('author','opt'),('year','opt'),('title','opt'),('location','opt'),('signature','opt'),('pages','opt'),('editorial remarks','opt'),('description','opt'),('keywords','opt')]}
82:
83:
84: referenceTypes=['Book','Journal Article','Manuscript']
85:
86: def __init__(self,id,title):
87: """init"""
88: self.id=id
89: self.title=title
90: #self.acquisitionData=['provider_name','provider_address','provider_contact','provider_url','date','description']
91:
92:
93: def getName(self):
94: """gives name from request session path"""
95: path=self.REQUEST.SESSION['path']
96: splitted=path.split("/")
97: return splitted[len(splitted)-1]
98:
99: def addRessourceMeta(self,path=None,RESPONSE=None):
100: """Metadaten fuer Ressource"""
101: if not path:
102: path=self.REQUEST.SESSION['path']
103:
104: else:
105: self.REQUEST.SESSION['path']=path
106:
107: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','inputRessourceData.zpt')).__of__(self)
108: return pt()
109:
110:
111: def writeRessourceMetadata(self,name,date,description,creator,RESPONSE=None):
112: """schreibe Resourcedata in index.meta"""
113:
114: path=self.REQUEST.SESSION['path']
115:
116: subnodes={}
117: subnodes['name']=name
118: subnodes['archive-creation-date']=date
119: subnodes['creator']=creator
120: subnodes['description']=description
121:
122: changeNodesInIndexMeta(path,"",subnodes)
123: self.inbox.addPath(self.REQUEST.SESSION['path'])
124: RESPONSE.redirect(self.REQUEST['URL2'])
125:
126:
127: def addAcquisition(self,path):
128: """Hinzufügen von Acquisition Daten"""
129: self.REQUEST.SESSION['path']=path
130: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','inputAcquisitionData.zpt')).__of__(self)
131: return pt()
132:
133:
134: def writeAcquisitionMetadata(self,date,path,media_type,producer="mpiwg",description=""):
135: """Schreibe Acquisiondata in index.meta"""
136:
137:
138: #schreibe in index.meta
139: subnodes={}
140: subnodes['media-type']=media_type
141: changeNodesInIndexMeta(path,"",subnodes)
142:
143: subnodes={}
144: subnodes['date']=date
145: subnodes['description']=description
146:
147: changeNodesInIndexMeta(path,"acquisition",subnodes)
148: #print "HI"
149:
150: subnodes={}
151: subnodes['provider-id']=producer
152: subnodes['url']=getattr(self.producerFolder,producer).url
153: subnodes['contact']=getattr(self.producerFolder,producer).contact
154: subnodes['address']=getattr(self.producerFolder,producer).address
155:
156: changeNodesInIndexMeta(path,"provider",subnodes,parent="acquisition")
157:
158:
159: self.metaDataSet=self.metaDataSets[self.mediaToAcquisition[media_type]]
160: self.media_type=self.mediaToAcquisition[media_type]
161:
162: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','inputDocumentMetadata.zpt')).__of__(self)
163: return pt()
164:
165:
166: def writeDocumentMetadata(self,referenceType):
167:
168: """write document metadata"""
169: form=self.REQUEST.form
170: #schreibe in index.meta
171: self.bibDataSet=self.bibDataSets[form['referenceType']]
172: self.bibdata_type=form['referenceType']
173:
174: subnodes={}
175: subnodes['device']=form['device']
176: subnodes['image-type']=form['image-type']
177: subnodes['production-comment']=form['production-comment']
178: changeNodesInIndexMeta(self.REQUEST.SESSION['path'],"image-acquisition",subnodes)
179:
180: subnodes={}
181: subnodes['dpi']=form['dpi']
182:
183:
184: changeNodesInIndexMeta(self.REQUEST.SESSION['path'],"img",subnodes)
185:
186:
187: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','inputBiblioMetadata.zpt')).__of__(self)
188: return pt()
189:
190: def writeBiblioMetadata(self,bibdata_type,RESPONSE=None):
191: """Write all"""
192: #to do write metadata
193:
194: subnodes={}
195: form=self.REQUEST.form
196: #for key in form.keys():
197: # subnodes[key]=form['device']
198: subnodes=form
199: del subnodes['bibdata_type'] #in form but not metadata
200: changeNodesInIndexMeta(self.REQUEST.SESSION['path'],"bib",subnodes,nodeAttributes={'type':bibdata_type},parent="meta")
201: #return self.REQUEST
202: return self.addRessourceMeta()
203:
204:
205:
206: def manage_AddOSAS_metadataOrganizerForm(self):
207: """interface for adding the OSAS_root"""
208: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddOSAS_metadataOrganizer.zpt')).__of__(self)
209: return pt()
210:
211:
212: def manage_AddOSAS_metadataOrganizer(self,id,title="",RESPONSE=None):
213: """add the OSAS_root"""
214: if title=="":
215: title=id
216:
217: newObj=OSAS_metadataOrganizer(id, title)
218: self._setObject(id,newObj)
219: if RESPONSE is not None:
220: RESPONSE.redirect('manage_main')
221:
222:
223: class OSAS_processViewer(SimpleItem,Persistent,Implicit):
224: """Process viewer for archiving"""
225:
226: meta_type="OSAS_processViewer"
227:
228: def __init__(self, id, title):
229: """init"""
230: self.id=id
231: self.title=title
232:
233: def index_html(self):
234: """main page"""
235: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','processViewerIndex.zpt')).__of__(self)
236: return pt()
237:
238: def storeFile(self,something):
239: """store info in session"""
240: self.REQUEST.SESSION['something']=something
241: return 1
242:
243: def getFile(self,number):
244: """get info from session"""
245: check=self.getoverview('/var/tmp/archiver').messages()[number]
246: return check
247:
248: def getoverview(self,path):
249: """get overview"""
250: return archive.overview(path)
251:
252: def storeerror(self,ret,path,context,i):
253: """store an error"""
254: session=context.REQUEST.SESSION
255: session['error%i'%i]=ret
256: session['path%i'%i]=path
257:
258: return 'error?number=%i'%i
259:
260: def geterror(self,str,context):
261: session=context.REQUEST.SESSION
262: return session[str]
263:
264:
265: def readfile(self,path):
266:
267: ret=""
268: f=open(path,'r')
269: for g in f.readlines():
270: ret=ret+g
271: return ret
272:
273: def writefile(self,path,txt,REQUEST):
274: """writefile"""
275: f=open(path,'w')
276: f.write(txt)
277: f.close()
278: rval=self.aq_acquire('archive2')
279: return rval()
280:
281:
282: def view(self,number):
283: """view page"""
284: self.errnum=number
285: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','processViewerView.zpt')).__of__(self)
286: return pt()
287:
288: def error(self):
289: """view errors"""
290: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','processViewerError.zpt')).__of__(self)
291: return pt()
292:
293: def manage_AddOSAS_processViewerForm(self):
294: """interface for adding the OSAS_processViewer"""
295: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddOSAS_processViewer.zpt')).__of__(self)
296: return pt()
297:
298:
299: def manage_AddOSAS_processViewer(self,id,title="",RESPONSE=None):
300: """add the OSAS_processViewer"""
301: if title=="":
302: title=id
303:
304: newObj=OSAS_processViewer(id, title)
305: self._setObject(id,newObj)
306: if RESPONSE is not None:
307: RESPONSE.redirect('manage_main')
308:
309:
310:
311: class OSAS_archiver(Folder, Persistent,Implicit):
312: """Hauptklasse fuer das Archiv"""
313:
314: meta_type="OSAS_archiver"
315:
316: manage_options = Folder.manage_options+(
317: {'label':'Main Config','action':'changeOSAS_archiverForm'},
318: )
319:
320: def unarchive(self,path):
321: """unarchive the path"""
322: f = os.popen("/usr/local/mpiwg/archive/unarchiver "+path,"r")
323: return f.readlines()
324:
325: def checkIfUnarchive(self,path):
326: if not os.path.exists(path+"/index.meta"):
327: return 0
328: f=file(path+"/index.meta","r").read()
329: dom=xml.dom.minidom.parseString(f)
330: archiveStorageDates=dom.getElementsByTagName("archive-storage-date")
331: if archiveStorageDates:
332: return 1
333: else:
334: return 0
335:
336: ## methoden aus dem alten archive.py
337:
338:
339: def isArray(self,path):
340: """check for array"""
341: if type(path) == StringType:
342: return 0
343: else:
344: return 1
345:
346: def archiver(self,path):
347: """archive the documents in path"""
348: tmp=archive.archive(path,self.REQUEST.SESSION)
349: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','archiveStatus.zpt')).__of__(self)
350: return pt()
351:
352: def archive2(self):
353: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','archive2.zpt')).__of__(self)
354: return pt()
355:
356:
357: def metachecker(self,path):
358: """check the metadata of the documents in path"""
359: self.REQUEST.SESSION['path']=self.REQUEST['path']
360: return archive.metacheck(path)
361:
362: ## methods from OSAS_show
363: def changeName(self,name):
364: return changeName(name)
365:
366: def hasMetafile(self,path):
367: return hasMetafile(path)
368:
369: def getMetafile(self,path):
370: return getMetafile(path)
371:
372: def toggle_view(self,path,file):
373: """Oeffnen bzw. schließen der Subfolders"""
374: self.tree(path).toggle(path,file)
375: return self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+"?path="+path)
376:
377:
378:
379: def isdigilib2(self,path):
380: """check if digilib"""
381: return isdigilib2(path)
382:
383: def path_to_link_view(self,path):
384: """generates navigation bar for viewfiles"""
385: return path_to_link_view(self.REQUEST['URL'],path)
386:
387:
388: def tree(self,start):
389: """get the filetree"""
390: k=browse(start)
391: return k
392:
393: def getfilesystem2(self,start,reload=0):
394: """load filesystem"""
395: k=filesystem2(start,1)
396: return k
397:
398: def getfilesystem(self,start,reload=0):
399: """load filesystem"""
400:
401: k=filesystem(start,1)
402: return k
403:
404:
405: ##init
406: def __init__(self, id, title,startPath):
407: """init"""
408: self.id=id
409: self.title=title
410: self.startPath=startPath
411:
412: def archiver_html(self):
413: """archiver"""
414: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','OSAS_Archiver.zpt')).__of__(self)
415: return pt()
416:
417: def index_html(self):
418: """main page"""
419: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','archiverIndex.zpt')).__of__(self)
420: return pt()
421:
422: def getDate(self):
423: """date"""
424: return time.strftime("%Y-%m-%d",time.localtime())
425:
426: def newFolders_html(self):
427: """main page"""
428: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','newFolders.zpt')).__of__(self)
429: return pt()
430:
431: def getProducers(self):
432: """Ausgabe der registrierten Benutzer"""
433: ret=[]
434: #x=7
435: id=self.producerFolder.getId()
436: for list in self.producerFolder.__dict__:
437: obj=getattr(self.producerFolder,list)
438: if (hasattr(obj,"meta_type")):
439: if (obj.meta_type=="OSAS_producer"):
440: ret.append(obj.getId())
441: return ret
442:
443: def getProducer(self,id):
444: """Gebe ProducerObjekt zurück"""
445: obj=getattr(self.producerFolder,id)
446: return obj
447:
448:
449:
450: def createFoldersForm(self,producer,number):
451: """Erzeuge Folder im producer Verzeichnis mit ids"""
452: self.REQUEST.SESSION['producer']=producer
453: self.REQUEST.SESSION['ids']=self.idGenerator.giveIdsOut(number)
454: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','createFoldersForm.zpt')).__of__(self)
455: return pt()
456:
457: def createFolders(self,folderList,producer):
458: """Erzeug die entsprechenden Folder"""
459: #hack
460: #producer="library"
461: if type(folderList)==StringType:
462: folders=[folderList]
463: else:
464: folders=folderList
465: #return producer
466: producerFolderName=self.getProducer(producer).producerFolderName
467:
468: for folder in folders:
469: os.mkdir(self.startPath+"/"+producerFolderName+"/"+folder)
470: os.chmod(self.startPath+"/"+producerFolderName+"/"+folder,0775)
471: self.REQUEST.SESSION['folderList']=folders
472: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','createFolders.zpt')).__of__(self)
473: return pt()
474:
475: def storeerror(self,ret,path,context,i):
476: """store an error"""
477: session=context.REQUEST.SESSION
478: session['error%i'%i]=ret
479: session['path%i'%i]=path
480:
481: return 'error?number=%i'%i
482:
483: def geterror(self,str,context):
484: session=context.REQUEST.SESSION
485: return session[str]
486:
487: def readfile(self,path):
488:
489: ret=""
490: f=open(path,'r')
491: for g in f.readlines():
492: ret=ret+g
493: return ret
494:
495: def writefile(self,path,txt,REQUEST):
496: """writefile"""
497: f=open(path,'w')
498: f.write(txt)
499: f.close()
500: return self.archive2()
501:
502: def error(self):
503: """view errors"""
504: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','processViewerError.zpt')).__of__(self)
505: return pt()
506:
507:
508: def archiveSelected(self):
509: """Archiviere ausgewaehlte files"""
510: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','archiveSelected.zpt')).__of__(self)
511: return pt()
512:
513: def enterAcquisitionMetadata(self):
514: """Erstelle Metadaten fuer Acquisition"""
515:
516: def enterPreliminaryBibMeta(self):
517: """Erstelle Metadaten fuer Bibliography"""
518:
519: def showFilesForArchiving(self):
520: """Anzeige der noch zu archivieren Files"""
521:
522:
523: def changeOSAS_archiverForm(self):
524: """change"""
525: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','ChangeOSAS_archiver.zpt')).__of__(self)
526: return pt()
527:
528: def changeOSAS_archiver(self,startPath,title="",RESPONSE=None):
529: """change"""
530: self.startPath=startPath
531: self.title=title
532:
533: if RESPONSE is not None:
534: RESPONSE.redirect('manage_main')
535:
536:
537: def manage_AddOSAS_archiverForm(self):
538: """interface for adding the OSAS_root"""
539: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddOSAS_archiver.zpt')).__of__(self)
540: return pt()
541:
542:
543: def manage_AddOSAS_archiver(self,id,startPath,title="",RESPONSE=None):
544: """add the OSAS_root"""
545: if title=="":
546: title=id
547:
548: newObj=OSAS_archiver(id, title,startPath)
549: self._setObject(id,newObj)
550: if RESPONSE is not None:
551: RESPONSE.redirect('manage_main')
552:
553:
554: class OSAS_producer(SimpleItem,Persistent,Implicit):
555: """Klasse fuer Produzenteninformationen
556: Metadaten nach V1.1.1"""
557:
558: meta_type="OSAS_producer"
559:
560: def __init__(self,shortName,fullName,producerFolderName,address="",url="",contact=""):
561:
562: self.id=shortName
563: self.title=fullName
564: self.address=address
565: self.url=url
566: self.contact=contact
567: self.producerFolderName=producerFolderName
568:
569: manage_options = SimpleItem.manage_options+(
570: {'label':'Main Config','action':'changeOSAS_producerForm'},
571: )
572:
573: def changeOSAS_producerForm(self):
574: """change"""
575: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','ChangeOSAS_producer.zpt')).__of__(self)
576: return pt()
577:
578: def changeOSAS_producer(self,title,address,producerFolderName,contact="",url="",RESPONSE=None):
579: """change"""
580: self.title=title
581: self.address=address
582: self.url=url
583: self.contact=contact
584: self.producerFolderName=producerFolderName
585:
586: if RESPONSE:
587: RESPONSE.redirect("manage_main")
588:
589: def manage_AddOSAS_producerForm(self):
590: """interface for adding the OSAS_root"""
591: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddOSAS_producer.zpt')).__of__(self)
592: return pt()
593:
594:
595: def manage_AddOSAS_producer(self,id,producerFolderName,title="",contact="",address="",url="",RESPONSE=None):
596: """add the OSAS_root"""
597: if title=="":
598: title=id
599:
600: newObj=OSAS_producer(id, title,producerFolderName,address,contact,url)
601: self._setObject(id,newObj)
602: if RESPONSE is not None:
603: RESPONSE.redirect('manage_main')
604:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>