diff --git a/dddp/api.py b/dddp/api.py index 603748d..cdce7b7 100644 --- a/dddp/api.py +++ b/dddp/api.py @@ -12,7 +12,10 @@ from django.conf import settings from django.contrib.auth import get_user_model from django.db import connection, connections from django.db.models import aggregates, Q -from django.db.models.expressions import ExpressionNode +try: + from django.db.models.expressions import ExpressionNode +except ImportError: + from django.db.models import Expression as ExpressionNode from django.db.models.sql import aggregates as sql_aggregates from django.utils.encoding import force_text from django.db import DatabaseError @@ -48,6 +51,7 @@ class Array(aggregates.Aggregate): """Array aggregate function.""" func = 'ARRAY' + function = 'array_agg' name = 'Array' def add_to_query(self, query, alias, col, source, is_summary): @@ -64,9 +68,17 @@ class Array(aggregates.Aggregate): return 'ArrayType' new_source = ArrayField() - super(Array, self).add_to_query( - query, alias, col, new_source, is_summary, - ) + try: + super(Array, self).add_to_query( + query, alias, col, new_source, is_summary, + ) + except AttributeError: + query.aggregates[alias] = new_source + + def convert_value(self, value, expression, connection, context): + if not value: + return [] + return value def api_endpoint(path_or_func): diff --git a/dddp/msg.py b/dddp/msg.py index 892f49f..4029b5b 100644 --- a/dddp/msg.py +++ b/dddp/msg.py @@ -1,16 +1,22 @@ """Django DDP utils for DDP messaging.""" from copy import deepcopy from dddp import THREAD_LOCAL as this, REMOVED -from django.db.models.expressions import ExpressionNode +try: + from django.db.models.expressions import ExpressionNode +except AttributeError: + ExpressionNode = None def obj_change_as_msg(obj, msg): """Generate a DDP msg for obj with specified msg type.""" - # check for F expressions - exps = [ - name for name, val in vars(obj).items() - if isinstance(val, ExpressionNode) - ] + if ExpressionNode is None: + exps = False + else: + # check for F expressions + exps = [ + name for name, val in vars(obj).items() + if isinstance(val, ExpressionNode) + ] if exps: # clone and update obj with values but only for the expression fields obj = deepcopy(obj) diff --git a/setup.py b/setup.py index 99d473e..32e4432 100644 --- a/setup.py +++ b/setup.py @@ -14,10 +14,10 @@ setup( packages=find_packages(), include_package_data=True, install_requires=[ - 'Django>=1.7,<1.8', + 'Django>=1.7', 'psycopg2>=2.5.4', 'gevent>=1.0', - 'gevent-websocket>=0.9', + 'gevent-websocket>=0.9,!=0.9.4', 'meteor-ejson>=1.0', 'psycogreen>=1.0', 'django-dbarray>=0.2',