web/htmlwidgets.py
branchstable
changeset 4786 df2a12bfbab6
parent 4721 8f63691ccb7f
child 5421 8167de96c523
equal deleted inserted replaced
4785:1fa7363c78bd 4786:df2a12bfbab6
   334     def itercols(self, rowindex):
   334     def itercols(self, rowindex):
   335         for column in self.columns:
   335         for column in self.columns:
   336             yield column, self.model.sortvalue(rowindex, column.rset_sortcol)
   336             yield column, self.model.sortvalue(rowindex, column.rset_sortcol)
   337 
   337 
   338 
   338 
   339 class ProgressBarWidget(HTMLWidget):
       
   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 
       
   346     def __init__(self, done, todo, total):
       
   347         self.done = done
       
   348         self.todo = todo
       
   349         self.budget = total
       
   350 
       
   351     @property
       
   352     def overrun(self):
       
   353         """overrun = done + todo - """
       
   354         if self.done + self.todo > self.budget:
       
   355             overrun = self.done + self.todo - self.budget
       
   356         else:
       
   357             overrun = 0
       
   358         if overrun < self.precision:
       
   359             overrun = 0
       
   360         return overrun
       
   361 
       
   362     @property
       
   363     def overrun_percentage(self):
       
   364         """pourcentage overrun = overrun / budget"""
       
   365         if self.budget == 0:
       
   366             return 0
       
   367         else:
       
   368             return self.overrun * 100. / self.budget
       
   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         else:
       
   377             pourcent = done*100./budget
       
   378         if pourcent > 100.1:
       
   379             color = 'red'
       
   380         elif todo+done > self.red_threshold*budget:
       
   381             color = 'red'
       
   382         elif todo+done > self.orange_threshold*budget:
       
   383             color = 'orange'
       
   384         elif todo+done > self.yellow_threshold*budget:
       
   385             color = 'yellow'
       
   386         else:
       
   387             color = 'green'
       
   388         if pourcent < 0:
       
   389             pourcent = 0
       
   390 
       
   391         if floor(done) == done or done>100:
       
   392             done_str = '%i' % done
       
   393         else:
       
   394             done_str = '%.1f' % done
       
   395         if floor(budget) == budget or budget>100:
       
   396             budget_str = '%i' % budget
       
   397         else:
       
   398             budget_str = '%.1f' % budget
       
   399 
       
   400         title = u'%s/%s = %i%%' % (done_str, budget_str, pourcent)
       
   401         short_title = title
       
   402         if self.overrun_percentage:
       
   403             title += u' overrun +%sj (+%i%%)' % (self.overrun,
       
   404                                                  self.overrun_percentage)
       
   405             overrun = self.overrun
       
   406             if floor(overrun) == overrun or overrun>100:
       
   407                 overrun_str = '%i' % overrun
       
   408             else:
       
   409                 overrun_str = '%.1f' % overrun
       
   410             short_title += u' +%s' % overrun_str
       
   411         # write bars
       
   412         maxi = max(done+todo, budget)
       
   413         if maxi == 0:
       
   414             maxi = 1
       
   415 
       
   416         cid = random.randint(0, 100000)
       
   417         self.w(u'%s<br/>'
       
   418                u'<canvas class="progressbar" id="canvas%i" width="100" height="10"></canvas>'
       
   419                u'<script type="application/x-javascript">'
       
   420                u'draw_progressbar("canvas%i", %i, %i, %i, "%s");</script>'
       
   421                % (short_title.replace(' ','&nbsp;'), cid, cid,
       
   422                   int(100.*done/maxi), int(100.*(done+todo)/maxi),
       
   423                   int(100.*budget/maxi), color))