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.
This commit is contained in:
Sahil Batra 2022-04-07 15:54:30 +05:30 committed by Tim Abbott
parent 90898cc9c4
commit 9d9252ef08
6 changed files with 55 additions and 8 deletions

View File

@ -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)

View File

@ -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

View File

@ -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,
)

View File

@ -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])

View File

@ -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, "<p>:green_tick:</p>")
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)

View File

@ -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)