sql: update storage for py3 compatibility (#36515)

This commit is contained in:
Frédéric Péters 2019-11-12 14:18:32 +01:00
parent 07357b8549
commit 95c5c36103
1 changed files with 18 additions and 13 deletions

View File

@ -24,8 +24,9 @@ try:
except ImportError:
import pickle
from django.utils.encoding import force_text
from django.utils.six import StringIO
from django.utils import six
from django.utils.encoding import force_bytes, force_text
from django.utils.six import BytesIO
from quixote import get_publisher
from . import qommon
@ -65,7 +66,9 @@ SQL_TYPE_MAPPING = {
def pickle_loads(value):
return UnpicklerClass(StringIO(value)).load()
if hasattr(value, 'tobytes'):
value = value.tobytes()
return UnpicklerClass(BytesIO(force_bytes(value))).load()
class Criteria(qommon.storage.Criteria):
@ -259,9 +262,11 @@ def parse_clause(clause):
def str_encode(value):
if isinstance(value, list):
return [str_encode(x) for x in value]
if not isinstance(value, unicode):
return value
return value.encode(get_publisher().site_charset)
if six.PY2:
if not isinstance(value, unicode):
return value
return value.encode(get_publisher().site_charset)
return value
def site_unicode(value):
if not isinstance(value, basestring):
@ -1185,7 +1190,7 @@ class SqlMixin(object):
if sql_type == 'date':
value = value.timetuple()
elif sql_type == 'bytea':
value = pickle_loads(str(value))
value = pickle_loads(value)
obdata[field.id] = value
i += 1
if field.store_display_value:
@ -1195,7 +1200,7 @@ class SqlMixin(object):
if field.store_structured_value:
value = row[i]
if value is not None:
obdata['%s_structured' % field.id] = pickle_loads(str(value))
obdata['%s_structured' % field.id] = pickle_loads(value)
if obdata['%s_structured' % field.id] is None:
del obdata['%s_structured' % field.id]
i += 1
@ -1301,7 +1306,7 @@ class SqlDataMixin(SqlMixin):
if o.time:
o.time = o.time.timetuple()
if row[6]:
o.parts = pickle_loads(str(row[6]))
o.parts = pickle_loads(row[6])
return o
def set_evolution(self, value):
@ -1517,11 +1522,11 @@ class SqlDataMixin(SqlMixin):
if o.receipt_time:
o.receipt_time = o.receipt_time.timetuple()
if o.workflow_data:
o.workflow_data = pickle_loads(str(o.workflow_data))
o.workflow_data = pickle_loads(o.workflow_data)
if o.workflow_roles:
o.workflow_roles = pickle_loads(str(o.workflow_roles))
o.workflow_roles = pickle_loads(o.workflow_roles)
if o.submission_context:
o.submission_context = pickle_loads(str(o.submission_context))
o.submission_context = pickle_loads(o.submission_context)
o.geolocations = {}
for i, field in enumerate((cls._formdef.geolocations or {}).keys()):
@ -1917,7 +1922,7 @@ class Session(SqlMixin, wcs.sessions.BasicSession):
def _row2ob(cls, row):
o = cls.__new__(cls)
cls.id = str_encode(row[0])
session_data = pickle_loads(str(row[1]))
session_data = pickle_loads(row[1])
for k, v in session_data.items():
setattr(o, k, v)
return o