web/htmlwidgets.py
changeset 4211 eac4b23a42ff
parent 4183 b5aa030bb2f9
child 4252 6c4f109c2b03
equal deleted inserted replaced
4204:60256056bda6 4211:eac4b23a42ff
     6 :organization: Logilab
     6 :organization: Logilab
     7 :copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2.
     7 :copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2.
     8 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
     8 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
     9 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
     9 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
    10 """
    10 """
       
    11 
       
    12 from math import floor
       
    13 import random
    11 
    14 
    12 from logilab.mtconverter import xml_escape
    15 from logilab.mtconverter import xml_escape
    13 
    16 
    14 from cubicweb.utils import UStringIO
    17 from cubicweb.utils import UStringIO
    15 from cubicweb.uilib import toggle_action, limitsize, htmlescape
    18 from cubicweb.uilib import toggle_action, limitsize, htmlescape
   333             yield column, self.model.sortvalue(rowindex, column.rset_sortcol)
   336             yield column, self.model.sortvalue(rowindex, column.rset_sortcol)
   334 
   337 
   335 
   338 
   336 class ProgressBarWidget(HTMLWidget):
   339 class ProgressBarWidget(HTMLWidget):
   337     """display a progress bar widget"""
   340     """display a progress bar widget"""
       
   341     precision = 0.1
       
   342     red_threshold = 1.1
       
   343     orange_threshold = 1.05
       
   344     yellow_threshold = 1
       
   345 
   338     def __init__(self, done, todo, total):
   346     def __init__(self, done, todo, total):
   339         self.done = done
   347         self.done = done
   340         self.todo = todo
   348         self.todo = todo
   341         self.total = total
   349         self.budget = total
   342 
   350 
   343     def _render(self):
   351     @property
   344         try:
   352     def overrun(self):
   345             percent = self.done*100./self.total
   353         """overrun = done + todo - """
   346         except ZeroDivisionError:
   354         if self.done + self.todo > self.budget:
   347             percent = 0
   355             overrun = self.done + self.todo - self.budget
   348         real_percent = percent
   356         else:
   349         if percent > 100 :
   357             overrun = 0
   350             color = 'done'
   358         if overrun < self.precision:
   351             percent = 100
   359             overrun = 0
   352         elif self.todo + self.done > self.total :
   360         return overrun
   353             color = 'overpassed'
   361 
   354         else:
   362     @property
   355             color = 'inprogress'
   363     def overrun_percentage(self):
   356         if percent < 0:
   364         """pourcentage overrun = overrun / budget"""
   357             percent = 0
   365         if self.budget == 0:
   358         self.w(u'<div class="progressbarback" title="%i %%">' % real_percent)
   366             return 0
   359         self.w(u'<div class="progressbar %s" style="width: %spx; align: left;" ></div>' % (color, percent))
   367         else:
   360         self.w(u'</div>')
   368             return self.overrun * 100. / self.budget
   361 
   369 
       
   370     def _render(self):
       
   371         done = self.done
       
   372         todo = self.todo
       
   373         budget = self.budget
       
   374         if budget == 0:
       
   375             pourcent = 100
       
   376             todo_pourcent = 0
       
   377         else:
       
   378             pourcent = done*100./budget
       
   379             todo_pourcent = min(todo*100./budget, 100-pourcent)
       
   380         bar_pourcent = pourcent
       
   381         if pourcent > 100.1:
       
   382             color = 'red'
       
   383             bar_pourcent = 100
       
   384         elif todo+done > self.red_threshold*budget:
       
   385             color = 'red'
       
   386         elif todo+done > self.orange_threshold*budget:
       
   387             color = 'orange'
       
   388         elif todo+done > self.yellow_threshold*budget:
       
   389             color = 'yellow'
       
   390         else:
       
   391             color = 'green'
       
   392         if pourcent < 0:
       
   393             pourcent = 0
       
   394 
       
   395         if floor(done) == done or done>100:
       
   396             done_str = '%i' % done
       
   397         else:
       
   398             done_str = '%.1f' % done
       
   399         if floor(budget) == budget or budget>100:
       
   400             budget_str = '%i' % budget
       
   401         else:
       
   402             budget_str = '%.1f' % budget
       
   403 
       
   404         title = u'%s/%s = %i%%' % (done_str, budget_str, pourcent)
       
   405         short_title = title
       
   406         if self.overrun_percentage:
       
   407             title += u' overrun +%sj (+%i%%)' % (self.overrun,
       
   408                                                  self.overrun_percentage)
       
   409             overrun = self.overrun
       
   410             if floor(overrun) == overrun or overrun>100:
       
   411                 overrun_str = '%i' % overrun
       
   412             else:
       
   413                 overrun_str = '%.1f' % overrun
       
   414             short_title += u' +%s' % overrun_str
       
   415         # write bars
       
   416         maxi = max(done+todo, budget)
       
   417         if maxi == 0:
       
   418             maxi = 1
       
   419 
       
   420         cid = random.randint(0, 100000)
       
   421         self.w(u'%s<br/>'
       
   422                u'<canvas class="progressbar" id="canvas%i" width="100" height="10"></canvas>'
       
   423                u'<script type="application/x-javascript">'
       
   424                u'draw_progressbar("canvas%i", %i, %i, %i, "%s");</script>'
       
   425                % (short_title.replace(' ','&nbsp;'), cid, cid,
       
   426                   int(100.*done/maxi), int(100.*(done+todo)/maxi),
       
   427                   int(100.*budget/maxi), color))