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

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

Fixes for ticket:722, changing to internal unicode (probably not complete),
with decode on the edge coming out ... fixes 722 but may have some
other problems now ...

Line 
1from htmlUtilities import *
2from renderService import *
3from renderParameters import *
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        if entity.metadataType in ['DC','MDIP']:
23            return entity.toHTML()
24        elif entity.metadataType == 'NDG-B1':
25                relatedHTML=renderRelated(entity)
26                contentHTML=renderDescription(entity.description)
27                if entity.stubBtype=='dgDataEntity':
28                    contentHTML+=renderDataContent(entity)
29                else:
30                    contentHTML=''
31                serviceHTML=self.renderServices(entity)
32        elif entity.metadataType=='DIF':
33                relatedHTML=''
34                contentHTML=renderDataContent(entity)
35                serviceHTML=self.renderServices(entity)
36        else:
37            contentHTML=''
38            serviceHTML=''
39            relatedHTML=''
40
41        #content and related are ordinary strings, service is unicode, and ought not be (ticket:722)
42        body=contentHTML+relatedHTML+serviceHTML
43       
44        if entity.citation<>'':
45            #cite='<table><tbody><tr><td>Citation&nbsp;</td><td>%s</td></tr></tbody></table>'%entity.citation
46            cite='<p>Citation<br/><span class="citation">%s</span></p>'%entity.citation
47        else: cite=''
48       
49        html=u'''
50                <DIV id="">
51                <p></p>
52                <span class="title">%s</span>
53                <DIV class="abstract">%s </DIV>
54                %s
55                <p><br/></p>
56                %s
57        </DIV>'''%(entity.name,entity.abstract,cite,body)
58
59        return html
60   
61       
62    def renderServices(self,entity):
63        '''Render information about services for a data entity '''
64        html='''<p><br/></p>
65                <table cellspacing="0" cellpadding="3" width=" 100%"border="0">
66                <tbody>
67                <tr><td class="lineHead" colspan="3">
68                <span class="headingO">Links and Services</span></td></tr>'''
69
70        s=renderService(self.config)
71        for item in entity.services:
72            html+='<tr><td>%s</td><td>%s</td></tr>'%(s.get(item))
73           
74        if entity.ndgObject is not None:
75            print 'Render says gettable is :', entity.ndgObject.gettable
76            xx=image(self.config.get('layout','Xicon'),'[X]')
77            pp=image(self.config.get('layout','printer'),'[Print]')
78            xicon1=hyperlink(xx,entity.ndgObject.xmlURL)
79            picon1=hyperlink(pp,entity.ndgObject.printableURL)
80            xicon2,picon2='',''
81            if entity.ndgObject.gettable: 
82                xicon2='(Original %s)'%hyperlink(xx,entity.ndgObject.xmlURL+'&original=1')
83                picon2='(Original %s)'%hyperlink(pp,entity.ndgObject.printableURL+'&original=1')
84            html+='<tr><td width="20%%">%s</td><td> Downloadable XML version of this record %s </td></tr>'%(xicon1,xicon2)
85            html+='<tr><td>%s</td><td> Viewable XML version of this record %s</td></tr>'%(picon1,picon2)
86            if entity.ndgObject.gettable:
87                html+='<tr><td></td><td>(Original records are the raw material harvested from data providers)</td></tr>'
88           
89        html+='</tbody></table>'
90       
91        return html
92           
93def renderDescription(description,abstract=0):
94    ''' Takes a dgMetadatadescription and describes it, with or without the abstract '''
95    html='<div class="dgMetadataDescription">'
96    if description.descriptionType in ['','text/plain']:
97        html+='<div class="description"><p>%s</p></div>'%description.description
98    elif description.description<>'':
99        html+='<div class="description">%s</div>'%description.description
100    if description.onlineRefs<>[]:
101        html+='<p>Simple Links:<ul>'
102        for l in description.onlineRefs:
103            html+='<li><a href="%s">%s</a></li>'%(l[1],l[0])
104        html+='</ul></p>'
105    html+='</dgMetadataDescription>'
106    return html
107
108def renderDataContent(entity):
109        '''Parse a data entity for content information '''
110       
111        html=''
112        try:
113            if entity.constraints.exists:
114                html='<p>Access Control: %s</p>'%entity.constraints.html
115        except: pass
116       
117        html+='''
118        <table cellspacing="0" cellpadding="3" width="100%" border="0">
119                <tbody><tr><td class="lineHead" colspan="3">
120                          <span class="headingO">Dataset Detail</span></td></tr>'''
121               
122        #try:
123        #currently all entities are parsed for parameters ...
124        html+=showKeywordList(entity.parameters,'Parameter',tell=1)
125           
126        html+='''
127                <tr><td class="line">Spatial Coverage<br/></td>
128                    <td>%s</td></tr>'''%entity.bbox.toHTML()
129       
130        if entity.metadataType=='DIF': 
131            html+=showKeywordList(entity.paleoKeywords,'Location Keyword')
132            html+=showKeywordList(entity.sensors,'Sensor')
133            html+=showKeywordList(entity.sources,'Source')
134   
135        html+='''
136            <tr><td class="line">Temporal Coverage<br/></td>
137                    <td>%s</td></tr>'''%entity.timeCoverage
138       
139        #except: pass
140       
141        html+='''
142                <tr><td class="line">Data Curator<br/></td>
143                        <td>%s</td></tr>'''%entity.curator.toHTML()
144               
145        for c in entity.creators:
146                html+='''
147                        <tr><td class="line">Data Creator<br/></td>
148                        <td>%s</td></tr>'''%c.toHTML()
149                       
150        if entity.personnel<>[]:
151            for p in entity.personnel:
152                html+='''<tr><td class="line">%s</td><td>%s</td></tr>'''%(
153                        p.core['role'],p.toHTML())               
154                       
155        html+='</tbody></table>'
156       
157        return html
158       
159
160#
161# Following classes specific to stub-B
162#
163def renderGranules(entity):
164        ''' Render information about data granules within a data entity '''
165        if len(entity.granules):
166                html='''<p><br/></p>
167                <table cellspacing="0" cellpadding="3" width="100%" border="0">
168                <tbody>
169                        <tr><td class="lineHead" colspan="3">
170                          <span class="headingO">Data Granules</span></td></tr>
171                        <tr class="lineHiLite">
172                          <td width="20%" colspan="2">Accessability</td><td>Link</td></tr>'''
173                for g in entity.granules:
174                        html+='<tr>'
175                        if g.constraints.exist:
176                                html+='<td width="20px"  class="key"></td><td>%s</td>'%g.constraints.html
177                        else:
178                           html+='<td>public</td><td></td>'
179                        html+='<td>%s (%s)</td></tr>'%(g.binding,g.binding.uri)
180                html+='</tbody></table>'
181                return html
182        else: return ''
183       
184def renderDataLinks(entity):
185    return 'some data link stuff'
186
187def showKeywordList(keywords,title,tell=0):
188    ''' Layout a list of keywords '''
189    html=''
190    if len(keywords)==0:
191            if tell: html+='''<tr><td class="line" width="20%%">%s</td>
192            <td> Unfortunately it appears that this record is not faithfully
193            translated in our system (either that, or it's morally invalid since all records should have
194            %s(s)). You can see the original record in xml by choosing the appropriate icon below.</td></tr> '''%(title,title)
195    else:
196        if len(keywords)==1: 
197            html+='''<tr><td class="line" width="20%%">%s</td><td>'''%title
198        else:
199            html+='''<tr><td class="line" width="20%%">%ss</td><td>'''%title
200           
201        #is it a list of DIF style parameter keywords? If so, let's format that especially
202        #and use the vocabulary server
203        if (title=='Parameter'):# and len(keywords[0].split('>'))==5):
204            html+=renderParameters(keywords)
205        else:
206            html+=keywords[0]
207            for item in keywords[1:]:
208                i=item.replace(' ','&nbsp;')
209                html+=',&nbsp;&nbsp; %s'%i
210        html+='</td></tr>'
211    return html
212           
213def renderRelated(entity):
214    ''' take a stub-b and create html for the related entities '''
215    html=''
216
217    if entity.related!=[]:
218        html='''<p><br/></p>'
219                <table cellspacing="0" cellpadding="3" border="0" width="100%">
220                <tbody>
221                <tr><td class="lineHead" colspan="3"><span class="headingO">Related Entities</span></td></tr>
222                '''
223        i=0
224        for deployment in entity.related:
225            #could use a name if we have one, but meanwhile we'll use a numeric ...
226            i+=1
227            d=str(i) 
228            for key in deployment.links:
229                for l in deployment.links[key]:
230                    b='<a href="%s">%s</a>'%(deployment.URL,d)
231                    a='<a href="%s">%s</a>'%(l.URL,l.name)
232                    html+='''<tr><td width="10%%">%s</td>
233                                <td width="30%%"><b>%s</b></td>
234                                    <td width="60%%">%s</td></tr>'''%(b,l.label,a)
235       
236        html+='</tbody></table>'
237    return html
238       
Note: See TracBrowser for help on using the repository browser.