Pass the session that updated the pointer from Django to Tornado

This allows us to check whether the session that updated the pointer
is the same as a session that is doing a long poll to avoid sending
new pointer information when that information is coming from the same
session.

We still return from the long poll early, though, which is sub-optimal.

(imported from commit 7d4be0956f112eacefb7d198ea929957cd2b05e3)
This commit is contained in:
Zev Benjamin 2012-10-22 17:06:22 -04:00
parent d17db6687c
commit f817bf6144
2 changed files with 10 additions and 6 deletions

View File

@ -126,11 +126,12 @@ class UserProfile(models.Model):
callbacks_table.clear(self.user.id, Callbacks.TYPE_RECEIVE) callbacks_table.clear(self.user.id, Callbacks.TYPE_RECEIVE)
def update_pointer(self, new_pointer): def update_pointer(self, new_pointer, updater_session):
global callbacks_table global callbacks_table
for cb in callbacks_table.get(self.user.id, Callbacks.TYPE_POINTER_UPDATE): for cb in callbacks_table.get(self.user.id, Callbacks.TYPE_POINTER_UPDATE):
cb(new_pointer=new_pointer) cb(new_pointer=new_pointer, updater_session=updater_session,
user_profile=self)
callbacks_table.clear(self.user.id, Callbacks.TYPE_POINTER_UPDATE) callbacks_table.clear(self.user.id, Callbacks.TYPE_POINTER_UPDATE)

View File

@ -231,13 +231,15 @@ def update_pointer_backend(request, user_profile):
requests.post(settings.NOTIFY_POINTER_UPDATE_URL, data=[ requests.post(settings.NOTIFY_POINTER_UPDATE_URL, data=[
('secret', settings.SHARED_SECRET), ('secret', settings.SHARED_SECRET),
('user', user_profile.user.id), ('user', user_profile.user.id),
('new_pointer', pointer)]) ('new_pointer', pointer),
('updater_session', request.session.session_key)])
return json_success() return json_success()
def format_updates_response(messages=[], mit_sync_bot=False, apply_markdown=False, def format_updates_response(messages=[], mit_sync_bot=False, apply_markdown=False,
reason_empty=None, user_profile=None, reason_empty=None, user_profile=None,
new_pointer=None, where='bottom'): new_pointer=None, where='bottom',
updater_session=''):
max_message_id = None max_message_id = None
if user_profile is not None: if user_profile is not None:
try: try:
@ -256,7 +258,7 @@ def format_updates_response(messages=[], mit_sync_bot=False, apply_markdown=Fals
if max_message_id is not None: if max_message_id is not None:
# TODO: Figure out how to accurately return this always # TODO: Figure out how to accurately return this always
ret["max_message_id"] = max_message_id ret["max_message_id"] = max_message_id
if new_pointer is not None: if new_pointer is not None and updater_session != user_profile.last_pointer_updater:
ret['new_pointer'] = new_pointer ret['new_pointer'] = new_pointer
return ret return ret
@ -609,8 +611,9 @@ def notify_pointer_update(request, handler):
# FIXME: better query # FIXME: better query
user_profile = UserProfile.objects.get(id=request.POST['user']) user_profile = UserProfile.objects.get(id=request.POST['user'])
new_pointer = int(request.POST['new_pointer']) new_pointer = int(request.POST['new_pointer'])
updater_session = request.POST['updater_session']
user_profile.update_pointer(new_pointer) user_profile.update_pointer(new_pointer, updater_session)
handler.finish() handler.finish()