Commit 30ab2e11 by Roman Krejcik

fixed queries with User as query argument

eg Subscription.Query.get(user=User(objectId='foo'))
parent efb00e40
...@@ -45,19 +45,19 @@ class ParseType(object): ...@@ -45,19 +45,19 @@ class ParseType(object):
@staticmethod @staticmethod
def convert_to_parse(python_object, as_pointer=False): def convert_to_parse(python_object, as_pointer=False):
is_object = isinstance(python_object, Object) is_object = isinstance(python_object, ParseResource) #User is derived from ParseResouce not Object, check against ParseResource
if is_object and not as_pointer: if is_object and not as_pointer:
return dict([(k, ParseType.convert_to_parse(v, as_pointer=True)) return dict([(k, ParseType.convert_to_parse(v, as_pointer=True))
for k, v in python_object._editable_attrs.items() for k, v in python_object._editable_attrs.items()
]) ])
python_type = Object if is_object else type(python_object) python_type = ParseResource if is_object else type(python_object)
# classes that need to be cast to a different type before serialization # classes that need to be cast to a different type before serialization
transformation_map = { transformation_map = {
datetime.datetime: Date, datetime.datetime: Date,
Object: Pointer ParseResource: Pointer
} }
if python_type in transformation_map: if python_type in transformation_map:
......
...@@ -222,7 +222,7 @@ class TestQuery(unittest.TestCase): ...@@ -222,7 +222,7 @@ class TestQuery(unittest.TestCase):
ParseBatcher().batch_delete(GameScore.Query.all()) ParseBatcher().batch_delete(GameScore.Query.all())
ParseBatcher().batch_delete(Game.Query.all()) ParseBatcher().batch_delete(Game.Query.all())
cls.game = Game(title="Candyland") cls.game = Game(title="Candyland", creator=None)
cls.game.save() cls.game.save()
cls.scores = [GameScore(score=s, player_name='John Doe', game=cls.game) for s in range(1, 6)] cls.scores = [GameScore(score=s, player_name='John Doe', game=cls.game) for s in range(1, 6)]
...@@ -415,6 +415,7 @@ class TestUser(unittest.TestCase): ...@@ -415,6 +415,7 @@ class TestUser(unittest.TestCase):
def setUp(self): def setUp(self):
self.username = TestUser.USERNAME self.username = TestUser.USERNAME
self.password = TestUser.PASSWORD self.password = TestUser.PASSWORD
self.game = None
try: try:
u = User.login(self.USERNAME, self.PASSWORD) u = User.login(self.USERNAME, self.PASSWORD)
...@@ -425,6 +426,9 @@ class TestUser(unittest.TestCase): ...@@ -425,6 +426,9 @@ class TestUser(unittest.TestCase):
def tearDown(self): def tearDown(self):
self._destroy_user() self._destroy_user()
if self.game:
self.game.delete()
self.game = None
def testCanSignUp(self): def testCanSignUp(self):
self._destroy_user() self._destroy_user()
...@@ -463,6 +467,12 @@ class TestUser(unittest.TestCase): ...@@ -463,6 +467,12 @@ class TestUser(unittest.TestCase):
self.assertNotEqual(user.updatedAt, original_updatedAt, self.assertNotEqual(user.updatedAt, original_updatedAt,
'Failed to batch update user data: updatedAt not changed') 'Failed to batch update user data: updatedAt not changed')
def testUserAsQueryArg(self):
user = self._get_user()
g = self.game = Game(title='G1', creator=user)
g.save()
self.assertEqual(1, len(Game.Query.filter(creator=user)))
class TestPush(unittest.TestCase): class TestPush(unittest.TestCase):
""" """
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from parse_rest.core import ResourceRequestLoginRequired from parse_rest.core import ResourceRequestLoginRequired, ParseError
from parse_rest.connection import API_ROOT from parse_rest.connection import API_ROOT
from parse_rest.datatypes import ParseResource, ParseType from parse_rest.datatypes import ParseResource, ParseType
from parse_rest.query import QueryManager from parse_rest.query import QueryManager
...@@ -60,8 +60,7 @@ class User(ParseResource): ...@@ -60,8 +60,7 @@ class User(ParseResource):
url = self._absolute_url url = self._absolute_url
data = self._to_native() data = self._to_native()
response = self.__class__.PUT(url, extra_headers=session_header, response = User.PUT(url, extra_headers=session_header, batch=batch, **data)
batch=batch, **data)
def call_back(response_dict): def call_back(response_dict):
self.updatedAt = response_dict['updatedAt'] self.updatedAt = response_dict['updatedAt']
...@@ -74,7 +73,7 @@ class User(ParseResource): ...@@ -74,7 +73,7 @@ class User(ParseResource):
@login_required @login_required
def delete(self): def delete(self):
session_header = {'X-Parse-Session-Token': self.sessionToken} session_header = {'X-Parse-Session-Token': self.sessionToken}
return self.DELETE(self._absolute_url, extra_headers=session_header) return User.DELETE(self._absolute_url, extra_headers=session_header)
@staticmethod @staticmethod
def signup(username, password, **kw): def signup(username, password, **kw):
...@@ -101,7 +100,7 @@ class User(ParseResource): ...@@ -101,7 +100,7 @@ class User(ParseResource):
try: try:
User.POST(url, email=email) User.POST(url, email=email)
return True return True
except: except ParseError:
return False return False
def _to_native(self): def _to_native(self):
...@@ -113,7 +112,7 @@ class User(ParseResource): ...@@ -113,7 +112,7 @@ class User(ParseResource):
return '_User' return '_User'
def __repr__(self): def __repr__(self):
return '<User:%s (Id %s)>' % (self.username, self.objectId) return '<User:%s (Id %s)>' % (getattr(self, 'username', None), self.objectId)
User.Query = QueryManager(User) User.Query = QueryManager(User)
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