Source code for fandango.web

#!/usr/bin/env python

#############################################################################
##
## $Author: Sergi Rubio Manrique, srubio@cells.es $
##
## $Revision: 2008 $
##
## copyleft :    ALBA Synchrotron Controls Section, CELLS
##               Bellaterra
##               Spain
##
#############################################################################
##
## This file is part of Tango Control System
##
## Tango Control System is free software; you can redistribute it and/or
## modify it under the terms of the GNU General Public License as published
## by the Free Software Foundation; either version 3 of the License, or
## (at your option) any later version.
##
## Tango Control System is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program; if not, see <http://www.gnu.org/licenses/>.
###########################################################################

"""

Some extensions to python dictionary
ThreadDict: Thread safe dictionary with redefinable read/write methods and a backgroud thread for hardware update.
defaultdict_fromkey: Creates a dictionary with a default_factory function that creates new elements using key as argument.
CaselessDict: caseless dictionary
CaselessDefaultDict: a join venture between caseless and default dict

@deprecated
@note see in tau.core.utils.containers

by Sergi Rubio, 
srubio@cells.es, 
2010 
"""


import sys,time,traceback
import fandango
from fandango.functional import time2str,isString,isSequence,toList
import pickle
import PyQt4
from PyQt4 import Qt
from PyQt4.Qt import QColor
#import fandango.qt

#import guiqwt
#import guidata
#from guiqwt.plot import CurveDialog
#from guiqwt.builder import make
#from guiqwt.styles import COLORS

###############################################################################

page = lambda s: '<html>%s</html>'%s
body = lambda s: '<body>%s</body>'%s
paragraph = lambda s: '<p>%s</p>'%s
code = lambda s: '<pre>%s</pre>'%str(s)
raw = code
linebreak = '<br>'
separator = '<hr>'

ulist = lambda s: '<ul>%s</ul>'%s
item = lambda s: '<li>%s</li>'%s

bold = lambda s: '<b>%s</b>'%s
em = lambda s: '<em>'+str(s)+'</em>'
under = lambda s: '<u>\n'+str(s)+'\n</u>'
camel = lambda s: ''.join(r[0].upper()+(r[1:] or '').lower() for r in s.split())
color = lambda s,color: '<font color="%s">%s</font>'%(camel(color),s)
colors = "black white yellow blue green red gray fuchsia lime maroon aqua navy olive purple silver teal".split()
size = lambda s,size: '<font size="%s">%s</font>'%(size,s)

link = lambda s,url: '<a href="%s">%s</a>' % (url,s)
iname = lambda s: s.replace(' ','').lower()
iurl = lambda url: '#'+iname(url)
ilink = lambda s,url: '<a name="%s">%s</a>' % (iname(s),s)
title = lambda s,n=1: '<a name="%s"><h%d>%s</h%d></a>' % (iname(s),n,s,n) #<a> allows to make titles linkable
title1 = lambda s: '<h1>%s</h1>'%s

row,cell = (lambda s: '<tr>%s</tr>'%s) , (lambda s: '<td>%s</td>'%s)
table = lambda s: '<table border=1>\n'+'\n'.join([row(''.join([
                            (cell('%s'%c) if (len(s)==1 or j or (len(toList(r))<3 and i)) else cell(bold('%s'%c)))
                                for j,c in enumerate(toList(r))])) 
                            for i,r in enumerate(s)]
                   )+'\n</table>'

