|
14 | 14 | """
|
15 | 15 | from __future__ import absolute_import, unicode_literals
|
16 | 16 |
|
| 17 | +import django |
| 18 | + |
17 | 19 | from base64 import b64encode, b64decode
|
18 | 20 | from zlib import compress, decompress
|
19 | 21 |
|
| 22 | +from celery.five import with_metaclass |
20 | 23 | from celery.utils.serialization import pickle
|
| 24 | +from kombu.utils.encoding import bytes_to_str, str_to_bytes |
21 | 25 |
|
22 | 26 | from django.db import models
|
23 | 27 |
|
|
28 | 32 |
|
29 | 33 | DEFAULT_PROTOCOL = 2
|
30 | 34 |
|
| 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 | + |
31 | 45 |
|
32 | 46 | class PickledObject(str):
|
33 | 47 | pass
|
34 | 48 |
|
35 | 49 |
|
36 | 50 | def maybe_compress(value, do_compress=False):
|
37 | 51 | if do_compress:
|
38 |
| - return compress(value) |
| 52 | + return compress(str_to_bytes(value)) |
39 | 53 | return value
|
40 | 54 |
|
41 | 55 |
|
42 | 56 | def maybe_decompress(value, do_decompress=False):
|
43 | 57 | if do_decompress:
|
44 |
| - return decompress(value) |
| 58 | + if str_to_bytes(value[:15]) != NO_DECOMPRESS_HEADER: |
| 59 | + return decompress(str_to_bytes(value)) |
45 | 60 | return value
|
46 | 61 |
|
47 | 62 |
|
48 | 63 | def encode(value, compress_object=False, pickle_protocol=DEFAULT_PROTOCOL):
|
49 |
| - return b64encode(maybe_compress( |
| 64 | + return bytes_to_str(b64encode(maybe_compress( |
50 | 65 | pickle.dumps(value, pickle_protocol), compress_object),
|
51 |
| - ) |
| 66 | + )) |
52 | 67 |
|
53 | 68 |
|
54 | 69 | def decode(value, compress_object=False):
|
55 | 70 | return pickle.loads(maybe_decompress(b64decode(value), compress_object))
|
56 | 71 |
|
57 | 72 |
|
58 |
| -class PickledObjectField(models.Field): |
59 |
| - __metaclass__ = models.SubfieldBase |
| 73 | +class PickledObjectField(BaseField): |
60 | 74 |
|
61 | 75 | def __init__(self, compress=False, protocol=DEFAULT_PROTOCOL,
|
62 | 76 | *args, **kwargs):
|
|
0 commit comments