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

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

Move vocabdata object into global variable to allow efficient re-use +
simplify some of the edit control logic + remove unused routings.

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
10import logging
11from ndgUtils.models.Atom import Atom
12from ndgUtils.vocabtermdata import VocabTermData as VTD
13
14class RetrieveController(BaseController):
15    ''' Provides the pylons controller for retrieving NDG documents. The simple model
16    is now that an attempt to retrieve/uri will parse the uri, read the config file,
17    and if the local server name is not the same as the uri server name. '''
18   
19    def __setup(self,uri):
20        ''' Common setup stuff for all the actions on this controller '''
21        logging.info("Setting up RetrieveController")
22        self.cf=request.environ['ndgConfig']
23        try:
24            self.uri=ndgObject(uri, config=self.cf.config)
25        except ValueError,e:
26            return e
27
28        self.inputs=dict(parse_querystring(request.environ))
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: 
35            self.format=self.inputs['format']
36        self.outputSchema=''
37        if 'outputSchema' in self.inputs: 
38            self.outputSchema=self.inputs['outputSchema']
39
40        # Add selected granules to context
41        #c.selectedGranules = [g_uri for g_uri, g_name in session.get('selection', [])]
42                             
43        logging.info("RetrieveController set up")
44        return 0
45       
46    def index(self,uri):
47        ''' Returns the document unadorned in anyway, i.e. the raw xml'''
48        status=self.__setup(uri)
49        if status:
50            c.xml='<p>%s</p>'%status
51            response.status_code = 400
52            return render('error')
53       
54        status,x=interface.GetXML(uri,outputSchema=self.outputSchema)
55        if status:
56            #(the return object x is an xmlHandler object)
57            c.xml=x.xmls
58            response.headers['Content-Type'] = 'application/xml'
59            response.write(c.xml)
60        else:
61            e=404
62            if x.startswith('<p> Access'): e=401
63            response.status_code = e
64            return render('error')
65
66    def viewDeployments(self, uri):
67        '''
68        Get the deployments data associated with the uri
69        @param uri: valid ndg uri
70        @return rendered genshi deployments template
71        '''
72        logging.info("Getting deployments data for '%s'" %uri)
73        status=self.__setup(uri)
74        if status:
75            c.xml='<p>%s</p>'%status
76            response.status_code = 400
77            return render('error')
78
79        status,x=interface.GetXML(uri,outputSchema=self.outputSchema)
80        c.xmlh=x
81        c.atom = Atom(xmlString=str(x), ndgObject = self.uri)
82           
83        try:
84            import time
85            time.sleep(5)
86            return render('genshi', 'deployments_data')
87       
88        except ExpatError, e:
89            c.xml='XML content is not well formed'
90            c.doc=str(x)
91            response.status_code = 400
92            logging.error("Error retrieving [%s] - XML content: %s" % (uri, e))
93            return render('error')
94
95        except Exception, e:
96            #we may be showing an xml document ... but it could go wrong if
97            #we have crap content ...
98            c.xml='Unexpected error [%s] viewing [%s]'%(str(e), uri)
99            c.doc=''
100            response.status_code = 400
101            logging.error(c.xml)
102            return render('error')
103
104       
105       
106    def view(self,uri):
107        ''' Returns either an html marked up version of the xml, or a properly laid
108        out version of the document '''
109        c.doc=None
110        status=self.__setup(uri)
111        if status:
112            c.xml='<p>%s</p>'%status
113            response.status_code = 400
114            return render('error')
115
116        logging.info("Retrieving document to view")
117        status,x=interface.GetXML(uri,outputSchema=self.outputSchema)
118        c.title='Viewing [%s]'%self.uri
119       
120        # NB, legacy code uses kid templates - newer stuff should use genshi
121        templateType = "kid"
122        if status:
123            logging.debug("Document retrieved ok - now processing results")
124            #(the return object x is an xmlHandler object)
125            viewFormat=self.uri.schema
126            if self.outputSchema!='': 
127                viewFormat=self.outputSchema
128
129            logging.debug("Doc format: %s, View format: %s" \
130                           %(self.format, viewFormat))
131
132            name=str(self.uri)
133            if self.format=='xml':
134                c.xml=x.tohtml()
135                renderTemplate = 'content'
136                c.tab='Details'
137
138            elif self.format=='raw':
139                c.xml=x.xmls
140                response.headers['Content-Type'] = 'application/xml'
141                return response.write(c.xml)
142               
143            elif viewFormat == ndgObject.ATOM_DOC_TYPE or \
144                viewFormat ==  ndgObject.ATOM_BACKUP_DOC_TYPE:
145                renderTemplate = 'atom_editor'
146                c.xmlh=x
147                c.atom = Atom(xmlString=str(x), ndgObject = self.uri)
148                c.r = info = self.__mytb('')
149                c.title = 'Viewing [%s]'%self.uri
150                c.deploymentsURL = h.url_for(controller='retrieve', \
151                                             action='viewDeployments', \
152                                             uri = self.uri)
153                templateType = "genshi"
154
155            elif viewFormat == ndgObject.MOLES_DOC_TYPE:
156                renderTemplate = 'stubB'
157                c.doc=stubB.stubB(x.tree,self.cf.config)
158                c.tbinfo=self.__mytb(c.doc.name)
159                name=c.doc.abbreviation
160               
161            elif viewFormat == ndgObject.NDGA0_DOC_TYPE:
162                #renderTemplate = 'csml'
163                renderTemplate = 'content'
164                name=self.uri.localID
165                #for now we'll handle as pretty print xml
166                c.xml=x.tohtml()
167                c.tab='Details'
168               
169            elif viewFormat == ndgObject.DIF_DOC_TYPE:
170                renderTemplate = 'dif'
171                c.doc=DIF.DIF(x.tree,et=1,ndgObj=self.uri)
172                name=c.doc.name
173               
174            elif viewFormat == ndgObject.NUMSIM_DOC_TYPE:
175                renderTemplate = 'numsim'
176                c.xmlh=x
177                c.r = info = self.__mytb('')
178                name=x.getText('NS_Name')
179                c.name=name
180               
181            else:
182                c.xml=x.tohtml()
183                renderTemplate = 'content'
184           
185            needed=0
186            if 'lastViewed' not in session: 
187                needed=1
188               
189            session['lastViewed']=h.current_url()
190            if needed: 
191                c.pageTabs.append(('Details',session['lastViewed']))
192           
193            session.save()
194            code=200
195        else:
196            renderTemplate = 'error'
197            if x.startswith('<p> Access Denied'):
198                code=401
199            else: code=400
200            c.xml='%s'%x
201            logging.error(x)
202           
203        response.status_code = code
204        try:
205            return render(templateType, renderTemplate)
206       
207        except ExpatError, e:
208            c.xml='XML content is not well formed'
209            c.doc=str(x)
210            response.status_code = 400
211            logging.error("Error retrieving [%s] - XML content: %s" % (uri, e))
212            return render('error')
213
214        except Exception, e:
215            #we may be showing an xml document ... but it could go wrong if
216            #we have crap content ...
217            c.xml='Unexpected error [%s] viewing [%s]'%(str(e), uri)
218            c.doc=''
219            response.status_code = 400
220            logging.error(c.xml)
221            return render('error')
222   
223    def askCorrect(self,uri):
224        ''' Provide a form (ajaxaciously) so that a user can correct a metadata record'''
225        status=self.__setup(uri)
226        c.uri=self.uri
227        if status: return response.write(status)
228        return render('correct',fragment=True)
229
230   
231    def correct(self,uri):
232        ''' Receive a correction form to update a record and post it to the holder '''
233        status=self.__setup(uri)
234        if 'ndgSec' not in session:
235            return response.write('Not Logged In')
236        body='Metadata Change Request for %s'%uri
237        payload='<Change><uri>%s</uri><from>%s</from><Contents>%s</Contents></Change>'%(
238            self.inputs['Identifier'],self.inputs['Submitter'],self.inputs['Comment'])
239        name='ChangeRequestFor_%s.xml'%uri
240        status,message=mailer.mailHandler([self.cf.get('DEFAULT','metadataMaintainer'),],
241                       body,body,xmlAttachments=[(payload,name),],
242                       server=self.cf.get('DEFAULT','mailserver'))
243        if status:
244            c.xml='<p>Success: Mail sent to metadata maintainer</p>'
245        else:
246            c.xml=message
247        return render('content')
248       
249
250    def __mytb(self,name):
251        ''' Get the trackback info for this page
252        (can't do it in Kid because it doesn't do substitutions in comments) '''
253        s='''<!--
254        <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
255             xmlns:dc="http://purl.org/dc/elements/1.1/"
256             xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
257        <rdf:Description
258            rdf:about="%s"
259            dc:identifier="%s"
260            dc:title="%s"
261            trackback:ping="%s" />
262        </rdf:RDF>
263        -->'''%(self.uri,g.server+h.url_for(),name,g.server+h.url_for(controller="trackback"))
264        return s
Note: See TracBrowser for help on using the repository browser.