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

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

Trackback bug fixes.

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        # it's kind of unfortunate that format=(xml,html) is what we expect in the
29        # url but at the retrieval level format is the schema ... oh well ...
30        self.format=''
31        if 'original' in self.inputs:
32            self.format={'0':'','1':'original'}[self.inputs['original']]
33        return 0
34       
35    def index(self,uri):
36        ''' Returns the document unadorned in anyway, i.e. the raw xml'''
37        status=self.__setup(uri)
38        if status:
39            c.xml='<p>%s</p>'%status
40            return render_response('error')
41        status,x=interface.GetXML(uri)
42       
43        if status:
44            #(the return object x is an xmlHandler object)
45            c.xml=x.xmls
46            return Response(c.xml,'application/xml')
47        else:
48            return Response(x) 
49       
50    def view(self,uri):
51        ''' Returns either an html marked up version of the xml, or a properly laid
52        out version of the document '''
53        c.doc=None
54        status=self.__setup(uri)
55        if status:
56            c.xml='<p>%s</p>'%status
57            return render_response('error')
58        status,x=interface.GetXML(uri)
59        c.title='Viewing [%s]'%self.uri
60       
61        if status:
62            #(the return object x is an xmlHandler object)
63            print self.uri.schema
64            if self.uri.schema=='NDG-B1':
65                r='stubB'
66                c.doc=stubB.stubB(x.tree,self.cf)
67                c.tbinfo=self.__mytb(c.doc.name)
68                name=c.doc.abbreviation
69            elif self.uri.schema=='NDG-A0':
70                r='csml'
71                name=self.uri.localID
72                if 'format' not in self.inputs: self.inputs['format']='xml'
73            elif self.uri.schema=='DIF':
74                r='dif'
75                c.doc=DIF.DIF(x.tree,et=1,ndgObj=self.uri)
76                name=c.doc.name
77                print c.doc.ndgObject
78            elif self.uri.schema=='NumSim':
79                r='numsim'
80                c.xmlh=x
81                c.tbinfo=self.__mytb('')
82                name=x.getText('NS_Model/NS_Name')
83            else:
84                c.xml=x.tohtml()
85                r='content'
86            if 'format' in self.inputs:
87                #override previous output choice if format is xml
88                if self.inputs['format']=='xml': 
89                    c.xml=x.tohtml()
90                    r='content'
91                    c.tab='Display'
92            #f=file('debug.xml','w')
93            #f.write(x.tohtml())
94            #f.close()
95            #g=file('debug2.xml','w')
96            #g.write(str(x))
97            #g.close()       
98        else: 
99            c.xml='<div class="error">%s</div>'%x
100            r='error'
101       
102        if status: 
103            needed=0
104            if 'lastViewed' not in session: needed=1
105            session['lastViewed']=h.current_url()
106            if needed: c.pageTabs.append(('Display',session['lastViewed']))
107       
108        if status and 'ndgSec' in session:
109            #we can update the history
110            if 'history' not in session:
111                session['history']=[(name,uri),]
112            else:
113                rb=Utilities.RingBuffer(10)
114                for i in session['history']: rb.append(i)
115                #delete it first, so we get to the top of the queue.
116                if (name,uri) in rb: rb.remove((name,uri))
117                rb.append((name,uri))
118                session['history']=rb.tolist()
119       
120        if status: session.save()
121       
122        if r=='content':
123            #we're showing an xml document ... but it could go wrong if
124            #we have crap content ...
125            try:
126                resp=render_response(r)
127            except ExpatError,e:
128                c.xml='<p> XML content is not well formed </p>'
129                c.doc=str(x)
130                resp=render_response('error')
131        else:
132            resp=render_response(r)
133        return resp
134   
135    def askCorrect(self,uri):
136        ''' Provide a form (ajaxaciously) so that a user can correct a metadata record'''
137        status=self.__setup(uri)
138        c.uri=self.uri
139        if status: return Response(status)
140        return render_response('correct',fragment=True)
141
142   
143    def correct(self,uri):
144        ''' Receive a correction form to update a record and post it to the holder '''
145        status=self.__setup(uri)
146        if 'ndgSec' not in session:
147            return Response('Not Logged In')
148        body='Metadata Change Request for %s'%uri
149        payload='<Change><uri>%s</uri><from>%s</from><Contents>%s</Contents></Change>'%(
150            self.inputs['Identifier'],self.inputs['Submitter'],self.inputs['Comment'])
151        name='ChangeRequestFor_%s.xml'%uri
152        status,message=mailer.mailHandler([self.cf.get('DEFAULT','metadataMaintainer'),],
153                       body,body,xmlAttachments=[(payload,name),],
154                       server=self.cf.get('DEFAULT','mailserver'))
155        if status:
156            c.xml='<p>Success: Mail sent to metadata maintainer</p>'
157        else:
158            c.xml=message
159        return render_response('content')
160       
161
162    def __mytb(self,name):
163        ''' Get the trackback info for this page
164        (can't do it in Kid because it doesn't do substutions in comments) '''
165        s='''<!--
166        <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
167             xmlns:dc="http://purl.org/dc/elements/1.1/"
168             xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
169        <rdf:Description
170            rdf:about="%s"
171            dc:identifier="%s"
172            dc:title="%s"
173            trackback:ping="%s" />
174        </rdf:RDF>
175        -->'''%(self.uri,g.server+h.url_for(),name,g.server+h.url_for(controller="trackback"))
176        return s
Note: See TracBrowser for help on using the repository browser.