Esempio n. 1
0
 def test_generic_ipaddress_as_generic(self):
     # The edge cases of the IPv6 validation code are not deeply tested
     # here, they are covered in the tests for django.utils.ipv6
     f = GenericIPAddressField()
     self.assertFormErrors(['This field is required.'], f.clean, '')
     self.assertFormErrors(['This field is required.'], f.clean, None)
     self.assertEqual(f.clean(' 127.0.0.1 '), '127.0.0.1')
     self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean,
                           'foo')
     self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean,
                           '127.0.0.')
     self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean,
                           '1.2.3.4.5')
     self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean,
                           '256.125.1.5')
     self.assertEqual(f.clean(' fe80::223:6cff:fe8a:2e8a '),
                      'fe80::223:6cff:fe8a:2e8a')
     self.assertEqual(f.clean(' 2a02::223:6cff:fe8a:2e8a '),
                      '2a02::223:6cff:fe8a:2e8a')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean,
                           '12345:2:3:4')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean,
                           '1::2:3::4')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean,
                           'foo::223:6cff:fe8a:2e8a')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean,
                           '1::2:3:4:5:6:7:8')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean,
                           '1:2')
Esempio n. 2
0
 def test_generic_ipaddress_as_ipv6_only(self):
     f = GenericIPAddressField(protocol="IPv6")
     self.assertFormErrors(['This field is required.'], f.clean, '')
     self.assertFormErrors(['This field is required.'], f.clean, None)
     self.assertFormErrors(['Enter a valid IPv6 address.'], f.clean,
                           '127.0.0.1')
     self.assertFormErrors(['Enter a valid IPv6 address.'], f.clean, 'foo')
     self.assertFormErrors(['Enter a valid IPv6 address.'], f.clean,
                           '127.0.0.')
     self.assertFormErrors(['Enter a valid IPv6 address.'], f.clean,
                           '1.2.3.4.5')
     self.assertFormErrors(['Enter a valid IPv6 address.'], f.clean,
                           '256.125.1.5')
     self.assertEqual(f.clean(' fe80::223:6cff:fe8a:2e8a '),
                      'fe80::223:6cff:fe8a:2e8a')
     self.assertEqual(f.clean(' 2a02::223:6cff:fe8a:2e8a '),
                      '2a02::223:6cff:fe8a:2e8a')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean,
                           '12345:2:3:4')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean,
                           '1::2:3::4')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean,
                           'foo::223:6cff:fe8a:2e8a')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean,
                           '1::2:3:4:5:6:7:8')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean,
                           '1:2')
Esempio n. 3
0
 def test_generic_ipaddress_as_ipv4_only(self):
     f = GenericIPAddressField(protocol="IPv4")
     self.assertFormErrors(["This field is required."], f.clean, "")
     self.assertFormErrors(["This field is required."], f.clean, None)
     self.assertEqual(f.clean(" 127.0.0.1 "), "127.0.0.1")
     self.assertFormErrors(["Enter a valid IPv4 address."], f.clean, "foo")
     self.assertFormErrors(["Enter a valid IPv4 address."], f.clean, "127.0.0.")
     self.assertFormErrors(["Enter a valid IPv4 address."], f.clean, "1.2.3.4.5")
     self.assertFormErrors(["Enter a valid IPv4 address."], f.clean, "256.125.1.5")
     self.assertFormErrors(["Enter a valid IPv4 address."], f.clean, "fe80::223:6cff:fe8a:2e8a")
     self.assertFormErrors(["Enter a valid IPv4 address."], f.clean, "2a02::223:6cff:fe8a:2e8a")
Esempio n. 4
0
 def test_generic_ipaddress_as_ipv4_only(self):
     f = GenericIPAddressField(protocol="IPv4")
     self.assertFormErrors(['This field is required.'], f.clean, '')
     self.assertFormErrors(['This field is required.'], f.clean, None)
     self.assertEqual(f.clean(' 127.0.0.1 '), '127.0.0.1')
     self.assertFormErrors(['Enter a valid IPv4 address.'], f.clean, 'foo')
     self.assertFormErrors(['Enter a valid IPv4 address.'], f.clean, '127.0.0.')
     self.assertFormErrors(['Enter a valid IPv4 address.'], f.clean, '1.2.3.4.5')
     self.assertFormErrors(['Enter a valid IPv4 address.'], f.clean, '256.125.1.5')
     self.assertFormErrors(['Enter a valid IPv4 address.'], f.clean, 'fe80::223:6cff:fe8a:2e8a')
     self.assertFormErrors(['Enter a valid IPv4 address.'], f.clean, '2a02::223:6cff:fe8a:2e8a')
