diff --git a/auxiliary.py b/auxiliary.py index 81a00b4..e9cedce 100644 --- a/auxiliary.py +++ b/auxiliary.py @@ -9,3 +9,9 @@ def to_nested_dict(row): current_level = current_level[part] current_level[keys[-1]] = value return result + + +def compile_query_to_plain_sql(query) -> str: + return query.statement.compile(compile_kwargs={ + 'literal_binds': True + }) diff --git a/routes/sipro.py b/routes/sipro.py index 93b0757..c9fbc4d 100644 --- a/routes/sipro.py +++ b/routes/sipro.py @@ -1,10 +1,10 @@ from enum import StrEnum - -from flask import Blueprint, request +from flask import Blueprint, request, jsonify from sqlalchemy import func import auxiliary import database +import database.enums sipro_blueprint = Blueprint('sipro', __name__) @@ -51,3 +51,65 @@ def assembly_info(): result = query.all() json_result = [auxiliary.to_nested_dict(row) for row in result] return json_result + + +@sipro_blueprint.post('/tableAssemblyStats') +def table_assembly_stats(): + filters = request.json + date_from = filters.get('from') + date_to = filters.get('to') + + dated_query = ( + database.Assembly.query + .join(database.User) + .filter( + database.Assembly.state == database.enums.AssemblyState.CONFIRMED, + database.Assembly.ended_at >= date_from, + database.Assembly.ended_at <= date_to, + database.User.is_admin == False + ) + .group_by(database.User.login, database.Assembly.user_id) + .with_entities( + database.User.login.label('user_login'), + func.count(database.Assembly.user_id).label('assembled'), + func.string_agg(func.cast(database.Assembly.order_id, database.db.String), ',').label('order_ids') + ) + ) + + json_result = [] + for row in dated_query.all(): + json_result.append({ + 'user_login': row.user_login, + 'assembled': row.assembled, + 'order_ids': row.order_ids + }) + + return jsonify(json_result) + + +@sipro_blueprint.get('/dailyAssemblyData') +def daily_assembly_stats(): + query = ( + database.Assembly.query + .join(database.User) + .filter( + database.Assembly.state == database.enums.AssemblyState.CONFIRMED, + database.Assembly.ended_at >= func.current_date() + ) + .group_by(database.User.login, database.Assembly.user_id) + .with_entities( + database.User.login.label('user_login'), + func.count(database.Assembly.user_id).label('assembled'), + func.string_agg(func.cast(database.Assembly.order_id, database.db.String), ',').label('order_ids') + ) + ) + + json_result = [] + for row in query.all(): + json_result.append({ + 'user_login': row.user_login, + 'assembled': row.assembled, + 'order_ids': row.order_ids + }) + + return json_result