user-presence: Add offline status to aggregated info.

- Add `OFFLINE_THRESHOLD_SECS` settings parameter
  to handle offline period.
- Set aggregated status to offline if user's status
  haven't changed for `OFFLINE_THRESHOLD_SECS` period.
- Add test for offline aggregated status.
This commit is contained in:
K.Kanakhin
2017-03-06 17:25:37 +06:00
committed by Tim Abbott
parent 2f251dedaf
commit 173f34b7aa
3 changed files with 23 additions and 0 deletions

View File

@@ -270,3 +270,18 @@ class UserPresenceAggregationTests(ZulipTestCase):
"timestamp": datetime_to_timestamp(validate_time - datetime.timedelta(seconds=2)) "timestamp": datetime_to_timestamp(validate_time - datetime.timedelta(seconds=2))
} }
) )
def test_aggregated_presense_offline(self):
# type: () -> None
email = "othello@zulip.com"
self.login(email)
validate_time = timezone.now()
with self.settings(OFFLINE_THRESHOLD_SECS=1):
result_dict = self._send_presence_for_aggregated_tests(email, 'idle', validate_time)
self.assertDictEqual(
result_dict['presence']['aggregated'],
{
"status": "offline",
"timestamp": datetime_to_timestamp(validate_time - datetime.timedelta(seconds=2))
}
)

View File

@@ -2,6 +2,8 @@ from __future__ import absolute_import
import datetime import datetime
import time import time
from django.conf import settings
from typing import Any, Dict, Text from typing import Any, Dict, Text
from django.http import HttpRequest, HttpResponse from django.http import HttpRequest, HttpResponse
@@ -12,6 +14,7 @@ from zerver.decorator import authenticated_json_post_view
from zerver.lib.actions import get_status_dict, update_user_presence from zerver.lib.actions import get_status_dict, update_user_presence
from zerver.lib.request import has_request_variables, REQ, JsonableError from zerver.lib.request import has_request_variables, REQ, JsonableError
from zerver.lib.response import json_success, json_error from zerver.lib.response import json_success, json_error
from zerver.lib.timestamp import datetime_to_timestamp
from zerver.lib.validator import check_bool from zerver.lib.validator import check_bool
from zerver.models import UserActivity, UserPresence, UserProfile, \ from zerver.models import UserActivity, UserPresence, UserProfile, \
get_user_profile_by_email get_user_profile_by_email
@@ -40,6 +43,10 @@ def get_presence_backend(request, user_profile, email):
# For initial version, we just include the status and timestamp keys # For initial version, we just include the status and timestamp keys
result = dict(presence=presence_dict[target.email]) result = dict(presence=presence_dict[target.email])
aggregated_info = result['presence']['aggregated']
aggr_status_duration = datetime_to_timestamp(timezone.now()) - aggregated_info['timestamp']
if aggr_status_duration > settings.OFFLINE_THRESHOLD_SECS:
aggregated_info['status'] = 'offline'
for val in result['presence'].values(): for val in result['presence'].values():
val.pop('client', None) val.pop('client', None)
val.pop('pushable', None) val.pop('pushable', None)

View File

@@ -203,6 +203,7 @@ DEFAULT_SETTINGS = {'TWITTER_CONSUMER_KEY': '',
'ANALYTICS_LOCK_DIR': "/home/zulip/deployments/analytics-lock-dir", 'ANALYTICS_LOCK_DIR': "/home/zulip/deployments/analytics-lock-dir",
'PASSWORD_MIN_LENGTH': 6, 'PASSWORD_MIN_LENGTH': 6,
'PASSWORD_MIN_ZXCVBN_QUALITY': 0.5, 'PASSWORD_MIN_ZXCVBN_QUALITY': 0.5,
'OFFLINE_THRESHOLD_SECS': 5 * 60,
} }
for setting_name, setting_val in six.iteritems(DEFAULT_SETTINGS): for setting_name, setting_val in six.iteritems(DEFAULT_SETTINGS):