user_topics: Refactor add_topic_mute.

In order to support different types of topic visibility policies,
this renames 'add_topic_mute' to
'set_user_topic_visibility_policy_in_database'
and refactors it to accept a parameter 'visibility_policy'.

Create a corresponding UserTopic row for any visibility policy,
not just muting topics.

When a UserTopic row for (user_profile, stream, topic, recipient_id)
exists already, it updates the row with the new visibility_policy.

In the event of a duplicate request, raises a JsonableError.
i.e., new_visibility_policy == existing_visibility_policy.

There is an increase in the database query count in the message-edit
code path.

Reason:
Earlier, 'add_topic_mute' used 'bulk_create' which either
creates or raises IntegrityError -- 1 query.

Now, 'set_user_topic_visibility_policy' uses get_or_create
-- 2 queries in the case of creating new row.

We can't use the previous approach, because now we have to
handle the case of updating the visibility_policy too.
Also, using bulk_* for a single row is not the correct way.

Co-authored-by: Kartik Srivastava <kaushiksri0908@gmail.com>
Co-authored-by: Prakhar Pratyush <prakhar841301@gmail.com>
This commit is contained in:
Kartik Srivastava
2022-09-12 20:09:53 +05:30
committed by Tim Abbott
parent e9580f8c5a
commit f844cb6dad
6 changed files with 121 additions and 40 deletions

View File

@@ -1,13 +1,11 @@
import datetime
from typing import Optional
from django.db import IntegrityError
from django.http import HttpRequest, HttpResponse
from django.utils.timezone import now as timezone_now
from django.utils.translation import gettext as _
from zerver.actions.user_topics import do_set_user_topic_visibility_policy
from zerver.lib.exceptions import JsonableError
from zerver.lib.request import REQ, has_request_variables
from zerver.lib.response import json_success
from zerver.lib.streams import (
@@ -34,16 +32,13 @@ def mute_topic(
assert stream_id is not None
(stream, sub) = access_stream_by_id(user_profile, stream_id)
try:
do_set_user_topic_visibility_policy(
user_profile,
stream,
topic_name,
visibility_policy=UserTopic.MUTED,
last_updated=date_muted,
)
except IntegrityError:
raise JsonableError(_("Topic already muted"))
do_set_user_topic_visibility_policy(
user_profile,
stream,
topic_name,
visibility_policy=UserTopic.MUTED,
last_updated=date_muted,
)
def unmute_topic(