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