Esempio n. 5
0
 def test_generic_ipaddress_as_ipv4_only(self):
     f = GenericIPAddressField(protocol="IPv4")
     self.assertFormErrors(['This field is required.'], f.clean, '')
     self.assertFormErrors(['This field is required.'], f.clean, None)
     self.assertEqual(f.clean(' 127.0.0.1 '), '127.0.0.1')
     self.assertFormErrors(['Enter a valid IPv4 address.'], f.clean, 'foo')
     self.assertFormErrors(['Enter a valid IPv4 address.'], f.clean, '127.0.0.')
     self.assertFormErrors(['Enter a valid IPv4 address.'], f.clean, '1.2.3.4.5')
     self.assertFormErrors(['Enter a valid IPv4 address.'], f.clean, '256.125.1.5')
     self.assertFormErrors(['Enter a valid IPv4 address.'], f.clean, 'fe80::223:6cff:fe8a:2e8a')
     self.assertFormErrors(['Enter a valid IPv4 address.'], f.clean, '2a02::223:6cff:fe8a:2e8a')
Esempio n. 6
0
    def test_generic_ipaddress_normalization(self):
        # Test the normalizing code
        f = GenericIPAddressField()
        self.assertEqual(f.clean(' ::ffff:0a0a:0a0a  '), '::ffff:10.10.10.10')
        self.assertEqual(f.clean(' ::ffff:10.10.10.10  '), '::ffff:10.10.10.10')
        self.assertEqual(f.clean(' 2001:000:a:0000:0:fe:fe:beef  '), '2001:0:a::fe:fe:beef')
        self.assertEqual(f.clean(' 2001::a:0000:0:fe:fe:beef  '), '2001:0:a::fe:fe:beef')

        f = GenericIPAddressField(unpack_ipv4=True)
        self.assertEqual(f.clean(' ::ffff:0a0a:0a0a'), '10.10.10.10')
Esempio n. 7
0
 def test_generic_ipaddress_as_generic_not_required(self):
     f = GenericIPAddressField(required=False)
     self.assertEqual(f.clean(''), '')
     self.assertEqual(f.clean(None), '')
     self.assertEqual(f.clean('127.0.0.1'), '127.0.0.1')
     self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean, 'foo')
     self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean, '127.0.0.')
     self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean, '1.2.3.4.5')
     self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean, '256.125.1.5')
     self.assertEqual(f.clean(' fe80::223:6cff:fe8a:2e8a '), 'fe80::223:6cff:fe8a:2e8a')
     self.assertEqual(f.clean(' 2a02::223:6cff:fe8a:2e8a '), '2a02::223:6cff:fe8a:2e8a')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '12345:2:3:4')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '1::2:3::4')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, 'foo::223:6cff:fe8a:2e8a')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '1::2:3:4:5:6:7:8')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '1:2')
Esempio n. 8
0
class ApiKeyForm(ModelForm):
    """
    Generate a random API key if one isn't provided.
    """
    class Meta:
        model = ApiKey
        fields = ('key', 'logged_ip', 'last_used', 'dataset')

    key = CharField(
        max_length=KEY_SIZE,
        required=False,
        help_text=u'If not provided, a random key will be generated.')

    logged_ip = GenericIPAddressField(required=False)

    def clean(self):
        apikey = self.cleaned_data.get('key') or ''
        if not apikey:
            # 'key' is required, but we want to allow generating it
            # server-side.  so we remove its errors if it's not
            # provided.  Note that we can't just define
            # self.clean_key() because that's never called if the key
            # isn't provided.
            self._errors.pop('key', None)
            apikey = generate_unique_api_key()
            self.cleaned_data['key'] = apikey
            if hasattr(self, 'clean_key'):
                # NOW we can call this...
                self.cleaned_data['key'] = self.clean_key()

        # For logged IP, convert blank to NULL
        self.cleaned_data['logged_ip'] = self.cleaned_data.get(
            'logged_ip') or None
        return self.cleaned_data
