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

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

Browse now modified to use Matt's backend ...

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        #qs=env.get('QUERY_STRING')
49        #if qs!='': self.URL+='?'+qs
50        try: # some apache problems result in nasty errors ...
51            self.variables=getURLdict(cgi.FieldStorage())
52            #reconstruct the url carefully, to avoid the selector and any
53            #ndg security info if present ...
54            tmp={}
55            reject=['select','NDG-ID1','NDG-ID2']
56            for i in self.variables:
57                if i not in reject: tmp[i]=self.variables[i]
58            if tmp!={}: self.URL+='?%s'%urllib.urlencode(tmp)
59        except Exception,e:
60            #raise e
61            self.variables={'Error':'<p> Error in Request, parsing url [%s] </p>'%self.URL}
62
63class Response:
64        ''' Holds all the parts of the response to an HTML get or post '''
65        def __init__(self,content='text/html'):
66                self.headers=[]
67                self.cookie=None
68                self.contentType=content
69                self.content=''
70        def write(self,out):
71                for name,value in self.headers:
72                        out.write("%s: %s\n"( name,value))
73                if self.cookie:
74                        out.write("%s\n"%self.cookie)
75                out.write("Content-type: %s\n"%self.contentType)
76                out.write("\n")
77                self.content=self.content.encode('utf-8')
78                out.write(self.content)
79
80class RingBuffer(deque):
81    #deque is a python 2.4 class!
82    #credit http://www.onlamp.com/pub/a/python/excerpt/pythonckbk_chap1/index1.html
83    def __init__(self, size_max):
84        deque.__init__(self)
85        self.size_max = size_max
86    def append(self, datum):
87        deque.append(self, datum)
88        if len(self) > self.size_max:
89            self.popleft( )
90    def tolist(self):
91        return list(self)
92
93def wrapGetText(element,xpathExpression,multiple=0):
94        ''' Wraps a call to ET to get a text object in an error handler '''
95        def none2txt(i):
96            if i is None: return ''
97            return i
98        if multiple:
99                r=element.findall(xpathExpression)
100        else:
101                r=[element.find(xpathExpression),]
102        try:
103                rr=[i.text for i in r]
104        except:
105                rr=['',]
106        rr=map(none2txt,rr) 
107        if multiple: 
108                return rr
109        else: return rr[0] 
110
111def getURLdict(cgiFieldStorage):
112    ''' takes a cgi field storage object and converts it to a dictionary '''
113    result={}
114    for item in cgiFieldStorage:
115            result[item]=cgiFieldStorage[item].value
116    return result
117##
118### convert the followign two methods into one class that can handle
119## xml directly too if necessary
120##
121def DIFid2NDGid(string):
122    ''' takes a dif thing parses it and produces an ET ndg element id ...
123    and use this in dif ... '''
124    s=string.split(':')
125    try:
126        r='''<DIFid><schemeIdentifier>%s</schemeIdentifier>
127         <repositoryIdentifier>%s</repositoryIdentifier>
128         <localIdentifier>%s</localIdentifier></DIFid>'''%(s[1],s[0],s[2])
129        return ET.fromstring(r)
130    except:
131        r='''<DIFid><schemeIdentifier>DIF</schemeIdentifier>
132        <repositoryIdentifier>Unknown</repositoryIdentifier>
133        <localIdentifier>%s</localIdentifier></DIFid>'''%string
134        return ET.fromstring(r)
135
136def EnumerateString(string):
137    ''' Takes a string, and if it's got a number on the end, increments it,
138    otherwise adds a number on the end, used to differentiate strings which
139    would otherwise be identical '''
140    def addNum(matchObj):
141        s=matchObj.group()
142        return str(int(s)+1)
143    r=re.sub('\d+$',addNum,string)
144    if r==string: r=r+'1'
145    return r
146if __name__=="__main__":
147    s,t='abc12','def'
148    print s,EnumerateString(s),t,EnumerateString(t)
149   
Note: See TracBrowser for help on using the repository browser.