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..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 @@ -61,3 +63,21 @@ 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, get): + assert admin.created == admin.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