Esempio n. 9
0
 def test_generic_ipaddress_as_generic_not_required(self):
     f = GenericIPAddressField(required=False)
     self.assertEqual(f.clean(""), "")
     self.assertEqual(f.clean(None), "")
     self.assertEqual(f.clean("127.0.0.1"), "127.0.0.1")
     self.assertFormErrors(["Enter a valid IPv4 or IPv6 address."], f.clean, "foo")
     self.assertFormErrors(["Enter a valid IPv4 or IPv6 address."], f.clean, "127.0.0.")
     self.assertFormErrors(["Enter a valid IPv4 or IPv6 address."], f.clean, "1.2.3.4.5")
     self.assertFormErrors(["Enter a valid IPv4 or IPv6 address."], f.clean, "256.125.1.5")
     self.assertEqual(f.clean(" fe80::223:6cff:fe8a:2e8a "), "fe80::223:6cff:fe8a:2e8a")
     self.assertEqual(f.clean(" 2a02::223:6cff:fe8a:2e8a "), "2a02::223:6cff:fe8a:2e8a")
     self.assertFormErrors(["This is not a valid IPv6 address."], f.clean, "12345:2:3:4")
     self.assertFormErrors(["This is not a valid IPv6 address."], f.clean, "1::2:3::4")
     self.assertFormErrors(["This is not a valid IPv6 address."], f.clean, "foo::223:6cff:fe8a:2e8a")
     self.assertFormErrors(["This is not a valid IPv6 address."], f.clean, "1::2:3:4:5:6:7:8")
     self.assertFormErrors(["This is not a valid IPv6 address."], f.clean, "1:2")
Esempio n. 10
0
 def test_generic_ipaddress_as_ipv6_only(self):
     f = GenericIPAddressField(protocol="IPv6")
     self.assertFormErrors(['This field is required.'], f.clean, '')
     self.assertFormErrors(['This field is required.'], f.clean, None)
     self.assertFormErrors(['Enter a valid IPv6 address.'], f.clean, '127.0.0.1')
     self.assertFormErrors(['Enter a valid IPv6 address.'], f.clean, 'foo')
     self.assertFormErrors(['Enter a valid IPv6 address.'], f.clean, '127.0.0.')
     self.assertFormErrors(['Enter a valid IPv6 address.'], f.clean, '1.2.3.4.5')
     self.assertFormErrors(['Enter a valid IPv6 address.'], f.clean, '256.125.1.5')
     self.assertEqual(f.clean(' fe80::223:6cff:fe8a:2e8a '), 'fe80::223:6cff:fe8a:2e8a')
     self.assertEqual(f.clean(' 2a02::223:6cff:fe8a:2e8a '), '2a02::223:6cff:fe8a:2e8a')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '12345:2:3:4')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '1::2:3::4')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, 'foo::223:6cff:fe8a:2e8a')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '1::2:3:4:5:6:7:8')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '1:2')
Esempio n. 11
0
 def test_generic_ipaddressfield(self):
     e = {
         "required": "REQUIRED",
         "invalid": "INVALID IP ADDRESS",
     }
     f = GenericIPAddressField(error_messages=e)
     self.assertFormErrors(["REQUIRED"], f.clean, "")
     self.assertFormErrors(["INVALID IP ADDRESS"], f.clean, "127.0.0")
 def test_generic_ipaddressfield(self):
     e = {
         'required': 'REQUIRED',
         'invalid': 'INVALID IP ADDRESS',
     }
     f = GenericIPAddressField(error_messages=e)
     self.assertFormErrors(['REQUIRED'], f.clean, '')
     self.assertFormErrors(['INVALID IP ADDRESS'], f.clean, '127.0.0')
