diff options
author | Nicolás Reynolds <fauno@kiwwwi.com.ar> | 2011-03-06 11:05:57 -0300 |
---|---|---|
committer | Nicolás Reynolds <fauno@kiwwwi.com.ar> | 2011-03-06 11:05:57 -0300 |
commit | 3aa14c9fbec24f5049e12a8dbb5ce059d2c8f5f3 (patch) | |
tree | 28755cf0ae66b145d752358c1f722c2d095e877a /mirrors/models.py | |
parent | c738e2c8f687f3417b90c951254121cce491843a (diff) | |
parent | 65e965c8f76677904f5d98965e13bf89726247d4 (diff) |
Merge branch 'master' of git://projects.archlinux.org/archweb
Conflicts:
media/archweb.css
public/views.py
urls.py
Diffstat (limited to 'mirrors/models.py')
-rw-r--r-- | mirrors/models.py | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/mirrors/models.py b/mirrors/models.py index e070b1cd..401821a8 100644 --- a/mirrors/models.py +++ b/mirrors/models.py @@ -1,4 +1,8 @@ from django.db import models +from django.core.exceptions import ValidationError + +import socket +from urlparse import urlparse TIER_CHOICES = ( (0, 'Tier 0'), @@ -47,13 +51,43 @@ class MirrorProtocol(models.Model): class Meta: verbose_name = 'Mirror Protocol' + ordering = ('protocol',) class MirrorUrl(models.Model): 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") - has_ipv4 = models.BooleanField("IPv4 capable", default=True) - has_ipv6 = models.BooleanField("IPv6 capable", default=False) + has_ipv4 = models.BooleanField("IPv4 capable", default=True, + editable=False) + has_ipv6 = models.BooleanField("IPv6 capable", default=False, + editable=False) + + def address_families(self): + hostname = urlparse(self.url).hostname + info = socket.getaddrinfo(hostname, None, 0, socket.SOCK_STREAM) + families = [x[0] for x in info] + return families + + @property + def hostname(self): + return urlparse(self.url).hostname + + 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) + try: + families = self.address_families() + self.has_ipv4 = socket.AF_INET in families + self.has_ipv6 = socket.AF_INET6 in families + except socket.error as e: + # We don't fail in this case; we'll just set both to False + self.has_ipv4 = False + self.has_ipv6 = False def __unicode__(self): return self.url |