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