Esempio n. 13
0
 def test_generic_ipaddress_as_generic_not_required(self):
     f = GenericIPAddressField(required=False)
     self.assertEqual(f.clean(''), '')
     self.assertEqual(f.clean(None), '')
     self.assertEqual(f.clean('127.0.0.1'), '127.0.0.1')
     self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean,
                           'foo')
     self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean,
                           '127.0.0.')
     self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean,
                           '1.2.3.4.5')
     self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean,
                           '256.125.1.5')
     self.assertEqual(f.clean(' fe80::223:6cff:fe8a:2e8a '),
                      'fe80::223:6cff:fe8a:2e8a')
     self.assertEqual(f.clean(' 2a02::223:6cff:fe8a:2e8a '),
                      '2a02::223:6cff:fe8a:2e8a')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean,
                           '12345:2:3:4')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean,
                           '1::2:3::4')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean,
                           'foo::223:6cff:fe8a:2e8a')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean,
                           '1::2:3:4:5:6:7:8')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean,
                           '1:2')
Esempio n. 14
0
 def test_generic_ipaddress_as_generic(self):
     # The edge cases of the IPv6 validation code are not deeply tested
     # here, they are covered in the tests for django.utils.ipv6
     f = GenericIPAddressField()
     self.assertFormErrors(['This field is required.'], f.clean, '')
     self.assertFormErrors(['This field is required.'], f.clean, None)
     self.assertEqual(f.clean(' 127.0.0.1 '), '127.0.0.1')
     self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean, 'foo')
     self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean, '127.0.0.')
     self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean, '1.2.3.4.5')
     self.assertFormErrors(['Enter a valid IPv4 or IPv6 address.'], f.clean, '256.125.1.5')
     self.assertEqual(f.clean(' fe80::223:6cff:fe8a:2e8a '), 'fe80::223:6cff:fe8a:2e8a')
     self.assertEqual(f.clean(' 2a02::223:6cff:fe8a:2e8a '), '2a02::223:6cff:fe8a:2e8a')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '12345:2:3:4')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '1::2:3::4')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, 'foo::223:6cff:fe8a:2e8a')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '1::2:3:4:5:6:7:8')
     self.assertFormErrors(['This is not a valid IPv6 address.'], f.clean, '1:2')
Esempio n. 15
0
 def test_generic_ipaddress_as_generic(self):
     # The edge cases of the IPv6 validation code are not deeply tested
     # here, they are covered in the tests for django.utils.ipv6
     f = GenericIPAddressField()
     self.assertFormErrors(["This field is required."], f.clean, "")
     self.assertFormErrors(["This field is required."], f.clean, None)
     self.assertEqual(f.clean(" 127.0.0.1 "), "127.0.0.1")
     self.assertFormErrors(["Enter a valid IPv4 or IPv6 address."], f.clean, "foo")
     self.assertFormErrors(["Enter a valid IPv4 or IPv6 address."], f.clean, "127.0.0.")
     self.assertFormErrors(["Enter a valid IPv4 or IPv6 address."], f.clean, "1.2.3.4.5")
     self.assertFormErrors(["Enter a valid IPv4 or IPv6 address."], f.clean, "256.125.1.5")
     self.assertEqual(f.clean(" fe80::223:6cff:fe8a:2e8a "), "fe80::223:6cff:fe8a:2e8a")
     self.assertEqual(f.clean(" 2a02::223:6cff:fe8a:2e8a "), "2a02::223:6cff:fe8a:2e8a")
     self.assertFormErrors(["This is not a valid IPv6 address."], f.clean, "12345:2:3:4")
     self.assertFormErrors(["This is not a valid IPv6 address."], f.clean, "1::2:3::4")
     self.assertFormErrors(["This is not a valid IPv6 address."], f.clean, "foo::223:6cff:fe8a:2e8a")
     self.assertFormErrors(["This is not a valid IPv6 address."], f.clean, "1::2:3:4:5:6:7:8")
     self.assertFormErrors(["This is not a valid IPv6 address."], f.clean, "1:2")
Esempio n. 16
0
    def test_generic_ipaddress_normalization(self):
        # Test the normalising code
        f = GenericIPAddressField()
        self.assertEqual(f.clean(' ::ffff:0a0a:0a0a  '), '::ffff:10.10.10.10')
        self.assertEqual(f.clean(' ::ffff:10.10.10.10  '), '::ffff:10.10.10.10')
        self.assertEqual(f.clean(' 2001:000:a:0000:0:fe:fe:beef  '), '2001:0:a::fe:fe:beef')
        self.assertEqual(f.clean(' 2001::a:0000:0:fe:fe:beef  '), '2001:0:a::fe:fe:beef')

        f = GenericIPAddressField(unpack_ipv4=True)
        self.assertEqual(f.clean(' ::ffff:0a0a:0a0a'), '10.10.10.10')
