From e4acc5c101b4f901589b6ac4f2259a0030aea986 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20M=C3=BCller=20=28ChaoticByte=29?= Date: Wed, 1 Nov 2023 19:07:07 +0100 Subject: [PATCH] Added two new statistics about all users: 'order sum' visible for users having the 'view_order' permission and 'deposit sum' visible for users having the 'view_registertransaction' permission, improved the layout of the statistics page, updated translations --- app/db_queries.py | 37 +++++++++++++++---- app/locales/de/LC_MESSAGES/django.mo | Bin 3624 -> 3704 bytes app/locales/de/LC_MESSAGES/django.po | 43 ++++++++++++---------- app/templates/statistics.html | 51 +++++++++++++++++++++++---- app/views.py | 12 +++++-- 5 files changed, 109 insertions(+), 34 deletions(-) diff --git a/app/db_queries.py b/app/db_queries.py index 0363896..dd79bbe 100644 --- a/app/db_queries.py +++ b/app/db_queries.py @@ -16,7 +16,6 @@ def _db_select(sql_select:str): result = cursor.fetchall() return result - def _combine_results(results:list) -> dict: ''' e.g. @@ -81,8 +80,7 @@ def select_history(user, language_code="en") -> list: result = [list(row) for row in result] return result - -def orders_per_month(user) -> list: +def select_orders_per_month(user) -> dict: # number of orders per month (last 12 months) result_user = _db_select(f""" select @@ -105,8 +103,7 @@ def orders_per_month(user) -> list: """) return _combine_results([result_all, result_user]) - -def orders_per_weekday(user) -> list: +def select_orders_per_weekday(user) -> list: # number of orders per weekday (all time) result = _db_select(f""" with q_all as ( @@ -132,8 +129,7 @@ def orders_per_weekday(user) -> list: result[i] = (day_name[int(day_)-1], all_, user_) return result - -def orders_per_drink(user) -> list: +def select_orders_per_drink(user) -> dict: # number of orders per drink (all time) result_user = _db_select(f""" select @@ -155,3 +151,30 @@ def orders_per_drink(user) -> list: order by "data" desc; """) return _combine_results([result_all, result_user]) + +def select_order_sum_per_user_all_users() -> list: + # sum of all orders per user, for all users + result = _db_select(f""" + select + app_user.username as user, + sum(app_order.price_sum) as sum + from app_user + left outer join app_order on (app_user.id = app_order.user_id) + group by app_user.id + order by app_user asc; + """) + return result + +def select_deposit_sum_per_user_all_users() -> list: + # sum of all orders per user, for all users + result = _db_select(f""" + select + app_user.username as user, + sum(rt.transaction_sum) as sum + from app_user + left outer join app_registertransaction rt on (app_user.id = rt.user_id) + where rt.is_user_deposit is true or rt.is_user_deposit is null + group by app_user.id + order by app_user asc; + """) + return result diff --git a/app/locales/de/LC_MESSAGES/django.mo b/app/locales/de/LC_MESSAGES/django.mo index 73d1c7135393360c788e1d6c270bab1427e0c8a3..2e84d2fd89d1c282b18a917240047d7a23e92828 100644 GIT binary patch delta 1173 zcmXZbUr1A77{~E1`$J+X{XbTK6th8J+tJO3pBMU+c1-l3WWeK(t9f1&wqM(aF zI0QnVbhC;e0%12rT?8>IkRT|Fq8p`)@~R6j4Ep}YdpPHO-aqF&?{l7adz@NHm43wC z`-Y>FE5#M@8*>g<9c~;a1IE;05AMTWT#L7GJ>J7LID_l3j2p0mdj1`9nt$B%oI|iM zhH;ZIC6k~LW1toFU>7QIw{-xc^z*2|MXblW)@eKb2$jGKRJ`}71;67qTtrUeFt{5- zSjYONgT_V%a;VJCq7u1)5gfApG1S7>P!+g?A)G=L>j7$kSyUy<7{oWI_dehb{DwQx z&!ofpriF$AwxNqzRG=>8S#tulz!|J1h_wV!Up!>{6V^%V4Xh=KN?^)5i>mN5ENP+F zG_=55Z1k~bs0EgJJBxo&U%HnYduFnz`Ce3@0Xv?@Q}nN+;#N@!%%du~fO>xkRq@pj z^=B;;qye8u*g_{HkEG-fb|?Kp-3^-qwk29c9YQq3^#LW1KPbo_jK!FTKl8&nD+t@#8DDO0dm!$FhOb^3ADL(vFJAW2!9A`TbA!R2K%{%5FnRIPXt9tVE_e^4 J$Gp$czW*T}Zw&wd delta 1111 zcmXxjPe>GD7{~E<+L_#JXS1y=+_e>KMN6Z0Z8Md?5{wE%DuOOWLF6G2BCvwS(^j|G z$v}b**&(!pBt#$;1VyLLLVuvNOC73HSsnWR;^}2)KJ&i&&hxzQ^X~r4-OokuGyb@v z^>XF7{&>zE#wAR46<=BQr+=eUgG}hrctida|3M;q;M{Q7bE=7P1>t*l+zIRN`Z(3Y@`O96=T9GAcoYs$>O|IEi}i0k+^Aw&6!i zkl&@4rGRzlV*@Hs9+~4>Pzko87FI;2JafcnC@9&Zelp zR(hVBb~uI^tk{GJB!;_Z-_Kb85wXIG9K4QVBQC>2yp$+;y>W-%>~+UO zel{#K+RCMRm*R{5feuwli&fjnr3LEu)5P_^=^v!l6@T}$-i|m7N?y-wUyw<}Cz9>6 Q {{ key }} - {{ values.a|default:"0" }} - {{ values.b|default:"0" }} + {{ values.a|default:0 }} + {{ values.b|default:0 }} {% endfor %} + +

{% translate "orders / month" %}

@@ -37,8 +39,8 @@ {% for key, values in orders_per_month.items %} - - + + {% endfor %}
{{ key }}{{ values.a|default:"0" }}{{ values.b|default:"0" }}{{ values.a|default:0 }}{{ values.b|default:0 }}
@@ -54,11 +56,48 @@ {% for values in orders_per_weekday %} {{ values.0 }} - {{ values.1|default:"0" }} - {{ values.2|default:"0" }} + {{ values.1|default:0 }} + {{ values.2|default:0 }} {% endfor %}
+
+
+ {% if user.is_superuser or perms.app.view_order %} +
+

{% translate "order sum" %}

+ + + + + + {% for values in order_sum_per_user %} + + + + + {% endfor %} +
{% translate "user" %}{% translate "sum" %}
{{ values.0 }}{{ values.1|default:0.0 }} {{ currency_suffix }}
+
+ {% endif %} + {% if user.is_superuser or perms.app.view_registertransaction %} +
+

{% translate "deposit sum" %}

+ + + + + + {% for values in deposit_sum_per_user %} + + + + + {% endfor %} +
{% translate "user" %}{% translate "sum" %}
{{ values.0 }}{{ values.1|default:0.0 }} {{ currency_suffix }}
+
+ {% endif %} +
{% endblock %} \ No newline at end of file diff --git a/app/views.py b/app/views.py index b7f936b..ba864a4 100644 --- a/app/views.py +++ b/app/views.py @@ -80,11 +80,17 @@ def deposit(request): @login_required def statistics(request): + user = request.user context = { - "orders_per_month": db_queries.orders_per_month(request.user), - "orders_per_weekday": db_queries.orders_per_weekday(request.user), - "orders_per_drink": db_queries.orders_per_drink(request.user), + "orders_per_month": db_queries.select_orders_per_month(user), + "orders_per_weekday": db_queries.select_orders_per_weekday(user), + "orders_per_drink": db_queries.select_orders_per_drink(user), } + # Advanced statistics + if user.has_perm("app.view_order") or user.is_superuser: + context["order_sum_per_user"] = db_queries.select_order_sum_per_user_all_users() + if user.has_perm("app.view_registertransaction") or user.is_superuser: + context["deposit_sum_per_user"] = db_queries.select_deposit_sum_per_user_all_users() return render(request, "statistics.html", context) @login_required