diff --git a/tests/test_unique_validator.py b/tests/test_unique_validator.py index e03a511..7716b06 100644 --- a/tests/test_unique_validator.py +++ b/tests/test_unique_validator.py @@ -2,11 +2,17 @@ from pytest import mark, raises from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship +from sqlalchemy_utils import PhoneNumberType from wtforms import Form from wtforms.fields import TextField from tests import MultiDict -from wtforms_alchemy import ModelForm, QuerySelectField, Unique +from wtforms_alchemy import ( + ModelForm, + PhoneNumberField, + QuerySelectField, + Unique +) base = declarative_base() @@ -22,6 +28,10 @@ class User(base): id = sa.Column(sa.Integer, primary_key=True) name = sa.Column(sa.Unicode(255), unique=True) email = sa.Column(sa.Unicode(255)) + phone = sa.Column( + PhoneNumberType(region='ES', max_length=25), + unique=True + ) favorite_color_id = sa.Column(sa.Integer, sa.ForeignKey(Color.id)) favorite_color = relationship(Color) @@ -372,3 +382,16 @@ class MyForm(ModelForm): form = MyForm(MultiDict({'name': u'someone'})) assert form.validate() + + def test_invalid_unique_phone_no_500_error(self): + class MyForm(ModelForm): + phone = PhoneNumberField( + validators=[Unique(User.phone)], + region='ES' + ) + + form = MyForm(MultiDict({'phone': u'abc$%ยท'})) + form.validate() + assert len(form.errors['phone']) == 2 + assert 'Not a valid phone number value' in form.errors['phone'] + assert 'Unable to check uniqueness.' in form.errors['phone'] diff --git a/wtforms_alchemy/validators.py b/wtforms_alchemy/validators.py index cfee413..5addb4c 100644 --- a/wtforms_alchemy/validators.py +++ b/wtforms_alchemy/validators.py @@ -3,6 +3,7 @@ import six from sqlalchemy import Column from sqlalchemy.orm.attributes import InstrumentedAttribute +from sqlalchemy_utils import PhoneNumberParseException, PhoneNumberType from wtforms import ValidationError @@ -25,13 +26,18 @@ class Unique(object): parameter. :param message: The error message. + :param message_uncheck + The error message when the attempt to check uniqueness cannot be + carried out, i.e. the query throws an exception. """ field_flags = ('unique', ) - def __init__(self, column, get_session=None, message=None): + def __init__(self, column, get_session=None, message=None, + message_uncheck=u'Unable to check uniqueness.'): self.column = column self.message = message self.get_session = get_session + self.message_uncheck = message_uncheck @property def query(self): @@ -76,7 +82,10 @@ def __call__(self, form, field): for field_name, column in columns: query = query.filter(column == form[field_name].data) - obj = query.first() + try: + obj = query.first() + except PhoneNumberParseException: + raise ValidationError(self.message_uncheck) if not hasattr(form, '_obj'): raise Exception(