Esempio n. 17
0
    def test_generic_ipaddress_normalization(self):
        # Test the normalizing code
        f = GenericIPAddressField()
        self.assertEqual(f.clean(" ::ffff:0a0a:0a0a  "), "::ffff:10.10.10.10")
        self.assertEqual(f.clean(" ::ffff:10.10.10.10  "), "::ffff:10.10.10.10")
        self.assertEqual(f.clean(" 2001:000:a:0000:0:fe:fe:beef  "), "2001:0:a::fe:fe:beef")
        self.assertEqual(f.clean(" 2001::a:0000:0:fe:fe:beef  "), "2001:0:a::fe:fe:beef")

        f = GenericIPAddressField(unpack_ipv4=True)
        self.assertEqual(f.clean(" ::ffff:0a0a:0a0a"), "10.10.10.10")
Esempio n. 18
0
class AllFieldTypesForm(Form):
    char = CharField()
    int_ = IntegerField()
    date = DateField()
    time = TimeField()
    datetime_ = DateTimeField()
    regex = RegexField(regex='^[a-f]{3}$')
    email = EmailField()
    file = FileField()
    # image = ImageField()
    url = URLField()
    bool = BooleanField()
    nullbool = NullBooleanField()
    choice = ChoiceField(choices=(('test choice', 'yay test choice'), ))
    multichoice = MultipleChoiceField(choices=(
        ('test choice', 'yay test choice'),
        ('test choice 2', 'yay another choice'),
        ('test choice 3', 'yay test choice'),
    ))
    float = FloatField()
    decimal = DecimalField()
    ip = IPAddressField()
    generic_ip = GenericIPAddressField()
    filepath = FilePathField(path=tempfile.gettempdir(),
                             allow_files=True,
                             allow_folders=True)
    slug = SlugField()
    typed_choice = TypedChoiceField(choices=(
        (1, 'test'),
        (2, 'test 2'),
        (3, 'bah'),
    ),
                                    coerce=int)
    typed_multichoice = TypedMultipleChoiceField(choices=(
        (1, 'test'),
        (2, 'test 2'),
        (3, 'bah'),
    ),
                                                 coerce=int)
    model_choice = ModelChoiceField(queryset=get_user_model().objects.all())
    model_multichoice = ModelMultipleChoiceField(
        queryset=get_user_model().objects.all())
Esempio n. 19
0
 def test_generic_ipaddress_as_ipv4_only(self):
     f = GenericIPAddressField(protocol="IPv4")
     with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
         f.clean("")
     with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
         f.clean(None)
     self.assertEqual(f.clean(" 127.0.0.1 "), "127.0.0.1")
     with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"):
         f.clean("foo")
     with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"):
         f.clean("127.0.0.")
     with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"):
         f.clean("1.2.3.4.5")
     with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"):
         f.clean("256.125.1.5")
     with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"):
         f.clean("fe80::223:6cff:fe8a:2e8a")
     with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 address.'"):
         f.clean("2a02::223:6cff:fe8a:2e8a")
