diff options
-rw-r--r-- | mirrors/views.py | 22 | ||||
-rw-r--r-- | templates/mirrors/index.html | 19 | ||||
-rw-r--r-- | urls.py | 4 |
3 files changed, 31 insertions, 14 deletions
diff --git a/mirrors/views.py b/mirrors/views.py index fbff697d..aaafc1be 100644 --- a/mirrors/views.py +++ b/mirrors/views.py @@ -3,18 +3,22 @@ from django.db.models import Q from django.shortcuts import render_to_response from django.template import RequestContext from django.views.decorators.csrf import csrf_exempt -from main.models import Mirror, MirrorUrl +from main.models import Mirror, MirrorUrl, MirrorProtocol from main.utils import make_choice class MirrorlistForm(forms.Form): country = forms.MultipleChoiceField(required=False) + protocol = forms.MultipleChoiceField(required=False) def __init__(self, *args, **kwargs): super(MirrorlistForm, self).__init__(*args, **kwargs) mirrors = Mirror.objects.filter(active=True).values_list( 'country', flat=True).distinct().order_by('country') - self.fields['country'].choices = make_choice( - [mirror for mirror in mirrors]) + self.fields['country'].choices = make_choice(mirrors) + protos = make_choice( + MirrorProtocol.objects.exclude(protocol__iexact='rsync')) + self.fields['protocol'].choices = protos + self.fields['protocol'].initial = [t[0] for t in protos] @csrf_exempt def generate(request): @@ -22,17 +26,21 @@ def generate(request): form = MirrorlistForm(data=request.REQUEST) if form.is_valid(): countries = form.cleaned_data['country'] - return find_mirrors(request, countries) + protocols = form.cleaned_data['protocol'] + return find_mirrors(request, countries, protocols) else: form = MirrorlistForm() return render_to_response('mirrors/index.html', {'mirrorlist_form': form}, context_instance=RequestContext(request)) -def find_mirrors(request, countries=None): +def find_mirrors(request, countries=None, protocols=None): + print 'protocols', protocols + if not protocols: + protocols = MirrorProtocol.objects.exclude( + protocol__iexact='rsync').values_list('protocol', flat=True) qset = MirrorUrl.objects.select_related().filter( - Q(protocol__protocol__iexact='HTTP') | - Q(protocol__protocol__iexact='FTP'), + protocol__protocol__in=protocols, mirror__public=True, mirror__active=True, mirror__isos=True ) if countries and 'all' not in countries: diff --git a/templates/mirrors/index.html b/templates/mirrors/index.html index f6db74f1..8c193bae 100644 --- a/templates/mirrors/index.html +++ b/templates/mirrors/index.html @@ -15,18 +15,23 @@ <h3>Mirrorlist with all available mirrors</h3> - <p>You can get an up-to-date - <a href="all/">mirrorlist containing all available mirrors</a>. - This URL requires no GET or POST parameters so can be fetched from the - command line if desired.<p> + <p>An up-to-date mirrorlist is available containing all currently active + mirrors, optionally filtering by protocol. These URLs requires no GET or + POST parameters so they can be fetched from the command line if desired.<p> + + <ul> + <li><a href="all/">All mirrors</a></li> + <li><a href="all/ftp/">All mirrors, FTP only</a></li> + <li><a href="all/http/">All mirrors, HTTP only</a></li> + </ul> <h3>Customized by country mirrorlist</h3> <p>The following form can generate a custom up-to-date <a href="http://wiki.archlinux.org/index.php/Pacman" - title="ArchWiki: Pacman">pacman</a> mirrorlist based on geography. - Simply replace the contents of <code>/etc/pacman.d/mirrorlist</code> with - the generated code.</p> + title="ArchWiki: Pacman">pacman</a> mirrorlist based on geography and + desired protocol(s). Simply replace the contents of + <code>/etc/pacman.d/mirrorlist</code> with your generated list.</p> <form id="list-generator" method="get"> {{ mirrorlist_form.as_p }} @@ -67,6 +67,10 @@ urlpatterns = patterns('', (r'^mirrorlist/$', 'mirrors.views.generate', {}, 'mirrorlist'), (r'^mirrorlist/all/$', 'mirrors.views.find_mirrors', {'countries': ['all']}), + (r'^mirrorlist/all/ftp/$', 'mirrors.views.find_mirrors', + {'countries': ['all'], 'protocols': ['ftp']}), + (r'^mirrorlist/all/http/$', 'mirrors.views.find_mirrors', + {'countries': ['all'], 'protocols': ['http']}), (r'^devel/$', 'devel.views.index'), (r'^devel/notify/$', 'devel.views.change_notify'), |