Add a basic mirror details page

Still some work to do here, but this covers the basics of the public view we
can show for mirrors and their associated data. The upstream and downstream
links should be working OK to aid navigation, but right now we have some
potential dead links for non-authenticated users if they click a link to a
"private" mirror.

Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Dan McGee 2010-09-23 18:50:56 -05:00
parent 1c6099f4b2
commit bc5a5781bf
5 changed files with 78 additions and 1 deletions

View File

@ -31,6 +31,12 @@ def supported_protocols(self):
urls__mirror=self).order_by('protocol').distinct()
return ", ".join([p.protocol for p in protocols])
def downstream(self):
return Mirror.objects.filter(upstream=self).order_by('name')
def get_absolute_url(self):
return '/mirrors/%s/' % self.name
class MirrorProtocol(models.Model):
protocol = models.CharField(max_length=10, unique=True)
def __unicode__(self):

View File

@ -1,6 +1,8 @@
from django import forms
from django.db.models import Avg, Count, Max, Min, StdDev
from django.db.models import Q
from django.http import Http404
from django.shortcuts import get_object_or_404
from django.views.decorators.csrf import csrf_exempt
from django.views.generic.simple import direct_to_template
@ -77,6 +79,15 @@ def mirrors(request):
return direct_to_template(request, 'mirrors/mirrors.html',
{'mirror_list': mirrors})
def mirror_details(request, name):
mirror = get_object_or_404(Mirror, name=name)
if not request.user.is_authenticated() and \
(not mirror.public or not mirror.active):
# TODO: maybe this should be 403? but that would leak existence
raise Http404
return direct_to_template(request, 'mirrors/mirror_details.html',
{'mirror': mirror})
def status(request):
bad_timedelta = datetime.timedelta(days=3)
status_info = get_mirror_statuses()

View File

@ -0,0 +1,58 @@
{% extends "base.html" %}
{% block title %}Arch Linux - {{ mirror.name }} - Mirror Details{% endblock %}
{% block content %}
<!-- TODO: ids and classes -->
<div id="pkgdetails" class="box">
<h2>Mirror Details: {{ mirror.name }}</h2>
<table id="pkginfo">
<tr>
<th>Name:</th>
<td>{{ mirror.name }}</td>
</tr><tr>
<th>Tier:</th>
<td>{{ mirror.get_tier_display }}</td>
</tr><tr>
<th>Upstream:</th>
<!-- TODO: linking to non-public mirrors -->
<td>{% if mirror.upstream %}
<a href="{{ mirror.upstream.get_absolute_url }}"
title="Mirror details for {{ mirror.upstream.name }}">{{ mirror.upstream.name }}</a>
{% else %}None{% endif %}</td>
</tr><tr>
<th>Downstream:</th>
{% with mirror.downstream as ds_mirrors %}
<td>{% if ds_mirrors %}
{% for ds in ds_mirrors %}
<a href="{{ ds.get_absolute_url }}"
title="Mirror details for {{ ds.name }}">{{ ds.name }}</a><br/>
{% endfor %}
{% else %}None{% endif %}
</td>
{% endwith %}
</tr><tr>
<th>Country:</th>
<td>{{ mirror.country }}</td>
</tr><tr>
<th>Has ISOs:</th>
<td>{{ mirror.isos|yesno }}</td>
</tr><tr>
<th>Protocols:</th>
<td>{{ mirror.supported_protocols }}</td>
</tr><tr>
<th>Mirror URLs:</th>
{% with mirror.urls.all as urls %}
<td>{% if urls %}
{% for u in urls %}
<a href="{{ u.url }}">{{ u.url }}</a><br/>
{% endfor %}
{% else %}None{% endif %}
</td>
{% endwith %}
</tr>
</table>
</div>
{% endblock %}

View File

@ -24,7 +24,8 @@ <h2>Mirror Overview</h2>
<tbody>
{% for mirror in mirror_list %}
<tr class="{% cycle 'odd' 'even' %}">
<td>{{mirror.name}}</td>
<td><a href="{{ mirror.get_absolute_url }}"
title="Mirror details for {{ mirror.name }}">{{ mirror.name }}</a></td>
<td>{{mirror.get_tier_display}}</td>
<td>{{mirror.country}}</td>
<td>{{mirror.isos|yesno}}</td>

View File

@ -73,6 +73,7 @@
(r'^mirrors/$', 'mirrors.views.mirrors', {}, 'mirrors-list'),
(r'^mirrors/status/$', 'mirrors.views.status', {}, 'mirror-status'),
(r'^mirrors/(?P<name>[\.\-\w]+)/$', 'mirrors.views.mirror_details'),
(r'^mirrorlist/$', 'mirrors.views.generate_mirrorlist', {}, 'mirrorlist'),
(r'^mirrorlist/all/$', 'mirrors.views.find_mirrors', {'countries': ['all']}),