From b003e2f0df6695815ca6a2eb8d8986247e2a5d4e Mon Sep 17 00:00:00 2001 From: serversdwn Date: Sun, 29 Mar 2026 20:44:33 +0000 Subject: [PATCH] feat: enhance keys page with grouped key display and inline editing functionality --- app.py | 39 ++- tarkov.db | Bin 4005888 -> 4005888 bytes templates/keys.html | 692 ++++++++++++++++++++++++++------------------ 3 files changed, 442 insertions(+), 289 deletions(-) diff --git a/app.py b/app.py index baf24ea..a376737 100644 --- a/app.py +++ b/app.py @@ -123,11 +123,29 @@ def _keys_context(): key_query += f" ORDER BY {order_by} " keys = conn.execute(key_query, params).fetchall() - conn.close() key_maps = {k: sorted(v) for k, v in key_maps.items()} + + # Build info view data: all keys (unfiltered), grouped by map then unassigned. + all_keys = conn.execute(""" + SELECT k.id, k.name, k.grid_image_url, k.wiki_url, + r.priority, r.reason, COALESCE(r.used_in_quest, 0) AS used_in_quest + FROM keys k + LEFT JOIN key_ratings r ON k.id = r.key_id + ORDER BY k.name ASC + """).fetchall() + conn.close() + + # keys_by_map: list of (map_row, [key_row, ...]) sorted by map name + keys_by_map = [] + for m in sorted(maps, key=lambda r: r["name"]): + bucket = [k for k in all_keys if m["id"] in key_maps.get(k["id"], [])] + keys_by_map.append((m, bucket)) + unassigned_keys = [k for k in all_keys if not key_maps.get(k["id"])] + return dict(keys=keys, maps=maps, key_maps=key_maps, - map_filter=map_filter, sort=sort, show=show) + map_filter=map_filter, sort=sort, show=show, + keys_by_map=keys_by_map, unassigned_keys=unassigned_keys) @app.route("/keys") @@ -183,6 +201,23 @@ def rate_key(): return redirect(f"{base_url}#key-{key_id}") +@app.route("/rate_json", methods=["POST"]) +def rate_json(): + data = request.get_json(force=True) + key_id = data.get("key_id") + if not key_id: + return jsonify({"ok": False, "error": "missing key_id"}), 400 + priority = data.get("priority") # None or int + reason = data.get("reason", "") + used_in_quest = 1 if data.get("used_in_quest") else 0 + map_ids = [int(m) for m in data.get("map_ids", [])] + conn = get_db() + _update_key(conn, key_id, priority, reason, used_in_quest, map_ids) + conn.commit() + conn.close() + return jsonify({"ok": True}) + + def _update_key(conn, key_id, priority, reason, used_in_quest, map_ids): conn.execute(""" INSERT INTO key_ratings (key_id, priority, reason, used_in_quest) diff --git a/tarkov.db b/tarkov.db index 9a027218aedbb8ba7a6ee2b98f269fe2434c1dbe..8f5f6cc6a72991315d1cb9d98324e3fae68e30ee 100644 GIT binary patch delta 6149 zcmZ{o3vg7`8OQhT*+(|nyBmTq!DLTD8`Wg?5-QBbHE<&;|((eT^Yd$7$=REn$XEtm(M@ZgRF|zwd;Z z|8Vo$bN>JDoO{o`_uQVr+fomx&m-;a_kK;A$XATN|oOW%K?f-T85oUm-Ml$gITzbAPO zpGa$7*v(v8L7#heMn#pSR?5kUX!(1XE6>;+@9GW*!xf8ykwxKZC0G>=RYl7y!uLWe zEo5dMuMzzmj0S_@TKHK86Ym?U%Oh-YpWecD*v#DN4wcbJS+uMyJdZmhs!Xm^e`X&` z_Wu}6_RcWIg}lLFuXv0PXW~kpCFE=-+mxOgR`~L&>s8&_$}HBFzL?HskxIR( zN()WGOR3O~3)yIAx6)%nbGS)=nb_nR8JoOA$T$#Wn`x=F$+n1=_!r#9?su^2^wI2h zVAnH*+ysJL&8cEH2_6Wc!RWV@x4nl+n6jE0k1G@F&L{IR*iTw}JHu9}XST1=HD z#zxptwiQ|=jl)LG*k}w$lhTlMNUE1g3=;mKf&p=dB1O2F-N>b4f!B3}3t*{mpil1gS_QcuVsLWT&LBqT7K70pe* z>n5DMzQ24=T%QJg((4;0BuPl*F5GJ?Ax8-r0fOtZ^7=lyC_eX|NCyyfsqW#n|Hw6o9|XI3gTB?``L@l)*Ro1T2N0C|9d0|gL2Ua6Vv;cr z2h|YLPRMZ}D7u?Rztt*^wz_aol#n(;eniMsASk+>N3S_AK8e+C9NkLDF(AnH32xgk zF~hT0MDmeJ)}{vdiFklpp-cL0 z?}voEkI7*_$yv>FvR8-)^cZwW&pATKB~11u{S0IRnL!qi6_f$8figi^AUj9~IY3TO zHfR=THs~(U98eBuE@&Re1#*LOK^~A7ln3&G{2&FC4=Mo72Q2_C1lEW|4qIqzbPM- zx5?j@D+ZSKm=4*sB|WUg?8#@fHch&&y38I$KMak*q1Vq~V|08!b6G4NpN^A1)m!B0 zhx%^F?Dgs`wmqV{Sccc5_5VcmSeQ3ghx%S;ApfBHv81?UpF!4~=jDyE>Rci3au&(I zmwk>;9Y1$G=U6SD8kpOserY%7nQCp)R1uc^>0`YLi{dlYN~tpZ`VU&ea@B42O&xmP zP~Dci=_Yy|)(r3TANm`Hm3gNBm?|dw6?L>A{X&@-RMC^UWL|n2i;H3M2VBgfn zdoUp03cOBSMhS5aQQu{}-W$zg->0BY`W5{qAvXlR@Wo^5jrz)ZvG0nD*!R1H`~nD` zhtw9m&LsAo_gn1yAR&8zVBgfPy+15IZ+|B)p5Ni5)j+Usn9sw_Ux|GOh|6b$_=lq&I-8t9$A26b9nU*rj#AqZ`CYkB-fX*Uzil71KWpD$_hm-1&SdS)Y|BzI zKhHd^Ka(G^S;C1{*e7dWjj8mLWH=hGd^E8Qes8mB!7#_27!($TIw+R?O2X@>uIbUhyLy7QI`-$29BP_Q!bq@^~)4L9XI%T-sw zst#pcR~)qqMZ=MmiCvIf4Lf-KwV;@-Yj5pnZ0SItHWV<=W{F zRrHqj*@t*C{iABpthC9@8aFJ~>aIw|*2=_Acxl`T>z-kRW#!t2Yq-z@*Kna{f#7R$JHK|W?_{nVG6TV&{DpSBNeye8$FP6z z75FwL<1a8o(;PcJYbK{@u#OqmuK4^VlGLXEX HN=yC=7bK%) delta 3374 zcmYM0dr(zX6vjFCoXa^}xDODOm$*?7Q9v#)0S`V(C7Vg5QIQh3H0k)l;Ex!sF+I+- ziwqS_cTT?OHPuv;HU>3mAU?oEA!nS_)EKAfF(Hta;bZK=UEl7HJM+71t?yg=b2=y9l# z`aFs>7MX#FxUZ^7!_^{P166|bIaGgZ4%O?kDN_6q9PXi7q}k!%le7z@&miUWZ8REf zx<9hJSB)JWn^x%mClVC;tD98b+DqkP5LO~J7>z1GdLGp$Y(o7`naibI|1VgG9EvQg zMfGGIp5>AnK)RReaNo|t;k(3ew#WG3TC7l526R4N91>KV< z(y|@hpLM`%+YlAmRF`OVsHMZCGdd#0+s$b4M5tO7*z>kf66tYhk*v|lNC|_@vM{wT zaH1lqsv#RyZ#vQTJ4t_mbVqPuh%>~0GXM4ubGA#(547Ftg6O!U0g!G-lRKDOi90Y9 zr>JwQ8NI^?t0YZfOBfNIw3$lkYQoe5C2OPX<3Sg-!U2vg_5czy(j6C zq>v~mOi3?DdKaWuQ?Kf8(94L1a+;)dk{Ut!8d9!%L^IY`Q>5}P)}SB;UR9C~NxBHq zmy?nmh1c^GIs6H{@?+t(R?gij!P-h z{{dEM^%ywpm((Rmji;=>2)%zp?^Vc&eUdInvWSwp7R;H>nZa2IXAaInISb>=U*O`*&6$U@aLyt)8^Kv5XCpZq#o1`iqBx7@EQYgK z&f+*5!&y9MV>x4-C2%&5v+ifd}_E$6Z&Rzd{e|i`xU1>E=Da>0^inzZRSlS zBHVd9$lc~Ha!+*q;ri57?^@85xWl{`CJuQ*ZrbCuLWRmb2h6ME0&kkV<3umCZjLHmaJ}F<3%8*k~7D}oC85XW5kB*?#Wh903G^DdYhBcQuv`oR*=VK(r zHA&%TZXJR_Bt_bJNGm~x6;A@+MI74>B*jBX z-V1WlF(fE{4T8N$iq0V#dK2yOsG1t%Xcl^lnRB$k?9-cO) - OnlyScavs – Key Ratings + OnlyScavs – Keys @@ -276,107 +217,284 @@ Barters -

