Changeset 12090f0 in osmose-frontend


Ignore:
Timestamp:
Nov 4, 2012 12:53:42 PM (5 years ago)
Author:
Jocelyn Jaubert <jocelyn.jaubert@…>
Branches:
master
Children:
aae368b
Parents:
a471d0e (diff), 6bf5a5c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge remote-tracking branch 'frodrigo/bottle' into dev

Files:
3 deleted
15 edited

Legend:

Unmodified
Added
Removed
  • control.py

    r95a622e r6bf5a5c  
    2121########################################################################### 
    2222 
    23 from bottle import route, request, response, template 
     23from bottle import route, request, response, template, post 
    2424from tools import utils 
    2525from tools import update 
     
    8585 
    8686 
    87 @route('/control/send-update') 
    88 @route('/cgi-bin/update.py') # Backward compatibility 
     87@post('/control/send-update') 
     88@post('/cgi-bin/update.py') # Backward compatibility 
    8989def send_update(): 
    9090    code = request.params.get('code') 
  • errors.py

    r184d4e1 r1054d21  
    3131    return map(lambda x: int(x), filter(lambda x: x and x!='',s).split(',')) 
    3232 
    33 @route('/errors/graph.png') 
    34 def graph(db): 
     33@route('/errors/graph.<format:ext>') 
     34def graph(db, format='png'): 
    3535    class options: 
    3636        sources = request.params.get('sources', type=int_list, default=[]) 
     
    4242 
    4343    try: 
    44         data = errors_graph.make_plt(db, options) 
    45         response.content_type = "image/png" 
     44        data = errors_graph.make_plt(db, options, format) 
     45        response.content_type = {'png':'image/png', 'svg':'image/svg+xml', 'pdf':'application/pdf'}[format] 
    4646        return data 
    4747    except Exception, e: 
  • errors_graph.py

    r7f3b062 re5466bd  
    2121########################################################################### 
    2222 
    23 import time, sys, datetime, os, commands 
     23import time, sys, datetime, StringIO, os, tempfile 
     24os.environ['MPLCONFIGDIR'] = tempfile.mkdtemp() 
     25import matplotlib 
     26# Force matplotlib to not use any Xwindows backend. 
     27matplotlib.use('Agg') 
     28import pylab 
     29from matplotlib.dates import YearLocator, MonthLocator, DayLocator, DateFormatter 
    2430 
    2531 
    2632def get_data(db, options): 
    27     sql =  "SELECT dynpoi_stats.source, dynpoi_stats.class, dynpoi_stats.timestamp, dynpoi_stats.count " 
    28     sql += "FROM dynpoi_stats %s " 
    29     sql += "WHERE 1=1 %s " 
    30     sql += "ORDER BY timestamp" 
     33    sql = """ 
     34SELECT 
     35    date, 
     36    SUM(count) 
     37FROM ( 
     38SELECT 
     39    date_trunc('day', dynpoi_stats.timestamp) AS date, 
     40    AVG(dynpoi_stats.count) AS count 
     41FROM 
     42    dynpoi_stats 
     43    %s 
     44WHERE 1=1 
     45    %s 
     46GROUP BY 
     47    dynpoi_stats.source, 
     48    dynpoi_stats.class, 
     49    date 
     50) AS t 
     51GROUP BY 
     52    date 
     53ORDER BY 
     54    date 
     55""" 
    3156 
    3257    join_item = "" 
    3358    where_sql = "" 
    3459 
    35     if len(options.items)==1: 
    36        join_item += "JOIN dynpoi_class ON dynpoi_stats.source = dynpoi_class.source AND dynpoi_stats.class = dynpoi_class.class " 
    37        where_sql += "AND dynpoi_class.item=%d " % options.items[0] 
    38     elif len(options.items)>=1: 
    39        join_item += "JOIN dynpoi_class ON dynpoi_stats.source = dynpoi_class.source AND dynpoi_stats.class = dynpoi_class.class " 
    40        where_sql += "AND dynpoi_class.item in (%s) " % convIntsToStr(options.items) 
     60    if len(options.items)>=1: 
     61        join_item += """ 
     62    JOIN dynpoi_class ON 
     63        dynpoi_stats.source = dynpoi_class.source AND 
     64        dynpoi_stats.class = dynpoi_class.class AND 
     65        dynpoi_class.item in (%s) 
     66        """ % convIntsToStr(options.items) 
    4167 
    42     if len(options.classes)==1: 
    43        where_sql += "AND dynpoi_stats.class=%d " % options.classes[0] 
    44     elif len(options.classes)>=1: 
    45        where_sql += "AND dynpoi_stats.class in (%s) " % convIntsToStr(options.classes) 
     68    if len(options.classes)>=1: 
     69        where_sql += "AND dynpoi_stats.class in (%s) " % convIntsToStr(options.classes) 
    4670 
    47     if len(options.sources)==1: 
    48        where_sql += "AND dynpoi_stats.source=%d " % options.sources[0] 
    49     elif len(options.sources)>=1: 
    50        where_sql += "AND dynpoi_stats.source in (%s) " % convIntsToStr(options.sources) 
     71    if len(options.sources)>=1: 
     72        where_sql += "AND dynpoi_stats.source in (%s) " % convIntsToStr(options.sources) 
    5173 
    5274    if options.country: 
    53        join_item += "JOIN dynpoi_source ON dynpoi_stats.source = dynpoi_source.source " 
    54        where_sql += "AND dynpoi_source.comment LIKE '%%-%s%%' " % options.country 
     75        join_item += """ 
     76    JOIN dynpoi_source ON 
     77        dynpoi_stats.source = dynpoi_source.source AND 
     78        dynpoi_source.comment LIKE '%%-%s%%' 
     79        """ % options.country 
    5580 
    5681    sql = sql % (join_item, where_sql) 
     
    5984      print sql 
    6085 
     86    result = [] 
    6187    db.execute(sql) 
     88    for r in db.fetchall(): 
     89        result.append((r[0],r[1])) 
     90    return result 
    6291 
    63     if len(options.sources)!=1: 
    64         delay = datetime.timedelta(days=1) 
    65     else: 
    66         delay = datetime.timedelta(seconds=1) 
    67  
    68     result = [] 
    69     last = {} 
    70     timestamp = 0 
    71     prev_timestamp = 0 
    72     for res in db.fetchall(): 
    73         timestamp = res['timestamp'] 
    74         if prev_timestamp == 0: 
    75             prev_timestamp = timestamp 
    76  
    77         last[(res["source"],res["class"])] = res['count'] 
    78         if (timestamp - prev_timestamp) > delay: 
    79             result.append((timestamp.strftime('%d/%m/%Y'), sum(last.itervalues()))) 
    80             prev_timestamp = timestamp 
    81  
    82     if last: 
    83         result.append((timestamp.strftime('%d/%m/%Y'), sum(last.itervalues()))) 
    84     return result 
    8592 
    8693def get_text(db, options): 
    8794    if len(options.sources)==1 and len(options.classes)==1: 
    8895        db.execute("SELECT title->'en' FROM dynpoi_class WHERE source=%s AND class=%s;", (options.sources[0], options.classes[0])) 
    89  
    9096    elif len(options.items)==1 and len(options.classes)==1: 
    9197        db.execute("SELECT title->'en' FROM dynpoi_class WHERE class=%s AND item=%s LIMIT 1;", (options.classes[0], options.items[0])) 
    92  
     98    elif len(options.items)==1: 
     99        db.execute("SELECT menu->'en' FROM dynpoi_item WHERE item=%s LIMIT 1;", (options.items[0],)) 
    93100    else: 
    94101        return "" 
     
    100107        return "" 
    101108 
     109 
    102110def get_src(db, options): 
    103111    if len(options.sources) != 1: 
     
    107115        return db.fetchone()[0] 
    108116 
    109 def make_plt(db, options): 
    110  
    111     data = get_data(db, options) 
    112     text = get_text(db, options) 
    113  
    114     if not data or len(data) < 2: 
    115          raise SystemError("no data available") 
    116  
    117     gnuplotFilename = "/tmp/data_%i.plt"%os.getpid() 
    118     dataFilename = "/tmp/data_%i.dat"%os.getpid() 
    119  
    120     f_plt = open(gnuplotFilename, 'w') 
    121     f_plt.write("set terminal png\n") 
    122     f_plt.write("set title \"Source : %s\"\n"%get_src(db, options)) 
    123 #    f_plt.write("set style data fsteps\n") 
    124     f_plt.write("set style data line\n") 
    125     f_plt.write("set timefmt \"%d/%m/%Y\"\n") 
    126     f_plt.write("set xdata time\n") 
    127     f_plt.write("set xrange [ \"%s\":\"%s\" ]\n"%(data[0][0], data[-1][0])) 
    128     f_plt.write("set format x \"%d/%m\\n%Y\"\n") 
    129     #f_plt.write("set xlabel \"Date\nTime\"\n") 
    130     f_plt.write("set yrange [ %d : %d ]\n"%(0,100*(max([x[1] for x in data])/100+2))) 
    131     #f_plt.write("set ylabel "Concentration\nmg/l"\n") 
    132     f_plt.write("set grid\n") 
    133     f_plt.write("set key left\n") 
    134     f_plt.write("plot '%s' using 1:2 t '%s'\n"%(dataFilename, text)) 
    135     f_plt.close() 
    136  
    137     f_dat = open(dataFilename, 'w') 
    138     for x in data: 
    139         f_dat.write("%s %d\n"%(x[0], x[1])) 
    140     f_dat.close() 
    141  
    142     s, o = commands.getstatusoutput("gnuplot "+gnuplotFilename) 
    143  
    144     if s: 
    145         raise SystemError("error in gnuplot generation") 
    146  
    147     os.remove(gnuplotFilename) 
    148     os.remove(dataFilename) 
    149  
    150     return o 
    151  
    152  
    153 def convStrToInts(string): 
    154     """ 
    155     Convertie une chaine en liste d'entier 
    156     """ 
    157     if not string: 
    158         return [] 
    159  
    160     string = string.replace(" ", "") 
    161     if string=="": 
    162         return [] 
    163  
    164     return [int(elt) for elt in string.split(",")] 
    165117 
    166118def convIntsToStr(values): 
     
    171123 
    172124 
     125def make_plt(db, options, format): 
     126    data = get_data(db, options) 
     127    text = get_text(db, options) 
     128    src = get_src(db, options) 
     129    return plot(data, text+' '+src, format) 
     130 
     131 
     132def plot(data, title, format): 
     133 
     134    dates = [q[0] for q in data] 
     135    opens = [q[1] for q in data] 
     136 
     137    fig = pylab.figure() 
     138    ax = fig.add_subplot(111) 
     139    ax.plot_date(dates, opens, '-', color='r') 
     140 
     141    ax.set_title(title) 
     142 
     143    # format the ticks 
     144    if dates[-1] - dates[0] > datetime.timedelta(days=365*3): 
     145        ax.xaxis.set_major_locator(YearLocator()) 
     146        ax.xaxis.set_major_formatter(DateFormatter('%Y')) 
     147        ax.xaxis.set_minor_locator(MonthLocator()) 
     148    elif dates[-1] - dates[0] > datetime.timedelta(weeks=10): 
     149        ax.xaxis.set_major_locator(MonthLocator()) 
     150        ax.xaxis.set_major_formatter(DateFormatter('%Y-%m')) 
     151        ax.xaxis.set_minor_locator(DayLocator()) 
     152    else: 
     153        ax.xaxis.set_major_locator(DayLocator()) 
     154        ax.xaxis.set_major_formatter(DateFormatter('%Y-%m-%d')) 
     155    ax.autoscale_view() 
     156 
     157    # format the coords message box 
     158    ax.fmt_ydata = lambda x: '$%1.2f'%x 
     159    ax.grid(True) 
     160 
     161    fig.autofmt_xdate() 
     162 
     163    buf = StringIO.StringIO() 
     164    pylab.savefig(buf, format = format) 
     165    return buf.getvalue() 
     166 
     167 
    173168if __name__ == "__main__": 
    174169    from optparse import OptionParser, SUPPRESS_HELP 
     
    176171 
    177172    parser = OptionParser() 
    178  
    179173    parser.add_option("--source", dest="sources", type="int", action="append", default=[]) 
    180174    parser.add_option("--class", dest="classes", type="int", action="append", default=[]) 
  • map.py

    rca358f2 rce387de  
    2525import datetime 
    2626import json 
     27 
     28 
     29def check_items(items, all_items): 
     30    if items == None or items == 'xxxx': 
     31        return all_items 
     32    else: 
     33        items = items.split(',') 
     34        return filter(lambda i: str(i) in items or str(i)[0]+'xxx' in items, all_items) 
    2735 
    2836 
     
    4048    source = request.params.get('source', default='') 
    4149    user   = request.params.get('user', default='') 
    42     active_items = request.params.get('item', default=(request.get_cookie("lastItem") or None)) 
    43  
    44     if active_items: 
    45         try: 
    46             active_items = [int(x) for x in active_items if x] 
    47         except: 
    48             active_items = None 
    49  
    50     if not active_items: 
    51         active_items = [] 
    52         db.execute("SELECT item FROM dynpoi_item GROUP BY item;") 
    53         for res in db.fetchall(): 
    54             active_items.append(int(res[0])) 
     50 
     51    active_items = request.params.get('item', default=request.get_cookie("lastItem")) 
     52    all_items = [] 
     53    db.execute("SELECT item FROM dynpoi_item GROUP BY item;") 
     54    for res in db.fetchall(): 
     55        all_items.append(int(res[0])) 
     56    active_items = check_items(active_items, all_items) 
    5557 
    5658    level_selected = {} 
     
    100102    lat    = int(request.params.get('lat', type=float, default=0)*1000000) 
    101103    lon    = int(request.params.get('lon', type=float, default=0)*1000000) 
    102     err_id = request.params.get('item', default='').split(',') 
    103     err_id = ','.join([str(int(x)) for x in err_id if x]) 
     104    item   = request.params.get('item') 
    104105    source = request.params.get('source', default='') 
    105106    user   = utils.pg_escape(unicode(request.params.get('user', default=''))) 
     
    171172        sources2 = " OR ".join(source2) 
    172173        where = "(%s)" % sources2 
    173     elif err_id: 
    174         where = "(marker.item IN (%s))" % err_id 
     174    elif item != None: 
     175        if item == '': 
     176            where = "1=2" 
     177        elif item == 'xxxx': 
     178            where = "1=1" 
     179        else: 
     180            where = [] 
     181            l = [] 
     182            for i in item.split(','): 
     183                try: 
     184                    if 'xxx' in i: 
     185                        where.append("marker.item/1000 = %s" % int(i[0])) 
     186                    else: 
     187                        l.append(str(int(i))) 
     188                except: 
     189                    pass 
     190            if l != []: 
     191                where.append("marker.item IN (%s)" % ','.join(l)) 
     192            if where != []: 
     193                where = "(%s)" % ' OR '.join(where) 
     194            else: 
     195                where = "1=1" 
    175196    else: 
    176197        where = "1=1" 
     
    190211    results = db.fetchall() 
    191212 
    192     out = ["\t".join(["lat", "lon", "marker_id", "icon", "iconSize", "iconOffset", "html"])] 
     213    out = ["\t".join(["lat", "lon", "marker_id", "item"])] 
    193214    for res in results: 
    194215        lat       = str(float(res["lat"])/1000000) 
     
    196217        error_id  = res["id"] 
    197218        item      = res["item"] or 0 
    198         marker = "../images/markers/marker-b-%d.png" % (res["item"]) 
    199         out.append("\t".join([lat, lon, str(error_id), marker, "17,33", "-8,-33", "plop"]).encode("utf8")) 
     219        out.append("\t".join([lat, lon, str(error_id), str(item)])) 
    200220 
    201221    response.content_type = "text/plain; charset=utf-8" 
  • osmose.py

    r968dae2 r1054d21  
    2323 
    2424def ext_filter(config): 
    25     regexp = r'html|json|xml|rss' 
     25    regexp = r'html|json|xml|rss|png|svg|pdf' 
    2626    def to_python(match): 
    27         return match if match in ('html', 'json', 'xml', 'rss') else 'html' 
     27        return match if match in ('html', 'json', 'xml', 'rss', 'png', 'svg', 'pdf') else 'html' 
    2828    def to_url(ext): 
    2929        return ext 
  • static/map/DynPoi.js

    ra21d87d rce387de  
    4646                            attributes['lon'] = geometry.x; 
    4747                            set = true; 
    48                         } else if (columns[valIndex] == 'image' || columns[valIndex] == 'icon') style['externalGraphic'] = vals[valIndex]; 
    49                         else if (columns[valIndex] == 'iconSize') { 
    50                             var size = vals[valIndex].split(','); 
    51                             style['graphicWidth'] = parseFloat(size[0]); 
    52                             style['graphicHeight'] = parseFloat(size[1]); 
    53                         } else if (columns[valIndex] == 'iconOffset') { 
    54                             var offset = vals[valIndex].split(','); 
    55                             style['graphicXOffset'] = parseFloat(offset[0]); 
    56                             style['graphicYOffset'] = parseFloat(offset[1]); 
    57                         } else if (columns[valIndex] == 'marker_id') attributes['marker_id'] = vals[valIndex]; 
    58                         else if (columns[valIndex] == 'html') attributes['html'] = vals[valIndex]; 
     48                        } else if (columns[valIndex] == 'item') { 
     49                            style['item'] = vals[valIndex]; 
     50                        } else if (columns[valIndex] == 'marker_id') { 
     51                            attributes['marker_id'] = vals[valIndex]; 
     52                        } 
    5953                    } 
    6054                } 
     
    136130            // items list 
    137131            var ch = ""; 
    138             for (var i = 0; i < document.myform.elements.length; ++i) { 
    139                 var el = document.myform.elements[i]; 
    140                 if (el.type == "checkbox" && el.name.match(/item[-0-9]+/) != null) { 
    141                     if (el.checked) ch += el.name.substr(4) + ','; 
    142                 } 
     132            if ($(".test_group :checkbox:not(:checked)").length == 0) { 
     133                ch = "xxxx"; 
     134            } else { 
     135                $(".test_group").each(function() { 
     136                    var id = this.id; 
     137                    v = $("h1 span", this).text().split("/"); 
     138                    if (v[0] == v[1]) { 
     139                        ch += id.substring(5,6) + "xxx,"; 
     140                    } else { 
     141                        $(":checked", this).each(function() { 
     142                            ch += this.name.substr(4) + ","; 
     143                        }) 
     144                    } 
     145                }) 
    143146            } 
    144147            ch = ch.replace(/,$/, ''); 
     
    160163            var permalink = plk.element; 
    161164            // var permalink = document.getElementsByClassName('olControlPermalink')[0].firstChild; 
    162             permalink.href = permalink.href.replace(/&item=[-0-9,]*/, '').replace(/\?item=[-0-9,]*&?/, '?') + "&item=" + ch; 
    163             permalink.href = permalink.href.replace(/&level=[-0-9,]*/, '').replace(/\?level=[-0-9,]*&?/, '?') + "&level=" + document.myform.level.value; 
     165            permalink.href = permalink.href.replace(/&item=[-0-9x,]*/, '').replace(/\?item=[-0-9x,]*&?/, '?') + "&item=" + ch; 
     166            permalink.href = permalink.href.replace(/&level=[-0-9x,]*/, '').replace(/\?level=[-0-9x,]*&?/, '?') + "&level=" + document.myform.level.value; 
    164167 
    165168            var onFail = function (e) { 
     
    195198 
    196199            location = new OpenLayers.LonLat(feature.geometry.x, feature.geometry.y); 
    197  
    198             if (feature.style.graphicWidth && feature.style.graphicHeight) { 
    199                 iconSize = new OpenLayers.Size(feature.style.graphicWidth, feature.style.graphicHeight); 
    200             } 
    201  
    202             // FIXME: At the moment, we only use this if we have an 
    203             // externalGraphic, because icon has no setOffset API Method. 
    204             /** 
    205              * FIXME FIRST!! 
    206              * The Text format does all sorts of parseFloating 
    207              * The result of a parseFloat for a bogus string is NaN. That 
    208              * means the three possible values here are undefined, NaN, or a 
    209              * number. The previous check was an identity check for null. This 
    210              * means it was failing for all undefined or NaN. A slightly better 
    211              * check is for undefined. An even better check is to see if the 
    212              * value is a number (see #1441). 
    213              */ 
    214             if (feature.style.graphicXOffset !== undefined && feature.style.graphicYOffset !== undefined) { 
    215                 iconOffset = new OpenLayers.Pixel(feature.style.graphicXOffset, feature.style.graphicYOffset); 
    216             } 
    217  
    218             if (feature.style.externalGraphic != null) { 
    219                 data.icon = new OpenLayers.Icon(feature.style.externalGraphic, iconSize, iconOffset); 
    220             } else { 
    221                 data.icon = OpenLayers.Marker.defaultIcon(); 
    222                 // allows for the case where the image url is not 
    223                 // specified but the size is. use a default icon 
    224                 // but change the size 
    225                 if (iconSize != null) { 
    226                     data.icon.setSize(iconSize); 
    227                 } 
    228             } 
    229  
    230             if (feature.attributes.comment == null) feature.attributes.comment = ""; 
    231             if (feature.attributes.marker_id != null) { 
    232                 data['popupContentHTML'] = feature.attributes.html; 
    233             } 
     200            iconSize = new OpenLayers.Size(17,33); 
     201            iconOffset = new OpenLayers.Pixel(-8,-33); 
     202            data.icon = new OpenLayers.Icon("../images/markers/marker-b-"+feature.style.item+".png", iconSize, iconOffset); 
    234203 
    235204            data['overflow'] = feature.attributes.overflow || "auto"; 
  • static/map/map.js

    r3aad5cc r3274bb2  
    337337 
    338338// Change level 
    339 function change_item_display(l, enable) { 
    340     disabled = !enable; 
    341     hidden = enable ? null : "hidden"; 
    342     color = enable ? "black" : "#999999"; 
     339function change_item_display(l) { 
    343340    $("div#tests li").each(function () { 
    344341        id = parseInt($(this).attr('id').replace(/item_desc/, '')); 
     
    349346        } 
    350347    }); 
     348    ll = l.split(',') 
     349    for (var i=1 ; i<=3 ; i++) { 
     350        if (ll.indexOf(i.toString())>=0) { 
     351            $(".level-"+i).removeClass("disabled"); 
     352        } else { 
     353            $(".level-"+i).addClass("disabled"); 
     354        } 
     355    } 
    351356} 
    352357 
    353358function change_level_display() { 
    354359    var new_level = document.getElementById('level').value; 
    355  
    356360    if (new_level == "") { 
    357         change_item_display("1,2,3", true); 
     361        change_item_display("1,2,3"); 
    358362    } else { 
    359         // change_item_display("1,2,3", false); 
    360         change_item_display(new_level, true); 
     363        change_item_display(new_level); 
    361364    } 
    362365} 
  • static/map/style.css

    re11ae9d r3274bb2  
    2020  background: white; 
    2121  position: absolute; 
    22   width: 330px; 
     22  width: 270px; 
    2323  left: 50px; 
    2424  top: 30px; 
     
    2626  padding: 5px; 
    2727  padding-top: 8px; 
     28  padding-right: 0px; 
    2829  opacity: 0.9; 
    2930} 
     
    272273  height: 16px; 
    273274} 
    274 div.level-123 { 
    275   background: url('../images/level-123.png'); 
    276 } 
    277 div.level-12_ { 
    278   background: url('../images/level-12_.png'); 
    279 } 
    280 div.level-1_3 { 
    281   background: url('../images/level-1_3.png'); 
    282 } 
    283 div.level-_23 { 
    284   background: url('../images/level-_23.png'); 
    285 } 
    286 div.level-1__ { 
    287   background: url('../images/level-1__.png'); 
    288 } 
    289 div.level-_2_ { 
    290   background: url('../images/level-_2_.png'); 
    291 } 
    292 div.level-__3 { 
    293   background: url('../images/level-__3.png'); 
     275div.test_group div.level div { 
     276  width: 16px; 
     277  height: 16px; 
     278  display: inline-block; 
     279  direction: rtl; 
     280} 
     281div.test_group div.level div span { 
     282  display: none; 
     283} 
     284div.test_group div.level div:hover span { 
     285  display: block; 
     286  padding: 5px; 
     287  z-index: 20; 
     288  overflow: visible; 
     289} 
     290div.level-1 { 
     291  background: url('../images/levels.png') no-repeat; 
     292  background-position:0px 0px; 
     293} 
     294div.level-2 { 
     295  background: url('../images/levels.png') no-repeat; 
     296  background-position:-16px 0px; 
     297} 
     298div.level-3 { 
     299  background: url('../images/levels.png') no-repeat; 
     300  background-position:-32px 0px; 
     301} 
     302div.level-1.disabled { 
     303  background: url('../images/levels.png') no-repeat; 
     304  background-position:0px -16px; 
     305} 
     306div.level-2.disabled { 
     307  background: url('../images/levels.png') no-repeat; 
     308  background-position:-16px -16px; 
     309} 
     310div.level-3.disabled { 
     311  background: url('../images/levels.png') no-repeat; 
     312  background-position:-32px -16px; 
    294313} 
    295314 
  • tools/utils.py

    r95a622e r6e7d36d  
    5555                res["menu"] = res1[1][l] 
    5656                break 
    57         curs2.execute("SELECT item, menu, marker_color, marker_flag, levels FROM dynpoi_item WHERE categ = %d ORDER BY item"%res1[0]) 
     57        curs2.execute("SELECT item, menu, marker_color, marker_flag, levels, number FROM dynpoi_item WHERE categ = %d ORDER BY item"%res1[0]) 
    5858        for res2 in curs2.fetchall(): 
    59             res["item"].append({"item":res2[0], "menu":"no translation", "marker_color":res2[2], "marker_flag":res2[3], "levels": res2["levels"]}) 
     59            res["item"].append({"item":res2[0], "menu":"no translation", "marker_color":res2[2], "marker_flag":res2[3], "levels":res2["levels"], "number":res2["number"]}) 
    6060            for l in lang: 
    6161                if res2[1] and l in res2[1]: 
  • views/control/updates.tpl

    r334c621 rc4fe22d  
    11%rebase layout title=_("Last updates") 
     2<p>{{_("Median delay : ")}} {{liste[len(liste)/2][2]}}</p> 
    23<table> 
    34<tr> 
  • views/map/index.tpl

    r3aad5cc r6e7d36d  
    7171    <ul> 
    7272%    for err in categ["item"]: 
    73 %        s_l = ["_"] * 3 
    74 %        for l in err["levels"]: 
    75 %            s_l[l-1] = str(l) 
     73        <li style='background-image: url(../images/markers/marker-l-{{err["item"]}}.png)' id='item_desc{{err["item"]}}'> 
     74            <div class="level">\\ 
     75%        p = 0 
     76%        for i in [1,2,3]: 
     77%            if i in err["levels"]: 
     78<div class="level-{{i}}"><span>{{err["number"][p] if err["number"] and len(err["number"]) > p else 0}}</span></div>\\ 
     79%                p += 1 
     80%            else: 
     81<div></div>\\ 
     82%            end 
    7683%        end 
    77         <li style='background-image: url(../images/markers/marker-l-{{err["item"]}}.png)' id='item_desc{{err["item"]}}'> 
     84            </div> 
    7885            <input type='checkbox' id='item{{err["item"]}}' name='item{{err["item"]}}' onclick='checkbox_click(this)' {{ {True:" checked=\"checked\"", False:""}[err["item"] in active_items]}}> 
    7986            <a target="_blank" href="../errors/?item={{err["item"]}}">{{err["menu"]}}</a> 
    80             <div class="level level-{{"".join(s_l)}}">&nbsp;</div> 
    8187        </li> 
    8288%    end 
Note: See TracChangeset for help on using the changeset viewer.