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

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

Modifications to improve status of author information in DIF citation
group ...

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 multiple:
113                r=element.findall(xpathExpression)
114        else:
115                r=[element.find(xpathExpression),]
116        try:
117                rr=[i.text for i in r]
118        except:
119                rr=['',]
120        rr=map(none2txt,rr) 
121        if multiple: 
122                return rr
123        else: return rr[0] 
124
125def getURLdict(cgiFieldStorage):
126    ''' takes a cgi field storage object and converts it to a dictionary '''
127    result={}
128    for item in cgiFieldStorage:
129            result[item]=cgiFieldStorage[item].value
130    return result
131##
132### convert the followign two methods into one class that can handle
133## xml directly too if necessary
134##
135def DIFid2NDGid(string):
136    ''' takes a dif thing parses it and produces an ET ndg element id ...
137    and use this in dif ... '''
138    s=string.split(':')
139    try:
140        r='''<DIFid><schemeIdentifier>%s</schemeIdentifier>
141         <repositoryIdentifier>%s</repositoryIdentifier>
142         <localIdentifier>%s</localIdentifier></DIFid>'''%(s[1],s[0],s[2])
143        return ET.fromstring(r)
144    except:
145        r='''<DIFid><schemeIdentifier>DIF</schemeIdentifier>
146        <repositoryIdentifier>Unknown</repositoryIdentifier>
147        <localIdentifier>%s</localIdentifier></DIFid>'''%string
148        return ET.fromstring(r)
149
150def EnumerateString(string):
151    ''' Takes a string, and if it's got a number on the end, increments it,
152    otherwise adds a number on the end, used to differentiate strings which
153    would otherwise be identical '''
154    def addNum(matchObj):
155        s=matchObj.group()
156        return str(int(s)+1)
157    r=re.sub('\d+$',addNum,string)
158    if r==string: r=r+'1'
159    return r
160
161def dateParse(string,instruction):
162    ''' Simple date manipulations on a string, if it is understood ...
163       if instruction = YYYY, return the year '''
164    s=string.split('-')
165    if instruction=='YYYY':
166        if len(s)==3: # expecting year,mon,day or day,mon,year ...
167            if int(s[0])>int(s[2]): 
168                return s[0]
169            else:
170                return s[2]
171        else:
172            return string # unknown format as yet ...
173    else:
174        return 'unknown instruction to dateParse %s'%instruction
175       
176if __name__=="__main__":
177    s,t='abc12','def'
178    print s,EnumerateString(s),t,EnumerateString(t)
179   
Note: See TracBrowser for help on using the repository browser.