django-dirtyfield
django-dirtyfield tracks changes to model instances.
Usage
Inherit from djangodirtyfield.mixin.DirtyFieldMixin
class MyModel(models.Model, DirtyFieldMixin):
pass
Call get_changes()
to list modifications.
Using a custom model.save()
Add a call to self.update_dirtyfields_copy()
after any modifications done in a custom model.save()
.
Multiple sources
It is possible to track and namespace specified fields, eg. if you're using the model to sync with LDAP.
class ModelLdapDirtyField(DirtyFieldMixin):
sources = {'default': {'state': '_original_state', 'lookup': '_as_dict', 'fields': '_get_fields'},
'ldap': {'state': '_ldap_original_state', 'lookup': '_ldap_as_dict', 'fields': 'get_ldap_fields'}}
def _ldap_as_dict(self, *args, **kwargs):
fields = {}
for k,v in getattr(self, 'ldap_only_fields', {}).iteritems():
fields.update({k: getattr(self, k, '')})
return fields
def get_ldap_fields(self):
return {'get_ldap_cn': 'cn',
'username': ['uid'],
'first_name':'givenName'}
class MyModel(ModelLdapDirtyFieldMixin):
pass
Call get_changes()
to list modifications for states default
and ldap
.