From 02795e526cea2186871d4ccbf4dd302f6841c33c Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Wed, 5 Apr 2017 11:11:46 -0400 Subject: [PATCH] inherit from jsonbfield package not jsonfield * jsonbfield supports json querying. jsonfield package is still a jsonb postgres data type, but doesn't support jsonb style querying. * add undo migration support to GIN index --- awx/main/fields.py | 9 ++++++--- awx/main/migrations/0037_v320_fact_recent.py | 3 ++- awx/main/tests/unit/test_fields.py | 3 ++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/awx/main/fields.py b/awx/main/fields.py index 373133eb60..aeb5101dc9 100644 --- a/awx/main/fields.py +++ b/awx/main/fields.py @@ -27,6 +27,7 @@ from django.db.models import Q # Django-JSONField from jsonfield import JSONField as upstream_JSONField +from jsonbfield.fields import JSONField as upstream_JSONBField # AWX from awx.main.models.rbac import batch_role_ancestor_rebuilding, Role @@ -47,7 +48,7 @@ class JSONField(upstream_JSONField): return super(JSONField, self).from_db_value(value, expression, connection, context) -class JSONBField(upstream_JSONField): +class JSONBField(upstream_JSONBField): def get_db_prep_value(self, value, connection, prepared=False): if connection.vendor == 'sqlite': # sqlite (which we use for tests) does not support jsonb; @@ -399,8 +400,10 @@ class DynamicFilterField(models.TextField): last_v = new_v last_kv = new_kv contains_count += 1 - - if contains_count > 1: + + if contains_count == 1 and isinstance(assembled_v, basestring): + assembled_v = '"' + assembled_v + '"' + elif contains_count > 1: if type(last_v) is list: last_v.append(v) if type(last_v) is dict: diff --git a/awx/main/migrations/0037_v320_fact_recent.py b/awx/main/migrations/0037_v320_fact_recent.py index abc22a5809..9a8ffb58b8 100644 --- a/awx/main/migrations/0037_v320_fact_recent.py +++ b/awx/main/migrations/0037_v320_fact_recent.py @@ -39,5 +39,6 @@ class Migration(migrations.Migration): index_together=set([('timestamp', 'module', 'host')]), ), migrations.RunSQL([("CREATE INDEX fact_recent_facts_default_gin ON %s USING gin" - "(facts jsonb_path_ops);", [AsIs(FactRecent._meta.db_table)])]), + "(facts jsonb_path_ops);", [AsIs(FactRecent._meta.db_table)])], + [('DROP INDEX fact_recent_facts_default_gin;', None)]), ] diff --git a/awx/main/tests/unit/test_fields.py b/awx/main/tests/unit/test_fields.py index 468a90da9c..f203d42d4d 100644 --- a/awx/main/tests/unit/test_fields.py +++ b/awx/main/tests/unit/test_fields.py @@ -59,7 +59,8 @@ class TestDynamicFilterFieldFilterStringToQ(): ('a__b__c[]=3.14', Q(**{ "a__b__c__contains": 3.14})), ('a__b__c[]=true', Q(**{ "a__b__c__contains": True})), ('a__b__c[]=false', Q(**{ "a__b__c__contains": False})), - ('a__b__c[]="true"', Q(**{ "a__b__c__contains": "true"})), + ('a__b__c[]="true"', Q(**{ "a__b__c__contains": "\"true\""})), + ('a__b__c[]="hello world"', Q(**{ "a__b__c__contains": "\"hello world\""})), ('a__b__c[]__d[]="foobar"', Q(**{ "a__b__c__contains": [{"d": ["foobar"]}]})), ('a__b__c[]__d="foobar"', Q(**{ "a__b__c__contains": [{"d": "foobar"}]})), ('a__b__c[]__d__e="foobar"', Q(**{ "a__b__c__contains": [{"d": {"e": "foobar"}}]})),