Only use constr. inv URL when req comes from it (#13797)

When the API request is for /inventories/id use that as the URL in the
API response. When the request is for /constructed_inventories/id use
that.

Signed-off-by: Rick Elrod <rick@elrod.me>
This commit is contained in:
Rick Elrod
2023-04-04 10:26:52 -05:00
committed by GitHub
parent 479d0c2b12
commit 1e690fcd7f
2 changed files with 28 additions and 2 deletions

View File

@@ -17,6 +17,7 @@ from django.db import models, connection
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.db import transaction from django.db import transaction
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.urls import resolve
from django.utils.timezone import now from django.utils.timezone import now
from django.db.models import Q from django.db.models import Q
@@ -206,8 +207,14 @@ class Inventory(CommonModelNameNotUnique, ResourceMixin, RelatedJobsMixin):
) )
def get_absolute_url(self, request=None): def get_absolute_url(self, request=None):
if self.kind == 'constructed': if request is not None:
return reverse('api:constructed_inventory_detail', kwargs={'pk': self.pk}, request=request) # circular import
from awx.api.urls.inventory import constructed_inventory_urls
route = resolve(request.path_info)
if any(route.url_name == url.name for url in constructed_inventory_urls):
return reverse('api:constructed_inventory_detail', kwargs={'pk': self.pk}, request=request)
return reverse('api:inventory_detail', kwargs={'pk': self.pk}, request=request) return reverse('api:inventory_detail', kwargs={'pk': self.pk}, request=request)
variables_dict = VarsDictProperty('variables') variables_dict = VarsDictProperty('variables')

View File

@@ -680,3 +680,22 @@ class TestConstructedInventory:
inv_src = constructed_inventory.inventory_sources.first() inv_src = constructed_inventory.inventory_sources.first()
assert inv_src.update_cache_timeout == 55 assert inv_src.update_cache_timeout == 55
assert inv_src.limit == 'foobar' assert inv_src.limit == 'foobar'
def test_get_absolute_url_for_constructed_inventory(self, constructed_inventory, admin_user, get):
"""
If we are using the normal inventory API endpoint to look at a
constructed inventory, then we should get a normal inventory API route
back. If we are accessing it via the special constructed inventory
endpoint, then we should get that back.
"""
url_const = reverse('api:constructed_inventory_detail', kwargs={'pk': constructed_inventory.pk})
url_inv = reverse('api:inventory_detail', kwargs={'pk': constructed_inventory.pk})
const_r = get(url=url_const, user=admin_user, expect=200)
inv_r = get(url=url_inv, user=admin_user, expect=200)
assert const_r.data['url'] == url_const
assert inv_r.data['url'] == url_inv
assert inv_r.data['url'] != const_r.data['url']
assert inv_r.data['related']['constructed_url'] == url_const
assert const_r.data['related']['constructed_url'] == url_const