Changeset 66 for trunk/db/fields.py


Ignore:
Timestamp:
06/23/08 17:34:15 (6 years ago)
Author:
msaelices
Message:

Integrated EncryptedField?. I've changed implementation a little, adding a formfield method to EncriptedField?. Fixes #42.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/db/fields.py

    r53 r66  
    1111from django.dispatch import dispatcher 
    1212from django.template import defaultfilters 
     13from django.utils.functional import curry 
     14from django.utils.encoding import smart_unicode 
    1315 
    1416from cmsutils import forms as cmsutilsforms 
     
    1820from cmsutils.oldforms.fields import SpanishDateField as oldformsSpanishDateField 
    1921from cmsutils.map_utils import MapPosition 
     22from cmsutils.utils import encrypt, decrypt 
    2023 
    2124 
     
    338341 
    339342        return super(GoogleMapsPositionField, self).formfield(**defaults) 
     343 
     344 
     345class EncryptedField(models.CharField): 
     346    def __init__(self, verbose_name=None, cipher_key=None, **kwargs): 
     347        self.input_type = "password" 
     348        self.key = smart_unicode(kwargs.pop('cipher_key', settings.SECRET_KEY)) 
     349        models.CharField.__init__(self, verbose_name=verbose_name, max_length=200, **kwargs) 
     350 
     351    def _encrypt(self, value): 
     352        if value is not None: 
     353            return encrypt(smart_unicode(value), self.key) 
     354        else: 
     355            return None 
     356 
     357    def _decrypt(self, value): 
     358        if value is not None: 
     359            return decrypt(smart_unicode(value), self.key) 
     360        else: 
     361            return None 
     362 
     363    def _decrypt_field(self, cls, field): 
     364        return field._decrypt(getattr(cls, field.name)) 
     365 
     366    def contribute_to_class(self, cls, name): 
     367        self.set_attributes_from_name(name) 
     368        cls._meta.add_field(self) 
     369        setattr(cls, 'get_decrypted_%s' % self.name, curry(self._decrypt_field, field=self)) 
     370 
     371    def get_manipulator_field_objs(self): 
     372        return [oldforms.PasswordField] 
     373 
     374    def get_internal_type(self): 
     375        return "TextField" 
     376 
     377    def get_db_prep_save(self, value): 
     378        value = self._encrypt(value) 
     379        return super(EncryptedField, self).get_db_prep_save(value) 
     380 
     381    def formfield(self, **kwargs): 
     382        defaults = {'form_class': forms.CharField} 
     383        defaults.update(kwargs) 
     384        defaults['widget'] = forms.PasswordInput() 
     385 
     386        return super(EncryptedField, self).formfield(**defaults) 
Note: See TracChangeset for help on using the changeset viewer.