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

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

Further tidy up of existing code: remove History, cart and selection templates
and remove leftPanel template function and its references. Also remove selection.py
and tabs.py and clear out any associated code.

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