示例#1
0
 def test_min_length(self):
     # type: () -> None
     stat = COUNT_STATS['realm_active_humans::day']
     self.insert_data(stat, [None], [])
     # test min_length is too short to change anything
     result = self.client_get('/json/analytics/chart_data', {
         'chart_name': 'number_of_humans',
         'min_length': 2
     })
     self.assert_json_success(result)
     data = result.json()
     self.assertEqual(
         data['end_times'],
         [datetime_to_timestamp(dt) for dt in self.end_times_day])
     self.assertEqual(data['realm'], {'human': self.data(100)})
     # test min_length larger than filled data
     result = self.client_get('/json/analytics/chart_data', {
         'chart_name': 'number_of_humans',
         'min_length': 5
     })
     self.assert_json_success(result)
     data = result.json()
     end_times = [
         ceiling_to_day(self.realm.date_created) + timedelta(days=i)
         for i in range(-1, 4)
     ]
     self.assertEqual(data['end_times'],
                      [datetime_to_timestamp(dt) for dt in end_times])
     self.assertEqual(data['realm'], {'human': [0] + self.data(100)})
示例#2
0
def do_increment_logging_stat(zerver_object: Union[Realm, UserProfile, Stream],
                              stat: CountStat,
                              subgroup: Optional[Union[str, int, bool]],
                              event_time: datetime,
                              increment: int = 1) -> None:
    table = stat.data_collector.output_table
    if table == RealmCount:
        id_args = {'realm': zerver_object}
    elif table == UserCount:
        id_args = {'realm': zerver_object.realm, 'user': zerver_object}
    else:  # StreamCount
        id_args = {'realm': zerver_object.realm, 'stream': zerver_object}

    if stat.frequency == CountStat.DAY:
        end_time = ceiling_to_day(event_time)
    else:  # CountStat.HOUR:
        end_time = ceiling_to_hour(event_time)

    row, created = table.objects.get_or_create(property=stat.property,
                                               subgroup=subgroup,
                                               end_time=end_time,
                                               defaults={'value': increment},
                                               **id_args)
    if not created:
        row.value = F('value') + increment
        row.save(update_fields=['value'])
示例#3
0
 def setUp(self) -> None:
     self.realm = get_realm('zulip')
     self.user = self.example_user('hamlet')
     self.login(self.user.email)
     self.end_times_hour = [ceiling_to_hour(self.realm.date_created) + timedelta(hours=i)
                            for i in range(4)]
     self.end_times_day = [ceiling_to_day(self.realm.date_created) + timedelta(days=i)
                           for i in range(4)]
示例#4
0
 def setUp(self) -> None:
     self.realm = get_realm('zulip')
     self.user = self.example_user('hamlet')
     self.login(self.user.email)
     self.end_times_hour = [ceiling_to_hour(self.realm.date_created) + timedelta(hours=i)
                            for i in range(4)]
     self.end_times_day = [ceiling_to_day(self.realm.date_created) + timedelta(days=i)
                           for i in range(4)]
示例#5
0
 def setUp(self):
     # type: () -> None
     self.realm = get_realm('zulip')
     self.user = get_user_profile_by_email('*****@*****.**')
     self.login(self.user.email)
     self.end_times_hour = [ceiling_to_hour(self.realm.date_created) + timedelta(hours=i)
                            for i in range(4)]
     self.end_times_day = [ceiling_to_day(self.realm.date_created) + timedelta(days=i)
                           for i in range(4)]
示例#6
0
 def setUp(self):
     # type: () -> None
     self.realm = get_realm('zulip')
     self.user = get_user_profile_by_email('*****@*****.**')
     self.login(self.user.email)
     self.end_times_hour = [ceiling_to_hour(self.realm.date_created) + timedelta(hours=i)
                            for i in range(4)]
     self.end_times_day = [ceiling_to_day(self.realm.date_created) + timedelta(days=i)
                           for i in range(4)]
示例#7
0
 def setUp(self) -> None:
     super().setUp()
     self.realm = get_realm("zulip")
     self.user = self.example_user("hamlet")
     self.login_user(self.user)
     self.end_times_hour = [
         ceiling_to_hour(self.realm.date_created) + timedelta(hours=i) for i in range(4)
     ]
     self.end_times_day = [
         ceiling_to_day(self.realm.date_created) + timedelta(days=i) for i in range(4)
     ]
示例#8
0
 def test_min_length(self) -> None:
     stat = COUNT_STATS["realm_active_humans::day"]
     self.insert_data(stat, [None], [])
     stat = COUNT_STATS["1day_actives::day"]
     self.insert_data(stat, [None], [])
     stat = COUNT_STATS["active_users_audit:is_bot:day"]
     self.insert_data(stat, ["false"], [])
     # test min_length is too short to change anything
     result = self.client_get("/json/analytics/chart_data", {
         "chart_name": "number_of_humans",
         "min_length": 2
     })
     self.assert_json_success(result)
     data = result.json()
     self.assertEqual(
         data["end_times"],
         [datetime_to_timestamp(dt) for dt in self.end_times_day])
     self.assertEqual(
         data["everyone"],
         {
             "_1day": self.data(100),
             "_15day": self.data(100),
             "all_time": self.data(100)
         },
     )
     # test min_length larger than filled data
     result = self.client_get("/json/analytics/chart_data", {
         "chart_name": "number_of_humans",
         "min_length": 5
     })
     self.assert_json_success(result)
     data = result.json()
     end_times = [
         ceiling_to_day(self.realm.date_created) + timedelta(days=i)
         for i in range(-1, 4)
     ]
     self.assertEqual(data["end_times"],
                      [datetime_to_timestamp(dt) for dt in end_times])
     self.assertEqual(
         data["everyone"],
         {
             "_1day": [0, *self.data(100)],
             "_15day": [0, *self.data(100)],
             "all_time": [0, *self.data(100)],
         },
     )
