def task_save_redis_requests_statistics_to_db(statistics_date=None): """ Task that saves redis requests statistics data to DB. Doesn't remove data in Redis. """ if settings.ANALYTICS_REQUESTS_TURNED_ON: statistics_date = statistics_date or now().date() daily_requests_statistics = (DailyRequestsStatistics.objects.filter( created__date=statistics_date).first()) r = redis_client() redis_path_key_pattern = 'analytics.requests_statistics.path:' paths_keys = r.keys(redis_path_key_pattern + '*') json_data = {} for path_key in paths_keys: path = path_key.split(redis_path_key_pattern)[1] path_data = r.hgetall(path_key) json_data.update({ path: { 'hits': path_data.get('hits'), 'unique_visitors': path_data.get('unique_visitors') } }) if daily_requests_statistics: (DailyRequestsStatistics.objects.filter( id=daily_requests_statistics.id).update(json_data=json_data)) else: DailyRequestsStatistics.objects.create(json_data=json_data) redis_publish( 'admin.notifications', { 'is_browser_notification': True, 'title': 'Admin notification', 'message': 'Request statistics was updated' })
def task_save_redis_requests_statistics_to_db(statistics_date=None): """ Task that saves redis requests statistics data to DB. Doesn't remove data in Redis. """ if settings.ANALYTICS_REQUESTS_TURNED_ON: statistics_date = statistics_date or now().date() daily_requests_statistics = (DailyRequestsStatistics.objects .filter(created__date=statistics_date) .first()) r = redis_client() redis_path_key_pattern = 'analytics.requests_statistics.path:' paths_keys = r.keys(redis_path_key_pattern + '*') json_data = {} for path_key in paths_keys: path = path_key.split(redis_path_key_pattern)[1] path_data = r.hgetall(path_key) json_data.update({path: {'hits': path_data.get('hits'), 'unique_visitors': path_data.get('unique_visitors') } }) if daily_requests_statistics: (DailyRequestsStatistics.objects .filter(id=daily_requests_statistics.id) .update(json_data=json_data)) else: DailyRequestsStatistics.objects.create(json_data=json_data) redis_publish('admin.notifications', {'is_browser_notification': True, 'title': 'Admin notification', 'message': 'Request statistics was updated'})
def process_request(self, request): if settings.ANALYTICS_AB_TESTS_TURNED_ON: ab_test_uid = request.GET.get('abtu') ab_test_action_id = request.GET.get('abau') if ab_test_uid and ab_test_action_id: r = redis_client() r.hincrby('analytics.ab_tests.uid:{}'.format(ab_test_uid), ab_test_action_id, 1)
def task_save_redis_requests_statistics_to_db_at_end_of_day(): """ Daily task that saves data to DB and remove all requests statistics data from Redis. """ if settings.ANALYTICS_REQUESTS_TURNED_ON: previous_date = now().date() - datetime.timedelta(days=1) task_save_redis_requests_statistics_to_db(statistics_date=previous_date) r = redis_client() paths_keys = r.keys('analytics.requests_statistics.*') if paths_keys: r.delete(*paths_keys)
def task_save_redis_ab_statistics_to_db_at_end_of_day(): """ Daily task that saves data to DB and remove all ab statistics data from Redis. """ if settings.ANALYTICS_AB_TESTS_TURNED_ON: previous_date = now().date() - datetime.timedelta(days=1) task_save_redis_ab_statistics_to_db(statistics_date=previous_date) r = redis_client() paths_keys = r.keys('analytics.ab_tests.*') if paths_keys: r.delete(*paths_keys)
def process_response(self, request, response): ip = request.META.get('REMOTE_ADDR') path = request.path if settings.ANALYTICS_REQUESTS_TURNED_ON and \ (str(response.status_code) not in settings.ANALYTICS_IGNORE_RESPONSE_STATUSES) and \ (ip not in settings.ANALYTICS_IGNORE_IP) and \ (path not in settings.ANALYTICS_IGNORE_PATH): r = redis_client() path_key = 'analytics.requests_statistics.path:{}'.format(path) r.hincrby(path_key, 'hits', 1) if r.sadd( 'analytics.requests_statistics.path_ip_set:{}'.format( path), ip): r.hincrby(path_key, 'unique_visitors', 1) return response
def task_save_redis_ab_statistics_to_db(statistics_date=None): """ Task that saves redis AB statistics data to DB. Doesn't remove data in Redis. """ if settings.ANALYTICS_AB_TESTS_TURNED_ON: statistics_date = statistics_date or now().date() r = redis_client() redis_ab_tests_key_pattern = 'analytics.ab_tests.uid_total_hits:' ab_tests_keys = r.keys(redis_ab_tests_key_pattern + '*') for ab_test_key in ab_tests_keys: ab_test_uid = ab_test_key.split(redis_ab_tests_key_pattern)[1] ab_test = ABTest.objects.actual_list().filter( uid=ab_test_uid).first() if ab_test: daily_ab_statistics = (DailyABStatistics.objects.filter( ab_test=ab_test, created__date=statistics_date).first()) ab_test_data = r.hgetall( 'analytics.ab_tests.uid:{}'.format(ab_test_uid)) for key in ab_test_data.keys(): if key not in ab_test.json_description: del ab_test_data[key] ab_test_data_hits = r.hgetall(ab_test_key) if ab_test_data_hits: ab_test_data.update(ab_test_data_hits) if daily_ab_statistics: (DailyABStatistics.objects.filter( id=daily_ab_statistics.id).update( json_data=ab_test_data)) else: ab_test.daily_ab_statistics.create(json_data=ab_test_data) redis_publish( 'admin.notifications', { 'is_browser_notification': True, 'title': 'Admin notification', 'message': 'AB statistics was updated' })
def task_save_redis_ab_statistics_to_db(statistics_date=None): """ Task that saves redis AB statistics data to DB. Doesn't remove data in Redis. """ if settings.ANALYTICS_AB_TESTS_TURNED_ON: statistics_date = statistics_date or now().date() r = redis_client() redis_ab_tests_key_pattern = 'analytics.ab_tests.uid_total_hits:' ab_tests_keys = r.keys(redis_ab_tests_key_pattern + '*') for ab_test_key in ab_tests_keys: ab_test_uid = ab_test_key.split(redis_ab_tests_key_pattern)[1] ab_test = ABTest.objects.actual_list().filter(uid=ab_test_uid).first() if ab_test: daily_ab_statistics = (DailyABStatistics.objects .filter(ab_test=ab_test, created__date=statistics_date) .first()) ab_test_data = r.hgetall('analytics.ab_tests.uid:{}'.format(ab_test_uid)) for key in ab_test_data.keys(): if key not in ab_test.json_description: del ab_test_data[key] ab_test_data_hits = r.hgetall(ab_test_key) if ab_test_data_hits: ab_test_data.update(ab_test_data_hits) if daily_ab_statistics: (DailyABStatistics.objects .filter(id=daily_ab_statistics.id) .update(json_data=ab_test_data)) else: ab_test.daily_ab_statistics.create(json_data=ab_test_data) redis_publish('admin.notifications', {'is_browser_notification': True, 'title': 'Admin notification', 'message': 'AB statistics was updated'})
def get_ab_test_case(request, ab_test_uid): a_b = request.session.get('ab_test') if a_b: r = redis_client() r.hincrby('analytics.ab_tests.uid_total_hits:{}'.format(ab_test_uid), '{}_hits'.format(a_b), 1) return a_b