mirror of
https://github.com/zulip/zulip.git
synced 2025-11-13 10:26:28 +00:00
Add get_topic_history_for_stream().
This commit is contained in:
@@ -40,7 +40,7 @@ from zerver.models import Realm, RealmEmoji, Stream, UserProfile, UserActivity,
|
||||
from zerver.lib.alert_words import alert_words_in_realm
|
||||
from zerver.lib.avatar import get_avatar_url, avatar_url
|
||||
|
||||
from django.db import transaction, IntegrityError
|
||||
from django.db import transaction, IntegrityError, connection
|
||||
from django.db.models import F, Q
|
||||
from django.db.models.query import QuerySet
|
||||
from django.core.exceptions import ValidationError
|
||||
@@ -167,6 +167,52 @@ def realm_user_count(realm):
|
||||
# type: (Realm) -> int
|
||||
return UserProfile.objects.filter(realm=realm, is_active=True, is_bot=False).count()
|
||||
|
||||
def get_topic_history_for_stream(user_profile, recipient):
|
||||
# type: (UserProfile, Recipient) -> List[Tuple[str, int]]
|
||||
|
||||
# We tested the below query on some large prod datasets, and we never
|
||||
# saw more than 50ms to execute it, so we think that's acceptable,
|
||||
# but we will monitor it, and we may later optimize it further.
|
||||
query = '''
|
||||
SELECT topic, read, count(*)
|
||||
FROM (
|
||||
SELECT
|
||||
("zerver_usermessage"."flags" & 1) as read,
|
||||
"zerver_message"."subject" as topic,
|
||||
"zerver_message"."id" as message_id
|
||||
FROM "zerver_usermessage"
|
||||
INNER JOIN "zerver_message" ON (
|
||||
"zerver_usermessage"."message_id" = "zerver_message"."id"
|
||||
) WHERE (
|
||||
"zerver_usermessage"."user_profile_id" = %s AND
|
||||
"zerver_message"."recipient_id" = %s
|
||||
) ORDER BY "zerver_usermessage"."message_id" DESC
|
||||
) messages_for_stream
|
||||
GROUP BY topic, read
|
||||
ORDER BY max(message_id) desc
|
||||
'''
|
||||
cursor = connection.cursor()
|
||||
cursor.execute(query, [user_profile.id, recipient.id])
|
||||
rows = cursor.fetchall()
|
||||
cursor.close()
|
||||
|
||||
topic_names = dict() # type: Dict[str, str]
|
||||
topic_counts = dict() # type: Dict[str, int]
|
||||
topics = []
|
||||
for row in rows:
|
||||
topic_name, read, count = row
|
||||
if topic_name.lower() not in topic_names:
|
||||
topic_names[topic_name.lower()] = topic_name
|
||||
topic_name = topic_names[topic_name.lower()]
|
||||
if topic_name not in topic_counts:
|
||||
topic_counts[topic_name] = 0
|
||||
topics.append(topic_name)
|
||||
if not read:
|
||||
topic_counts[topic_name] += count
|
||||
|
||||
history = [(topic, topic_counts[topic]) for topic in topics]
|
||||
return history
|
||||
|
||||
def send_signup_message(sender, signups_stream, user_profile,
|
||||
internal=False, realm=None):
|
||||
# type: (UserProfile, text_type, UserProfile, bool, Optional[Realm]) -> None
|
||||
|
||||
Reference in New Issue
Block a user