source: TI05-delivery/ows_framework/trunk/ows_server/ows_server/controllers/retrieve.py @ 2976

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI05-delivery/ows_framework/trunk/ows_server/ows_server/controllers/retrieve.py@2976
Revision 2976, 7.7 KB checked in by lawrence, 12 years ago (diff)

A whole raft of modifications

  • changing to the NERC icons
  • search support within Browse and NumSim
  • NumSim V10 support in viewing
  • older numsim docs will now not be found and displayed properly (which means a lot of updating is needed)
Line 
1
2from ows_server.lib.base import *
3from ows_server.models import ndgObject,  Utilities
4from paste.request import parse_querystring
5from ows_server.models import stubB,DIF
6from ows_server.lib import mailer
7from ows_server.lib.ndgInterface import interface
8from xml.parsers.expat import ExpatError
9#from ows_server.models import ndgRetrieve
10
11class RetrieveController(BaseController):
12    ''' Provides the pylons controller for retrieving NDG documents. The simple model
13    is now that an attempt to retrieve/uri will parse the uri, read the config file,
14    and if the local server name is not the same as the uri server name. '''
15   
16    def __setup(self,uri):
17        ''' Common setup stuff for all the actions on this controller '''
18        try:
19            self.uri=ndgObject.ndgObject(uri)
20        except ValueError,e:
21            return e
22        self.cf=request.environ['ndgConfig']
23        self.uri.setConfig(self.cf)
24        self.requestor=request.environ['REMOTE_ADDR']
25        self.logger=0
26        if logger: self.logger=logger
27        self.inputs=dict(parse_querystring(request.environ))
28        # NB: we could have two types of query string argument:
29        #   format= (raw,html) and
30        #   outputSchema=(original, someSchema)
31        self.format=''
32        if 'format' in self.inputs: self.format=self.inputs['format']
33        self.outputSchema=''
34        if 'outputSchema' in self.inputs: self.outputSchema=self.inputs['outputSchema']
35
36        # Add selected granules to context
37        c.selectedGranules = [g_uri for g_uri, g_name in session.get('selection', [])]
38                             
39
40        return 0
41       
42    def index(self,uri):
43        ''' Returns the document unadorned in anyway, i.e. the raw xml'''
44        status=self.__setup(uri)
45        if status:
46            c.xml='<p>%s</p>'%status
47            return Response(render('error'),code=400)
48       
49        status,x=interface.GetXML(uri,outputSchema=self.outputSchema)
50        if status:
51            #(the return object x is an xmlHandler object)
52            c.xml=x.xmls
53            return Response(c.xml,'application/xml')
54        else:
55            e=404
56            if x.startswith('<p> Access'): e=401
57            return Response(render('error'),code=e)
58       
59    def view(self,uri):
60        ''' Returns either an html marked up version of the xml, or a properly laid
61        out version of the document '''
62        c.doc=None
63        status=self.__setup(uri)
64        if status:
65            c.xml='<p>%s</p>'%status
66            return Response(render('error'),code=400)
67        status,x=interface.GetXML(uri,outputSchema=self.outputSchema)
68        c.title='Viewing [%s]'%self.uri
69       
70        if status:
71            #(the return object x is an xmlHandler object)
72            viewFormat=self.uri.schema
73            if self.outputSchema!='': viewFormat=self.outputSchema
74            if self.format not in ('xml','raw'):
75                if viewFormat=='NDG-B1':
76                    r='stubB'
77                    c.doc=stubB.stubB(x.tree,self.cf)
78                    c.tbinfo=self.__mytb(c.doc.name)
79                    name=c.doc.abbreviation
80                elif viewFormat=='NDG-A0':
81                    r='csml'
82                    name=self.uri.localID
83                    #for now we'll handle as pretty print xml
84                    c.xml=x.tohtml()
85                    r='content'
86                    c.tab='Display'
87                elif viewFormat=='DIF':
88                    r='dif'
89                    c.doc=DIF.DIF(x.tree,et=1,ndgObj=self.uri)
90                    name=c.doc.name
91                    print c.doc.ndgObject
92                elif viewFormat=='NumSim':
93                    r='numsim'
94                    c.xmlh=x
95                    c.tbinfo=self.__mytb('')
96                    name=x.getText('NS_Name')
97                    c.name=name
98                else:
99                    c.xml=x.tohtml()
100                    r='content'
101            else:
102                if self.format=='xml':
103                    c.xml=x.tohtml()
104                    r='content'
105                    c.tab='Display'
106                elif self.format=='raw':
107                    c.xml=x.xmls
108                    return Response(c.xml,'application/xml')
109           
110            needed=0
111            if 'lastViewed' not in session: needed=1
112            session['lastViewed']=h.current_url()
113            if needed: c.pageTabs.append(('Display',session['lastViewed']))
114           
115            if 'ndgSec' in session:
116                #we can update the history
117                if 'history' not in session:
118                    session['history']=[(name,uri),]
119                else:
120                    rb=Utilities.RingBuffer(10)
121                    for i in session['history']: rb.append(i)
122                    #delete it first, so we get to the top of the queue.
123                    if (name,uri) in rb: rb.remove((name,uri))
124                    rb.append((name,uri))
125                    session['history']=rb.tolist()
126            session.save()
127            code=200
128        else:
129            if x.startswith('<p> Access Denied'):
130                code=401
131            else: code=400
132            c.xml='<div class="error">%s</div>'%x
133            r='error'
134            print c.xml
135           
136        if r=='content':
137            #we're showing an xml document ... but it could go wrong if
138            #we have crap content ...
139            try:
140                resp=render(r)
141            except ExpatError,e:
142                c.xml='<p> XML content is not well formed </p>'
143                c.doc=str(x)
144                resp=render('error')
145                code=400
146            resp=Response(resp,code=code)
147        else:
148            #resp=Response(render(r),code=code)
149            try:
150                resp=Response(render(r),code=code)
151            except Exception,e:
152                c.xml='<p> Unexpected error [%s] viewing [%s] </p>'%(str(e),uri)
153                c.doc=''
154                code=400
155                resp=Response(render('error'),code=code)
156        return resp
157   
158    def askCorrect(self,uri):
159        ''' Provide a form (ajaxaciously) so that a user can correct a metadata record'''
160        status=self.__setup(uri)
161        c.uri=self.uri
162        if status: return Response(status)
163        return render_response('correct',fragment=True)
164
165   
166    def correct(self,uri):
167        ''' Receive a correction form to update a record and post it to the holder '''
168        status=self.__setup(uri)
169        if 'ndgSec' not in session:
170            return Response('Not Logged In')
171        body='Metadata Change Request for %s'%uri
172        payload='<Change><uri>%s</uri><from>%s</from><Contents>%s</Contents></Change>'%(
173            self.inputs['Identifier'],self.inputs['Submitter'],self.inputs['Comment'])
174        name='ChangeRequestFor_%s.xml'%uri
175        status,message=mailer.mailHandler([self.cf.get('DEFAULT','metadataMaintainer'),],
176                       body,body,xmlAttachments=[(payload,name),],
177                       server=self.cf.get('DEFAULT','mailserver'))
178        if status:
179            c.xml='<p>Success: Mail sent to metadata maintainer</p>'
180        else:
181            c.xml=message
182        return render_response('content')
183       
184
185    def __mytb(self,name):
186        ''' Get the trackback info for this page
187        (can't do it in Kid because it doesn't do substutions in comments) '''
188        s='''<!--
189        <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
190             xmlns:dc="http://purl.org/dc/elements/1.1/"
191             xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
192        <rdf:Description
193            rdf:about="%s"
194            dc:identifier="%s"
195            dc:title="%s"
196            trackback:ping="%s" />
197        </rdf:RDF>
198        -->'''%(self.uri,g.server+h.url_for(),name,g.server+h.url_for(controller="trackback"))
199        return s
Note: See TracBrowser for help on using the repository browser.