Annotation of OSAS/OSA_system/OSAS_show.py, revision 1.13

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

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