source: TI07-MOLES/trunk/PythonCode/wsgi/renderDiscoverySet.py @ 1958

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI07-MOLES/trunk/PythonCode/wsgi/renderDiscoverySet.py@1958
Revision 1958, 5.2 KB checked in by lawrence, 13 years ago (diff)

Refactoring discovery wsgi for cleaner service binding. (Done, but
there will be implications for wsgi browse which may now be broken,
but I can't test it til the database is updated).

Line 
1from DiscoveryState import DiscoveryState
2from ndgSearch import ndgSearch
3from DIF import DIF
4from htmlUtilities import *
5from renderService import *
6
7def renderDiscoverySet(difSet,state,config,summary=0,services=0,spatial=0,temporal=0,
8    linkto='NDG_B_SERVICE',selector=None):
9    '''Takes a set of xml DIFS from a discovery search (difSet) and renders a
10    list of responses as a table, with layout depending on a set of keywords:
11            summary (boolean) - show the abstract,
12            services (boolean) - show the service list,
13            spatial (boolean) - show the bounding box,
14            temporal (boolean) - show the date range,
15            linkto (string) - clicking on the select widget should add the url for
16                              this service to the selected list
17     Note that state is a DiscoveryState instance containing the sessionID from the search,
18     and the offset, stride, and total number of results ...selector is a class for adding
19     particular datasets to a selection dataset (and cookie).
20     '''
21           
22    #
23    # List of methods which deal with the actual row content ...
24    #   
25   
26    def row(rowList,bgcolor='rbgWhite'):
27        h='<tr class="%s">'%bgcolor
28        for item in rowList:
29            if type(item)==type((1,2)):
30                h+='<td colspan="%s">%s</td>'%(item[1],item[0])
31            else:h+='<td>%s</td>'%item
32        h+='</tr>'
33        return h#span(h,bgcolor)
34
35    def spatialBox(elem):
36        return elem.bbox.toHTMLbox()
37     
38    def temporalRange(elem):
39        return ''
40   
41    def serviceList(d):
42        ll=span(' Links: ','ndgem')
43        ndg=0
44        serviceRenderer=renderService(config)
45        if d.binding is not None: ll+=serviceRenderer.get(d.binding)
46        for item in d.services:
47            ll+=', '
48            #s=0
49            if item.contentType == 'NDG_A_SERVICE': 
50                ndg+=1
51            elif item.contentType == 'NDG_B_SERVICE':
52                ndg+=1
53            ll+=serviceRenderer.get(item)
54       
55        if ndg<2: ndg=0
56        return ndg,ll
57
58   
59    # ##################################
60    # Actual html production follows
61    # ##################################
62   
63    # depending on keyword options, provide column headings
64    #
65   
66    columns=['Dataset',]   
67    if spatial: columns.append('Location')
68    if temporal: 
69        #two columns for temporal but put a column header across both columns
70        header='''<table><tbody><tr><td colspan="2" align="center">Time&nbsp;Coverage</td></tr><tr>
71        <td align="center">Start</td><td align="center"> End</td></tr></tbody></table>'''
72        columns.append((header,2))
73    html='<div class="ListOfResults"><table><tbody>'+row(columns,bgcolor="rbgBeige")
74   
75    # ok, now let's cycle through the hits
76    i=1
77    for item in difSet:
78        d=item # we used to do the diffing here ... but we don't anymore
79        bgc={1:'rbgWhite',-1:'rbgGrey'}[i]
80        i=-1*i
81       
82        if d.tree is None:
83            html+='<tr class="%s"><td colspan="%s"> Unparseable record </td></tr>'%(bgc,len(columns))
84        else:
85            ndg,slist=serviceList(d)
86            rlist=['',]
87            if summary:
88                if d.briefCitation is not None:
89                    rlist[0]='%s: %s'%(span('Citation','ndgem'),d.briefCitation)
90                else:
91                    rlist[0]='%s: %s'%(span('Title','ndgem'),abbreviate(d.name,60))
92                rlist[0]+='<br/>%s: %s'%(span('Summary','ndgem'),abbreviate(d.abstract,200))
93                if d.binding is not None: rlist[0]+=' '+hyperlink('(more)',d.binding.url)
94            rlist[0]+='<br/>%s: %s.'%(span('Repository','ndgem'),d.centre.toHTML())
95            if not summary and d.binding is not None:
96                rlist[0]+=' '+hyperlink('(more)',d.binding.url)
97            if services:rlist[0]+=slist
98            if ndg and selector !=None: 
99                rlist[0]+=',&nbsp;'+selector.target(d.entryID,name=d.abbreviation)
100            if spatial: rlist.append(spatialBox(d))
101            if temporal: 
102                rlist.append(htmlTime(d.timeCoverage[0]))
103                rlist.append(htmlTime(d.timeCoverage[1]))
104            html+=row(rlist,bgcolor=bgc)
105
106    html+='</tbody></table>'
107   
108    #now work out the links to step through a large result set
109    #html+='<p>Results %s to %s of %s'%(state.offset,min(state.offset+state.stride-1,state.hits),state.hits)
110    html+='<p>Results %s to %s of %s'%(state.offset,state.offset+len(difSet)-1,state.hits)
111    if state.stride < state.hits:
112        #1,10,21   11,20,21  21,21,21
113        if state.offset+state.stride-1<state.hits:
114            next1=state.offset+state.stride   #11,21
115            nextNum=min(state.stride,1+state.hits-next1) # 10,1
116            s1='Next %s'%nextNum
117            nexturl=state.geturl(offset=next1,stride=nextNum)
118            html+=', %s'%hyperlink(s1,nexturl)
119        if state.offset>1:
120            last1=max(1,state.offset-state.stride)
121            lastNum=min(state.stride,1+state.hits-last1)
122            if lastNum<min(20,state.hits): lastNum=20
123            l1='Last %s'%lastNum
124            lasturl=state.geturl(offset=last1,stride=lastNum)
125            html+=', %s'%hyperlink(l1,lasturl)
126    else:
127        html+='</p>'
128    html+='</div>'
129    return html
130
Note: See TracBrowser for help on using the repository browser.