示例#1
0
    def test_strict_code_or_value_case_insensitive(self):
        """
        If strict it validates against the value OR the code
        """
        for field in self.strict_lookup_fields:
            lookup_values = util_model.get_field_lookup_values(field)
            lookup_codes = [code for code in util_model.get_field_lookup_codes(field) if code]
            for value in lookup_values:
                valid, message = validate_lookup(field, value)
                self.assertTrue(valid)
                self.assertIsNone(message)
                # test case insensitive
                valid, message = validate_lookup(field, value.capitalize().swapcase())
                self.assertTrue(valid)
                self.assertIsNone(message)
            for value in lookup_codes:
                self.assertTrue(validate_lookup(field, value)[0])
                # test case insensitive
                self.assertTrue(validate_lookup(field, value.capitalize().swapcase())[0])
                # test blank is not accepted
                valid, message = validate_lookup(field, "")
                self.assertFalse(valid)
                # test that there's a message
                self.assertTrue(message)

                # test that boolean, none, int doesn't break anything
                for weird in ["", 12, None, True, {}, []]:
                    valid, message = validate_lookup(field, weird)
                    self.assertFalse(valid)
                    # test that there's a message
                    self.assertTrue(message)

                # random
                randoms = [str(random.randint(1783, 6900)), "dhgd6sdkcdfdee765&"]
                for r in randoms:
                    valid, message = validate_lookup(field, r)
                    self.assertFalse(valid)
                    # test that there's a message
                    self.assertTrue(message)
示例#2
0
def to_lookup_raise(field, value, commit=True, default=None):
    """
    Rules:
        validate only for 'strict' lookups
        validate against code or values (case insensitive)
        deprecated lookups are rejected.
    """
    if is_blank(value):
        return default
    if not util_model.is_lookup_field(field):
        raise FieldErrorException("{field} is not a lookup".format(field=field))
    lookup_model = field.related_model
    value = str(value) if value is not None else None  # operate on string only
    # search for lookup code first and value after (case insensitive)
    lookup = lookup_model.objects.filter(code__iexact=value).first() \
             or lookup_model.objects.filter(value__iexact=value).first()
    if lookup is None:
        # can't find. If lookup is strict, it's an error
        if util_model.is_strict_lookup_field(field):
            codes = [str(c) for c in util_model.get_field_lookup_codes(field)]
            values = [str(v) for v in util_model.get_field_lookup_values(field)]
            accepted_values = codes + values
            message = "{value} is not an authorized lookup value for {field}. Should be one of: {values}" \
                .format(value=value, field=field.verbose_name, values=accepted_values)
            raise FieldErrorException(message)
        elif value is not None and len(value.strip()) > 0:
            # if not strict we add a new lookup in the value.
            lookup = lookup_model(value=value)
            if commit:
                lookup.save()
    elif lookup.deprecated:
        message = "{value} is a deprecated value for {field}" \
            .format(value=value, field=field.verbose_name)
        raise FieldErrorException(message)

    return lookup