sql: update storage for py3 compatibility (#36515)
This commit is contained in:
parent
07357b8549
commit
95c5c36103
31
wcs/sql.py
31
wcs/sql.py
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue