From 60d2df9fb9d84a9fa189dc3a4fa2624e85eb9231 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20M=C3=BCller=20=28ChaoticByte=29?= Date: Mon, 30 Oct 2023 18:36:44 +0100 Subject: [PATCH 1/5] Use a dedicated logfile for session cleanup --- scripts/_bootstrap.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/_bootstrap.py b/scripts/_bootstrap.py index 71ce28d..142781e 100755 --- a/scripts/_bootstrap.py +++ b/scripts/_bootstrap.py @@ -32,6 +32,7 @@ configuration_file = data_directory / "config.yml" caddyfile = data_directory / "Caddyfile" logfile_caddy = logfile_directory / "caddy.log" logfile_app = logfile_directory / "app.log" +logfile_sessioncleanup = logfile_directory / "session-cleanup.log" class MonitoredSubprocess: @@ -183,6 +184,6 @@ if __name__ == "__main__": MonitoredSubprocess( "Session Autocleaner", ["./scripts/_session-autocleaner.py", str(config["app"]["session_clear_interval"])], - logfile_app) + logfile_sessioncleanup) ] start_and_monitor(procs) -- 2.43.0 From 31ae25116441549596b3d3f840c7e8a3a4864749 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20M=C3=BCller=20=28ChaoticByte=29?= Date: Tue, 31 Oct 2023 18:00:20 +0100 Subject: [PATCH 2/5] Fixed orders/weekday statistic, improved statistics page layout --- app/db_queries.py | 44 +++++++++++++++------------ app/locales/de/LC_MESSAGES/django.mo | Bin 3672 -> 3624 bytes app/locales/de/LC_MESSAGES/django.po | 12 ++++---- app/static/css/main.css | 17 +++++++++++ app/templates/statistics.html | 28 ++++++++--------- 5 files changed, 62 insertions(+), 39 deletions(-) diff --git a/app/db_queries.py b/app/db_queries.py index 656bbda..0363896 100644 --- a/app/db_queries.py +++ b/app/db_queries.py @@ -3,6 +3,7 @@ from django.conf import settings from django.db import connection from django.utils.translation import gettext +from calendar import day_name COMBINE_ALPHABET = "abcdefghijklmnopqrstuvwxyz" @@ -102,29 +103,34 @@ def orders_per_month(user) -> list: group by "month" order by "month" desc; """) - return _combine_results([result_user, result_all]) + return _combine_results([result_all, result_user]) def orders_per_weekday(user) -> list: # number of orders per weekday (all time) - result_user = _db_select(f""" - select - to_char(datetime, 'Day') as "day", - sum(amount) as "count" - from app_order - where user_id = {user.pk} - group by "day" - order by "count" desc; + result = _db_select(f""" + with q_all as ( + select + extract(isodow from datetime) as "d", + sum(amount) as "c" + from app_order + group by d + ), q_user as ( + select + extract(isodow from datetime) as "d", + sum(amount) as "c" + from app_order + where user_id = {user.pk} + group by d + ) + select q_all.d as "day", q_all.c, q_user.c from q_all full join q_user on q_all.d = q_user.d + group by day, q_all.c, q_user.c + order by day asc; """) - result_all = _db_select(f""" - select - to_char(datetime, 'Day') as "day", - sum(amount) as "count" - from app_order - group by "day" - order by "count" desc; - """) - return _combine_results([result_user, result_all]) + for i in range(len(result)): + day_, all_, user_ = result[i] + result[i] = (day_name[int(day_)-1], all_, user_) + return result def orders_per_drink(user) -> list: @@ -148,4 +154,4 @@ def orders_per_drink(user) -> list: group by d.product_name order by "data" desc; """) - return _combine_results([result_user, result_all]) + return _combine_results([result_all, result_user]) diff --git a/app/locales/de/LC_MESSAGES/django.mo b/app/locales/de/LC_MESSAGES/django.mo index d7435cb07bae255287ca6bfa885580bd2e060d15..73d1c7135393360c788e1d6c270bab1427e0c8a3 100644 GIT binary patch delta 1133 zcmZ9~Pe@cz6vy#1IyPF9Nq?-yDaS@F`=e>4maRgtqQ4Xf?WX3XqP~%FhW;&{E2&m7 zwsBLCE}~it4MY$W6hy1m1FecS(W181rtfdO7I^W@=br0*_uYH$E5{$li}6qpHM7Bp zSq+}YdK|_&yo#%F3ajxJuEGH0IE%HofO_s3w&N@8z%QuhqD<0y4H(84YMtg<3ye9| z&VVL%qBhcl>#*PD$DL=K7f~;~geM^$bCHLr*p@jdb``{c&I;s)~HsCDbtm^ETE>bc&) zbxz@C1}-~qIt!=@J;647j(R~E594Q-H?f=DfqNN$>+&DYKX`!g$Xc_5IDop-Db#{_)P`qJmAZ{uzks@u2dD!)LMjv3 zQ#bGiwZjjn2S1`JQbv{bC+cK1T)eJgJ62&Ea>bRh?n5;_r`ANYR(eZ6U7*b#B~(qb zxyEq)i5->h(vLn5HJ!bO=pb4MeU81vEF;`uy2t6&RiMw{9J0pE_i<0^KCG1e*yT(b=&{| delta 1180 zcmZY8OGs2v9LMo9K5{ZsD^t^nu9>E04=o>Mv?!woSWsB2qQN<7INs5jD`rr4or@q0 zf*@!il+?l)Xwgn0B8XZAZQ2IbB5)x=5q*E-5hM@(=X3w(-gC}9|8sp7`x2XrMZ$7p zOmC4fb=Z%aaRN(l3JdWemf~Yvk1wzoUtvDZ<2rncG5mm0TtJOm#72zJ*^Eu7aTlT{ z%uRTSjsiNap(e7(7?X4l2B;UgiDh`l<@cNqoR3iBpP&|aiuDm=p1b>>c>5#te@1Pf zyf`#wD;Kq7TA&S8kuFsKX*`QpQ4`OiDlmtt&}-Cl@2~>DB5RpN*Z&*0kZ;=ij)OIIIW2KJ(k;vD8-KXSymvK~M+RZ^{%*iG~(p|ulw zsiQ;_Va#-8LFpM4_W!n@jt)Y5-9_lLQ^ECrqA#SA*h^3@!&Y)dZJQn`=nCt}x(GFW zY}z&NXgp#Mp|*XQ+^;sLifPk3h<$`A)=jK59ifhIr8T;X7SwU8@@hMc$<`Ov<()jA zPS|wD8?|XKk-p&%n^henDL)wUnv(HM;I*}Txir(f`iTi^hZFJ1?1`ePNcL{@d;XQ< zHWS!na@-%ZzBigqd8cfUelx?wYwq-={CL3hHn div { + height: 100%; + width: 16rem; +} + /* Responsive */ @media only screen and (max-width: 1200px) { diff --git a/app/templates/statistics.html b/app/templates/statistics.html index 4f938b9..0c1e6e7 100644 --- a/app/templates/statistics.html +++ b/app/templates/statistics.html @@ -8,14 +8,14 @@ {% block content %}

{% translate "Statistics" %}

-
-
-

{% translate "Orders per drink" %}

+
+
+

{% translate "orders / drink" %}

- + {% for key, values in orders_per_drink.items %} @@ -26,13 +26,13 @@ {% endfor %}
{% translate "drink" %}{% translate "you" %} {% translate "all" %}{% translate "you" %}
-
-

{% translate "Orders per month (last 12 months)" %}

+
+

{% translate "orders / month" %}

- + {% for key, values in orders_per_month.items %} @@ -43,19 +43,19 @@ {% endfor %}
{% translate "month" %}{% translate "you" %} {% translate "all" %}{% translate "you" %}
-
-

{% translate "Orders per weekday" %}

+
+

{% translate "orders / weekday" %}

- + - {% for key, values in orders_per_weekday.items %} + {% for values in orders_per_weekday %} - - - + + + {% endfor %}
{% translate "day" %}{% translate "you" %} {% translate "all" %}{% translate "you" %}
{{ key }}{{ values.a|default:"0" }}{{ values.b|default:"0" }}{{ values.0 }}{{ values.1|default:"0" }}{{ values.2|default:"0" }}
-- 2.43.0 From 4eb2911150778eb3b8e4d2a184de4c2b76dfeeff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20M=C3=BCller=20=28ChaoticByte=29?= Date: Tue, 31 Oct 2023 18:17:12 +0100 Subject: [PATCH 3/5] Fixed round corners on tables for Firefox --- app/static/css/main.css | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/static/css/main.css b/app/static/css/main.css index 0387a51..4ba0fc7 100644 --- a/app/static/css/main.css +++ b/app/static/css/main.css @@ -97,11 +97,12 @@ table { border-radius: var(--border-radius); } -tr { +tr > th, +tr > td { background: var(--bg-color); } -tr:nth-child(2n+2) { +tr:nth-child(2n+2) > td { background: var(--bg-color2); } -- 2.43.0 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 4/5] 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 -- 2.43.0 From 4958a56f8d7c4734d158d391de66997af29c8347 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20M=C3=BCller=20=28ChaoticByte=29?= Date: Wed, 1 Nov 2023 19:21:34 +0100 Subject: [PATCH 5/5] Bumped version to 19 --- start.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start.sh b/start.sh index 8f4ba06..ab9ea5b 100755 --- a/start.sh +++ b/start.sh @@ -11,6 +11,6 @@ chmod -c -R g-w,o-rwx .gitignore export PYTHONPATH="$basedir" export DJANGO_SETTINGS_MODULE="project.settings" -export APP_VERSION="17" +export APP_VERSION="19" exec ./scripts/_bootstrap.py "$@" -- 2.43.0