Projet

Général

Profil

0002-api-ignore-deleted-users-when-using-update-get_or_cr.patch

Benjamin Dauvergne, 23 février 2021 15:15

Télécharger (3,15 ko)

Voir les différences:

Subject: [PATCH 2/2] api: ignore deleted users when using update/get_or_create
 (#51368)

 src/authentic2/api_mixins.py | 20 +++++++-------------
 tests/test_api.py            | 11 +++++++++++
 2 files changed, 18 insertions(+), 13 deletions(-)
src/authentic2/api_mixins.py
41 41
    def _get_lookup_keys(self, name):
42 42
        return self.request.GET.getlist(name)
43 43

  
44
    def _get_model_class(self):
45
        serializer_class = self.get_serializer_class()
46
        return serializer_class.Meta.model
47

  
48 44
    def _lookup_instance(self, keys):
49
        ModelClass = self._get_model_class()
50

  
51 45
        kwargs = {}
52 46
        for key in keys:
53 47
            try:
54 48
                kwargs[key] = self.request.data[key]
55 49
            except KeyError:
56 50
                raise ValidationError({api_settings.NON_FIELD_ERRORS_KEY: ['key %r is missing' % key]})
51

  
52
        qs = self.get_queryset()
57 53
        try:
58
            return ModelClass.objects.get(**kwargs)
59
        except ModelClass.DoesNotExist:
54
            return qs.get(**kwargs)
55
        except qs.model.DoesNotExist:
60 56
            return None
61
        except ModelClass.MultipleObjectsReturned:
57
        except qs.model.MultipleObjectsReturned:
62 58
            raise Conflict('retrieved several instances of model %s for key attributes %s' % (
63
                    ModelClass.__name__, kwargs))
59
                qs.model.__name__, kwargs))
64 60

  
65 61
    def _validate_get_keys(self, keys):
66
        ModelClass = self._get_model_class()
67

  
68 62
        # Remove many-to-many relationships from validated_data.
69 63
        # They are not valid arguments to the default `.create()` method,
70 64
        # as they require that the instance has already been saved.
71
        info = model_meta.get_field_info(ModelClass)
65
        info = model_meta.get_field_info(self.get_queryset().model)
72 66
        errors = []
73 67
        for key in keys:
74 68
            if key not in info.fields:
tests/test_api.py
1462 1462
    assert User.objects.get(id=id).password != password
1463 1463
    assert User.objects.get(id=id).check_password('secret')
1464 1464

  
1465
    # do not get deleted user, create a new one
1466
    User.objects.get(id=id).mark_as_deleted()
1467
    payload['last_name'] = 'Doe'
1468
    resp = app.post_json('/api/users/?get_or_create=email', params=payload, status=201)
1469
    assert id != resp.json['id']
1470
    id = resp.json['id']
1471
    assert User.objects.get(id=id).first_name == 'Jane'
1472
    assert User.objects.get(id=id).last_name == 'Doe'
1473
    assert User.objects.get(id=id).password != password
1474
    assert User.objects.get(id=id).check_password('secret')
1475

  
1465 1476

  
1466 1477
def test_api_users_get_or_create_email_is_unique(settings, app, admin):
1467 1478
    settings.A2_EMAIL_IS_UNIQUE = True
1468
-