Esempio n. 20
0
 def test_generic_ipaddress_as_generic_not_required(self):
     f = GenericIPAddressField(required=False)
     self.assertEqual(f.clean(""), "")
     self.assertEqual(f.clean(None), "")
     self.assertEqual(f.clean("127.0.0.1"), "127.0.0.1")
     with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 or IPv6 address.'"):
         f.clean("foo")
     with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 or IPv6 address.'"):
         f.clean("127.0.0.")
     with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 or IPv6 address.'"):
         f.clean("1.2.3.4.5")
     with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv4 or IPv6 address.'"):
         f.clean("256.125.1.5")
     self.assertEqual(f.clean(" fe80::223:6cff:fe8a:2e8a "), "fe80::223:6cff:fe8a:2e8a")
     self.assertEqual(f.clean(" 2a02::223:6cff:fe8a:2e8a "), "2a02::223:6cff:fe8a:2e8a")
     with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
         f.clean("12345:2:3:4")
     with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
         f.clean("1::2:3::4")
     with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
         f.clean("foo::223:6cff:fe8a:2e8a")
     with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
         f.clean("1::2:3:4:5:6:7:8")
     with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
         f.clean("1:2")
 def test_generic_ipaddress_as_ipv6_only(self):
     f = GenericIPAddressField(protocol="IPv6")
     with self.assertRaisesMessage(ValidationError,
                                   "'This field is required.'"):
         f.clean('')
     with self.assertRaisesMessage(ValidationError,
                                   "'This field is required.'"):
         f.clean(None)
     with self.assertRaisesMessage(ValidationError,
                                   "'Enter a valid IPv6 address.'"):
         f.clean('127.0.0.1')
     with self.assertRaisesMessage(ValidationError,
                                   "'Enter a valid IPv6 address.'"):
         f.clean('foo')
     with self.assertRaisesMessage(ValidationError,
                                   "'Enter a valid IPv6 address.'"):
         f.clean('127.0.0.')
     with self.assertRaisesMessage(ValidationError,
                                   "'Enter a valid IPv6 address.'"):
         f.clean('1.2.3.4.5')
     with self.assertRaisesMessage(ValidationError,
                                   "'Enter a valid IPv6 address.'"):
         f.clean('256.125.1.5')
     self.assertEqual(f.clean(' fe80::223:6cff:fe8a:2e8a '),
                      'fe80::223:6cff:fe8a:2e8a')
     self.assertEqual(f.clean(' 2a02::223:6cff:fe8a:2e8a '),
                      '2a02::223:6cff:fe8a:2e8a')
     with self.assertRaisesMessage(ValidationError,
                                   "'This is not a valid IPv6 address.'"):
         f.clean('12345:2:3:4')
     with self.assertRaisesMessage(ValidationError,
                                   "'This is not a valid IPv6 address.'"):
         f.clean('1::2:3::4')
     with self.assertRaisesMessage(ValidationError,
                                   "'This is not a valid IPv6 address.'"):
         f.clean('foo::223:6cff:fe8a:2e8a')
     with self.assertRaisesMessage(ValidationError,
                                   "'This is not a valid IPv6 address.'"):
         f.clean('1::2:3:4:5:6:7:8')
     with self.assertRaisesMessage(ValidationError,
                                   "'This is not a valid IPv6 address.'"):
         f.clean('1:2')
 def test_generic_ipaddress_invalid_arguments(self):
     with self.assertRaises(ValueError):
         GenericIPAddressField(protocol='hamster')
     with self.assertRaises(ValueError):
         GenericIPAddressField(protocol='ipv4', unpack_ipv4=True)
