Skip to content

Commit d3b1552

Browse files
authored
Merge pull request #101 from novafloss/80_validate_data_through_api
Validate data through api Reviewed by @wo0dyn.
2 parents 5be5003 + 1068c4e commit d3b1552

File tree

4 files changed

+72
-3
lines changed

4 files changed

+72
-3
lines changed

demo/tests/tests_integration.py

+47-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from formidable.models import Formidable
1010
from formidable.accesses import get_accesses
1111
from formidable.forms import FormidableForm, fields
12-
from formidable import validators
12+
from formidable import validators, constants
1313

1414
form_data = {
1515
"label": "test create",
@@ -275,3 +275,49 @@ def test_jedi_form_form_invalid(self):
275275
form.errors['birth_date'][0],
276276
'You cannot be a jedi until your 21'
277277
)
278+
279+
280+
class MyForm(FormidableForm):
281+
first_name = fields.CharField(
282+
accesses={'padawan': constants.REQUIRED},
283+
)
284+
last_name = fields.CharField(
285+
accesses={'padawan': constants.REQUIRED},
286+
validators=[validators.MinLengthValidator(5)]
287+
)
288+
289+
290+
class TestValidationEndPoint(APITestCase):
291+
292+
def setUp(self):
293+
super(TestValidationEndPoint, self).setUp()
294+
self.formidable = MyForm.to_formidable(label='title')
295+
296+
def test_validate_data_ok(self):
297+
parameters = {
298+
'first_name': 'Guillaume',
299+
'last_name': 'Gérard',
300+
}
301+
session = self.client.session
302+
session['role'] = 'padawan'
303+
session.save()
304+
res = self.client.get(
305+
reverse('formidable:form_validation', args=[self.formidable.pk]),
306+
parameters, format='json'
307+
)
308+
self.assertEqual(res.status_code, 204)
309+
310+
def test_validate_data_ko(self):
311+
parameters = {
312+
'last_name': 'Gérard',
313+
}
314+
session = self.client.session
315+
session['role'] = 'padawan'
316+
session.save()
317+
res = self.client.get(
318+
reverse('formidable:form_validation', args=[self.formidable.pk]),
319+
parameters, format='json'
320+
)
321+
self.assertEqual(res.status_code, 400)
322+
errors = res.data
323+
self.assertIn('first_name', errors)

formidable/accesses.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ def get_accesses():
4646

4747
def get_context(request, kwargs):
4848
module, meth_name = settings.FORMIDABLE_CONTEXT_LOADER.rsplit('.', 1)
49-
mod = importlib.import_module(module, [meth_name])
49+
if six.PY3:
50+
mod = importlib.import_module(module)
51+
else:
52+
mod = importlib.import_module(module, [meth_name])
5053
meth = getattr(mod, meth_name)
5154
return meth(request, kwargs)

formidable/urls.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22

33
from formidable.views import FormidableDetail, FormidableCreate, AccessList
44
from formidable.views import ContextFormDetail
5-
from formidable.views import PresetsList
5+
from formidable.views import PresetsList, ValidateView
66

77
urlpatterns = patterns(
88
r'',
99
url(r'^forms/(?P<pk>\d+)/$', ContextFormDetail.as_view(),
1010
name='form_detail'),
11+
url(r'^forms/(?P<pk>\d+)/validate/$', ValidateView.as_view(),
12+
name='form_validation'),
1113
url(r'^builder/forms/(?P<pk>\d+)/$', FormidableDetail.as_view(),
1214
name='form_detail'),
1315
url(r'^builder/forms/$', FormidableCreate.as_view(), name='form_create'),

formidable/views.py

+18
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
RetrieveAPIView,
99
)
1010
from rest_framework.response import Response
11+
from rest_framework import exceptions
1112

1213
from formidable.models import Formidable, Field
1314
from formidable.serializers import FormidableSerializer, SimpleAccessSerializer
@@ -69,3 +70,20 @@ def get(self, request, format=None):
6970
instance=presets_declarations
7071
)
7172
return Response(serializer.data)
73+
74+
75+
class ValidateView(APIView):
76+
77+
def get(self, request, **kwargs):
78+
try:
79+
formidable = Formidable.objects.get(pk=kwargs['pk'])
80+
except Formidable.DoesNotExist:
81+
raise exceptions.Http404()
82+
83+
role = get_context(request, kwargs)
84+
form_class = formidable.get_django_form_class(role)
85+
form = form_class(data=request.GET)
86+
if form.is_valid():
87+
return Response(status=204)
88+
else:
89+
return Response(form.errors, status=400)

0 commit comments

Comments
 (0)