# -*- coding: utf-8 -*- from __future__ import unicode_literals from south.modelsinspector import add_introspection_rules from django.db import models class BaseEnc(object): def encrypt(self, value): return value def decrypt(self, value): return value class EncryptedField(models.TextField): description = "A encrypted field" def __init__(self, encryptor=BaseEnc, *args, **kwargs): self.encryptor = encryptor() super(EncryptedField, self).__init__(*args, **kwargs) def contribute_to_class(self, cls, name): if self.db_column is None: self.db_column = name self.field_name = name + '_enc' super(EncryptedField, self).contribute_to_class(cls, self.field_name) setattr(cls, name, property(self.get_data, self.set_data)) def get_data(self, obj): if getattr(obj, self.field_name): return self.encryptor.decrypt(getattr(obj, self.field_name)) return None def set_data(self, obj, data): if data: setattr(obj, self.field_name, self.encryptor.encrypt(data)) else: setattr(obj, self.field_name, None)