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

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

Improved error handling, including gross error mailing

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