0001-api-rely-on-DRF-validation-55367.patch
chrono/api/views.py | ||
---|---|---|
1113 | 1113 | |
1114 | 1114 |
slots = StringOrListField(required=True, child=serializers.CharField(max_length=160, allow_blank=False)) |
1115 | 1115 | |
1116 |
def validate(self, attrs): |
|
1117 |
super().validate(attrs) |
|
1118 |
if not attrs.get('slots'): |
|
1119 |
raise serializers.ValidationError({'slots': _('This field is required.')}) |
|
1120 |
return attrs |
|
1121 | ||
1122 | ||
1123 |
class EventSlotsSerializer(SlotsSerializer): |
|
1124 |
def validate(self, attrs): |
|
1125 |
super().validate(attrs) |
|
1126 |
if not attrs.get('user_external_id'): |
|
1127 |
raise serializers.ValidationError({'user_external_id': _('This field is required.')}) |
|
1128 |
return attrs |
|
1129 | ||
1116 | 1130 | |
1117 | 1131 |
class Fillslots(APIView): |
1118 | 1132 |
permission_classes = (permissions.IsAuthenticated,) |
... | ... | |
1156 | 1170 | |
1157 | 1171 |
if 'slots' in payload: |
1158 | 1172 |
slots = payload['slots'] |
1159 |
if not slots: |
|
1160 |
raise APIError( |
|
1161 |
_('slots list cannot be empty'), |
|
1162 |
err_class='slots list cannot be empty', |
|
1163 |
http_status=status.HTTP_400_BAD_REQUEST, |
|
1164 |
) |
|
1165 | 1173 | |
1166 | 1174 |
if 'count' in payload: |
1167 | 1175 |
places_count = payload['count'] |
... | ... | |
1535 | 1543 | |
1536 | 1544 |
class RecurringFillslots(APIView): |
1537 | 1545 |
permission_classes = (permissions.IsAuthenticated,) |
1538 |
serializer_class = SlotsSerializer |
|
1546 |
serializer_class = EventSlotsSerializer
|
|
1539 | 1547 | |
1540 |
def post(self, request, agenda_identifier=None, format=None):
|
|
1548 |
def post(self, request, agenda_identifier): |
|
1541 | 1549 |
if not settings.ENABLE_RECURRING_EVENT_BOOKING: |
1542 | 1550 |
raise Http404() |
1543 | 1551 | |
... | ... | |
1556 | 1564 |
) |
1557 | 1565 |
payload = serializer.validated_data |
1558 | 1566 | |
1559 |
user_external_id = payload.get('user_external_id') |
|
1560 |
if not user_external_id: |
|
1561 |
raise APIError( |
|
1562 |
_('user_external_id is required'), |
|
1563 |
err_class='user_external_id is required', |
|
1564 |
errors=serializer.errors, |
|
1565 |
http_status=status.HTTP_400_BAD_REQUEST, |
|
1566 |
) |
|
1567 | ||
1568 | 1567 |
open_event_slugs = set(agenda.get_open_recurring_events().values_list('slug', flat=True)) |
1569 | 1568 |
slots = collections.defaultdict(list) |
1570 | 1569 |
for slot in payload['slots']: |
tests/api/test_fillslot.py | ||
---|---|---|
370 | 370 |
# empty or missing slots |
371 | 371 |
resp = app.post_json('/api/agenda/%s/fillslots/' % agenda.id, params={'slots': []}, status=400) |
372 | 372 |
assert resp.json['err'] == 1 |
373 |
assert resp.json['reason'] == 'slots list cannot be empty' # legacy
|
|
374 |
assert resp.json['err_class'] == 'slots list cannot be empty'
|
|
375 |
assert resp.json['err_desc'] == 'slots list cannot be empty'
|
|
373 |
assert resp.json['reason'] == 'invalid payload' # legacy
|
|
374 |
assert resp.json['err_desc'] == 'invalid payload'
|
|
375 |
assert resp.json['errors']['slots'] == ['This field is required.']
|
|
376 | 376 |
resp = app.post_json('/api/agenda/%s/fillslots/' % agenda.id, status=400) |
377 | 377 |
assert resp.json['err'] == 1 |
378 |
assert resp.json['reason'] == 'slots list cannot be empty' # legacy |
|
379 |
assert resp.json['err_class'] == 'slots list cannot be empty' |
|
380 |
assert resp.json['err_desc'] == 'slots list cannot be empty' |
|
378 |
assert resp.json['reason'] == 'invalid payload' # legacy |
|
379 |
assert resp.json['err_desc'] == 'invalid payload' |
|
380 |
assert resp.json['errors']['slots'] == ['This field is required.'] |
|
381 |
resp = app.post_json('/api/agenda/%s/fillslots/' % agenda.id, params={'slots': ''}, status=400) |
|
382 |
assert resp.json['err'] == 1 |
|
383 |
assert resp.json['err_desc'] == 'invalid payload' |
|
384 |
assert resp.json['errors']['slots']['0'] == ['This field may not be blank.'] |
|
381 | 385 |
# invalid slots format |
382 | 386 |
resp = app.post_json('/api/agenda/%s/fillslots/' % agenda.id, params={'slots': 'foobar'}, status=400) |
383 | 387 |
assert resp.json['err'] == 1 |
... | ... | |
2182 | 2186 |
del params['user_external_id'] |
2183 | 2187 |
resp = app.post_json(fillslots_url, params=params, status=400) |
2184 | 2188 |
assert resp.json['err'] == 1 |
2185 |
assert resp.json['err_desc'] == 'user_external_id is required' |
|
2189 |
assert resp.json['err_desc'] == 'invalid payload' |
|
2190 |
assert resp.json['errors']['user_external_id'] == ['This field is required.'] |
|
2186 | 2191 | |
2187 | 2192 |
resp = app.post_json(fillslots_url, params={'user_external_id': 'a', 'slots': 'a:a'}, status=400) |
2188 | 2193 |
assert resp.json['err'] == 1 |
2189 |
- |