From 2c1336488059dfc24c34dd11865c713fec252cbc Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Thu, 30 Sep 2010 12:47:30 -0500 Subject: Mirror status improvements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix sorting issues. '', 'unknown', and '∞' should now always sort after anything else in the list. * Add a completion percentage column; this will tell you at a glance if a mirror is sometimes unresponsive. This should probably be incorporated into the mirror score. * Make a few more things dynamic in the template, like the time back the page reflects. * Add some additional template tags for formatting things. Signed-off-by: Dan McGee --- mirrors/templatetags/mirror_status.py | 25 +++++++++++++++++++++++-- mirrors/utils.py | 29 +++++++++++++++++------------ 2 files changed, 40 insertions(+), 14 deletions(-) (limited to 'mirrors') diff --git a/mirrors/templatetags/mirror_status.py b/mirrors/templatetags/mirror_status.py index 09c5b33..0031d83 100644 --- a/mirrors/templatetags/mirror_status.py +++ b/mirrors/templatetags/mirror_status.py @@ -1,15 +1,36 @@ +from datetime import timedelta from django import template +from django.template.defaultfilters import floatformat register = template.Library() @register.filter def duration(value): - if not value: - return u'\u221e' + if not value and type(value) != timedelta: + return u'' # does not take microseconds into account total_secs = value.seconds + value.days * 24 * 3600 mins, secs = divmod(total_secs, 60) hrs, mins = divmod(mins, 60) return '%d:%02d' % (hrs, mins) +@register.filter +def hours(value): + if not value and type(value) != timedelta: + return u'' + # does not take microseconds into account + total_secs = value.seconds + value.days * 24 * 3600 + mins, secs = divmod(total_secs, 60) + hrs, mins = divmod(mins, 60) + if hrs == 1: + return '%d hour' % hrs + return '%d hours' % hrs + +@register.filter +def percentage(value, arg=-1): + if not value and type(value) != float: + return u'' + new_val = value * 100.0 + return floatformat(new_val, arg) + '%' + # vim: set ts=4 sw=4 et: diff --git a/mirrors/utils.py b/mirrors/utils.py index cdb705b..0463247 100644 --- a/mirrors/utils.py +++ b/mirrors/utils.py @@ -16,7 +16,9 @@ def get_mirror_statuses(cutoff=default_cutoff): mirror__active=True, mirror__public=True, protocol__in=protocols, logs__check_time__gte=cutoff_time).annotate( - check_count=Count('logs'), last_sync=Max('logs__last_sync'), + check_count=Count('logs'), + success_count=Count('logs__duration'), + last_sync=Max('logs__last_sync'), last_check=Max('logs__check_time'), duration_avg=Avg('logs__duration'), duration_stddev=StdDev('logs__duration') @@ -32,17 +34,6 @@ def get_mirror_statuses(cutoff=default_cutoff): d = log.check_time - log.last_sync delays.setdefault(log.url_id, []).append(d) - for url in urls: - if url.id in delays: - url_delays = delays[url.id] - d = sum(url_delays, datetime.timedelta()) / len(url_delays) - url.delay = d - hours = d.days * 24.0 + d.seconds / 3600.0 - url.score = hours + url.duration_avg + url.duration_stddev - else: - url.delay = None - url.score = None - if urls: last_check = max([u.last_check for u in urls]) num_checks = max([u.check_count for u in urls]) @@ -55,7 +46,21 @@ def get_mirror_statuses(cutoff=default_cutoff): num_checks = 0 check_frequency = None + for url in urls: + url.completion_pct = float(url.success_count) / num_checks + if url.id in delays: + url_delays = delays[url.id] + d = sum(url_delays, datetime.timedelta()) / len(url_delays) + url.delay = d + hours = d.days * 24.0 + d.seconds / 3600.0 + url.score = hours + url.duration_avg + url.duration_stddev + else: + url.delay = None + url.score = None + url.completion = 0.0 + return { + 'cutoff': cutoff, 'last_check': last_check, 'num_checks': num_checks, 'check_frequency': check_frequency, -- cgit v1.2.3-24-g4f1b