From db1524fd64e8b5c0f43cfed7643034ee764f55fd Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sun, 27 Feb 2011 12:31:06 -0600 Subject: Auto map the protocol URL field And perform better validation when doing so. Signed-off-by: Dan McGee --- mirrors/admin.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'mirrors/admin.py') diff --git a/mirrors/admin.py b/mirrors/admin.py index 6990cca2..f6a72cf0 100644 --- a/mirrors/admin.py +++ b/mirrors/admin.py @@ -1,4 +1,5 @@ import re +from urlparse import urlparse, urlunsplit from django import forms from django.contrib import admin @@ -9,15 +10,26 @@ class MirrorUrlForm(forms.ModelForm): class Meta: model = MirrorUrl 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',) extra = 3 # ripped off from django.forms.fields, adding netmask ability -- cgit v1.2.3-2-g168b From 6d5909ca5dc8934cacd969e964573989dc6b0417 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sun, 27 Feb 2011 12:44:30 -0600 Subject: Auto-resolve mirror URLs on save This prevents people from having to mess with these checkboxes at all in the admin, and we incur no delay on their initial values being correct waiting for the cron job to run. Signed-off-by: Dan McGee --- mirrors/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'mirrors/admin.py') diff --git a/mirrors/admin.py b/mirrors/admin.py index f6a72cf0..b9c2876a 100644 --- a/mirrors/admin.py +++ b/mirrors/admin.py @@ -29,7 +29,7 @@ class MirrorUrlForm(forms.ModelForm): class MirrorUrlInlineAdmin(admin.TabularInline): model = MirrorUrl form = MirrorUrlForm - readonly_fields = ('protocol',) + readonly_fields = ('protocol', 'has_ipv4', 'has_ipv6') extra = 3 # ripped off from django.forms.fields, adding netmask ability -- cgit v1.2.3-2-g168b