Commit a48cadb1 by David Robinson

Merge pull request #59 from dgadling/master

Fix the relatedTo Query operator
parents 9b67ee0c b7fb7947
...@@ -60,6 +60,11 @@ class ParseType(object): ...@@ -60,6 +60,11 @@ class ParseType(object):
ParseResource: Pointer ParseResource: Pointer
} }
if hasattr(python_object, '__iter__'):
# It's an iterable? Repeat this whole process on each object
return [ParseType.convert_to_parse(o, as_pointer=as_pointer)
for o in python_object]
if python_type in transformation_map: if python_type in transformation_map:
klass = transformation_map.get(python_type) klass = transformation_map.get(python_type)
return klass(python_object)._to_native() return klass(python_object)._to_native()
......
...@@ -126,7 +126,7 @@ class Queryset(object): ...@@ -126,7 +126,7 @@ class Queryset(object):
if operator is None: if operator is None:
q._where[attr] = parse_value q._where[attr] = parse_value
elif operator == 'relatedTo': elif operator == 'relatedTo':
q._where['$' + operator] = parse_value q._where['$' + operator] = {'object': parse_value, 'key': attr}
else: else:
if not isinstance(q._where[attr], dict): if not isinstance(q._where[attr], dict):
q._where[attr] = {} q._where[attr] = {}
......
...@@ -59,6 +59,14 @@ class GameScore(Object): ...@@ -59,6 +59,14 @@ class GameScore(Object):
pass pass
class GameMap(Object):
pass
class GameMode(Object):
pass
class City(Object): class City(Object):
pass pass
...@@ -348,6 +356,32 @@ class TestQuery(unittest.TestCase): ...@@ -348,6 +356,32 @@ class TestQuery(unittest.TestCase):
self.assertEqual(GameScore.Query.filter(createdAt__lte=tomorrow).count(), 5, self.assertEqual(GameScore.Query.filter(createdAt__lte=tomorrow).count(), 5,
'Could not make inequality comparison with dates') 'Could not make inequality comparison with dates')
def testRelations(self):
"""Make some maps, make a Game Mode that has many maps, find all maps
given a Game Mode"""
maps = [GameMap(name="map " + i) for i in ['a', 'b', 'c', 'd']]
ParseBatcher().batch_save(maps)
gm = GameMode(name='test mode')
gm.save()
gm.addRelation("maps", GameMap.__name__, [m.objectId for m in maps])
modes = GameMode.Query.all()
self.assertEqual(len(modes), 1)
mode = modes[0]
maps_for_mode = GameMap.Query.filter(maps__relatedTo=mode)
self.assertEqual(len(maps_for_mode), 4)
gm.delete()
ParseBatcher().batch_delete(maps)
def testQueryByRelated(self):
game_scores_direct = GameScore.Query.filter(game=self.game)
self.assertTrue(len(game_scores_direct) > 0)
game_scores_in = GameScore.Query.filter(game__in=[self.game])
self.assertEqual(len(game_scores_in), len(game_scores_direct))
class TestFunction(unittest.TestCase): class TestFunction(unittest.TestCase):
def setUp(self): def setUp(self):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment