Merge pull request #676 from chripede/django-jsonpickle

Use jsonpickle in django contrib
This commit is contained in:
Bill Prin 2016-11-17 12:00:05 -08:00 committed by GitHub
commit 2da8ccde3f
6 changed files with 24 additions and 6 deletions

View File

@ -37,6 +37,7 @@ class CommunicationError(Error):
class NoDevshellServer(Error):
"""Error when no Developer Shell server can be contacted."""
# The request for credential information to the Developer Shell client socket
# is always an empty PBLite-formatted JSON object, so just define it as a
# constant.

View File

@ -19,6 +19,7 @@ import pickle
from django.db import models
from django.utils import encoding
import jsonpickle
import oauth2client
@ -48,7 +49,12 @@ class CredentialsField(models.Field):
elif isinstance(value, oauth2client.client.Credentials):
return value
else:
return pickle.loads(base64.b64decode(encoding.smart_bytes(value)))
try:
return jsonpickle.decode(
base64.b64decode(encoding.smart_bytes(value)).decode())
except ValueError:
return pickle.loads(
base64.b64decode(encoding.smart_bytes(value)))
def get_prep_value(self, value):
"""Overrides ``models.Field`` method. This is used to convert
@ -58,7 +64,8 @@ class CredentialsField(models.Field):
if value is None:
return None
else:
return encoding.smart_text(base64.b64encode(pickle.dumps(value)))
return encoding.smart_text(
base64.b64encode(jsonpickle.encode(value).encode()))
def value_to_string(self, obj):
"""Convert the field value from the provided model to a string.

View File

@ -92,6 +92,7 @@ def _CreateArgumentParser():
help='Set the logging level of detail.')
return parser
# argparser is an ArgumentParser that contains command-line options expected
# by tools.run(). Pass it in as part of the 'parents' argument to your own
# ArgumentParser.

View File

@ -21,6 +21,8 @@ import base64
import pickle
import unittest
import jsonpickle
from oauth2client import _helpers
from oauth2client import client
from oauth2client.contrib.django_util import models
@ -36,6 +38,8 @@ class TestCredentialsField(unittest.TestCase):
self.credentials = client.Credentials()
self.pickle_str = _helpers._from_bytes(
base64.b64encode(pickle.dumps(self.credentials)))
self.jsonpickle_str = _helpers._from_bytes(
base64.b64encode(jsonpickle.encode(self.credentials).encode()))
def test_field_is_text(self):
self.assertEqual(self.field.get_internal_type(), 'BinaryField')
@ -44,6 +48,10 @@ class TestCredentialsField(unittest.TestCase):
self.assertIsInstance(
self.field.to_python(self.pickle_str), client.Credentials)
def test_field_jsonunpickled(self):
self.assertIsInstance(
self.field.to_python(self.jsonpickle_str), client.Credentials)
def test_field_already_unpickled(self):
self.assertIsInstance(
self.field.to_python(self.credentials), client.Credentials)
@ -62,12 +70,12 @@ class TestCredentialsField(unittest.TestCase):
def test_field_pickled(self):
prep_value = self.field.get_db_prep_value(self.credentials,
connection=None)
self.assertEqual(prep_value, self.pickle_str)
self.assertEqual(prep_value, self.jsonpickle_str)
def test_field_value_to_string(self):
self.fake_model.credentials = self.credentials
value_str = self.fake_model_field.value_to_string(self.fake_model)
self.assertEqual(value_str, self.pickle_str)
self.assertEqual(value_str, self.jsonpickle_str)
def test_field_value_to_string_none(self):
self.fake_model.credentials = None

View File

@ -160,8 +160,8 @@ class _AuthReferenceServer(threading.Thread):
s.recv(to_read, socket.MSG_WAITALL))
if resp_buffer != devshell.CREDENTIAL_INFO_REQUEST_JSON:
self.bad_request = True
l = len(self.response)
s.sendall('{0}\n{1}'.format(l, self.response).encode())
response_len = len(self.response)
s.sendall('{0}\n{1}'.format(response_len, self.response).encode())
finally:
# Will fail if s is None, but these tests never encounter
# that scenario.

View File

@ -369,6 +369,7 @@ class ServiceAccountCredentialsTests(unittest.TestCase):
self.assertEqual(credentials.access_token, token2)
TOKEN_LIFE = service_account._JWTAccessCredentials._MAX_TOKEN_LIFETIME_SECS
T1 = 42
T1_DATE = datetime.datetime(1970, 1, 1, second=T1)