From 3803763c531caa5647682a7ad89b1b509e692202 Mon Sep 17 00:00:00 2001 From: Marcelo Moreira de Mello Date: Thu, 16 Jul 2020 17:45:07 -0400 Subject: [PATCH 1/2] Exposes the User.created attribute via API Signed-off-by: Marcelo Moreira de Mello --- awx/api/filters.py | 5 +++++ awx/main/models/__init__.py | 6 ++++++ awx/main/tests/functional/api/test_user.py | 6 ++++++ 3 files changed, 17 insertions(+) diff --git a/awx/api/filters.py b/awx/api/filters.py index d7b6c5dd0b..6d51441c28 100644 --- a/awx/api/filters.py +++ b/awx/api/filters.py @@ -257,6 +257,11 @@ class FieldLookupBackend(BaseFilterBackend): if key in self.RESERVED_NAMES: continue + # HACK: make `created` available via API for the Django User ORM model + # so it keep compatiblity with other objects which exposes the `created` attr. + if queryset.model._meta.object_name == 'User' and key.startswith('created'): + key = key.replace('created', 'date_joined') + # HACK: Make job event filtering by host name mostly work even # when not capturing job event hosts M2M. if queryset.model._meta.object_name == 'JobEvent' and key.startswith('hosts__name'): diff --git a/awx/main/models/__init__.py b/awx/main/models/__init__.py index 5c43c2d516..509378fcf5 100644 --- a/awx/main/models/__init__.py +++ b/awx/main/models/__init__.py @@ -127,9 +127,15 @@ def user_get_auditor_of_organizations(user): return Organization.objects.filter(auditor_role__members=user) +@property +def created(user): + return user.date_joined + + User.add_to_class('organizations', user_get_organizations) User.add_to_class('admin_of_organizations', user_get_admin_of_organizations) User.add_to_class('auditor_of_organizations', user_get_auditor_of_organizations) +User.add_to_class('created', created) @property diff --git a/awx/main/tests/functional/api/test_user.py b/awx/main/tests/functional/api/test_user.py index d91c4fb2d4..31235ea847 100644 --- a/awx/main/tests/functional/api/test_user.py +++ b/awx/main/tests/functional/api/test_user.py @@ -61,3 +61,9 @@ def test_user_cannot_update_last_login(patch, admin): middleware=SessionMiddleware() ) assert User.objects.get(pk=admin.pk).last_login is None + + +@pytest.mark.django_db +def test_user_verify_attribute_created(admin): + assert admin.created == admin.date_joined + User.objects.get(pk=admin.pk).created == User.objects.get(pk=admin.pk).date_joined From 34be08d38e233358b6c34fd16103b95080b99ad3 Mon Sep 17 00:00:00 2001 From: Ryan Petrello Date: Mon, 20 Jul 2020 11:26:46 -0400 Subject: [PATCH 2/2] add tests for filtering User.created_by in the API --- awx/main/tests/functional/api/test_user.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/awx/main/tests/functional/api/test_user.py b/awx/main/tests/functional/api/test_user.py index 31235ea847..821b37d6ae 100644 --- a/awx/main/tests/functional/api/test_user.py +++ b/awx/main/tests/functional/api/test_user.py @@ -1,3 +1,5 @@ +from datetime import date + import pytest from django.contrib.sessions.middleware import SessionMiddleware @@ -64,6 +66,18 @@ def test_user_cannot_update_last_login(patch, admin): @pytest.mark.django_db -def test_user_verify_attribute_created(admin): +def test_user_verify_attribute_created(admin, get): assert admin.created == admin.date_joined - User.objects.get(pk=admin.pk).created == User.objects.get(pk=admin.pk).date_joined + resp = get( + reverse('api:user_detail', kwargs={'pk': admin.pk}), + admin + ) + assert resp.data['created'] == admin.date_joined + + past = date(2020, 1, 1).isoformat() + for op, count in (('gt', 1), ('lt', 0)): + resp = get( + reverse('api:user_list') + f'?created__{op}={past}', + admin + ) + assert resp.data['count'] == count