from wtforms.validators import Optional


class ConditionalValidator(object):
    def __init__(self, other_field_name, other_data_contents, dependent_validator):
        self.other_field_name = other_field_name
        self.other_data_contents = other_data_contents
        self.dependent_validator = dependent_validator

    def __call__(self, form, field):
        other_field = form._fields.get(self.other_field_name)
        if other_field is None:
            raise Exception('no field named "%s" in form' % self.other_field_name)
        if other_field.data in self.other_data_contents:
            self.dependent_validator.__call__(form, field)
        else:
            Optional().__call__(form, field)
