| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 | 
							- # -*- coding:utf-8 -*-
 - from datetime import datetime
 - 
 - import pytz
 - from flask import jsonify
 - from flask_login import login_required, current_user
 - from flask_restful import Resource, reqparse
 - 
 - from controllers.console import api
 - from controllers.console.app import _get_app
 - from controllers.console.setup import setup_required
 - from controllers.console.wraps import account_initialization_required
 - from libs.helper import datetime_string
 - from extensions.ext_database import db
 - 
 - 
 - class DailyConversationStatistic(Resource):
 - 
 -     @setup_required
 -     @login_required
 -     @account_initialization_required
 -     def get(self, app_id):
 -         account = current_user
 -         app_id = str(app_id)
 -         app_model = _get_app(app_id)
 - 
 -         parser = reqparse.RequestParser()
 -         parser.add_argument('start', type=datetime_string('%Y-%m-%d %H:%M'), location='args')
 -         parser.add_argument('end', type=datetime_string('%Y-%m-%d %H:%M'), location='args')
 -         args = parser.parse_args()
 - 
 -         sql_query = '''
 -         SELECT date(DATE_TRUNC('day', created_at AT TIME ZONE 'UTC' AT TIME ZONE :tz )) AS date, count(distinct messages.conversation_id) AS conversation_count
 -             FROM messages where app_id = :app_id 
 -         '''
 -         arg_dict = {'tz': account.timezone, 'app_id': app_model.id}
 - 
 -         timezone = pytz.timezone(account.timezone)
 -         utc_timezone = pytz.utc
 - 
 -         if args['start']:
 -             start_datetime = datetime.strptime(args['start'], '%Y-%m-%d %H:%M')
 -             start_datetime = start_datetime.replace(second=0)
 - 
 -             start_datetime_timezone = timezone.localize(start_datetime)
 -             start_datetime_utc = start_datetime_timezone.astimezone(utc_timezone)
 - 
 -             sql_query += ' and created_at >= :start'
 -             arg_dict['start'] = start_datetime_utc
 - 
 -         if args['end']:
 -             end_datetime = datetime.strptime(args['end'], '%Y-%m-%d %H:%M')
 -             end_datetime = end_datetime.replace(second=0)
 - 
 -             end_datetime_timezone = timezone.localize(end_datetime)
 -             end_datetime_utc = end_datetime_timezone.astimezone(utc_timezone)
 - 
 -             sql_query += ' and created_at < :end'
 -             arg_dict['end'] = end_datetime_utc
 - 
 -         sql_query += ' GROUP BY date order by date'
 -         rs = db.session.execute(sql_query, arg_dict)
 - 
 -         response_date = []
 - 
 -         for i in rs:
 -             response_date.append({
 -                 'date': str(i.date),
 -                 'conversation_count': i.conversation_count
 -             })
 - 
 -         return jsonify({
 -             'data': response_date
 -         })
 - 
 - 
 - class DailyTerminalsStatistic(Resource):
 - 
 -     @setup_required
 -     @login_required
 -     @account_initialization_required
 -     def get(self, app_id):
 -         account = current_user
 -         app_id = str(app_id)
 -         app_model = _get_app(app_id)
 - 
 -         parser = reqparse.RequestParser()
 -         parser.add_argument('start', type=datetime_string('%Y-%m-%d %H:%M'), location='args')
 -         parser.add_argument('end', type=datetime_string('%Y-%m-%d %H:%M'), location='args')
 -         args = parser.parse_args()
 - 
 -         sql_query = '''
 -                 SELECT date(DATE_TRUNC('day', created_at AT TIME ZONE 'UTC' AT TIME ZONE :tz )) AS date, count(distinct messages.from_end_user_id) AS terminal_count
 -                     FROM messages where app_id = :app_id 
 -                 '''
 -         arg_dict = {'tz': account.timezone, 'app_id': app_model.id}
 - 
 -         timezone = pytz.timezone(account.timezone)
 -         utc_timezone = pytz.utc
 - 
 -         if args['start']:
 -             start_datetime = datetime.strptime(args['start'], '%Y-%m-%d %H:%M')
 -             start_datetime = start_datetime.replace(second=0)
 - 
 -             start_datetime_timezone = timezone.localize(start_datetime)
 -             start_datetime_utc = start_datetime_timezone.astimezone(utc_timezone)
 - 
 -             sql_query += ' and created_at >= :start'
 -             arg_dict['start'] = start_datetime_utc
 - 
 -         if args['end']:
 -             end_datetime = datetime.strptime(args['end'], '%Y-%m-%d %H:%M')
 -             end_datetime = end_datetime.replace(second=0)
 - 
 -             end_datetime_timezone = timezone.localize(end_datetime)
 -             end_datetime_utc = end_datetime_timezone.astimezone(utc_timezone)
 - 
 -             sql_query += ' and created_at < :end'
 -             arg_dict['end'] = end_datetime_utc
 - 
 -         sql_query += ' GROUP BY date order by date'
 -         rs = db.session.execute(sql_query, arg_dict)
 - 
 -         response_date = []
 - 
 -         for i in rs:
 -             response_date.append({
 -                 'date': str(i.date),
 -                 'terminal_count': i.terminal_count
 -             })
 - 
 -         return jsonify({
 -             'data': response_date
 -         })
 - 
 - 
 - class DailyTokenCostStatistic(Resource):
 -     @setup_required
 -     @login_required
 -     @account_initialization_required
 -     def get(self, app_id):
 -         account = current_user
 -         app_id = str(app_id)
 -         app_model = _get_app(app_id)
 - 
 -         parser = reqparse.RequestParser()
 -         parser.add_argument('start', type=datetime_string('%Y-%m-%d %H:%M'), location='args')
 -         parser.add_argument('end', type=datetime_string('%Y-%m-%d %H:%M'), location='args')
 -         args = parser.parse_args()
 - 
 -         sql_query = '''
 -                 SELECT date(DATE_TRUNC('day', created_at AT TIME ZONE 'UTC' AT TIME ZONE :tz )) AS date, 
 -                     (sum(messages.message_tokens) + sum(messages.answer_tokens)) as token_count,
 -                     sum(total_price) as total_price
 -                     FROM messages where app_id = :app_id 
 -                 '''
 -         arg_dict = {'tz': account.timezone, 'app_id': app_model.id}
 - 
 -         timezone = pytz.timezone(account.timezone)
 -         utc_timezone = pytz.utc
 - 
 -         if args['start']:
 -             start_datetime = datetime.strptime(args['start'], '%Y-%m-%d %H:%M')
 -             start_datetime = start_datetime.replace(second=0)
 - 
 -             start_datetime_timezone = timezone.localize(start_datetime)
 -             start_datetime_utc = start_datetime_timezone.astimezone(utc_timezone)
 - 
 -             sql_query += ' and created_at >= :start'
 -             arg_dict['start'] = start_datetime_utc
 - 
 -         if args['end']:
 -             end_datetime = datetime.strptime(args['end'], '%Y-%m-%d %H:%M')
 -             end_datetime = end_datetime.replace(second=0)
 - 
 -             end_datetime_timezone = timezone.localize(end_datetime)
 -             end_datetime_utc = end_datetime_timezone.astimezone(utc_timezone)
 - 
 -             sql_query += ' and created_at < :end'
 -             arg_dict['end'] = end_datetime_utc
 - 
 -         sql_query += ' GROUP BY date order by date'
 -         rs = db.session.execute(sql_query, arg_dict)
 - 
 -         response_date = []
 - 
 -         for i in rs:
 -             response_date.append({
 -                 'date': str(i.date),
 -                 'token_count': i.token_count,
 -                 'total_price': i.total_price,
 -                 'currency': 'USD'
 -             })
 - 
 -         return jsonify({
 -             'data': response_date
 -         })
 - 
 - 
 - api.add_resource(DailyConversationStatistic, '/apps/<uuid:app_id>/statistics/daily-conversations')
 - api.add_resource(DailyTerminalsStatistic, '/apps/<uuid:app_id>/statistics/daily-end-users')
 - api.add_resource(DailyTokenCostStatistic, '/apps/<uuid:app_id>/statistics/token-costs')
 
 
  |