From 8a7b6bcbabfb252749583b54d750c396d0283b95 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Mon, 1 Mar 2021 13:43:21 +0100 Subject: [PATCH 6/9] dj22: do not backport jsonb key transforms (#51516) --- zoo/zoo_data/lookups.py | 102 ++++++++++++++++++++-------------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/zoo/zoo_data/lookups.py b/zoo/zoo_data/lookups.py index 0720de3..7693de3 100644 --- a/zoo/zoo_data/lookups.py +++ b/zoo/zoo_data/lookups.py @@ -14,59 +14,59 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from django.contrib.postgres.fields import jsonb +import django + from django.db.models import Transform, TextField, DateField -from django.conf import settings - - -class KeyTransform(Transform): - operator = '->' - nested_operator = '#>' - - def __init__(self, key_name, *args, **kwargs): - super(KeyTransform, self).__init__(*args, **kwargs) - self.key_name = key_name - - def as_sql(self, compiler, connection): - key_transforms = [self.key_name] - previous = self.lhs - while isinstance(previous, KeyTransform): - key_transforms.insert(0, previous.key_name) - previous = previous.lhs - lhs, params = compiler.compile(previous) - if len(key_transforms) > 1: - return "(%s %s %%s)" % (lhs, self.nested_operator), [key_transforms] + params - try: - int(self.key_name) - except ValueError: - lookup = "'%s'" % self.key_name - else: - lookup = "%s" % self.key_name - return "(%s %s %s)" % (lhs, self.operator, lookup), params - - -jsonb.KeyTransform = KeyTransform - - -class KeyTextTransform(KeyTransform): - operator = '->>' - nested_operator = '#>>' - _output_field = TextField() - - -class KeyTransformTextLookupMixin(object): - """ - Mixin for combining with a lookup expecting a text lhs from a JSONField - key lookup. Make use of the ->> operator instead of casting key values to - text and performing the lookup on the resulting representation. - """ - def __init__(self, key_transform, *args, **kwargs): - assert isinstance(key_transform, KeyTransform) - key_text_transform = KeyTextTransform( - key_transform.key_name, *key_transform.source_expressions, **key_transform.extra - ) - super(KeyTransformTextLookupMixin, self).__init__(key_text_transform, *args, **kwargs) +from django.contrib.postgres.fields import jsonb +try: + from django.contrib.postgres.fields.jsonb import KeyTransform, KeyTransformTextLookupMixin +except ImportError: + # backport from Django 2.x + class KeyTransform(Transform): + operator = '->' + nested_operator = '#>' + + def __init__(self, key_name, *args, **kwargs): + super(KeyTransform, self).__init__(*args, **kwargs) + self.key_name = key_name + + def as_sql(self, compiler, connection): + key_transforms = [self.key_name] + previous = self.lhs + while isinstance(previous, KeyTransform): + key_transforms.insert(0, previous.key_name) + previous = previous.lhs + lhs, params = compiler.compile(previous) + if len(key_transforms) > 1: + return "(%s %s %%s)" % (lhs, self.nested_operator), [key_transforms] + params + try: + int(self.key_name) + except ValueError: + lookup = "'%s'" % self.key_name + else: + lookup = "%s" % self.key_name + return "(%s %s %s)" % (lhs, self.operator, lookup), params + + jsonb.KeyTransform = KeyTransform + + class KeyTextTransform(KeyTransform): + operator = '->>' + nested_operator = '#>>' + _output_field = TextField() + + class KeyTransformTextLookupMixin(object): + """ + Mixin for combining with a lookup expecting a text lhs from a JSONField + key lookup. Make use of the ->> operator instead of casting key values to + text and performing the lookup on the resulting representation. + """ + def __init__(self, key_transform, *args, **kwargs): + assert isinstance(key_transform, KeyTransform) + key_text_transform = KeyTextTransform( + key_transform.key_name, *key_transform.source_expressions, **key_transform.extra + ) + super(KeyTransformTextLookupMixin, self).__init__(key_text_transform, *args, **kwargs) class Lower(Transform): -- 2.30.0