barwy kategorii

This commit is contained in:
Mateusz Gruszczyński
2025-10-18 00:01:23 +02:00
parent 5ed356a61c
commit 57a553037b

24
app.py
View File

@@ -11,7 +11,6 @@ import re
import traceback
import bcrypt
import colorsys
from pillow_heif import register_heif_opener
from datetime import datetime, timedelta, UTC, timezone
from urllib.parse import urlparse, urlunparse
@@ -885,13 +884,13 @@ def get_admin_expense_summary():
}
import hashlib, colorsys
def category_to_color(name: str, min_hue_gap_deg: int = 18) -> str:
# Stabilny hash -> int
hv = int(hashlib.md5(name.encode("utf-8")).hexdigest(), 16)
# Proste, ale skuteczne mieszanie bitów, by uniknąć lokalnych skupień
# Proste mieszanie bitów, by uniknąć lokalnych skupień
def rotl(x, r, bits=128):
r %= bits
return ((x << r) | (x >> (bits - r))) & ((1 << bits) - 1)
@@ -901,29 +900,26 @@ def category_to_color(name: str, min_hue_gap_deg: int = 18) -> str:
# Pełne pokrycie koła barw 0..360
hue_deg = mix % 360
# Odpychanie lokalne: mała korekta hue, aby podobne nazwy nie dawały prawie identycznych kolorów
# Odpychanie lokalne po hue, by podobne nazwy nie lądowały zbyt blisko
gap = (rotl(mix, 17) % (2*min_hue_gap_deg)) - min_hue_gap_deg # [-gap, +gap]
hue_deg = (hue_deg + gap) % 360
# Ciemniejszy profil: mniej rażący na ekranie
# Bazowe S/L
s = 0.75
l = 0.52
# DARK profil: niższa jasność i nieco mniejsza saturacja
s = 0.70
l = 0.45
# Ograniczona wariacja, węższe widełki
# Wąska wariacja, żeby uniknąć „neonów” i zachować spójność
s_var = ((rotl(mix, 29) % 5) - 2) / 100.0 # ±0.02
l_var = ((rotl(mix, 53) % 7) - 3) / 100.0 # ±0.03
s = min(0.82, max(0.68, s + s_var))
l = min(0.56, max(0.46, l + l_var))
s = min(0.76, max(0.62, s + s_var))
l = min(0.50, max(0.40, l + l_var))
# Konwersja HLS->RGB (colorsys: H, L, S w [0..1])
# Konwersja HLS->RGB (colorsys: H,L,S w [0..1])
h = hue_deg / 360.0
r, g, b = colorsys.hls_to_rgb(h, l, s)
return f"#{int(round(r*255)):02x}{int(round(g*255)):02x}{int(round(b*255)):02x}"
def get_total_expenses_grouped_by_category(
show_all, range_type, start_date, end_date, user_id, category_id=None
):