diff --git a/apps/group_stat_api.py b/apps/group_stat_api.py index 80c1944..b57b774 100644 --- a/apps/group_stat_api.py +++ b/apps/group_stat_api.py @@ -1,33 +1,44 @@ from flask import Blueprint, jsonify, request +from peewee import SQL, fn from database import Message, Member from datetime import datetime group_stat_api = Blueprint('group_stat_api', __name__) +@group_stat_api.route("/chat_activity", methods=["GET"]) +def chat_activity(): + from_date = request.args.get("from_date") + to_date = request.args.get("to_date") -@group_stat_api.route("/top_users",methods=["GET"]) -def top_users(): - number = request.args.get("number") + date_format = request.args.get("date_format") + group_by = request.args.get("group_by") - if not number: number = 3 - - number = int(number) - - members = [] + if not date_format: + date_format = "%Y-%m-%d" + + if not group_by: + group_by = "day" + + dates = [] counts = [] - for user in Member.select(): - members.append(user.first_name) - counts.append(Message.select().where(Message.user_id == user.user_id).count()) - - # Sorting - counts, members = (list(t) for t in zip(*sorted(zip(counts,members),reverse=True))) - - members.insert(number, "Others") - counts.insert(number, sum(counts[number:])) + if from_date and to_date: + from_date = datetime.strptime(from_date, date_format) + to_date = datetime.strptime(to_date, date_format) + + query = (Message + .select(fn.date_trunc(group_by, Message.timestamp).alias('range'), fn.count(Message.id).alias('count')) + .where((Message.timestamp >= from_date) & (Message.timestamp <= to_date)) + .group_by(fn.date_trunc(group_by, Message.timestamp)) + .order_by(SQL("range")) + ) + + for group in query: + dates.append(group.range.strftime("%Y-%m-%d")) + counts.append(group.count) return jsonify({ - "members":members[:number+1], - "counts":counts[:number+1] + "date": dates, + "counts": counts })