Skip to content

Commit adb2b13

Browse files
committed
Database result backend now works with Python 3
1 parent 4cbc62d commit adb2b13

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed

djcelery/models.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@ class TaskMeta(models.Model):
3131
date_done = models.DateTimeField(_('done at'), auto_now=True)
3232
traceback = models.TextField(_('traceback'), blank=True, null=True)
3333
hidden = models.BooleanField(editable=False, default=False, db_index=True)
34+
# TODO compression was enabled by mistake, we need to disable it
35+
# but this is a backwards incompatible change that needs planning.
3436
meta = PickledObjectField(
35-
_('meta'), null=True, default=None, editable=False,
37+
compress=True, null=True, default=None, editable=False,
3638
)
3739

3840
objects = managers.TaskManager()

djcelery/picklefield.py

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,14 @@
1414
"""
1515
from __future__ import absolute_import, unicode_literals
1616

17+
import django
18+
1719
from base64 import b64encode, b64decode
1820
from zlib import compress, decompress
1921

22+
from celery.five import with_metaclass
2023
from celery.utils.serialization import pickle
24+
from kombu.utils.encoding import bytes_to_str, str_to_bytes
2125

2226
from django.db import models
2327

@@ -28,35 +32,45 @@
2832

2933
DEFAULT_PROTOCOL = 2
3034

35+
NO_DECOMPRESS_HEADER = b'\x1e\x00r8d9qwwerwhA@'
36+
37+
38+
if django.VERSION < (1, 3):
39+
BaseField = models.Field
40+
else:
41+
@with_metaclass(models.SubfieldBase)
42+
class BaseField(models.Field):
43+
pass
44+
3145

3246
class PickledObject(str):
3347
pass
3448

3549

3650
def maybe_compress(value, do_compress=False):
3751
if do_compress:
38-
return compress(value)
52+
return compress(str_to_bytes(value))
3953
return value
4054

4155

4256
def maybe_decompress(value, do_decompress=False):
4357
if do_decompress:
44-
return decompress(value)
58+
if str_to_bytes(value[:15]) != NO_DECOMPRESS_HEADER:
59+
return decompress(str_to_bytes(value))
4560
return value
4661

4762

4863
def encode(value, compress_object=False, pickle_protocol=DEFAULT_PROTOCOL):
49-
return b64encode(maybe_compress(
64+
return bytes_to_str(b64encode(maybe_compress(
5065
pickle.dumps(value, pickle_protocol), compress_object),
51-
)
66+
))
5267

5368

5469
def decode(value, compress_object=False):
5570
return pickle.loads(maybe_decompress(b64decode(value), compress_object))
5671

5772

58-
class PickledObjectField(models.Field):
59-
__metaclass__ = models.SubfieldBase
73+
class PickledObjectField(BaseField):
6074

6175
def __init__(self, compress=False, protocol=DEFAULT_PROTOCOL,
6276
*args, **kwargs):

0 commit comments

Comments
 (0)