from django.db import models from django.utils.encoding import smart_unicode from django.conf import settings from django.utils.functional import curry from django import forms import urllib import crypt class EncryptedField(models.CharField): def __init__(self, verbose_name=None, cipher_key=None, **kwargs): self.input_type = "password" self.key = smart_unicode(kwargs.pop('cipher_key', settings.SECRET_KEY)) models.CharField.__init__(self, verbose_name=verbose_name, max_length=20, **kwargs) def encrypt(self, cad, key=None): if not key: key = settings.SECRET_KEY assert (isinstance(cad, unicode)), "cad must be an unicode string." else: assert (isinstance(cad, unicode) and isinstance(key, unicode)), "cad and key must be unicode strings." return crypt.crypt(cad, key) def _encrypt(self, value): if value is not None: return self.encrypt(smart_unicode(value), self.key) else: return None def get_manipulator_field_objs(self): return [oldforms.PasswordField] def get_internal_type(self): return "TextField" def get_db_prep_save(self, value): value = self._encrypt(value) return super(EncryptedField, self).get_db_prep_save(value) def formfield(self, **kwargs): defaults = {'form_class': forms.CharField} defaults.update(kwargs) defaults['widget'] = forms.PasswordInput() return super(EncryptedField, self).formfield(**defaults)