Skip to content

Commit 77ad92c

Browse files
author
Sylvain Delabye
authored
Merge pull request #294 from peopledoc/allow-post-method-validation-endpoint
Allow post method validation endpoint
2 parents 459ef6e + 42dc9dc commit 77ad92c

File tree

6 files changed

+96
-14
lines changed

6 files changed

+96
-14
lines changed

CHANGELOG.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ ChangeLog
55
master (unreleased)
66
===================
77

8+
- Allow POST method for form validation endpoint. This version is the last to support the GET verb for the validation endpoint. We'll drop it in the next version.
89
- [Documentation] Fixed a missing ``cd`` in docs. You can't run pytest from project root (#293).
910

1011
Release 1.2.1 (2018-01-12)

demo/tests/test_integration.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -391,11 +391,15 @@ class MyForm(FormidableForm):
391391
class TestValidationEndPoint(FormidableAPITestCase):
392392

393393
url = 'formidable:form_validation'
394+
method = 'get'
394395

395396
def setUp(self):
396397
super(TestValidationEndPoint, self).setUp()
397398
self.formidable = MyForm.to_formidable(label='title')
398399

400+
def get_method(self):
401+
return getattr(self.client, self.method)
402+
399403
def test_validate_data_ok(self):
400404
parameters = {
401405
'first_name': 'Guillaume',
@@ -404,7 +408,8 @@ def test_validate_data_ok(self):
404408
session = self.client.session
405409
session['role'] = 'padawan'
406410
session.save()
407-
res = self.client.get(
411+
func = self.get_method()
412+
res = func(
408413
reverse(self.url, args=[self.formidable.pk]),
409414
parameters, format='json'
410415
)
@@ -419,7 +424,8 @@ def test_formidable_does_not_exist(self):
419424
session = self.client.session
420425
session['role'] = 'padawan'
421426
session.save()
422-
res = self.client.get(
427+
func = self.get_method()
428+
res = func(
423429
reverse(self.url, args=[9999]),
424430
parameters, format='json'
425431
)
@@ -432,7 +438,8 @@ def test_validate_data_ko(self):
432438
session = self.client.session
433439
session['role'] = 'padawan'
434440
session.save()
435-
res = self.client.get(
441+
func = self.get_method()
442+
res = func(
436443
reverse(self.url, args=[self.formidable.pk]),
437444
parameters, format='json'
438445
)
@@ -452,7 +459,8 @@ class WithFile(FormidableForm):
452459
session = self.client.session
453460
session['role'] = 'padawan'
454461
session.save()
455-
res = self.client.get(
462+
func = self.get_method()
463+
res = func(
456464
reverse(self.url, args=[formidable.pk]),
457465
parameters, format='json'
458466
)
@@ -493,7 +501,8 @@ class WithFile(FormidableForm):
493501

494502
# The checkbox is checked.
495503
parameters = {'checkbox': True}
496-
res = self.client.get(
504+
func = self.get_method()
505+
res = func(
497506
reverse(self.url, args=[formidable.pk]),
498507
parameters, format='json'
499508
)
@@ -503,7 +512,8 @@ class WithFile(FormidableForm):
503512

504513
# The checkbox is NOT checked.
505514
parameters = {'checkbox': False}
506-
res = self.client.get(
515+
func = self.get_method()
516+
res = func(
507517
reverse(self.url, args=[formidable.pk]),
508518
parameters, format='json'
509519
)
@@ -514,3 +524,8 @@ class WithFile(FormidableForm):
514524
class TestValidationFromSchemaEndPoint(TestValidationEndPoint):
515525

516526
url = 'form_validation_schema'
527+
528+
529+
class TestValidationWithPostMethod(TestValidationEndPoint):
530+
531+
method = 'post'

docs/package-lock.json

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/source/_static/specs/formidable.js

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,29 @@ var spec = {
482482
}
483483
}
484484
},
485-
"summary": "Validate a form"
485+
"summary": "Validate a form (GET method). GET and POST are equivalent, but GET is deprecated."
486+
},
487+
"post": {
488+
"parameters": [
489+
{
490+
"in": "path",
491+
"name": "id",
492+
"required": true,
493+
"type": "integer"
494+
}
495+
],
496+
"responses": {
497+
"204": {
498+
"description": "Validation OK"
499+
},
500+
"400": {
501+
"description": "Validation KO",
502+
"schema": {
503+
"$ref": "#/definitions/InputError"
504+
}
505+
}
506+
},
507+
"summary": "Validate a form (POST method). GET and POST are equivalent."
486508
}
487509
}
488510
},

docs/swagger/formidable.yml

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,21 @@ paths:
133133

134134
/forms/{id}/validate/:
135135
get:
136-
summary: Validate a form
136+
summary: Validate a form (GET method). GET and POST are equivalent, but GET is deprecated.
137+
parameters:
138+
- name: id
139+
in: path
140+
type: integer
141+
required: true
142+
responses:
143+
204:
144+
description: Validation OK
145+
400:
146+
description: Validation KO
147+
schema:
148+
$ref: '#/definitions/InputError'
149+
post:
150+
summary: Validate a form (POST method). GET and POST are equivalent.
137151
parameters:
138152
- name: id
139153
in: path

formidable/views.py

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from __future__ import unicode_literals
44

55
import logging
6+
import warnings
67

78
from django.conf import settings
89
from django.core.exceptions import ImproperlyConfigured
@@ -239,19 +240,29 @@ def build(self, role):
239240
def get_formidable_object(self, kwargs):
240241
return Formidable.objects.get(pk=kwargs['pk'])
241242

242-
def get(self, request, **kwargs):
243+
def post(self, request, **kwargs):
243244
try:
244245
formidable = self.get_formidable_object(kwargs)
245246
except Formidable.DoesNotExist:
246247
raise exceptions.NotFound()
247248

248249
form_class = self.get_form_class(formidable)
249-
form = self.get_form(form_class)
250+
form = self.get_form(form_class, request)
250251
if form.is_valid():
251252
return self.form_valid(form)
252253
else:
253254
return self.form_invalid(form)
254255

256+
def get(self, request, **kwargs):
257+
"""
258+
GET method is deprecated in favor of POST
259+
260+
"""
261+
warnings.warn('GET method for form validation has been deprecated in '
262+
'favor of POST. Please use POST instead of GET.',
263+
category=DeprecationWarning)
264+
return self.post(request, **kwargs)
265+
255266
def get_form_class(self, formidable):
256267
return formidable.get_django_form_class(
257268
**self.get_form_class_kwargs()
@@ -275,11 +286,17 @@ def form_invalid(self, form):
275286
# return Response(data, status=400)
276287
return Response(form.errors, status=status.HTTP_400_BAD_REQUEST)
277288

278-
def get_form(self, form_class):
279-
return form_class(**self.get_form_kwargs())
289+
def get_form(self, form_class, request):
290+
return form_class(**self.get_form_kwargs(request))
291+
292+
def get_form_kwargs(self, request):
293+
"""
294+
Return form_data.
280295
281-
def get_form_kwargs(self):
282-
return {'data': self.request.GET}
296+
"""
297+
if request.method == 'GET':
298+
return {'data': request.GET}
299+
return {'data': request.data}
283300

284301

285302
class ValidateViewFromSchema(ValidateView):

0 commit comments

Comments
 (0)