diff --git a/requirements-base.txt b/requirements-base.txt index 29fc87ad7b8bc4..7d9130cea78068 100644 --- a/requirements-base.txt +++ b/requirements-base.txt @@ -9,7 +9,7 @@ croniter==0.3.37 dataclasses==0.8; python_version <= '3.6' datadog==0.29.3 django-crispy-forms==1.8.1 -django-picklefield==1.0.0 +django-picklefield==2.1.0 Django==2.1.15 djangorestframework==3.11.2 email-reply-parser==0.5.12 diff --git a/src/sentry/db/models/fields/encrypted.py b/src/sentry/db/models/fields/encrypted.py index 8297b27f62ee6d..6a7d2ab6ba3afd 100644 --- a/src/sentry/db/models/fields/encrypted.py +++ b/src/sentry/db/models/fields/encrypted.py @@ -7,7 +7,7 @@ from django.db.models import CharField, TextField -from picklefield.fields import PickledObject, PickledObjectField, _ObjectWrapper, dbsafe_decode +from picklefield.fields import PickledObjectField from sentry.db.models.fields.jsonfield import JSONField from sentry.db.models.utils import Creator @@ -45,6 +45,8 @@ def to_python(self, value): class EncryptedPickledObjectField(PickledObjectField): + empty_strings_allowed = True + def get_db_prep_value(self, value, *args, **kwargs): if isinstance(value, bytes): value = value.decode("utf-8") @@ -54,24 +56,7 @@ def get_db_prep_value(self, value, *args, **kwargs): def to_python(self, value): if value is not None and isinstance(value, str): value = decrypt(value) - - # The following below is a copypaste of PickledObjectField.to_python of - # v1.0.0 with one change: We re-raise any baseexceptions such as - # signals. 1.0.0 has a bare `except:` which causes issues. - - if value is not None: - try: - value = dbsafe_decode(value, self.compress) - except Exception: - # If the value is a definite pickle; and an error is raised in - # de-pickling it should be allowed to propagate. - if isinstance(value, PickledObject): - raise - else: - if isinstance(value, _ObjectWrapper): - return value._obj - - return value + return super().to_python(value) class EncryptedTextField(TextField):