File:  [Repository] / OSAS / OSA_system / OSAS_archiver.py
Revision 1.10: download - view: text, annotated - select for diffs - revision graph
Fri Jan 9 12:47:04 2004 UTC (20 years, 5 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
bug in hasindex fixed

    1: # Methoden und Klassen fuer den MPIWG Archiver
    2: 
    3: from OFS.Image import Image
    4: from OFS.Folder import Folder
    5: from OFS.SimpleItem import SimpleItem
    6: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
    7: from Products.PageTemplates.PageTemplate import PageTemplate
    8: from AccessControl import ClassSecurityInfo
    9: from Globals import InitializeClass
   10: from Globals import Persistent
   11: from Acquisition import Implicit
   12: from OSAS_show import *
   13: from OSAS_helpers import *
   14: from types import *
   15: 
   16: import os.path
   17: import os
   18: import OSAS_ids
   19: import archive #Baustelle
   20: import time
   21: 
   22: class OSAS_archiveInbox(SimpleItem,Persistent,Implicit):
   23:     """Inbox"""
   24: 
   25:     meta_type="OSAS_archiveInbox"
   26:     pathes=[]
   27:     
   28:     def __init__(self,id,title):
   29:         """init"""
   30:         self.id=id
   31:         self.title=title
   32:         self.pathes=[]
   33: 
   34:     def addPath(self,path,RESPONSE=None):
   35:         """add a path"""
   36:         today=time.localtime()
   37:         temp=self.pathes[0:]
   38:         temp.append([path,today])
   39:         self.pathes=temp[0:]
   40:         if RESPONSE:
   41:             RESPONSE.redirect("index_html")
   42: 
   43:     def index_html(self):
   44:         """main"""
   45:         pt=PageTemplateFile('Products/OSA_system/OSAS_archiveInboxIndex.zpt').__of__(self)
   46:         return pt()
   47:     
   48: def manage_AddOSAS_archiveInboxForm(self):
   49:     """interface for adding the OSAS_root"""
   50:     pt=PageTemplateFile('Products/OSA_system/AddOSAS_archiveInbox.zpt').__of__(self)
   51:     return pt()
   52: 
   53: 
   54: def manage_AddOSAS_archiveInbox(self,id,title="",RESPONSE=None):
   55:     """add the OSAS_root"""
   56:     if title=="":
   57:         title=id
   58:         
   59:     newObj=OSAS_archiveInbox(id, title)
   60:     self._setObject(id,newObj)
   61:     if RESPONSE is not None:
   62:         RESPONSE.redirect('manage_main')
   63:     
   64: 
   65: 
   66: class OSAS_metadataOrganizer(SimpleItem,Persistent,Implicit):
   67:     """Eingabe von Metadaten"""
   68: 
   69:     meta_type="OSAS_metadataOrganizer"
   70:     mediaTypes=["image","video","text","audio","data"]
   71:     acquisitionTypes=["Image-Acquisition"]
   72:     mediaToAcquisition={"image":"Image-Acquisition"}
   73:     metaDataSets={'Image-Acquisition': [('device','opt'),('image-type','opt'),('production-comment','opt')]}
   74:     imgData={'image':[('dpi','req')]}
   75:     
   76:     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')],
   77:                   'Journal Article':[('author','opt'),('year','opt'),('title','opt'),('journal','opt'),('volume','opt'),('issue','opt'),('pages','opt'),('alternate journal','opt'),('call number','opt')],
   78:                   'Manuscript':[('author','opt'),('year','opt'),('title','opt'),('location','opt'),('signature','opt'),('pages','opt'),('editorial remarks','opt'),('description','opt'),('keywords','opt')]}
   79: 
   80: 
   81:     referenceTypes=['Book','Journal Article','Manuscript']
   82: 
   83:     def __init__(self,id,title):
   84:         """init"""
   85:         self.id=id
   86:         self.title=title
   87:         #self.acquisitionData=['provider_name','provider_address','provider_contact','provider_url','date','description']
   88: 
   89: 
   90:     def getName(self):
   91:         """gives name from request session path"""
   92:         path=self.REQUEST.SESSION['path']
   93:         splitted=path.split("/")
   94:         return splitted[len(splitted)-1]
   95:         
   96:     def addRessourceMeta(self,path=None,RESPONSE=None):
   97:         """Metadaten fuer Ressource"""
   98:         if not path:
   99:             path=self.REQUEST.SESSION['path']
  100: 
  101:         else:
  102:             self.REQUEST.SESSION['path']=path
  103: 
  104:         pt=PageTemplateFile('Products/OSA_system/inputRessourceData.zpt').__of__(self)
  105:         return pt()
  106: 
  107:         
  108:     def writeRessourceMetadata(self,name,date,description,creator,RESPONSE=None):
  109:         """schreibe Resourcedata in index.meta"""
  110: 
  111:         path=self.REQUEST.SESSION['path']
  112: 
  113:         subnodes={}
  114:         subnodes['name']=name
  115:         subnodes['archive-creation-date']=date
  116:         subnodes['creator']=creator       
  117:         subnodes['description']=description
  118:         
  119:         changeNodesInIndexMeta(path,"",subnodes)
  120:         self.inbox.addPath(self.REQUEST.SESSION['path'])
  121:         RESPONSE.redirect(self.REQUEST['URL2'])
  122:         
  123:         
  124:     def addAcquisition(self,path):
  125:         """Hinzufügen von Acquisition Daten"""
  126:         self.REQUEST.SESSION['path']=path
  127:         pt=PageTemplateFile('Products/OSA_system/inputAcquisitionData.zpt').__of__(self)
  128:         return pt()
  129: 
  130: 
  131:     def writeAcquisitionMetadata(self,date,path,media_type,producer="mpiwg",description=""):
  132:         """Schreibe Acquisiondata in index.meta"""
  133:         
  134:         
  135:         #schreibe in index.meta
  136:         subnodes={}
  137:         subnodes['media-type']=media_type
  138:         changeNodesInIndexMeta(path,"",subnodes)
  139:         
  140:         subnodes={}
  141:         subnodes['date']=date
  142:         subnodes['description']=description
  143:         
  144:         changeNodesInIndexMeta(path,"acquisition",subnodes)
  145:         #print "HI"
  146: 
  147:         subnodes={}
  148:         subnodes['provider-id']=producer
  149:         subnodes['url']=getattr(self.producerFolder,producer).url
  150:         subnodes['contact']=getattr(self.producerFolder,producer).contact
  151:         subnodes['address']=getattr(self.producerFolder,producer).address
  152:         
  153:         changeNodesInIndexMeta(path,"provider",subnodes,parent="acquisition")
  154: 
  155:         
  156:         self.metaDataSet=self.metaDataSets[self.mediaToAcquisition[media_type]]
  157:         self.media_type=self.mediaToAcquisition[media_type]
  158:         
  159:         pt=PageTemplateFile('Products/OSA_system/inputDocumentMetadata.zpt').__of__(self)
  160:         return pt()
  161: 
  162:         
  163:     def writeDocumentMetadata(self,referenceType):
  164: 
  165:         """write document metadata"""
  166:         form=self.REQUEST.form
  167: #schreibe in index.meta
  168:         self.bibDataSet=self.bibDataSets[form['referenceType']]
  169:         self.bibdata_type=form['referenceType']
  170: 
  171:         subnodes={}
  172:         subnodes['device']=form['device']
  173:         subnodes['image-type']=form['image-type']
  174:         subnodes['production-comment']=form['production-comment']
  175:         changeNodesInIndexMeta(self.REQUEST.SESSION['path'],"image-acquisition",subnodes)
  176: 
  177:         subnodes={}
  178:         subnodes['dpi']=form['dpi']
  179: 
  180:         
  181:         changeNodesInIndexMeta(self.REQUEST.SESSION['path'],"img",subnodes)
  182: 
  183: 
  184:         pt=PageTemplateFile('Products/OSA_system/inputBiblioMetadata.zpt').__of__(self)
  185:         return pt()
  186: 
  187:     def writeBiblioMetadata(self,bibdata_type,RESPONSE=None):
  188:         """Write all"""
  189:         #to do write metadata
  190: 
  191:         subnodes={}
  192:         form=self.REQUEST.form
  193:         #for key in form.keys():
  194:         #    subnodes[key]=form['device']
  195:         subnodes=form
  196:         del subnodes['bibdata_type'] #in form but not metadata
  197:         changeNodesInIndexMeta(self.REQUEST.SESSION['path'],"bib",subnodes,nodeAttributes={'type':bibdata_type},parent="meta")
  198:         #return self.REQUEST
  199:         return self.addRessourceMeta()
  200:         
  201: 
  202: 
  203:     
  204:         
  205:     
  206: 
  207: def manage_AddOSAS_metadataOrganizerForm(self):
  208:     """interface for adding the OSAS_root"""
  209:     pt=PageTemplateFile('Products/OSA_system/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/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/processViewerView.zpt').__of__(self)
  287:         return pt()
  288: 
  289:     def error(self):
  290:         """view errors"""
  291:         pt=PageTemplateFile('Products/OSA_system/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/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/archiveStatus.zpt').__of__(self)
  351:         return pt()
  352: 
  353:     def archive2(self):
  354:         pt=PageTemplateFile('Products/OSA_system/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/OSAS_Archiver.zpt').__of__(self)
  416:         return pt()
  417: 
  418:     def index_html(self):
  419:         """main page"""
  420:         pt=PageTemplateFile('Products/OSA_system/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/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/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/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/processViewerError.zpt').__of__(self)
  506:         return pt()
  507: 
  508:     
  509:     def archiveSelected(self):
  510:         """Archiviere ausgewaehlte files"""
  511:         pt=PageTemplateFile('Products/OSA_system/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/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/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/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/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>