Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unique validator does not raises 500 when it requires a type coercion and it raises an exception #140

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
25 changes: 24 additions & 1 deletion tests/test_unique_validator.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand All @@ -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)

Expand Down Expand Up @@ -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']
13 changes: 11 additions & 2 deletions wtforms_alchemy/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand All @@ -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):
Expand Down Expand Up @@ -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(
Expand Down