home: Don't use pointer to compute furthest_read_time.

When a user is reading messages only in stream or topic narrows, the pointer
can be left far behind. Using this to compute the furthest_read_time causes
the banckruptcy banner to be shown even when a user has been actively
reading messages. This commit switches to using the sent time on the last
message that the user has read to compute the furthest read time.
This commit is contained in:
Puneeth Chaganti 2020-04-26 23:23:24 +05:30 committed by Tim Abbott
parent d8def0de55
commit 8f32db81a1
3 changed files with 20 additions and 9 deletions

View File

@ -1964,6 +1964,10 @@ def get_usermessage_by_message_id(user_profile: UserProfile, message_id: int) ->
except UserMessage.DoesNotExist:
return None
def get_latest_read_usermessage(user_profile: UserProfile) -> Optional[UserMessage]:
return UserMessage.objects.select_related().filter(user_profile=user_profile,
flags=UserMessage.flags.read).last()
class ArchivedUserMessage(AbstractUserMessage):
"""Used as a temporary holding place for deleted UserMessages objects
before they are permanently deleted. This is an important part of

View File

@ -22,7 +22,7 @@ from zerver.lib.users import compute_show_invites_and_add_streams
from zerver.models import (
get_realm, get_stream, get_user, UserProfile,
flush_per_request_caches, DefaultStream, Realm,
get_system_bot,
get_system_bot, UserMessage
)
from zerver.views.home import sent_time_in_epoch_seconds, compute_navbar_logo_url
from corporate.models import Customer, CustomerPlan
@ -458,9 +458,19 @@ class HomeTest(ZulipTestCase):
user_profile.save()
self.login_user(user_profile)
with patch('logging.warning') as mock:
result = self._get_home_page()
mock.assert_called_once_with('User %s has invalid pointer 999999' % (user_profile.id,))
result = self._get_home_page()
self._sanity_check(result)
def test_no_read_user_messages(self) -> None:
user_profile = self.example_user('hamlet')
user_profile.pointer = 1
user_profile.save()
# Mark all messages as unread
UserMessage.objects.filter(user_profile=user_profile).update(flags=~UserMessage.flags.read)
self.login_user(user_profile)
result = self._get_home_page()
self._sanity_check(result)
def test_topic_narrow(self) -> None:

View File

@ -13,7 +13,7 @@ from zerver.forms import ToSForm
from zerver.models import Message, Stream, UserProfile, \
Realm, UserMessage, \
PreregistrationUser, \
get_usermessage_by_message_id
get_latest_read_usermessage
from zerver.lib.events import do_events_register
from zerver.lib.actions import do_change_tos_version, \
realm_user_count
@ -223,10 +223,7 @@ def home_real(request: HttpRequest) -> HttpResponse:
register_ret['pointer'] = register_ret['max_message_id']
furthest_read_time = None
else:
latest_read = get_usermessage_by_message_id(user_profile, user_profile.pointer)
if latest_read is None:
# Don't completely fail if your saved pointer ID is invalid
logging.warning("User %s has invalid pointer %s" % (user_profile.id, user_profile.pointer))
latest_read = get_latest_read_usermessage(user_profile)
furthest_read_time = sent_time_in_epoch_seconds(latest_read)
# We pick a language for the user as follows: