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(' ',' '), cid, cid, |
|
426 int(100.*done/maxi), int(100.*(done+todo)/maxi), |
|
427 int(100.*budget/maxi), color)) |