[docs]def list_to_ulist(l): return ulist('\n'.join(item(str(s)) for s in l))
[docs]def dicts2table(dcts,keys=None,formatter=None): """ :param dcts: a list of dictionaries :param keys: an alternative list of keys """ if not keys: keys = sorted(set(k for dct in dcts for k in dct.keys())) if not formatter: formatter = lambda s:s lines = [keys,] for dct in dcts: lines.append([formatter(dct.get(k,'')) for k in keys]) return table(lines)
[docs]def dict2dict2table(seq,keys=None,formatter=None): """ :param seq: a nested dictionary {:{}} :param keys: a list of header names """ if not keys: keys = [""]+sorted(set(k for v in seq.values() for k in v.keys())) if not formatter: formatter = lambda s:s lines = [keys,] for k,v in sorted(seq.items()): line = [k] for k in keys[1:]: line.append(formatter(v.get(k,''))) lines.append(line) return table(lines) ###############################################################################
MULTIPLIER = 10 OFFSETS = [-15,-30,-45,-60,-75,-90,-105,-120] COLORS = { 'red': (255, 0, 0, 255), 'blue': (0, 0, 255, 255), 'darkgreen': (0, 100, 0, 255), 'grey': (128, 128, 128, 255), 'lightblue': (173, 216, 230, 255), 'lightgreen': (144, 238, 144, 255), 'magenta': (255, 0, 255, 255), 'orange': (255, 165, 0, 255), 'violet': (238, 130, 238, 255) } HEXs = { 'red': '#ff0000', 'blue': '#0000ff', 'darkgreen': '#006400', 'grey': '#808080', 'lightblue': '#add8e6', 'lightgreen': '#90ee90', 'magenta': '#ff00ff', 'orange': '#ffa500', 'violet': '#ee82ee' } all_colors = COLORS.values() #ats = [CURRENT]+FRONTENDS #all_colors = [fg]+FECOLORS #t = [time.time()-DAYS*24*3600,time.time()] ############################################################################### #import PyTangoArchiving #from PyTangoArchiving.utils import decimate_array ###############################################################################
[docs]def jqplot(title,ats): #USING jqPlot instead of Qt js = 'http://www.cells.es/static/Files/Computing/Controls/Reports/js' includes = """ <script language="javascript" type="text/javascript" src="$JS/jquery.min.js"></script> <script language="javascript" type="text/javascript" src="$JS/jquery.jqplot.min.js"></script> <script type="text/javascript" src="$JS/plugins/jqplot.canvasAxisTickRenderer.min.js"></script> <script type="text/javascript" src="$JS/plugins/jqplot.dateAxisRenderer.min.js"></script> <link rel="stylesheet" type="text/css" href="$JS/jquery.jqplot.css" /> """.replace('$JS',js) jqp_template = """ <div id="chartdiv" style="height:100%;width:100%; "></div> <script class="code" type="text/javascript"> //var line1=[['2008-08-12 4:00',4], ['2008-09-12 4:00',6.5], ['2008-10-12 4:00',5.7], ['2008-11-12 4:00',9], ['2008-12-12 4:00',8.2]]; //var line1 = [['2012-09-17 16:44', -0.24086535644531001], ['2012-09-17 16:44', -0.166169769287108], ['2012-09-17 16:45', -0.097435409545898494]]; //var line1 = [['2012-09-17 16:41:25', -0.0238617248535157], ['2012-09-17 16:45:34', 0.058192413330078102], ['2012-09-17 16:49:34', 0.19318386840820501], ['2012-09-17 16:49:45', 0.61706387329101398], ['2012-09-17 16:49:55', 1.0387241058349601], ['2012-09-17 16:50:15', 1.54242512512208], ['2012-09-17 16:50:35', 2.4866759948730399], ['2012-09-17 16:51:34', 4.2881499938964902], ['2012-09-17 17:39:05', 2.0870143585204999], ['2012-09-17 17:39:15', -0.115877944946289], ['2012-09-17 17:43:55', -0.216508895874022], ['2012-09-17 17:50:45', -0.12760966491699099], ['2012-09-17 17:51:05', 0.00132557678222655], ['2012-09-17 17:51:14', 0.093648117065429706], ['2012-09-17 17:51:25', 0.17557904052734499], ['2012-09-17 17:51:35', 0.27481381225586199], ['2012-09-17 17:51:45', 0.45713497924804802], ['2012-09-17 17:52:05', 0.70768925476073896], ['2012-09-17 17:52:24', 1.0928863220214899], ['2012-09-17 17:52:55', 1.6552524261474699], ['2012-09-17 17:54:24', 2.6534446411132699], ['2012-09-17 17:57:35', 4.5955463104248198], ['2012-09-17 18:00:45', 7.7440131835937498], ['2012-09-17 19:02:15', 12.3284885101318], ['2012-09-17 19:15:35', 7.1876571350097702], ['2012-09-17 19:15:45', 0.51328236389160098], ['2012-09-17 19:16:35', 0.82798764038085604], ['2012-09-17 19:18:05', 1.2241496734619199], ['2012-09-17 19:18:25', 1.97309834289551], ['2012-09-17 19:18:45', 3.0986022644042799], ['2012-09-17 19:19:25', 4.5590980224609501], ['2012-09-17 19:19:55', 6.3049014739990499], ['2012-09-17 19:21:15', 10.757810562133701], ['2012-09-17 19:22:15', -0.19701274108886499], ['2012-09-17 19:22:25', 0.40055233764648701], ['2012-09-17 19:22:35', 1.10074002075196], ['2012-09-17 19:22:45', 1.6407546691894599], ['2012-09-17 19:23:15', 3.0096213989257699], ['2012-09-17 19:23:45', 4.4580032043457098], ['2012-09-17 19:24:25', 6.4163531951904602], ['2012-09-17 19:25:55', 10.671424835205], ['2012-09-17 19:27:35', 16.0758376770019], ['2012-09-17 19:36:35', -0.088338500976562498], ['2012-09-17 19:37:25', -0.0030716247558593901], ['2012-09-17 19:38:05', 0.081846588134765599], ['2012-09-17 19:38:45', 0.18200032043457201], ['2012-09-17 19:39:25', 0.24985005187988499]]; line1 = $DATA; //var ticks = [[1,'Dec 10'], [2,'Jan 11'], [3,'Feb 11'], [4,'Mar 11'], [5,'Apr 11'], [6,'May 11'], [7,'Jun 11'], [8,'Jul 11'], [9,'Aug 11'], [10,'Sep 11'], [11,'Oct 11'], [12,'Nov 11'], [13,'Dec 11']]; $(document).ready(function(){ var plot1 = $.jqplot('chartdiv', line1, { title:'$TITLE', //axes:{yaxis:{min:-10, max:240}}, axes:{ xaxis:{ //ticks: ticks, renderer:$.jqplot.DateAxisRenderer, //min: "09-01-2008 16:00", //max: "06-22-2009 16:00", //rendererOptions:{ // tickInset: 0, // tickRenderer:$.jqplot.CanvasAxisTickRenderer // }, tickOptions:{ formatString:'%b %e', angle: -40 }, // For date axes, we can specify ticks options as human // readable dates. You should be as specific as possible, // however, and include a date and time since some // browser treat dates without a time as UTC and some // treat dates without time as local time. // Generally, if a time is specified without a time zone, // the browser assumes the time zone of the client. //tickInterval: "2 weeks", //tickRenderer: $.jqplot.CanvasAxisTickRenderer, label:'Time(s)', labelRenderer: $.jqplot.CanvasAxisLabelRenderer }, yaxis:{ label:'Am', labelRenderer: $.jqplot.CanvasAxisLabelRenderer } }, $SERIES, legend:{ show:true, placement: 'outsideGrid', //location: 'e', } }); }); </script> """ serie = """ { label:'$ATTR', lineWidth: 3, //color:'#5FAB78', color: "$COLOR", showMarker:false, //fill:true, //fillAndStroke:true, } """#.replace('$ATTR',CURRENT).replace('$COLOR','rgba(255, 0, 0, 0.5)') series = 'series:[\n%s\n]'%',\n'.join([ serie.replace('$ATTR',a).replace('$COLOR','rgba(%d,%d,%d,1)'%all_colors[i][:3]) for i,a in enumerate(ats) ]) #data = """[[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]]""" data = str([ list([fandango.time2str(t[0]),t[1]] for t in vals[k]) for k in ats] ) return jqp_template.replace('$DATA',data).replace('$SERIES',series).replace('$TITLE',title)
from . import doc __doc__ = doc.get_fn_autodoc(__name__,vars())