Initial backend implementation for AC-25, activity stream/audit love

This commit is contained in:
Matthew Jones
2013-11-08 04:39:53 -05:00
parent e99ac9d668
commit 3a02c17d2a
7 changed files with 175 additions and 0 deletions

View File

@@ -10,6 +10,9 @@ import subprocess
import sys
import urlparse
# Django
from django.db.models import Model
# Django REST Framework
from rest_framework.exceptions import ParseError, PermissionDenied
@@ -219,3 +222,36 @@ def update_scm_url(scm_type, url, username=True, password=True):
new_url = urlparse.urlunsplit([parts.scheme, netloc, parts.path,
parts.query, parts.fragment])
return new_url
def model_instance_diff(old, new):
"""
Calculate the differences between two model instances. One of the instances may be None (i.e., a newly
created model or deleted model). This will cause all fields with a value to have changed (from None).
"""
if not(old is None or isinstance(old, Model)):
raise TypeError('The supplied old instance is not a valid model instance.')
if not(new is None or isinstance(new, Model)):
raise TypeError('The supplied new instance is not a valid model instance.')
diff = {}
if old is not None and new is not None:
fields = set(old._meta.fields + new._meta.fields)
elif old is not None:
fields = set(old._meta.fields)
elif new is not None:
fields = set(new._meta.fields)
else:
fields = set()
for field in fields:
old_value = str(getattr(old, field.name, None))
new_value = str(getattr(new, field.name, None))
if old_value != new_value:
diff[field.name] = (old_value, new_value)
if len(diff) == 0:
diff = None
return diff