source: TI07-MOLES/trunk/PythonCode/wsgi/renderEntity.py @ 2278

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

Better handling of DIF parameters as currently reported by
mini-MOLES

RevLine 
[1905]1from htmlUtilities import *
[1958]2from renderService import *
[2278]3from renderParameters import *
[1905]4
5class renderEntity:
6   
7    def __init__(self,config=None):
8        self.config=config
9
10    def render(self,entity):
11        ''' Take an NDG metadata entity (D or B) and render to HTML on a standard pattern,
12        depends on all entities having the same attributes '''
13       
14        #this is NOT supposed to be the whole page ...
15       
16        #need to start by building the coverage information html
17        #follow by building the contact information
18        #then get the related datasets (if available)
19
20        if entity is None: return ''
21
22        #try:
23       
24        #except:
25        #       contentHTML=''
[1925]26       
[2260]27        if entity.metadataType in ['DC','MDIP']:
[1925]28            return entity.toHTML()
29       
[1905]30       
31        if entity.metadataType is 'stubB':
32                relatedHTML=renderRelated(entity)
33        else:
34                relatedHTML=''
35
[1958]36        if entity.metadataType=='dgDataEntity':
[1905]37                contentHTML=renderDataContent(entity)
38                relatedHTML=renderGranules(entity)+relatedHTML
39                serviceHTML=self.renderServices(entity)
[1958]40        elif entity.metadataType=='DIF':
[1905]41                contentHTML=renderDataContent(entity)
[2098]42                #relatedHTML=renderDataLinks(entity)+relatedHTML
[1905]43                serviceHTML=self.renderServices(entity)
44        else:
45                contentHTML=''
46                serviceHTML=self.renderServices(entity)
47               
48       
49        body=contentHTML+relatedHTML+serviceHTML
50        html='''
[1927]51                <DIV id="">
[1905]52                <p></p>
[1934]53                <span class="title">%s</span>
54                <DIV class="abstract">%s </DIV>
[1905]55                <p><br/></p>
56                %s
57        </DIV>'''%(entity.name,entity.abstract,body)
58        return html
59   
60       
61    def renderServices(self,entity):
62        '''Render information about services for a data entity '''
63        html='''<p><br/></p>
64                <table cellspacing="0" cellpadding="3" width=" 100%"border="0">
65                <tbody>
66                <tr><td class="lineHead" colspan="3">
67                <span class="headingO">Links and Services</span></td></tr>'''
[2098]68
[1958]69        s=renderService(self.config)
[1905]70        for item in entity.services:
[1958]71            html+='<tr><td>%s</td><td>%s</td></tr>'%(s.get(item),item.description)
[2097]72       
73        if entity.ndgObject is not None:
[2098]74            print 'Render says gettable is :', entity.ndgObject.gettable
[2118]75            xx=image(self.config.get('layout','Xicon'),'[X]')
76            pp=image(self.config.get('layout','printer'),'[Print]')
77            xicon1=hyperlink(xx,entity.ndgObject.xmlURL)
78            picon1=hyperlink(pp,entity.ndgObject.printableURL)
79            xicon2,picon2='',''
80            if entity.ndgObject.gettable: 
81                xicon2='(Original %s)'%hyperlink(xx,entity.ndgObject.xmlURL+'&original=1')
82                picon2='(Original %s)'%hyperlink(pp,entity.ndgObject.printableURL+'&original=1')
83            html+='<tr><td width="20%%">%s</td><td> Downloadable XML version of this record %s </td></tr>'%(xicon1,xicon2)
84            html+='<tr><td>%s</td><td> Viewable XML version of this record %s</td></tr>'%(picon1,picon2)
85            if entity.ndgObject.gettable:
86                html+='<tr><td></td><td>(Original records are the raw material harvested from data providers)</td></tr>'
87           
[2098]88        html+='</tbody></table>'
[1905]89        return html
90
91def renderDataContent(entity):
92        '''Parse a data entity for content information '''
93       
94        html=''
95        try:
96            if entity.constraints.exists:
97                html='<p>Access Control: %s</p>'%entity.constraints.html
98        except: pass
99       
100        html+='''
101        <table cellspacing="0" cellpadding="3" width="100%" border="0">
[1930]102                <tbody><tr><td class="lineHead" colspan="3">
103                          <span class="headingO">Dataset Detail</span></td></tr>'''
104               
105        #try:
[2104]106        #currently all entities are parsed for parameters ...
107        html+=showKeywordList(entity.parameters,'Parameter',tell=1)
[1927]108           
[1930]109        html+='''
[2097]110                <tr><td class="line">Spatial Coverage<br/></td>
[1930]111                    <td>%s</td></tr>'''%entity.bbox.toHTML()
[2104]112       
113        if entity.metadataType=='DIF': html+=showKeywordList(entity.paleoKeywords,'Location Keyword')
[1930]114   
115        html+='''
116            <tr><td class="line">Temporal Coverage<br/></td>
117                    <td>%s</td></tr>'''%entity.timeCoverage
[1905]118       
[1930]119        #except: pass
[1905]120       
121        html+='''
[1930]122                <tr><td class="line">Data Curator<br/></td>
123                        <td>%s</td></tr>'''%entity.curator.toHTML()
[1905]124               
125        for c in entity.creators:
126                html+='''
[1930]127                        <tr><td class="line">Data Creator<br/></td>
128                        <td>%s</td></tr>'''%c.toHTML()
[1905]129                       
130        html+='</tbody></table>'
131       
132        return html
133       
134
135#
136# Following classes specific to stub-B
137#
138def renderGranules(entity):
139        ''' Render information about data granules within a data entity '''
140        if len(entity.granules):
141                html='''<p><br/></p>
142                <table cellspacing="0" cellpadding="3" width="100%" border="0">
143                <tbody>
144                        <tr><td class="lineHead" colspan="3">
145                          <span class="headingO">Data Granules</span></td></tr>
146                        <tr class="lineHiLite">
[1930]147                          <td width="20%" colspan="2">Accessability</td><td>Link</td></tr>'''
[1905]148                for g in entity.granules:
149                        html+='<tr>'
150                        if g.constraints.exist:
151                                html+='<td width="20px"  class="key"></td><td>%s</td>'%g.constraints.html
152                        else:
153                           html+='<td>public</td><td></td>'
154                        html+='<td>%s (%s)</td></tr>'%(g.binding,g.binding.uri)
155                html+='</tbody></table>'
156                return html
157        else: return ''
158       
159def renderDataLinks(entity):
160    return 'some data link stuff'
[2104]161
162def showKeywordList(keywords,title,tell=0):
163    ''' Layout a list of keywords '''
164    html=''
165    if len(keywords)==0:
[2274]166            if tell: html+='''<tr><td class="line" width="20%%">%s</td>
167            <td> Unfortunately it appears that this record is not faithfully
168            translated in our system (either that, or it's morally invalid since all records should have
169            %s(s)). You can see the original record in xml by choosing the appropriate icon below.</td></tr> '''%(title,title)
[2104]170    else:
171        if len(keywords)==1: 
172            html+='''<tr><td class="line" width="20%%">%s</td><td>'''%title
173        else:
174            html+='''<tr><td class="line" width="20%%">%ss</td><td>'''%title
[2278]175           
176        #is it a list of DIF style parameter keywords? If so, let's format that especially
177        #and use the vocabulary server
178        if (title=='Parameter' and len(keywords[0].split('/'))==5):
179            html+=renderParameters(keywords)
180        else:
181            html+=keywords[0]
182            for item in keywords[1:]:
183                i=item.replace(' ','&nbsp;')
184                html+=',&nbsp;&nbsp; %s'%i
[2104]185        html+='</td></tr>'
186    return html
187           
[1905]188def renderRelated(entity):
189        ''' take a stub-b and create html for the related entities '''
190        if entity.related!=[]:
191                html='''<p><br/></p>
192                <table cellspacing="0" cellpadding="3" border="0" width="100%">
193                <tbody>
194                        <tr>
195                                <td class="lineHead" colspan="2"><span class="headingO">Related Entities</span></td>
196                        </tr>'''
197                       
198                for deployment in entity.related:
199                        #really ought to have a row for the deployment name ....
200                        for instance  in deployment[1]:
201                                label=instance[0]
202                                for link in instance[1]:
203                                        html+='<tr><td width="40%%"><b>%s</b></td><td width="60%%">%s</td></tr>'%(label,link)
204                html+='</tbody></table>'
205        else:
206                html=''
207        return html
208       
Note: See TracBrowser for help on using the repository browser.