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

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

Sundry modifications to browse to improve paging through
result sets and remove dependence on Marta's backend for
fulltext searching.

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