From 9630b3e5e2a6e263057add3ddc3dec07ea0f15c1 Mon Sep 17 00:00:00 2001 From: Steven Mapes Date: Fri, 17 Dec 2021 17:29:10 +0000 Subject: [PATCH] Bug fix for #4 This is a bug fix for issue #4 where Django Admin raises an exception when saving Encrypted fields as the value is not encrypted at the time of the clean process. This PR sets a semaphore property which is checked within the to_python method allowing the decryption to be skipped. It then removes the semaphore property to clean up the field --- encrypted_fields/fields.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/encrypted_fields/fields.py b/encrypted_fields/fields.py index 1e0fa2c..c4d7b94 100644 --- a/encrypted_fields/fields.py +++ b/encrypted_fields/fields.py @@ -51,11 +51,21 @@ class EncryptedFieldMixin(object): return self.to_python(value) def to_python(self, value): - if value is None or not isinstance(value, str): + if value is None or not isinstance(value, str) or hasattr(self, '_already_decrypted'): return value value = self.f.decrypt(bytes(value, 'utf-8')).decode('utf-8') return super(EncryptedFieldMixin, self).to_python(value) + def clean(self, value, model_instance): + """ + Create and assign a semaphore so that to_python method will not try to decrypt an already decrypted value + during cleaning of a form + """ + self._already_decrypted = True + ret = super().clean(value, model_instance) + del self._already_decrypted + return ret + class EncryptedCharField(EncryptedFieldMixin, models.CharField): pass