source: TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/browseCGI.py @ 1006

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/browseCGI.py@1006
Revision 1006, 7.0 KB checked in by lawrence, 14 years ago (diff)

More discovery/browse convergence, starting support
for linking to services ...

  • Property svn:executable set to *
Line 
1#!/usr/bin/env python
2# CGI Script to support prototype NDG MOLES_Portal (Browse) functionality
3# Bryan Lawrence, April, 2006
4
5import cgi
6#import cgitb;ctitb.enable()
7
8import os
9import ElementTree as ET
10
11from insecure import *
12from secure import *
13from stubB import *
14
15from renderEntity import renderEntity
16from renderPage import renderPage
17from renderDiscoverySet import renderDiscoverySet
18from Utilities import *
19from ETxmlView import *
20from DiscoveryWS import *
21
22import Cookie
23
24class BrowseSession:
25       
26        ''' Holds the browse history and contact details for the NDG session manager, designed
27        to work with the discovery portal as well '''
28       
29        def __init__(self,cookie,config):
30               
31                '''Instantiate with an unsecured browse session (security only
32                required if a secure resource is the target) '''
33                self.config=config
34                self.rawCookie=cookie
35                self.cookie=Cookie.SimpleCookie(cookie)
36                self.history=RingBuffer(10)
37                self.__loadBrowseHistory()
38       
39        def __toXML(self):
40                ''' Used to serialise the history into a cookie string '''
41                xml='<BH>'
42                for uri,name in self.getHistory():
43                        xml+='<i><u>%s</u><n>%s</n></i>'%(uri,name)
44                xml+='</BH>'
45                return xml
46                               
47        def __loadBrowseHistory(self):
48                ''' get the string of URI values out of the cookie (if it's there)'''
49                try:
50                        self.tree=ET.fromstring(self.cookie['BrowseHistory'].value)
51                        for item in self.tree:
52                                self.addToHistory(item.find('u').text,item.find('n').text,ignore=True)
53                except:
54                        pass
55        def addToHistory(self,uri,name,ignore=False):
56                ''' Add a URI to the session history'''
57                if not ignore:
58                        current=self.getHistory()
59                        if (uri,name) not in current:
60                                self.history.append((uri,name))
61                else:
62                        self.history.append((uri,name))
63        def getHistory(self):
64                ''' Return a list of the items in the history '''
65                return self.history.tolist()
66        def makeCookie(self,ndgSec=None):
67                ''' Create a local cookie '''
68                import md5,time,base64
69                # start by creating a unique session id
70                m=md5.new()
71                m.update('this is a seed string')
72                m.update(str(time.time()))
73                cookie=Cookie.SimpleCookie()
74                cookie['session']=base64.encodestring(m.digest())[:-3].replace("/", "$")
75                cookie['BrowseHistory']=self.__toXML()
76                return cookie
77       
78class CGIcontroller:
79        ''' Currently holds the cgi environment and controls '''
80       
81        def __init__(self,config):
82                ''' Instantiate the CGI environment'''
83                self.env=os.environ
84                self.path=self.env.get('PATH_INFO','/')
85                self.FieldStorage=cgi.FieldStorage()
86                self.config=config
87                self.response=Response()
88                self.requestURL=self.env.get('SCRIPT_NAME')+'?'+self.env.get('QUERY_STRING')
89               
90       
91        def makeGateway(self,cookie=None,cmdLine=None):
92                ''' Make connection to NDG security '''
93                aa=self.config.get('security','localAA',None)
94                self.ndgGate=gateway2NDGsession(self.requestURL,aa,cookie=cookie,cmdLine=cmdLine)
95
96        def goforit(self):
97                ''' This method actually responds to the user'''
98               
99                self.ViewTextOnly,self.ViewXML=0,0
100               
101                #Instantiate the Session Environment
102                self.cookie=self.env.get('HTTP_COOKIE',None)
103                self.session=BrowseSession(self.cookie,self.config)
104                if self.config.logfile is not None: self.config.log(self.cookie)
105               
106                #this will do for the moment, although I'd rather the whole
107                #URI was self consistent ...
108               
109                #use name as an error return as well in the following calls ...
110                if self.FieldStorage.has_key('uri'):
111                        self.uri=self.FieldStorage['uri'].value
112                        content,name=self.__browse()
113                elif self.FieldStorage.has_key('search'):
114                        self.searchType=self.FieldStorage['search'].value
115                        content,name=self.__search()
116                else: 
117                        self.response.content=self.error('No valid URI')
118                       
119                if not self.ViewTextOnly:
120                    historyHTML='<p>'
121                    for item in self.session.getHistory():
122                        historyHTML+='<a href="%s">%s</a><br/>'%item
123                    historyHTML+='</p>'
124                    self.response.content=renderPage(
125                        content,historyHTML,historyHTML,name,self.config)
126                else:
127                    self.response.content=content
128                return self.response
129               
130        def __browse(self):
131                ''' Handle orthodox browsing '''
132               
133                if self.FieldStorage.has_key('text'):
134                    self.ViewTextOnly=1
135                elif self.FieldStorage.has_key('xml'):
136                    self.ViewXML=1
137               
138                if self.FieldStorage.has_key('ndgSec'):
139                    pass
140               
141                #this is where we invoke NDG security setup
142                self.makeGateway()
143               
144                #get the xml document
145                db=self.config.get('db','exist',None)
146                xml=insecureGetDoc(self.uri,db)
147               
148                #create stub-b instance
149                self.b=stubB(xml,makeHTML=renderEntity)
150               
151                if self.b.xml is None:
152                    content=self.error('Unable to obtain stub-B from database')
153                    return content,0
154                else:
155                    self.session.addToHistory(self.b.Burl,self.b.abbreviation)
156                    self.response.cookie=self.session.makeCookie()
157                    if  self.b.constraints.exist:
158                        # we need to evaluate them
159                        result=self.ndgGate.check(self.b.constraints.SimpleCondition)
160                        if result=='AccessGranted': 
161                            access=1
162                        else:
163                            access=0
164                    else:
165                        access=1
166                    if access:
167                        name=self.b.name
168                        if self.ViewTextOnly:
169                            self.response.contentType='text/plain'
170                            content=et2text(self.b.tree)
171                        elif self.ViewXML==1:
172                            content=et2html(self.b.tree)
173                        else:
174                            content=self.b.toHTML()
175                    else:
176                        name='NDG Browse'
177                        content=result
178
179                    return content,name
180               
181        def __search(self):
182            ''' Handle simple searching within the context of the browse '''
183            if self.FieldStorage.has_key('SEARCHSTRING'):
184                searchString=self.FieldStorage['SEARCHSTRING'].value
185                try:
186                    ws=DiscoveryWS()
187                except Exception, e:
188                    return self.error('<p>%s<br/>%s'%(e,'Unable to connect to Search BackEnd')),'Error'
189                ws.SearchFullText(searchString)
190                results=ws.GetResults(number=5)
191                difs=[]
192                for result in results:
193                    difs.append(xmlCleanup(result))
194                html=renderDiscoverySet(difs,summary=1,spatial=1,temporal=1,services=1)
195                title='Search for '+searchString
196                return html,title
197            else:
198                return self.error('No valid search option'),'Error'
199             
200        def error(self,message):
201                ''' Construct a nice formal response, but don't throw a 404 ... '''
202                return '<p>Error: %s</p>'%message
203               
Note: See TracBrowser for help on using the repository browser.