urlencode unquote host_filter on save

This commit is contained in:
AlanCoding
2017-10-24 08:05:08 -04:00
parent f6bf0ad21f
commit 018514d657
2 changed files with 48 additions and 0 deletions

View File

@@ -6,6 +6,7 @@ import copy
import json import json
import re import re
import six import six
import urllib
from jinja2 import Environment, StrictUndefined from jinja2 import Environment, StrictUndefined
from jinja2.exceptions import UndefinedError from jinja2.exceptions import UndefinedError
@@ -352,6 +353,7 @@ class SmartFilterField(models.TextField):
# https://docs.python.org/2/library/stdtypes.html#truth-value-testing # https://docs.python.org/2/library/stdtypes.html#truth-value-testing
if not value: if not value:
return None return None
value = urllib.unquote(value)
try: try:
SmartFilter().query_from_string(value) SmartFilter().query_from_string(value)
except RuntimeError, e: except RuntimeError, e:

View File

@@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
import pytest import pytest
import mock import mock
@@ -236,6 +237,51 @@ def test_create_inventory_smart_inventory_sources(post, get, inventory, admin_us
assert jdata['count'] == 0 assert jdata['count'] == 0
@pytest.mark.django_db
def test_urlencode_host_filter(post, admin_user, organization):
"""
Host filters saved on the model must correspond to the same result
as when that host_filter is used in the URL as a querystring.
That means that it must be url-encoded patterns like %22 for quotes
must be escaped as the string is saved to the model.
Expected host filter in this test would match a host such as:
inventory.hosts.create(
ansible_facts={"ansible_distribution_version": "7.4"}
)
"""
# Create smart inventory with host filter that corresponds to querystring
post(
reverse('api:inventory_list'),
data={
'name': 'smart inventory', 'kind': 'smart',
'organization': organization.pk,
'host_filter': 'ansible_facts__ansible_distribution_version=%227.4%22'
},
user=admin_user,
expect=201
)
# Assert that the saved version of host filter has escaped ""
si = Inventory.objects.get(name='smart inventory')
assert si.host_filter == 'ansible_facts__ansible_distribution_version="7.4"'
@pytest.mark.django_db
def test_host_filter_unicode(post, admin_user, organization):
post(
reverse('api:inventory_list'),
data={
'name': 'smart inventory', 'kind': 'smart',
'organization': organization.pk,
'host_filter': u'ansible_facts__ansible_distribution=レッドハット'
},
user=admin_user,
expect=201
)
si = Inventory.objects.get(name='smart inventory')
assert si.host_filter == u'ansible_facts__ansible_distribution=レッドハット'
@pytest.mark.parametrize("role_field,expected_status_code", [ @pytest.mark.parametrize("role_field,expected_status_code", [
(None, 403), (None, 403),
('admin_role', 201), ('admin_role', 201),