File:  [Repository] / OSAS / OSA_system / OSAS_archiver.py
Revision 1.13: download - view: text, annotated - select for diffs - revision graph
Mon Sep 25 13:48:39 2006 UTC (17 years, 9 months ago) by casties
Branches: MAIN
CVS tags: HEAD
added journal-volume type
fixed generation of tags in index meta files

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>