From 387f3c981fb48404ce6b00db7e94cb6b7f08bb2b Mon Sep 17 00:00:00 2001 From: Jens Langhammer Date: Thu, 2 Jan 2020 13:00:16 +0100 Subject: [PATCH] audit: fix error when trying to save models with UUID as PK --- passbook/audit/models.py | 15 ++++++++++----- passbook/audit/tests/test_event.py | 23 ++++++++++++++++++++--- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/passbook/audit/models.py b/passbook/audit/models.py index 762e40fce..51bc8f893 100644 --- a/passbook/audit/models.py +++ b/passbook/audit/models.py @@ -1,5 +1,6 @@ """passbook audit models""" from enum import Enum +from uuid import UUID from inspect import getmodule, stack from typing import Optional, Dict, Any @@ -32,11 +33,15 @@ def sanitize_dict(source: Dict[Any, Any]) -> Dict[Any, Any]: source[key] = sanitize_dict(value) elif isinstance(value, models.Model): model_content_type = ContentType.objects.get_for_model(value) - source[key] = { - "app": model_content_type.app_label, - "name": model_content_type.model, - "pk": value.pk, - } + source[key] = sanitize_dict( + { + "app": model_content_type.app_label, + "name": model_content_type.model, + "pk": value.pk, + } + ) + elif isinstance(value, UUID): + source[key] = value.hex return source diff --git a/passbook/audit/tests/test_event.py b/passbook/audit/tests/test_event.py index d81e97718..04925f8fc 100644 --- a/passbook/audit/tests/test_event.py +++ b/passbook/audit/tests/test_event.py @@ -2,7 +2,9 @@ from django.test import TestCase from guardian.shortcuts import get_anonymous_user +from django.contrib.contenttypes.models import ContentType +from passbook.core.models import Policy from passbook.audit.models import Event, EventAction @@ -11,6 +13,21 @@ class TestAuditEvent(TestCase): def test_new_with_model(self): """Create a new Event passing a model as kwarg""" - event = Event.new(EventAction.CUSTOM, model=get_anonymous_user()) - event.save() - self.assertIsNotNone(event.pk) + event = Event.new(EventAction.CUSTOM, test={"model": get_anonymous_user()}) + event.save() # We save to ensure nothing is un-saveable + model_content_type = ContentType.objects.get_for_model(get_anonymous_user()) + self.assertEqual( + event.context.get("test").get("model").get("app"), + model_content_type.app_label, + ) + + def test_new_with_uuid_model(self): + """Create a new Event passing a model (with UUID PK) as kwarg""" + temp_model = Policy.objects.create() + event = Event.new(EventAction.CUSTOM, model=temp_model) + event.save() # We save to ensure nothing is un-saveable + model_content_type = ContentType.objects.get_for_model(temp_model) + self.assertEqual( + event.context.get("model").get("app"), model_content_type.app_label + ) + self.assertEqual(event.context.get("model").get("pk"), temp_model.pk.hex)