source: CMIP6dreqbuild/trunk/src/framework/dreqPy/makeTables.py @ 1302

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/framework/dreqPy/makeTables.py@1302
Revision 1302, 17.5 KB checked in by mjuckes, 10 months ago (diff)

minor fixes to get overviewTabs running in python3

Line 
1import collections, os, sys
2nt__charmeEnable = collections.namedtuple( 'charme', ['id','site'] )
3
4try:
5  import dreq
6  import vrev
7  import misc_utils
8  import rvgExtraTable
9  import volsum
10  import table_utils
11except:
12  import dreqPy.volsum as volsum
13  import dreqPy.dreq as dreq
14  import dreqPy.vrev as vrev
15  import dreqPy.misc_utils as misc_utils
16  import dreqPy.table_utils as table_utils
17  import dreqPy.rvgExtraTable as rvgExtraTable
18
19python2 = True
20if sys.version_info[0] == 3:
21  python2 = False
22  def cmp(x,y):
23    if x == y:
24      return 0
25    elif x > y:
26      return 1
27    else:
28      return -1
29
30setMlab = misc_utils.setMlab
31
32#priority       long name       units   comment         questions & notes       output variable name    standard name   unconfirmed or proposed standard name   unformatted units       cell_methods    valid min       valid max       mean absolute min       mean absolute max       positive        type    CMOR dimensions CMOR variable name      realm   frequency       cell_measures   flag_values     flag_meanings
33
34strkeys = [u'procNote', u'uid', u'odims', u'flag_meanings', u'prov', u'title', u'tmid', u'label', u'cell_methods', u'coords', u'cell_measures', u'spid', u'flag_values', u'description']
35
36ntstr = collections.namedtuple( 'ntstr', strkeys )
37
38class cmpd(object):
39  def __init__(self,k):
40    self.k = k
41  def cmp(self,x,y):
42    return cmp( x.__dict__[self.k], y.__dict__[self.k] )
43
44class cmpd2(object):
45  def __init__(self,k1,k2):
46    self.k1 = k1
47    self.k2 = k2
48  def cmp(self,x,y):
49    if x.__dict__[self.k1] == y.__dict__[self.k1]:
50      return cmp( x.__dict__[self.k2], y.__dict__[self.k2] )
51    else:
52      return cmp( x.__dict__[self.k1], y.__dict__[self.k1] )
53
54class cmpdn(object):
55  def __init__(self,kl):
56    self.kl = kl
57  def cmp(self,x,y):
58    for k in self.kl:
59      if x.__dict__[k] != y.__dict__[k]:
60        return cmp( x.__dict__[k], y.__dict__[k] )
61   
62    return cmp( 0,0 )
63
64import re
65
66class makePurl(object):
67  def __init__(self,dq):
68    c1 = re.compile( '^[a-zA-Z][a-zA-Z0-9]*$' )
69    mv = dq.coll['var'].items
70    oo = open( 'htmlRewrite.txt', 'w' )
71    for v in mv:
72      if c1.match( v.label ):
73         oo.write( 'RewriteRule ^%s$ http://clipc-services.ceda.ac.uk/dreq/u/%s.html\n' % (v.label,v.uid) )
74      else:
75         print ('Match failed: %s' % v.label )
76    oo.close()
77     
78
79hdr = """
80function f000(value) { return (value + "").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;") };
81
82function formatter00(row, cell, value, columnDef, dataContext) {
83        var vv = value.split(" ");
84        return '<b><a href="u/' + vv[1] + '.html">' + (vv[0] + " ").replace(/&/g,"&amp;") + '</a></b>, ';
85    };
86function formatter01(row, cell, value, columnDef, dataContext) { return '<i>' + f000(value) + '</i> ' };
87function formatter02(row, cell, value, columnDef, dataContext) { return '[' + f000(value) + '] ' };
88function formatter03(row, cell, value, columnDef, dataContext) { if (value != "'unset'"  ) { return '(' + f000(value) + ') ' } else {return ''} };
89function formatter04(row, cell, value, columnDef, dataContext) { return '{' + f000(value) + '} ' };
90function formatter05(row, cell, value, columnDef, dataContext) { return '&lt;' + f000(value) + '&gt; ' };
91
92var getData  = {
93cols: function() {
94  var columns = [ {id:0, name:'Variable', field:0, width: 100, formatter:formatter00 },
95              {id:1, name:'Standard name', field:1, width: 210, formatter:formatter01 },
96              {id:2, name:'Long name', field:2, width: 180, formatter:formatter02},
97              {id:3, name:'Units', field:3, width: 180, formatter:formatter03},
98              {id:4, name:'Description', field:4, width: 180, formatter:formatter04},
99              {id:5, name:'uid', field:5, width: 180, formatter:formatter05}];
100 return columns;
101},
102
103data: function() {
104var data = [];
105"""
106ftr = """return data;
107}
108};
109"""
110##rtmpl = 'data[%(n)s] = { "id":%(n)s, 0:"%(var)s",  1:"%(sn)s", 2:"%(ln)s", 3:"%(u)s", 4:"%(uid)s" };'
111rtmpl = 'data[%(n)s] = { "id":%(n)s, 0:"%(var)s",  1:"%(sn)s", 2:"%(ln)s", 3:"%(u)s", 4:"%(d)s", 5:"%(uid)s" };'
112
113class htmlTrees(object):
114  def __init__(self,dq,odir='html/t/'):
115    self.dq = dq
116    self.odir = odir
117    self.c = vrev.checkVar( dq )
118    self.anno = {}
119    for v in dq.coll['var'].items:
120      self.makeTree( v )
121   
122  def makeTree( self, v ):
123    ee = self.c.chk2( v.label )
124    if len(ee.keys()) > 0:
125      title = 'Usage tree for %s' % v.label
126      bdy = ['<h1>%s</h1>' % title, ]
127      bdy.append( '<html><head></head><body>\n' )
128      bdy.append( '<ul>\n' )
129      for k in sorted( ee.keys() ):
130        l1, xx = ee[k]
131        lx = list( xx )
132        if len( lx ) == 0:
133          bdy.append( '<li>%s: Empty</li>\n' % l1 )
134        else:
135          bdy.append( '<li>%s:\n<ul>' % l1 )
136          for x in lx:
137            bdy.append( '<li>%s</li>\n' % x )
138          bdy.append( '</ul></li>\n' )
139      bdy.append( '</ul></body></html>\n' )
140      oo = open( '%s/%s.html' % (self.odir,v.label), 'w' )
141      oo.write( self.dq.pageTmpl % ( title, '', '../', '../index.html', '\n'.join( bdy ) ) )
142      oo.close()
143      self.anno[v.label] = '<a href="../t/%s.html">Usage</a>' % v.label
144    else:
145      self.anno[v.label] = 'Unused'
146       
147
148class makeJs(object):
149  def __init__(self,dq):
150    n = 0
151    rl = []
152    for v in dq.coll['var'].items:
153      if 'CMORvar' in dq.inx.iref_by_sect[v.uid].a and len(dq.inx.iref_by_sect[v.uid].a['CMORvar'] ) > 0:
154        var = '%s %s' % (v.label,v.uid)
155        sn = v.sn
156        ln = v.title
157        u = v.units
158        d = v.description
159        uid = v.uid
160        d = locals()
161        for k in ['sn','ln','u','var','d']:
162   
163          if  d[k].find( '"' ) != -1:
164            print ( "WARNING ... quote in %s .. %s [%s]" % (k,var,d[k]) )
165            d[k] =  d[k].replace( '"', "'" )
166            print ( d[k] )
167       
168        rr = rtmpl % d
169        rl.append( rr )
170        n += 1
171    oo = open( 'data3.js', 'w' )
172    oo.write( hdr )
173    for r in rl:
174      oo.write( r + '\n' )
175    oo.write( ftr )
176    oo.close()
177
178class styles(object):
179  def __init__(self):
180    pass
181
182  def rqvLink01(self,targ,frm='',ann=''):
183    if targ._h.label == 'remarks':
184      return '<li>%s: %s</li>' % ( targ.__href__(odir='../u/', label=targ.title), "Link to request variable broken"  )
185    elif frm != "CMORvar":
186      cmv = targ._inx.uid[ targ.vid ]
187      if targ._h.label == 'remarks':
188        return '<li>%s [%s]: %s</li>' % ( cmv.label, targ.__href__(odir='../u/',label=targ.priority) , 'Variable not defined or not found'  )
189      else:
190        ng = len( targ._inx.iref_by_sect[cmv.uid].a['requestVar'] )
191        try:
192          nv = len( targ._inx.iref_by_sect[cmv.vid].a['CMORvar'] )
193        except:
194          print ( 'FAILED: %s' % cmv.uid )
195          raise
196        return '<li>%s.%s [%s]: %s {groups: %s, vars: %s}</li>' % ( cmv.label,cmv.mipTable, targ.__href__(odir='../u/',label=targ.priority) , cmv.__href__(odir='../u/',label=cmv.title), ng, nv  )
197    else:
198      rg = targ._inx.uid[ targ.vgid ]
199      if targ._h.label == 'remarks':
200        return '<li>%s [%s]: %s</li>' % ( targ.label, targ.__href__(label=targ.priority) , 'Link not defined or not found'  )
201      elif rg._h.label == 'remarks':
202        return '<li>%s [%s]: %s</li>' % ( rg.label, targ.__href__(label=targ.priority) , 'Group not defined or not found'  )
203      else:
204        return '<li>%s [%s]: %s</li>' % ( rg.label, targ.__href__(label=targ.priority) , rg.__href__(label=rg.mip)  )
205
206  def snLink01(self,a,targ,frm='',ann=''):
207    if targ._h.label == 'remarks':
208      return '<li>%s: Standard name under review [%s]</li>' % ( a, targ.__href__() )
209    else:
210      return '<li>%s [%s]: %s</li>' % ( targ._h.title, a, targ.__href__(label=targ.label)  )
211
212  def stidLink01(self,a,targ,frm='',ann=''):
213    if targ._h.label == 'remarks':
214      return '<li>%s: Broken link to structure  [%s]</li>' % ( a, targ.__href__() )
215    else:
216      return '<li>%s [%s]: %s [%s]</li>' % ( targ._h.title, a, targ.__href__(label=targ.title), targ.label  )
217
218  def baseLink01(self,targ,frm='',ann=''):
219    if targ._h.label == 'remarks':
220      return '<li>Broken link [%s]</li>' % ( targ.__href__() )
221    else:
222      return '<li>%s: %s</li>' % ( targ.label, targ.__href__(odir='../u/',label=targ.title)  )
223
224  def rqlLink02(self,targ,frm='',ann=''):
225    t2 = targ._inx.uid[targ.refid]
226    if t2._h.label == 'remarks':
227      return '<li>%s: %s</li>' % ( targ.__href__(odir='../u/', label=targ.title), "Link to variable group broken"  )
228    elif frm == "requestVarGroup":
229      return '<li>%s: %s [%s]</li>' % ( targ.__href__(odir='../u/', label=targ.mip), targ.title, targ.objective  )
230    else:
231      gpsz = len(t2._inx.iref_by_sect[t2.uid].a['requestVar'])
232      return '<li>%s: Link to group: %s [%s]</li>' % ( targ.__href__(odir='../u/', label='%s:%s' % (targ.mip,targ.title)), t2.__href__(odir='../u/', label=t2.title), gpsz  )
233
234  def rqiLink02(self,targ,frm='',ann=''):
235    t2 = targ._inx.uid[targ.rlid]
236    if t2._h.label == 'remarks':
237      return '<li>%s: %s</li>' % ( targ.__href__(odir='../u/', label=targ.title), "Link to request link broken"  )
238    else:
239      try:
240        t3 = t2._inx.uid[t2.refid]
241      except:
242        print ( [t2.uid, t2.__dict__] )
243        raise
244      if t3._h.label == 'remarks':
245        return '<li>%s [%s]: %s</li>' % ( targ.__href__(odir='../u/', label=targ.title), t2.__href__(odir='../u/', label=t2.title),"Link to request group broken"  )
246      else:
247        nv = len( t3._inx.iref_by_sect[t3.uid].a['requestVar'] )
248        return '<li>%s [%s]: %s (%s variables)</li>' % ( targ.__href__(odir='../u/', label=targ.title), t2.__href__(odir='../u/', label=t2.title), t3.__href__(odir='../u/', label=t3.title), nv )
249
250  def snLink(self,targ,frm='',ann=''):
251    return '<li>%s [%s]: %s</li>' % ( targ.title, targ.units, targ.__href__(odir='../u/') )
252
253  def varLink(self,targ,frm='',ann=''):
254    return '<li>%s: %s [%s]%s</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title, targ.units, ann )
255
256  def mipLink(self,targ,frm='',ann=''):
257    if targ.url != '':
258      return '<li>%s: %s <a href="%s">[project site]</a></li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title, targ.url )
259    else:
260      return '<li>%s: %s</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title )
261
262  def cmvLink(self,targ,frm='',ann=''):
263    t2 = targ._inx.uid[targ.stid]
264    if 'requestVar' in targ._inx.iref_by_sect[targ.uid].a:
265      nrq = len( targ._inx.iref_by_sect[targ.uid].a['requestVar'] )
266    else:
267      nrq = 'unused'
268    return '<li>%s {%s}: %s [%s: %s] (%s)</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.mipTable, targ.title, targ.frequency, t2.title, nrq )
269
270  def objLink(self,targ,frm='',ann=''):
271    return '<li>%s [%s]: %s</li>' % (  targ.label, targ.mip, targ.__href__(odir='../u/', label=targ.title,title=targ.description) )
272
273  def unitLink(self,targ,frm='',ann=''):
274    return '<li>%s [%s]: %s</li>' % (  targ.text, targ.label, targ.__href__(odir='../u/', label=targ.title) )
275
276  def strLink(self,targ,frm='',ann=''):
277    sz0 = len(targ._inx.iref_by_sect[targ.uid].a['CMORvar'])
278    sz1 = 0
279    if sz0 > 0:
280      for u in targ._inx.iref_by_sect[targ.uid].a['CMORvar']:
281        sz1 += len( targ._inx.iref_by_sect[u].a['requestVar'] )
282    return '<li>%s: %s [%s/%s]</li>' % (  targ.label, targ.__href__(odir='../u/', label=targ.title), sz0, sz1 )
283
284  def remarkLink(self,targ,frm='',ann=''):
285    if 'tid' in targ.__dict__ and targ.tid in targ._inx.uid:
286      ii = targ._inx.uid[ targ.tid ]
287      return '<li>%s.%s [%s]: %s</li>' % (  ii._h.label, targ.tattr, ii.label, targ.__href__(odir='../u/', label=targ.uid) )
288    else:
289      return '<li>%s [%s]: %s</li>' % (  targ.label, targ.tattr, targ.__href__(odir='../u/', label=targ.uid) )
290
291  def cmLink(self,targ,frm='',ann=''):
292    sz0 = len(targ._inx.iref_by_sect[targ.uid].a['structure'])
293    sz1 = 0
294    if sz0 > 0:
295      for id in targ._inx.iref_by_sect[targ.uid].a['structure']:
296        sz1 += len(targ._inx.iref_by_sect[id].a['CMORvar'])
297    return '<li>%s [%s]: %s {%s/%s}</li>' % (  targ.cell_methods,targ.label, targ.__href__(odir='../u/', label=targ.title),sz0,sz1 )
298
299  def objLnkLink(self,targ,frm='',ann=''):
300    lab1 = targ.title
301    if lab1 == '':
302        lab1 = targ.label
303
304    if frm == 'objective':
305      t2 = targ._inx.uid[targ.rid]
306      t3 = targ._inx.uid[t2.refid]
307      thislab = '%s (%s)' % (t2.mip,t3.label)
308      ##return '<li>%s: %s</li>' % (  t2.title, t2.__href__(odir='../u/',label=thislab) )
309      return '<li>%s: %s</li>' % (  targ.__href__(odir='../u/',label=lab1), t2.__href__(odir='../u/',label=thislab, title=t2.title) )
310    else:
311      t2 = targ._inx.uid[targ.oid]
312      return '<li>%s: %s</li>' % (  targ.__href__(odir='../u/',label=lab1), t2.__href__(odir='../u/',label=t2.label, title=t2.title) )
313
314  def labTtl(self,targ,frm='',ann=''):
315    return '<li>%s: %s</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title )
316
317  def vgrpLink(self,targ,frm='',ann=''):
318    gpsz = len(targ._inx.iref_by_sect[targ.uid].a['requestVar'])
319    nlnk = len(targ._inx.iref_by_sect[targ.uid].a['requestLink'])
320    return '<li>%s {%s}: %s variables, %s request links</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.mip, gpsz, nlnk )
321
322  def miptableLink(self,targ,frm='',ann=''):
323    sz = len(targ._inx.iref_by_sect[targ.uid].a['CMORvar'])
324    return '<li>%s:%s [%s] (%s variables)</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title, targ.frequency, sz )
325
326def obsolete_getTable(sc,m,m2,pmax,odsz,npy,odir='d1',txt=False,xls=False,txtOpts=None):
327     """replaces tables.getTable( self, m,m2,pmax,odsz,npy)"""
328##
329## this creates a new instance, and calls doTable ....
330## very messy ...
331##
332     vs = volsum.vsum( sc, odsz, npy, table_utils.makeTab, tables )
333     mlab = setMlab( m )
334     vs.run( m, 'requestVol_%s_%s_%s' % (mlab,sc.tierMax,pmax), pmax=pmax )
335
336
337## collected=summed volumes by table for first page.
338     table_utils.makeTab( sc.dq, subset=vs.thiscmvset, dest='%s/%s-%s_%s_%s' % (odir,mlab,mlab2,sc.tierMax,pmax), collected=collector[kkc].a,
339              mcfgNote=sc.mcfgNote,
340              txt=doTxt, xls=doXls, txtOpts=txtOpts )
341
342styls = styles()
343
344htmlStyle = {}
345htmlStyle['CMORvar'] = {'getIrefs':['__all__']}
346htmlStyle['requestVarGroup'] = {'getIrefs':['requestVar','requestLink']}
347htmlStyle['var'] = {'getIrefs':['CMORvar']}
348htmlStyle['objective'] = {'getIrefs':['objectiveLink']}
349htmlStyle['requestLink'] = {'getIrefs':['objectiveLink','requestItem']}
350htmlStyle['exptgroup'] = {'getIrefs':['__all__']}
351htmlStyle['requestItem'] = {'getIrefs':['__all__']}
352htmlStyle['experiment'] = {'getIrefs':['__all__']}
353htmlStyle['mip'] = {'getIrefs':['__all__']}
354htmlStyle['miptable'] = {'getIrefs':['__all__']}
355htmlStyle['remarks'] = {'getIrefs':['__all__']}
356htmlStyle['grids'] = {'getIrefs':['__all__']}
357htmlStyle['varChoice'] = {'getIrefs':['__all__']}
358htmlStyle['spatialShape'] = {'getIrefs':['__all__']}
359htmlStyle['temporalShape'] = {'getIrefs':['__all__']}
360htmlStyle['structure']    = {'getIrefs':['__all__']}
361htmlStyle['cellMethods']  = {'getIrefs':['__all__']}
362htmlStyle['standardname'] = {'getIrefs':['__all__']}
363htmlStyle['varRelations'] = {'getIrefs':['__all__']}
364htmlStyle['varRelLnk']    = {'getIrefs':['__all__']}
365htmlStyle['units']        = {'getIrefs':['__all__']}
366htmlStyle['timeSlice']    = {'getIrefs':['__all__']}
367
368def run():
369  try:
370    import makeTables
371    import scope
372  except:
373    import dreqPy.scope as scope
374    import dreqPy.makeTables as makeTables
375
376  assert os.path.isdir( 'html' ), 'Before running this script you need to create "html", "html/index" and "html/u" sub-directories, or edit the call to dq.makeHtml'
377  assert os.path.isdir( 'html/u' ), 'Before running this script you need to create "html", "html/index" and "html/u" sub-directories, or edit the call to dq.makeHtml, and refernces to "u" in style lines below'
378  assert os.path.isdir( 'html/index' ), 'Before running this script you need to create "html", "html/index" and "html/u" sub-directories, or edit the call to dq.makeHtml, and refernces to "u" in style lines below'
379  assert os.path.isdir( 'tables' ), 'Before running this script you need to create a "tables" sub-directory, or edit the table_utils.makeTab class'
380
381  dq = dreq.loadDreq( htmlStyles=htmlStyle, manifest='out/dreqManifest.txt' )
382##
383## add special styles to dq object "itemStyle" dictionary.
384##
385  dq.itemStyles['standardname'] = styls.snLink
386  dq.itemStyles['var'] = styls.varLink
387  dq.itemStyles['mip'] = styls.mipLink
388  dq.itemStyles['CMORvar'] = styls.cmvLink
389  dq.itemStyles['objective'] = styls.objLink
390  dq.itemStyles['units'] = styls.unitLink
391  dq.itemStyles['structure'] = styls.strLink
392  dq.itemStyles['cellMethods'] = styls.cmLink
393  dq.itemStyles['remarks'] = styls.remarkLink
394  dq.itemStyles['exptgroup'] = styls.baseLink01
395  dq.itemStyles['objectiveLink'] = styls.objLnkLink
396  dq.itemStyles['requestVarGroup'] = styls.vgrpLink
397  dq.itemStyles['miptable'] = styls.miptableLink
398  dq.itemStyles['requestLink'] = styls.rqlLink02
399  dq.itemStyles['requestItem'] = styls.rqiLink02
400  dq.itemStyles['spatialShape'] = styls.labTtl
401  dq.indexSortBy['miptable'] = 'label'
402  dq.coll['var'].items[0].__class__._linkAttrStyle['sn'] = styls.snLink01
403  dq.coll['CMORvar'].items[0].__class__._linkAttrStyle['stid'] = styls.stidLink01
404##dq.coll['requestVarGroup'].items[0].__class__._linkAttrStyle['requestVar'] = styls.rqvLink01
405  dq.itemStyles['requestVar'] = styls.rqvLink01
406
407  dreq.dreqItemBase._extraHtml['requestVarGroup'] = rvgExtraTable.vgx1(dq).mxoGet
408  dreq.dreqItemBase.__charmeEnable__['var'] = nt__charmeEnable( 'test','http://clipc-services.ceda.ac.uk/dreq' )
409
410  ht = htmlTrees(dq)
411  dq.makeHtml( annotations={'var':ht.anno}, ttl0='Data Request [%s]' % dreq.version )
412  sc = scope.dreqQuery(dq=dq)
413  try:
414    mt = table_utils.makeTab( sc)
415  except:
416    print ('Could not make tables ...')
417    raise
418  mp = makePurl( dq )
419  mj = makeJs( dq )
420
421if __name__ == "__main__":
422  run()
Note: See TracBrowser for help on using the repository browser.