Auto map the protocol URL field
And perform better validation when doing so. Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
parent
b86b71f97d
commit
db1524fd64
@ -1,4 +1,5 @@
|
|||||||
import re
|
import re
|
||||||
|
from urlparse import urlparse, urlunsplit
|
||||||
|
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
@ -9,15 +10,26 @@ class MirrorUrlForm(forms.ModelForm):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = MirrorUrl
|
model = MirrorUrl
|
||||||
def clean_url(self):
|
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
|
# ensure we always save the URL with a trailing slash
|
||||||
url = self.cleaned_data["url"].strip()
|
path = url_parts.path
|
||||||
if url[-1] == '/':
|
if not path.endswith('/'):
|
||||||
return url
|
path += '/'
|
||||||
return url + '/'
|
url = urlunsplit((url_parts.scheme, url_parts.netloc, path, '', ''))
|
||||||
|
return url
|
||||||
|
|
||||||
class MirrorUrlInlineAdmin(admin.TabularInline):
|
class MirrorUrlInlineAdmin(admin.TabularInline):
|
||||||
model = MirrorUrl
|
model = MirrorUrl
|
||||||
form = MirrorUrlForm
|
form = MirrorUrlForm
|
||||||
|
readonly_fields = ('protocol',)
|
||||||
extra = 3
|
extra = 3
|
||||||
|
|
||||||
# ripped off from django.forms.fields, adding netmask ability
|
# ripped off from django.forms.fields, adding netmask ability
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.core.exceptions import ValidationError
|
||||||
|
|
||||||
|
from urlparse import urlparse
|
||||||
|
|
||||||
TIER_CHOICES = (
|
TIER_CHOICES = (
|
||||||
(0, 'Tier 0'),
|
(0, 'Tier 0'),
|
||||||
@ -50,11 +53,20 @@ class Meta:
|
|||||||
|
|
||||||
class MirrorUrl(models.Model):
|
class MirrorUrl(models.Model):
|
||||||
url = models.CharField(max_length=255)
|
url = models.CharField(max_length=255)
|
||||||
protocol = models.ForeignKey(MirrorProtocol, related_name="urls")
|
protocol = models.ForeignKey(MirrorProtocol, related_name="urls",
|
||||||
|
editable=False)
|
||||||
mirror = models.ForeignKey(Mirror, related_name="urls")
|
mirror = models.ForeignKey(Mirror, related_name="urls")
|
||||||
has_ipv4 = models.BooleanField("IPv4 capable", default=True)
|
has_ipv4 = models.BooleanField("IPv4 capable", default=True)
|
||||||
has_ipv6 = models.BooleanField("IPv6 capable", default=False)
|
has_ipv6 = models.BooleanField("IPv6 capable", default=False)
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
try:
|
||||||
|
# Auto-map the protocol field by looking at the URL
|
||||||
|
protocol = urlparse(self.url).scheme
|
||||||
|
self.protocol = MirrorProtocol.objects.get(protocol=protocol)
|
||||||
|
except Exception as e:
|
||||||
|
raise ValidationError(e)
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return self.url
|
return self.url
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user