From 9d9252ef084a36d8e80d585fd39c09f7f8a6ec66 Mon Sep 17 00:00:00 2001 From: Sahil Batra Date: Thu, 7 Apr 2022 15:54:30 +0530 Subject: [PATCH] realm: Create RealmAuditLog entries when removing custom emoji. We also add acting_user parameter to do_remove_realm_emoji in this commit, so that we can use it while creating RealmAuditLog objects. --- zerver/actions/realm_emoji.py | 21 ++++++++++++++++++--- zerver/models.py | 1 + zerver/tests/test_audit_log.py | 31 ++++++++++++++++++++++++++++++- zerver/tests/test_events.py | 4 +++- zerver/tests/test_markdown.py | 4 ++-- zerver/views/realm_emoji.py | 2 +- 6 files changed, 55 insertions(+), 8 deletions(-) diff --git a/zerver/actions/realm_emoji.py b/zerver/actions/realm_emoji.py index d7e3e35ea8..2feed9683c 100644 --- a/zerver/actions/realm_emoji.py +++ b/zerver/actions/realm_emoji.py @@ -1,4 +1,4 @@ -from typing import IO, Dict +from typing import IO, Dict, Optional import django.db.utils import orjson @@ -64,8 +64,23 @@ def check_add_realm_emoji( return realm_emoji -def do_remove_realm_emoji(realm: Realm, name: str) -> None: +def do_remove_realm_emoji(realm: Realm, name: str, *, acting_user: Optional[UserProfile]) -> None: emoji = RealmEmoji.objects.get(realm=realm, name=name, deactivated=False) emoji.deactivated = True emoji.save(update_fields=["deactivated"]) - notify_realm_emoji(realm, realm.get_emoji()) + + realm_emoji_dict = realm.get_emoji() + RealmAuditLog.objects.create( + realm=realm, + acting_user=acting_user, + event_type=RealmAuditLog.REALM_EMOJI_REMOVED, + event_time=timezone_now(), + extra_data=orjson.dumps( + { + "realm_emoji": dict(sorted(realm_emoji_dict.items())), + "deactivated_emoji": realm_emoji_dict[str(emoji.id)], + } + ).decode(), + ) + + notify_realm_emoji(realm, realm_emoji_dict) diff --git a/zerver/models.py b/zerver/models.py index b30a2b1cec..85cca21d52 100644 --- a/zerver/models.py +++ b/zerver/models.py @@ -4257,6 +4257,7 @@ class AbstractRealmAuditLog(models.Model): REALM_LINKIFIER_CHANGED = 224 REALM_LINKIFIER_REMOVED = 225 REALM_EMOJI_ADDED = 226 + REALM_EMOJI_REMOVED = 227 SUBSCRIPTION_CREATED = 301 SUBSCRIPTION_ACTIVATED = 302 diff --git a/zerver/tests/test_audit_log.py b/zerver/tests/test_audit_log.py index 2fb1d4d68b..e3d3eac9ac 100644 --- a/zerver/tests/test_audit_log.py +++ b/zerver/tests/test_audit_log.py @@ -22,7 +22,7 @@ from zerver.actions.realm_domains import ( do_change_realm_domain, do_remove_realm_domain, ) -from zerver.actions.realm_emoji import check_add_realm_emoji +from zerver.actions.realm_emoji import check_add_realm_emoji, do_remove_realm_emoji from zerver.actions.realm_icon import do_change_icon_source from zerver.actions.realm_linkifiers import ( do_add_linkifier, @@ -937,3 +937,32 @@ class TestRealmAuditLog(ZulipTestCase): ).count(), 1, ) + + now = timezone_now() + do_remove_realm_emoji(user.realm, "test_emoji", acting_user=user) + + deactivated_emoji = EmojiInfo( + id=str(realm_emoji.id), + name="test_emoji", + source_url=get_emoji_url(get_emoji_file_name("img.png", realm_emoji.id), user.realm_id), + deactivated=True, + author_id=user.id, + still_url=None, + ) + realm_emoji_dict[str(realm_emoji.id)] = deactivated_emoji + + expected_extra_data = { + "realm_emoji": dict(sorted(realm_emoji_dict.items())), + "deactivated_emoji": deactivated_emoji, + } + + self.assertEqual( + RealmAuditLog.objects.filter( + realm=user.realm, + event_type=RealmAuditLog.REALM_EMOJI_REMOVED, + event_time__gte=now, + acting_user=user, + extra_data=orjson.dumps(expected_extra_data).decode(), + ).count(), + 1, + ) diff --git a/zerver/tests/test_events.py b/zerver/tests/test_events.py index 00bd14ddad..8f9a0de9b9 100644 --- a/zerver/tests/test_events.py +++ b/zerver/tests/test_events.py @@ -1786,7 +1786,9 @@ class NormalActionsTest(BaseAction): check_realm_emoji_update("events[0]", events[0]) events = self.verify_action( - lambda: do_remove_realm_emoji(self.user_profile.realm, "my_emoji") + lambda: do_remove_realm_emoji( + self.user_profile.realm, "my_emoji", acting_user=self.user_profile + ) ) check_realm_emoji_update("events[0]", events[0]) diff --git a/zerver/tests/test_markdown.py b/zerver/tests/test_markdown.py index 23e2c39562..e7ad341853 100644 --- a/zerver/tests/test_markdown.py +++ b/zerver/tests/test_markdown.py @@ -1201,14 +1201,14 @@ class MarkdownTest(ZulipTestCase): ) # Deactivate realm emoji. - do_remove_realm_emoji(realm, "green_tick") + do_remove_realm_emoji(realm, "green_tick", acting_user=None) converted = markdown_convert(":green_tick:", message_realm=realm, message=msg) self.assertEqual(converted.rendered_content, "

:green_tick:

") def test_deactivated_realm_emoji(self) -> None: # Deactivate realm emoji. realm = get_realm("zulip") - do_remove_realm_emoji(realm, "green_tick") + do_remove_realm_emoji(realm, "green_tick", acting_user=None) msg = Message(sender=self.example_user("hamlet")) converted = markdown_convert(":green_tick:", message_realm=realm, message=msg) diff --git a/zerver/views/realm_emoji.py b/zerver/views/realm_emoji.py index 4187adb374..eb0c791234 100644 --- a/zerver/views/realm_emoji.py +++ b/zerver/views/realm_emoji.py @@ -60,5 +60,5 @@ def delete_emoji(request: HttpRequest, user_profile: UserProfile, emoji_name: st ).exists(): raise JsonableError(_("Emoji '{}' does not exist").format(emoji_name)) check_remove_custom_emoji(user_profile, emoji_name) - do_remove_realm_emoji(user_profile.realm, emoji_name) + do_remove_realm_emoji(user_profile.realm, emoji_name, acting_user=user_profile) return json_success(request)