source: TI07-MOLES/trunk/PythonCode/browse/portal/cgi/browse/Utilities.py @ 1615

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI07-MOLES/trunk/PythonCode/browse/portal/cgi/browse/Utilities.py@1615
Revision 1615, 5.9 KB checked in by lawrence, 13 years ago (diff)

Modifications to discovery (and browse) to support ndgDoc as an interim
measure ...

Line 
1from collections import deque # python 2.4
2try: #python 2.5
3    from xml.etree import ElementTree as ET
4except:
5    import ElementTree as ET
6import ConfigParser
7import os
8import re
9import urllib
10
11class myConfig:
12        ''' Handle missing sections and variables in a config file a bit gracefully '''
13        def __init__(self,configfile):
14                self.config=ConfigParser.ConfigParser()
15                if not os.path.exists(configfile):
16                        raise 'No config file: %s'%configfile
17                self.config.read(configfile)
18                logfile=self.get('logging','debugLog',None)
19                self.logfile=None
20                if logfile is not None:
21                        self.logfile=open(logfile,'a')
22
23        def get(self,section,key,default=None):
24                try:
25                        return self.config.get(section,key)
26                except:
27                        return default
28       
29        def log(self,string):
30            ''' Log some debug information '''
31            if self.logfile is None: return
32            if string is not None:
33                self.logfile.write('%s\n'%string)
34            else:
35                self.logfile.write('empty log entry\n')
36               
37class Request:
38    ''' Holds the request URL etc '''
39    def __init__(self,env,cgi):
40        ''' Instantiates attributes:
41            env: the environment
42            URL: a url to recreate the request SANS any security info and selection arguments
43            variables: any arguments to the request ... '''
44        self.env=env
45        self.URL='http://%s:%s%s'%(env.get('SERVER_NAME'),env.get('SERVER_PORT'),
46                                   env.get('SCRIPT_NAME'))
47        self.baseURL=self.URL
48        try:
49             self.variables=getURLdict(cgi.FieldStorage())
50        except Exception,e:
51            self.variables={'Error':'<p> Error in Request, parseing url [%s]</p>'%self.URL}
52            return
53        self.URL=self.__rebuildURL()
54
55    def __rebuildURL(self):
56        ''' builds  a url from the cgi variables that are loaded '''
57        url=self.baseURL
58        try: 
59            #reconstruct the url carefully, to avoid the selector and any
60            #ndg security info if present ...
61            tmp={}
62            reject=['select','NDG-ID1','NDG-ID2']
63            for i in self.variables:
64                if i not in reject: tmp[i]=self.variables[i]
65            if tmp!={}: url+='?%s'%urllib.urlencode(tmp)
66        except Exception,e:
67            #raise e
68            self.variables={'Error':'<p> Error rebuilding URL from [%s] </p>'%url}
69        return url
70           
71    def modify(self,variables):
72        ''' Used to take a GET request url, and modify some of the variables and provide
73        a new modified GET '''
74        for var in variables:
75            self.variables[var]=variables[var]
76        return self.__rebuildURL()
77class Response:
78        ''' Holds all the parts of the response to an HTML get or post '''
79        def __init__(self,content='text/html'):
80                self.headers=[]
81                self.cookie=None
82                self.contentType=content
83                self.content=''
84        def write(self,out):
85                for name,value in self.headers:
86                        out.write("%s: %s\n"( name,value))
87                if self.cookie:
88                        out.write("%s\n"%self.cookie)
89                out.write("Content-type: %s\n"%self.contentType)
90                out.write("\n")
91                self.content=self.content.encode('utf-8')
92                out.write(self.content)
93
94class RingBuffer(deque):
95    #deque is a python 2.4 class!
96    #credit http://www.onlamp.com/pub/a/python/excerpt/pythonckbk_chap1/index1.html
97    def __init__(self, size_max):
98        deque.__init__(self)
99        self.size_max = size_max
100    def append(self, datum):
101        deque.append(self, datum)
102        if len(self) > self.size_max:
103            self.popleft( )
104    def tolist(self):
105        return list(self)
106
107def wrapGetText(element,xpathExpression,multiple=0):
108        ''' Wraps a call to ET to get a text object in an error handler '''
109        def none2txt(i):
110            if i is None: return ''
111            return i
112        if element is None:
113            if multiple:
114                 return ['',]
115            else: return ''
116        if multiple:
117                r=element.findall(xpathExpression)
118        else:
119                r=[element.find(xpathExpression),]
120        try:
121                rr=[i.text for i in r]
122        except:
123                rr=['',]
124        rr=map(none2txt,rr) 
125        if multiple: 
126                return rr
127        else: return rr[0] 
128
129def getURLdict(cgiFieldStorage):
130    ''' takes a cgi field storage object and converts it to a dictionary '''
131    result={}
132    for item in cgiFieldStorage:
133            result[item]=cgiFieldStorage[item].value
134    return result
135##
136### convert the followign two methods into one class that can handle
137## xml directly too if necessary
138##
139def DIFid2NDGid(string):
140    ''' takes a dif thing parses it and produces an ET ndg element id ...
141    and use this in dif ... '''
142    s=string.split(':')
143    try:
144        r='''<DIFid><schemeIdentifier>%s</schemeIdentifier>
145         <repositoryIdentifier>%s</repositoryIdentifier>
146         <localIdentifier>%s</localIdentifier></DIFid>'''%(s[1],s[0],s[2])
147        return ET.fromstring(r)
148    except:
149        r='''<DIFid><schemeIdentifier>DIF</schemeIdentifier>
150        <repositoryIdentifier>Unknown</repositoryIdentifier>
151        <localIdentifier>%s</localIdentifier></DIFid>'''%string
152        return ET.fromstring(r)
153
154def EnumerateString(string):
155    ''' Takes a string, and if it's got a number on the end, increments it,
156    otherwise adds a number on the end, used to differentiate strings which
157    would otherwise be identical '''
158    def addNum(matchObj):
159        s=matchObj.group()
160        return str(int(s)+1)
161    r=re.sub('\d+$',addNum,string)
162    if r==string: r=r+'1'
163    return r
164
165def dateParse(string,instruction):
166    ''' Simple date manipulations on a string, if it is understood ...
167       if instruction = YYYY, return the year '''
168    s=string.split('-')
169    if instruction=='YYYY':
170        if len(s)==3: # expecting year,mon,day or day,mon,year ...
171            if int(s[0])>int(s[2]): 
172                return s[0]
173            else:
174                return s[2]
175        else:
176            return string # unknown format as yet ...
177    else:
178        return 'unknown instruction to dateParse %s'%instruction
179       
180if __name__=="__main__":
181    s,t='abc12','def'
182    print s,EnumerateString(s),t,EnumerateString(t)
183   
Note: See TracBrowser for help on using the repository browser.