Esempio n. 23
0
    def __init__(self, *args, **kwargs):
        """Custom model form constructor to account for custom related objects,
        i.e. instances of (subclasses of) `FilterSetFilterField`. """
        super(FilterSetForm, self).__init__(*args, **kwargs)

        # Define all filter set filter fields for which we want form fields
        # The "choice" field contains the list of available options.
        # Multiselect form fields that load their choices asynchronously define
        # a "load" value, used to identify the DMARC aggregate report field
        # from which the options should be loaded.
        # See `views.choices_async` and `widgets.MultiSelectWidget`
        # The "label" value is used as text for the corresponding HTML label
        # element, "class" identifies the corresponding model class (subclass
        # of `FilterSetFilterField`), and "type" defines the allowed type of
        # the form value, used for Django's auto sanitization/type coercion.
        self.multiselect_filter_fields = {
            "report_sender": {
                "load": "reporter",
                "label": "Reporter(s)",
                "class": ReportSender,
                "type": str
            },
            "report_receiver_domain": {
                "load": "reportee",
                "label": "Reportee(s)",
                "class": ReportReceiverDomain,
                "type": str
            },
            "raw_dkim_domain": {
                "load": "dkim_domain",
                "label": "DKIM Domain(s)",
                "class": RawDkimDomain,
                "type": str
            },
            "raw_spf_domain": {
                "load": "spf_domain",
                "label": "SPF Domain(s)",
                "class": RawSpfDomain,
                "type": str
            },
            "raw_dkim_result": {
                "choices": choices.DKIM_RESULT,
                "label": "DKIM Result(s)",
                "class": RawDkimResult,
                "type": int
            },
            "raw_spf_result": {
                "choices": choices.SPF_RESULT,
                "label": "SPF Result(s)",
                "class": RawSpfResult,
                "type": int
            },
            "aligned_dkim_result": {
                "choices": choices.DMARC_RESULT,
                "label": "Aligned DKIM Result(s)",
                "class": AlignedDkimResult,
                "type": int
            },
            "aligned_spf_result": {
                "choices": choices.DMARC_RESULT,
                "label": "Aligned SPF Result(s)",
                "class": AlignedSpfResult,
                "type": int
            },
            "disposition": {
                "choices": choices.DISPOSITION_TYPE,
                "label": "Disposition(s)",
                "class": Disposition,
                "type": int
            }
        }

        # Initialize `FilterSetFilterField` form fields from dict defined above
        # The keyword arguments passed to the `MultiSelectWidget` constructor
        # are only relevant for multiselect elements that load their options
        # dynamically.
        for field_name, field_dict in self.multiselect_filter_fields.items():
            self.fields[field_name] = AsyncTypedMultipleChoiceField(
                coerce=field_dict.get("type"),
                required=False,
                label=field_dict.get("label"),
                choices=field_dict.get("choices", ()),
                widget=MultiSelectWidget(
                    **{
                        "load": field_dict.get("load", ""),
                        "action": reverse("choices_async")
                    }))

            # If the corresponding model objects already exists (i.e. on edit)
            # the selected options should also be shown as selected in the form
            if self.instance.id:
                self.fields[field_name].initial = list(
                    field_dict["class"].objects.filter(
                        foreign_key=self.instance.id).values_list("value",
                                                                  flat=True))

                # For multiselect fields that load their options asynchronously
                # we have to add already selected options to the field's
                # choices attribute
                if not field_dict.get("choices"):
                    self.fields[field_name].choices = [
                        (value, value)
                        for value in self.fields[field_name].initial
                    ]

        # Define additional non-multiselect filter set filter field form fields
        # Currently, there can at most be one `SourceIP` and one `MultipleDkim`
        # object on a filter set. See `models.FilterSetFilterField`'s docstring
        # for more info about why these filters have their own class and aren't
        # attributes of a `FilterSet` object.
        self.fields["source_ip"] = GenericIPAddressField(
            required=False, label="Mail Sender IP")
        self.fields["multiple_dkim"] = BooleanField(required=False,
                                                    label="Multiple DKIM only")

        # Fill fields with existing data if any
        if self.instance.id:
            source_ip_initial = SourceIP.objects.filter(
                foreign_key=self.instance.id).values_list("value", flat=True)

            if len(source_ip_initial):
                self.fields["source_ip"].initial = source_ip_initial[0]

            multiple_dkim_initial = MultipleDkim.objects.filter(
                foreign_key=self.instance.id).values_list("value", flat=True)

            if len(multiple_dkim_initial):
                self.fields["multiple_dkim"].initial = multiple_dkim_initial[0]
 def test_generic_ipaddress_as_ipv6_only(self):
     f = GenericIPAddressField(protocol="IPv6")
     with self.assertRaisesMessage(ValidationError,
                                   "'This field is required.'"):
         f.clean("")
     with self.assertRaisesMessage(ValidationError,
                                   "'This field is required.'"):
         f.clean(None)
     with self.assertRaisesMessage(ValidationError,
                                   "'Enter a valid IPv6 address.'"):
         f.clean("127.0.0.1")
     with self.assertRaisesMessage(ValidationError,
                                   "'Enter a valid IPv6 address.'"):
         f.clean("foo")
     with self.assertRaisesMessage(ValidationError,
                                   "'Enter a valid IPv6 address.'"):
         f.clean("127.0.0.")
     with self.assertRaisesMessage(ValidationError,
                                   "'Enter a valid IPv6 address.'"):
         f.clean("1.2.3.4.5")
     with self.assertRaisesMessage(ValidationError,
                                   "'Enter a valid IPv6 address.'"):
         f.clean("256.125.1.5")
     self.assertEqual(f.clean(" fe80::223:6cff:fe8a:2e8a "),
                      "fe80::223:6cff:fe8a:2e8a")
     self.assertEqual(f.clean(" 2a02::223:6cff:fe8a:2e8a "),
                      "2a02::223:6cff:fe8a:2e8a")
     with self.assertRaisesMessage(ValidationError,
                                   "'This is not a valid IPv6 address.'"):
         f.clean("12345:2:3:4")
     with self.assertRaisesMessage(ValidationError,
                                   "'This is not a valid IPv6 address.'"):
         f.clean("1::2:3::4")
     with self.assertRaisesMessage(ValidationError,
                                   "'This is not a valid IPv6 address.'"):
         f.clean("foo::223:6cff:fe8a:2e8a")
     with self.assertRaisesMessage(ValidationError,
                                   "'This is not a valid IPv6 address.'"):
         f.clean("1::2:3:4:5:6:7:8")
     with self.assertRaisesMessage(ValidationError,
                                   "'This is not a valid IPv6 address.'"):
         f.clean("1:2")
 def test_generic_ipaddress_as_ipv6_only(self):
     f = GenericIPAddressField(protocol="IPv6")
     with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
         f.clean('')
     with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
         f.clean(None)
     with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"):
         f.clean('127.0.0.1')
     with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"):
         f.clean('foo')
     with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"):
         f.clean('127.0.0.')
     with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"):
         f.clean('1.2.3.4.5')
     with self.assertRaisesMessage(ValidationError, "'Enter a valid IPv6 address.'"):
         f.clean('256.125.1.5')
     self.assertEqual(f.clean(' fe80::223:6cff:fe8a:2e8a '), 'fe80::223:6cff:fe8a:2e8a')
     self.assertEqual(f.clean(' 2a02::223:6cff:fe8a:2e8a '), '2a02::223:6cff:fe8a:2e8a')
     with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
         f.clean('12345:2:3:4')
     with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
         f.clean('1::2:3::4')
     with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
         f.clean('foo::223:6cff:fe8a:2e8a')
     with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
         f.clean('1::2:3:4:5:6:7:8')
     with self.assertRaisesMessage(ValidationError, "'This is not a valid IPv6 address.'"):
         f.clean('1:2')
 def test_generic_ipaddress_as_generic(self):
     # The edge cases of the IPv6 validation code are not deeply tested
     # here, they are covered in the tests for django.utils.ipv6
     f = GenericIPAddressField()
     with self.assertRaisesMessage(ValidationError,
                                   "'This field is required.'"):
         f.clean("")
     with self.assertRaisesMessage(ValidationError,
                                   "'This field is required.'"):
         f.clean(None)
     self.assertEqual(f.clean(" 127.0.0.1 "), "127.0.0.1")
     with self.assertRaisesMessage(ValidationError,
                                   "'Enter a valid IPv4 or IPv6 address.'"):
         f.clean("foo")
     with self.assertRaisesMessage(ValidationError,
                                   "'Enter a valid IPv4 or IPv6 address.'"):
         f.clean("127.0.0.")
     with self.assertRaisesMessage(ValidationError,
                                   "'Enter a valid IPv4 or IPv6 address.'"):
         f.clean("1.2.3.4.5")
     with self.assertRaisesMessage(ValidationError,
                                   "'Enter a valid IPv4 or IPv6 address.'"):
         f.clean("256.125.1.5")
     self.assertEqual(f.clean(" fe80::223:6cff:fe8a:2e8a "),
                      "fe80::223:6cff:fe8a:2e8a")
     self.assertEqual(f.clean(" 2a02::223:6cff:fe8a:2e8a "),
                      "2a02::223:6cff:fe8a:2e8a")
     with self.assertRaisesMessage(ValidationError,
                                   "'This is not a valid IPv6 address.'"):
         f.clean("12345:2:3:4")
     with self.assertRaisesMessage(ValidationError,
                                   "'This is not a valid IPv6 address.'"):
         f.clean("1::2:3::4")
     with self.assertRaisesMessage(ValidationError,
                                   "'This is not a valid IPv6 address.'"):
         f.clean("foo::223:6cff:fe8a:2e8a")
     with self.assertRaisesMessage(ValidationError,
                                   "'This is not a valid IPv6 address.'"):
         f.clean("1::2:3:4:5:6:7:8")
     with self.assertRaisesMessage(ValidationError,
                                   "'This is not a valid IPv6 address.'"):
         f.clean("1:2")