summaryrefslogtreecommitdiffstats
path: root/mirrors/fields.py
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2013-04-10 21:00:17 -0500
committerDan McGee <dan@archlinux.org>2013-04-10 21:03:09 -0500
commit06e1e857abfdf7f95661d337ce3c315bd51fb837 (patch)
tree7d14e91e1b2f953c6ecfccaca4f315837f4e68a3 /mirrors/fields.py
parent90e969a160e1ec028ded1ca9b33975ec50fed154 (diff)
downloadarchweb-06e1e857abfdf7f95661d337ce3c315bd51fb837.tar.gz
archweb-06e1e857abfdf7f95661d337ce3c315bd51fb837.zip
Allow mirror rsync IPs to be IPv4/IPv6 addresses or networksrelease_2013-04-10
This gives us a bunch more flexibility on this field, and now supports all the options that the rsync config file supports. Signed-off-by: Dan McGee <dan@archlinux.org>
Diffstat (limited to 'mirrors/fields.py')
-rw-r--r--mirrors/fields.py49
1 files changed, 49 insertions, 0 deletions
diff --git a/mirrors/fields.py b/mirrors/fields.py
new file mode 100644
index 00000000..206c9d7d
--- /dev/null
+++ b/mirrors/fields.py
@@ -0,0 +1,49 @@
+from IPy import IP
+
+from django import forms
+from django.core import validators
+from django.core.exceptions import ValidationError
+from django.db import models
+from south.modelsinspector import add_introspection_rules
+
+
+class IPNetworkFormField(forms.Field):
+ def to_python(self, value):
+ if value in validators.EMPTY_VALUES:
+ return None
+ try:
+ value = IP(value)
+ except ValueError as e:
+ raise ValidationError(str(e))
+ return value
+
+
+class IPNetworkField(models.Field):
+ __metaclass__ = models.SubfieldBase
+ description = "IPv4 or IPv6 address or subnet"
+
+ def __init__(self, *args, **kwargs):
+ kwargs['max_length'] = 44
+ super(IPNetworkField, self).__init__(*args, **kwargs)
+
+ def get_internal_type(self):
+ return "IPAddressField"
+
+ def to_python(self, value):
+ if not value:
+ return None
+ return IP(value)
+
+ def get_prep_value(self, value):
+ value = self.to_python(value)
+ if not value:
+ return None
+ return str(value)
+
+ def formfield(self, **kwargs):
+ defaults = {'form_class': IPNetworkFormField}
+ defaults.update(kwargs)
+ return super(IPNetworkField, self).formfield(**defaults)
+
+
+add_introspection_rules([], ["^mirrors\.fields\.IPNetworkField"])