audit: fix error when trying to save models with UUID as PK

This commit is contained in:
Jens Langhammer 2020-01-02 13:00:16 +01:00
parent 865435fb25
commit 387f3c981f
2 changed files with 30 additions and 8 deletions

View File

@ -1,5 +1,6 @@
"""passbook audit models""" """passbook audit models"""
from enum import Enum from enum import Enum
from uuid import UUID
from inspect import getmodule, stack from inspect import getmodule, stack
from typing import Optional, Dict, Any 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) source[key] = sanitize_dict(value)
elif isinstance(value, models.Model): elif isinstance(value, models.Model):
model_content_type = ContentType.objects.get_for_model(value) model_content_type = ContentType.objects.get_for_model(value)
source[key] = { source[key] = sanitize_dict(
{
"app": model_content_type.app_label, "app": model_content_type.app_label,
"name": model_content_type.model, "name": model_content_type.model,
"pk": value.pk, "pk": value.pk,
} }
)
elif isinstance(value, UUID):
source[key] = value.hex
return source return source

View File

@ -2,7 +2,9 @@
from django.test import TestCase from django.test import TestCase
from guardian.shortcuts import get_anonymous_user 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 from passbook.audit.models import Event, EventAction
@ -11,6 +13,21 @@ class TestAuditEvent(TestCase):
def test_new_with_model(self): def test_new_with_model(self):
"""Create a new Event passing a model as kwarg""" """Create a new Event passing a model as kwarg"""
event = Event.new(EventAction.CUSTOM, model=get_anonymous_user()) event = Event.new(EventAction.CUSTOM, test={"model": get_anonymous_user()})
event.save() event.save() # We save to ensure nothing is un-saveable
self.assertIsNotNone(event.pk) 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)