Projet

Général

Profil

0001-api-rely-on-DRF-validation-55367.patch

Valentin Deniaud, 02 août 2021 16:07

Télécharger (4,9 ko)

Voir les différences:

Subject: [PATCH 1/3] api: rely on DRF validation (#55367)

 chrono/api/views.py        | 33 ++++++++++++++++-----------------
 tests/api/test_fillslot.py | 17 ++++++++++-------
 2 files changed, 26 insertions(+), 24 deletions(-)
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['err_desc'] == 'invalid payload'
374
    assert resp.json['errors']['slots'] == ['This field is required.']
376 375
    resp = app.post_json('/api/agenda/%s/fillslots/' % agenda.id, status=400)
377 376
    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'
377
    assert resp.json['err_desc'] == 'invalid payload'
378
    assert resp.json['errors']['slots'] == ['This field is required.']
379
    resp = app.post_json('/api/agenda/%s/fillslots/' % agenda.id, params={'slots': ''}, status=400)
380
    assert resp.json['err'] == 1
381
    assert resp.json['err_desc'] == 'invalid payload'
382
    assert resp.json['errors']['slots']['0'] == ['This field may not be blank.']
381 383
    # invalid slots format
382 384
    resp = app.post_json('/api/agenda/%s/fillslots/' % agenda.id, params={'slots': 'foobar'}, status=400)
383 385
    assert resp.json['err'] == 1
......
2182 2184
    del params['user_external_id']
2183 2185
    resp = app.post_json(fillslots_url, params=params, status=400)
2184 2186
    assert resp.json['err'] == 1
2185
    assert resp.json['err_desc'] == 'user_external_id is required'
2187
    assert resp.json['err_desc'] == 'invalid payload'
2188
    assert resp.json['errors']['user_external_id'] == ['This field is required.']
2186 2189

  
2187 2190
    resp = app.post_json(fillslots_url, params={'user_external_id': 'a', 'slots': 'a:a'}, status=400)
2188 2191
    assert resp.json['err'] == 1
2189
-