view harvestToPurl.py @ 36:be8640c08d99

Updatedri in harbestToPUrl ge?ndert. jetzt werden gegebenenfalls dris aus den index.meta gelesen und in die db geschrieben, falls sie noch nicht existieren. ausserdem wird in den daten isdri=TRUE gesetzt, wenn es ich bei der PURL um eine handelt die auf ein DRI in den index.meta verweist.
author dwinter
date Mon, 03 Mar 2014 17:32:06 +0100
parents 1b2d74f94ca8
children 6a0873a913c5
line wrap: on
line source

# -*- coding: utf-8 -*-
'''

Created on 31.10.2012

@author: dwinter

wesentlich hier ist: harvestIndexMeta
'''



import managePurls.manageIndexMetaPURLs as manageIndexMetaPURLs
import addDriToIndexMeta


import os
from os.path import join, getsize
import sys
import re
from lxml import etree

def harvestIndexMeta(path,user,delpath="",replacepath="", update=False):
    """
    Sucht in path und allen unterordnern nach index.meta dateien und schaut dann nach ob es dort schon ein index meta gibt. Wenn ja wird geschaut, ob die
    dort enthaltenenn dris mit denen Übereinstimmen, die in der Datenbank gespeichert sind.
    
    delpath ist ein optionaler Parameter, der angibt wird welcher Teil des Pfades in pfad aus dem Pfad zur Überprüfung gelöscht werden soll, d.h.
    angenommen path="/mpiwg/online/permanent" und delpath="/mpiwg/online" dann wird in der Datenbank nach Pfaden gesucht die mit /permanent beginnen.
    
    Ist replacepath gesetzt wird der mit delpath geloeschte Teil durch replacepath ersetzt, dh.h
    path="/Volumes/online_permanent/library" und delpath="/Volumes/online_permanent", replacepath="/permanent" ann wird in der Datenbank nach Pfaden gesucht die mit /permanent beginnen.
    
    
    Falls es keine DRI gibt, wird eine PURL in der Datenbank erzeugt. Diese wird NICHT in den index.meta gespeichert, dazu muss ein anderes Script "addDriToIndexMeta" aufgerufen werden!
    
    Falls es eine gibt und das update Flag gesetzt ist, wird die Dri aus den Index.meta in die Datenbank zu dem Pfad geschrieben.
    """
    md = manageIndexMetaPURLs.IndexMetaPURLManager()
    
    for root, dirs, files in os.walk(path):
    
    
        for name in files:
            if name.endswith(".meta"):
                fl=join(root, name)
                
                
                driIndexMeta=addDriToIndexMeta.getDRIfromIndexMeta(fl)
                
                imagePath=createImagePath(fl,root)
               
                imagePath=re.sub("^"+delpath,replacepath,imagePath)
              
                fl=re.sub("^"+delpath,replacepath,fl) #loesche den teil vom path der mir delpath beginnt
                
                
                
                val,purl = md.register(fl, True,  user=user,imagePath=imagePath,driIndexMeta=driIndexMeta,update=update)
                try:
                    if val==manageIndexMetaPURLs.ALREADY_EXISTS:
                        print "found %s -> %s"%(fl,purl)
                
                    elif val==manageIndexMetaPURLs.UPDATED:
                        print "updated %s -> %s"%(fl,purl)
                    else:
                        print "added %s -> %s"%(fl,purl)
                except:
                    print "cannot print: %s"%purl
                     
        if 'pageimg' in dirs:
            dirs.remove('pageimg')  # don't visit pageimf
        for dir in dirs:
            if  dir== "pageimg":
                dirs.remove('pageimg')
            if  dir.startswith("."):
                dirs.remove(dir)

            if  dir.startswith(":"):
                dirs.remove(dir)


# erzeugt einen imagepath wenn kein texttooltag existiert
def createImagePath(path,root):
    print "parsing: %s"%path
    try:
        tree= etree.parse(path)
    except:
        print "cannot parse %s"%path
        return ""

    #teste ob texttool tag, dann kein imagePath
    tt =tree.xpath('//texttool')
    if len(tt)>0:
        return ""

    
    #im anderen fall, heuristic
    
    imageFolders=["pageimg","pages"]
    
    for imageFolder in imageFolders:
        fl=join(root, imageFolder)
        if os.path.exists(fl): # gibt es einen der folder
            return fl
        
    return ""
            
    
    

if __name__ == '__main__':
    args = sys.argv[1:]
    if not (len(args)==2 or len(args)==3 or len(args)==4):
        print "USAGE: python harvestToPurl.py path user (optional)pathPrefixToDelete (optional)replacedeleted"
        sys.exit(2)
    path=args[0]
    user=args[1]
    
    delpath=""
    replacepath=""
    
    if len(args)==3:
        delpath=args[2]
    elif len(args)==4:
        delpath=args[2]
        replacepath=args[3]
       
        
    if not os.path.exists(path):
        print "ERROR: path %s does not exist!"%path
        sys.exit(2)
        
    harvestIndexMeta(path,user,delpath=delpath,replacepath=replacepath,update=True)