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