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

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

Interim commit to support common cache. At this point
it's implemented in retrieve (although not obviously
working in all cases).

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(self.uri,self.cf,logger=self.logger,format=self.format)
42       
43        if status:
44            #(the return object x is an xmlHandler object)
45            c.xml=x.tohtml()
46            return Response(c.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            #f=file('debug.xml','w')
92            #f.write(x.tohtml())
93            #f.close()
94            #g=file('debug2.xml','w')
95            #g.write(str(x))
96            #g.close()       
97        else: 
98            c.xml='<div class="error">%s</div>'%x
99            r='error'
100           
101        if status and 'ndgSec' in session:
102            #we can update the history
103            if 'history' not in session:
104                session['history']=[(name,uri),]
105            else:
106                rb=Utilities.RingBuffer(10)
107                for i in session['history']: rb.append(i)
108                #delete it first, so we get to the top of the queue.
109                if (name,uri) in rb: rb.remove((name,uri))
110                rb.append((name,uri))
111                session['history']=rb.tolist()
112            session.save()
113       
114        if r=='content':
115            #we're showing an xml document ... but it could go wrong if
116            #we have crap content ...
117            try:
118                resp=render_response(r)
119            except ExpatError,e:
120                c.xml='<p> XML content is not well formed </p>'
121                c.doc=str(x)
122                resp=render_response('error')
123        else:
124            resp=render_response(r)
125        return resp
126   
127    def askCorrect(self,uri):
128        ''' Provide a form (ajaxaciously) so that a user can correct a metadata record'''
129        status=self.__setup(uri)
130        c.uri=self.uri
131        if status: return Response(status)
132        return render_response('correct',fragment=True)
133
134   
135    def correct(self,uri):
136        ''' Receive a correction form to update a record and post it to the holder '''
137        status=self.__setup(uri)
138        if 'ndgSec' not in session:
139            return Response('Not Logged In')
140        body='Metadata Change Request for %s'%uri
141        payload='<Change><uri>%s</uri><from>%s</from><Contents>%s</Contents></Change>'%(
142            self.inputs['Identifier'],self.inputs['Submitter'],self.inputs['Comment'])
143        name='ChangeRequestFor_%s.xml'%uri
144        status,message=mailer.mailHandler([self.cf.get('DEFAULT','metadataMaintainer'),],
145                       body,body,xmlAttachments=[(payload,name),],
146                       server=self.cf.get('DEFAULT','mailserver'))
147        if status:
148            c.xml='<p>Success: Mail sent to metadata maintainer</p>'
149        else:
150            c.xml=message
151        return render_response('content')
152       
153
154    def __mytb(self,name):
155        ''' Get the trackback info for this page
156        (can't do it in Kid because it doesn't do substutions in comments) '''
157        s='''<!--
158        <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
159             xmlns:dc="http://purl.org/dc/elements/1.1/"
160             xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
161        <rdf:Description
162            rdf:about="%s"
163            dc:identifier="%s"
164            dc:title="%s"
165            trackback:ping="%s" />
166        </rdf:RDF>
167        -->'''%(self.uri,g.server+h.url_for(),name,g.server+h.url_for(controller="trackback"))
168        return s
Note: See TracBrowser for help on using the repository browser.