summaryrefslogtreecommitdiff
path: root/mirrors/admin.py
diff options
context:
space:
mode:
Diffstat (limited to 'mirrors/admin.py')
-rw-r--r--mirrors/admin.py80
1 files changed, 59 insertions, 21 deletions
diff --git a/mirrors/admin.py b/mirrors/admin.py
index 394b3508..16a97ea2 100644
--- a/mirrors/admin.py
+++ b/mirrors/admin.py
@@ -1,61 +1,99 @@
-import re
+from datetime import datetime
+from urlparse import urlparse, urlunsplit
from django import forms
from django.contrib import admin
-from .models import Mirror, MirrorProtocol, MirrorUrl, MirrorRsync
+from .models import (Mirror, MirrorProtocol, MirrorUrl, MirrorRsync,
+ CheckLocation)
+
class MirrorUrlForm(forms.ModelForm):
class Meta:
model = MirrorUrl
+ fields = ('url', 'country', 'bandwidth', 'active')
+
def clean_url(self):
+ # is this a valid-looking URL?
+ url_parts = urlparse(self.cleaned_data["url"])
+ if not url_parts.scheme:
+ raise forms.ValidationError("No URL scheme (protocol) provided.")
+ if not url_parts.netloc:
+ raise forms.ValidationError("No URL host provided.")
+ if url_parts.params or url_parts.query or url_parts.fragment:
+ raise forms.ValidationError(
+ "URL parameters, query, and fragment elements are not supported.")
# ensure we always save the URL with a trailing slash
- url = self.cleaned_data["url"].strip()
- if url[-1] == '/':
- return url
- return url + '/'
+ path = url_parts.path
+ if not path.endswith('/'):
+ path += '/'
+ url = urlunsplit((url_parts.scheme, url_parts.netloc, path, '', ''))
+ return url
+
class MirrorUrlInlineAdmin(admin.TabularInline):
model = MirrorUrl
form = MirrorUrlForm
+ readonly_fields = ('protocol', 'has_ipv4', 'has_ipv6')
extra = 3
-# ripped off from django.forms.fields, adding netmask ability
-ipv4nm_re = re.compile(r'^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}(/(\d|[1-2]\d|3[0-2])){0,1}$')
-class IPAddressNetmaskField(forms.fields.RegexField):
- default_error_messages = {
- 'invalid': u'Enter a valid IPv4 address, possibly including netmask.',
- }
-
- def __init__(self, *args, **kwargs):
- super(IPAddressNetmaskField, self).__init__(ipv4nm_re, *args, **kwargs)
class MirrorRsyncForm(forms.ModelForm):
class Meta:
model = MirrorRsync
- ip = IPAddressNetmaskField(label='IP')
+ fields = ('ip',)
+
class MirrorRsyncInlineAdmin(admin.TabularInline):
model = MirrorRsync
form = MirrorRsyncForm
extra = 2
+
class MirrorAdminForm(forms.ModelForm):
class Meta:
model = Mirror
- upstream = forms.ModelChoiceField(queryset=Mirror.objects.filter(tier__gte=0, tier__lte=1), required=False)
+ fields = ('name', 'tier', 'upstream', 'admin_email', 'alternate_email',
+ 'public', 'active', 'isos', 'rsync_user', 'rsync_password',
+ 'bug', 'notes')
+
+ upstream = forms.ModelChoiceField(
+ queryset=Mirror.objects.filter(tier__gte=0, tier__lte=1),
+ required=False)
+
class MirrorAdmin(admin.ModelAdmin):
form = MirrorAdminForm
- list_display = ('name', 'tier', 'country', 'active', 'public', 'isos', 'admin_email', 'supported_protocols')
- list_filter = ('tier', 'country', 'active', 'public')
- search_fields = ('name',)
+ list_display = ('name', 'tier', 'active', 'public',
+ 'isos', 'admin_email', 'alternate_email')
+ list_filter = ('tier', 'active', 'public')
+ search_fields = ('name', 'admin_email', 'alternate_email')
+ readonly_fields = ('created', 'last_modified')
inlines = [
MirrorUrlInlineAdmin,
MirrorRsyncInlineAdmin,
]
+ def save_model(self, request, obj, form, change):
+ if '~~~' in obj.notes:
+ date = datetime.utcnow().strftime('%Y-%m-%d')
+ usertext = request.user.get_full_name()
+ obj.notes = obj.notes.replace('~~~', '%s (%s)' % (date, usertext))
+ obj.save()
+
+
+class MirrorProtocolAdmin(admin.ModelAdmin):
+ list_display = ('protocol', 'is_download', 'default')
+ list_filter = ('is_download', 'default')
+
+
+class CheckLocationAdmin(admin.ModelAdmin):
+ list_display = ('hostname', 'source_ip', 'country', 'created')
+ search_fields = ('hostname', 'source_ip')
+
+
admin.site.register(Mirror, MirrorAdmin)
-admin.site.register(MirrorProtocol)
+admin.site.register(MirrorProtocol, MirrorProtocolAdmin)
+admin.site.register(CheckLocation, CheckLocationAdmin)
# vim: set ts=4 sw=4 et: