0002-api-ignore-deleted-users-when-using-update-get_or_cr.patch
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 |
- |