summaryrefslogtreecommitdiffstats
path: root/mirrors
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2010-09-22 01:58:34 +0200
committerDan McGee <dan@archlinux.org>2010-09-22 01:58:34 +0200
commit550ef2eeeb58a3899b612bf5f895b2ae962086a9 (patch)
tree0227750631a5eb062a24050d391a9438a9c586cf /mirrors
parent5b87b21ccdd5938acf81afed00ccf0d957f5047c (diff)
downloadarchweb-550ef2eeeb58a3899b612bf5f895b2ae962086a9.tar.gz
archweb-550ef2eeeb58a3899b612bf5f895b2ae962086a9.tar.xz
Allow generated mirrorlist to take status info into account
By using the mirror score we calculate, we can sort the mirrors in the generated mirrorlist for people. Signed-off-by: Dan McGee <dan@archlinux.org>
Diffstat (limited to 'mirrors')
-rw-r--r--mirrors/views.py26
1 files changed, 21 insertions, 5 deletions
diff --git a/mirrors/views.py b/mirrors/views.py
index 17f65cc..71c896d 100644
--- a/mirrors/views.py
+++ b/mirrors/views.py
@@ -9,10 +9,12 @@ from .models import Mirror, MirrorUrl, MirrorProtocol
from .utils import get_mirror_statuses, get_mirror_errors
import datetime
+from operator import attrgetter
class MirrorlistForm(forms.Form):
country = forms.MultipleChoiceField(required=False)
protocol = forms.MultipleChoiceField(required=False)
+ use_mirror_status = forms.BooleanField(required=False)
def __init__(self, *args, **kwargs):
super(MirrorlistForm, self).__init__(*args, **kwargs)
@@ -32,13 +34,14 @@ def generate_mirrorlist(request):
if form.is_valid():
countries = form.cleaned_data['country']
protocols = form.cleaned_data['protocol']
- return find_mirrors(request, countries, protocols)
+ use_status = form.cleaned_data['use_mirror_status']
+ return find_mirrors(request, countries, protocols, use_status)
else:
form = MirrorlistForm()
return direct_to_template(request, 'mirrors/index.html', {'mirrorlist_form': form})
-def find_mirrors(request, countries=None, protocols=None):
+def find_mirrors(request, countries=None, protocols=None, use_status=False):
if not protocols:
protocols = MirrorProtocol.objects.exclude(
protocol__iexact='rsync').values_list('protocol', flat=True)
@@ -48,12 +51,25 @@ def find_mirrors(request, countries=None, protocols=None):
)
if countries and 'all' not in countries:
qset = qset.filter(mirror__country__in=countries)
- qset = qset.order_by('mirror__country', 'mirror__name', 'url')
- return direct_to_template(request, 'mirrors/mirrorlist.txt', {
- 'mirror_urls': qset,
+ if not use_status:
+ urls = qset.order_by('mirror__country', 'mirror__name', 'url')
+ template = 'mirrors/mirrorlist.txt'
+ else:
+ scores = dict([(u.id, u.score) for u in get_mirror_statuses()])
+ urls = []
+ for u in qset:
+ u.score = scores[u.id]
+ if u.score and u.score < 100.0:
+ urls.append(u)
+ urls = sorted(urls, key=attrgetter('score'))
+ template = 'mirrors/mirrorlist_status.txt'
+
+ return direct_to_template(request, template, {
+ 'mirror_urls': urls,
},
mimetype='text/plain')
+
def status(request):
bad_timedelta = datetime.timedelta(days=3)
urls = get_mirror_statuses()