Key Ratings

-
- - +

Keys

- - +
+ +
- - + {# Embed map list for JS #} + - -
+ {% macro priority_badge(key) %} + {% if key.priority == 4 %}SUPER + {% elif key.priority == 3 %}HIGH + {% elif key.priority == 2 %}MED + {% elif key.priority == 1 %}LOW + {% elif key.priority == 0 %}IGNORE + {% else %}{% endif %} + {% endmacro %} -
- {% if map_filter %}{% endif %} - {% if sort %}{% endif %} - {% if show %}{% endif %} - -
- -
- - {% for key in keys %} - {% set selected_maps = key_maps.get(key.id, []) %} -
- - - -
-
- {{ key.name }} - {% if key.wiki_url %}wiki ↗{% endif %} -
- {% if selected_maps %} -
- {% for map in maps %} - {% if map.id in selected_maps %} - {{ map.name }} - {% endif %} - {% endfor %} -
+ {% macro key_row(key, show_maps=true) %} + {% set selected_maps = key_maps.get(key.id, []) %} + + + + {{ key.name }} + {% if key.wiki_url %}
wiki ↗{% endif %} + + {{ priority_badge(key) }} + + {% if key.used_in_quest %} + + {% else %} + + {% endif %} + + +
+ {% if show_maps %} + {% for m in maps %}{% if m.id in selected_maps %}{{ m.name }}{% endif %}{% endfor %} {% endif %} + +
- -
- - - - -
- {% endfor %} + {% for map, map_keys in keys_by_map %} +
+
{{ map.name }}
+ + + + + + + + + + + {% for key in map_keys %}{{ key_row(key) }}{% endfor %} + {% if not map_keys %}{% endif %} + +
KeyPriorityQuestMapsNote
No keys assigned to this map.
+
+ {% endfor %} -
- -
- +
+
Unassigned
+ + + + + + + + + + + {% for key in unassigned_keys %}{{ key_row(key, show_maps=false) }}{% endfor %} + {% if not unassigned_keys %}{% endif %} + +
KeyPriorityQuestMapsNote
All keys assigned to maps.
+
+ +