示例#9
0
 def test_min_length(self) -> None:
     stat = COUNT_STATS['realm_active_humans::day']
     self.insert_data(stat, [None], [])
     # test min_length is too short to change anything
     result = self.client_get('/json/analytics/chart_data',
                              {'chart_name': 'number_of_humans',
                               'min_length': 2})
     self.assert_json_success(result)
     data = result.json()
     self.assertEqual(data['end_times'], [datetime_to_timestamp(dt) for dt in self.end_times_day])
     self.assertEqual(data['realm'], {'human': self.data(100)})
     # test min_length larger than filled data
     result = self.client_get('/json/analytics/chart_data',
                              {'chart_name': 'number_of_humans',
                               'min_length': 5})
     self.assert_json_success(result)
     data = result.json()
     end_times = [ceiling_to_day(self.realm.date_created) + timedelta(days=i) for i in range(-1, 4)]
     self.assertEqual(data['end_times'], [datetime_to_timestamp(dt) for dt in end_times])
     self.assertEqual(data['realm'], {'human': [0]+self.data(100)})
示例#10
0
 def test_min_length(self):
     # type: () -> None
     stat = COUNT_STATS['active_users:is_bot:day']
     self.insert_data(stat, ['true', 'false'], [])
     # test min_length is too short to change anything
     result = self.client_get('/json/analytics/chart_data',
                              {'chart_name': 'number_of_humans',
                               'min_length': 2})
     self.assert_json_success(result)
     data = ujson.loads(result.content)
     self.assertEqual(data['end_times'], [datetime_to_timestamp(dt) for dt in self.end_times_day])
     self.assertEqual(data['realm'], {'bot': self.data(100), 'human': self.data(101)})
     # test min_length larger than filled data
     result = self.client_get('/json/analytics/chart_data',
                              {'chart_name': 'number_of_humans',
                               'min_length': 5})
     self.assert_json_success(result)
     data = ujson.loads(result.content)
     end_times = [ceiling_to_day(self.realm.date_created) + timedelta(days=i) for i in range(-1, 4)]
     self.assertEqual(data['end_times'], [datetime_to_timestamp(dt) for dt in end_times])
     self.assertEqual(data['realm'], {'bot': [0]+self.data(100), 'human': [0]+self.data(101)})
示例#11
0
def do_increment_logging_stat(zerver_object, stat, subgroup, event_time, increment=1):
    # type: (Union[Realm, UserProfile, Stream], CountStat, Optional[Union[str, int, bool]], datetime, int) -> None
    table = stat.zerver_count_query.analytics_table
    if table == RealmCount:
        id_args = {'realm': zerver_object}
    elif table == UserCount:
        id_args = {'realm': zerver_object.realm, 'user': zerver_object}
    else: # StreamCount
        id_args = {'realm': zerver_object.realm, 'stream': zerver_object}

    if stat.frequency == CountStat.DAY:
        end_time = ceiling_to_day(event_time)
    else: # CountStat.HOUR:
        end_time = ceiling_to_hour(event_time)

    row, created = table.objects.get_or_create(
        property=stat.property, subgroup=subgroup, end_time=end_time,
        defaults={'value': increment}, **id_args)
    if not created:
        row.value = F('value') + increment
        row.save(update_fields=['value'])
示例#12
0
def do_increment_logging_stat(
    zerver_object: Union[Realm, UserProfile, Stream],
    stat: CountStat,
    subgroup: Optional[Union[str, int, bool]],
    event_time: datetime,
    increment: int = 1,
) -> None:
    if not increment:
        return

    table = stat.data_collector.output_table
    if table == RealmCount:
        assert isinstance(zerver_object, Realm)
        id_args: Dict[str, Union[Realm, UserProfile, Stream]] = {"realm": zerver_object}
    elif table == UserCount:
        assert isinstance(zerver_object, UserProfile)
        id_args = {"realm": zerver_object.realm, "user": zerver_object}
    else:  # StreamCount
        assert isinstance(zerver_object, Stream)
        id_args = {"realm": zerver_object.realm, "stream": zerver_object}

    if stat.frequency == CountStat.DAY:
        end_time = ceiling_to_day(event_time)
    else:  # CountStat.HOUR:
        end_time = ceiling_to_hour(event_time)

    row, created = table.objects.get_or_create(
        property=stat.property,
        subgroup=subgroup,
        end_time=end_time,
        defaults={"value": increment},
        **id_args,
    )
    if not created:
        row.value = F("value") + increment
        row.save(update_fields=["value"])