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

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

Sundry modifications associated with the deployment on glue, and better
options for viewing and downloading the underlying xml records (not yet
complete)

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        #print item.entryID
79        d=item # we used to do the diffing here ... but we don't anymore
80        bgc={1:'rbgWhite',-1:'rbgGrey'}[i]
81        i=-1*i
82       
83        if d.tree is None:
84            html+='<tr class="%s"><td colspan="%s"> Unparseable record </td></tr>'%(bgc,len(columns))
85        else:
86            ndg,slist=serviceList(d)
87            rlist=['',]
88            if summary:
89                if d.briefCitation is not None:
90                    rlist[0]='%s: %s'%(span('Citation','ndgem'),d.briefCitation)
91                else:
92                    rlist[0]='%s: %s'%(span('Title','ndgem'),abbreviate(d.name,60))
93                rlist[0]+='<br/>%s: %s'%(span('Summary','ndgem'),abbreviate(d.abstract,200))
94                if d.binding is not None: rlist[0]+=' '+hyperlink('(more)',d.binding.url)
95            rlist[0]+='<br/>%s: %s.'%(span('Repository','ndgem'),d.centre.toHTML())
96            if not summary and d.binding is not None:
97                rlist[0]+=' '+hyperlink('(more)',d.binding.url)
98            if services:rlist[0]+=slist
99            if ndg and selector !=None: 
100                rlist[0]+=',&nbsp;'+selector.target(d.entryID,name=d.abbreviation)
101            if spatial: rlist.append(spatialBox(d))
102            if temporal: 
103                rlist.append(htmlTime(d.timeCoverage[0]))
104                rlist.append(htmlTime(d.timeCoverage[1]))
105            html+=row(rlist,bgcolor=bgc)
106
107    html+='</tbody></table>'
108   
109    #now work out the links to step through a large result set
110    #html+='<p>Results %s to %s of %s'%(state.offset,min(state.offset+state.stride-1,state.hits),state.hits)
111    html+='<p>Results %s to %s of %s'%(state.offset,state.offset+len(difSet)-1,state.hits)
112    if state.stride < state.hits:
113        #1,10,21   11,20,21  21,21,21
114        if state.offset+state.stride-1<state.hits:
115            next1=state.offset+state.stride   #11,21
116            nextNum=min(state.stride,1+state.hits-next1) # 10,1
117            s1='Next %s'%nextNum
118            nexturl=state.geturl(offset=next1,stride=nextNum)
119            html+=', %s'%hyperlink(s1,nexturl)
120        if state.offset>1:
121            last1=max(1,state.offset-state.stride)
122            lastNum=min(state.stride,1+state.hits-last1)
123            if lastNum<min(20,state.hits): lastNum=20
124            l1='Last %s'%lastNum
125            lasturl=state.geturl(offset=last1,stride=lastNum)
126            html+=', %s'%hyperlink(l1,lasturl)
127    else:
128        html+='</p>'
129    html+='</div>'
130    return html
131
Note: See TracBrowser for help on using the repository browser.