Skip to content

Commit b5ab5e2

Browse files
authored
feat: hex to rgb (#213)
1 parent ed2fadc commit b5ab5e2

File tree

3 files changed

+123
-2
lines changed

3 files changed

+123
-2
lines changed

src/unfold/sites.py

+16-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from django.utils.module_loading import import_string
1212

1313
from .settings import get_config
14+
from .utils import hex_to_rgb
1415
from .widgets import INPUT_CLASSES
1516

1617

@@ -68,7 +69,9 @@ def each_context(self, request: HttpRequest) -> Dict[str, Any]:
6869
"show_view_on_site": get_config(self.settings_name)[
6970
"SHOW_VIEW_ON_SITE"
7071
],
71-
"colors": get_config(self.settings_name)["COLORS"],
72+
"colors": self._process_colors(
73+
get_config(self.settings_name)["COLORS"]
74+
),
7275
"tab_list": self.get_tabs_list(request),
7376
"styles": [
7477
self._get_value(style, request)
@@ -334,3 +337,15 @@ def _replace_values(self, target: Dict, source: Dict, request: HttpRequest):
334337
target[key] = source[key]
335338

336339
return target
340+
341+
def _process_colors(
342+
self, colors: Dict[str, Dict[str, str]]
343+
) -> Dict[str, Dict[str, str]]:
344+
for name, weights in colors.items():
345+
for weight, value in weights.items():
346+
if value[0] != "#":
347+
continue
348+
349+
colors[name][weight] = " ".join(str(item) for item in hex_to_rgb(value))
350+
351+
return colors

src/unfold/utils.py

+11-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import datetime
22
import decimal
33
import json
4-
from typing import Any, Iterable
4+
from typing import Any, Iterable, List
55

66
from django.db import models
77
from django.template.loader import render_to_string
@@ -111,3 +111,13 @@ def display_for_field(value: Any, field: Any, empty_value_display: str) -> str:
111111
return display_for_value(value, empty_value_display)
112112
else:
113113
return display_for_value(value, empty_value_display)
114+
115+
116+
def hex_to_rgb(hex_color: str) -> List[int]:
117+
hex_color = hex_color.lstrip("#")
118+
119+
r = int(hex_color[0:2], 16)
120+
g = int(hex_color[2:4], 16)
121+
b = int(hex_color[4:6], 16)
122+
123+
return (r, g, b)

tests/test_colors.py

+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
from django.contrib.auth.models import AnonymousUser
2+
from django.test import TestCase
3+
from django.test.client import RequestFactory
4+
from django.test.utils import override_settings
5+
from unfold.settings import CONFIG_DEFAULTS, get_config
6+
from unfold.sites import UnfoldAdminSite
7+
8+
9+
class ColorsTestCase(TestCase):
10+
@override_settings(
11+
UNFOLD={
12+
**CONFIG_DEFAULTS,
13+
**{
14+
"COLORS": {
15+
"primary": {
16+
50: "#f0f9ff",
17+
100: "#e0f2fe",
18+
200: "#bae6fd",
19+
300: "#7dd3fc",
20+
400: "#38bdf8",
21+
500: "#0ea5e9",
22+
600: "#0284c7",
23+
700: "#0369a1",
24+
800: "#075985",
25+
900: "#0c4a6e",
26+
950: "#082f49",
27+
}
28+
},
29+
},
30+
}
31+
)
32+
def test_colors_hex_to_rgb(self):
33+
admin_site = UnfoldAdminSite()
34+
request = RequestFactory().get("/rand")
35+
request.user = AnonymousUser()
36+
context = admin_site.each_context(request)
37+
self.assertTrue("colors" in context)
38+
self.assertTrue("primary" in context["colors"])
39+
40+
self.assertEqual(context["colors"]["primary"][50], "240 249 255")
41+
self.assertEqual(context["colors"]["primary"][100], "224 242 254")
42+
self.assertEqual(context["colors"]["primary"][200], "186 230 253")
43+
self.assertEqual(context["colors"]["primary"][300], "125 211 252")
44+
self.assertEqual(context["colors"]["primary"][400], "56 189 248")
45+
self.assertEqual(context["colors"]["primary"][500], "14 165 233")
46+
self.assertEqual(context["colors"]["primary"][600], "2 132 199")
47+
self.assertEqual(context["colors"]["primary"][700], "3 105 161")
48+
self.assertEqual(context["colors"]["primary"][800], "7 89 133")
49+
self.assertEqual(context["colors"]["primary"][900], "12 74 110")
50+
self.assertEqual(context["colors"]["primary"][950], "8 47 73")
51+
52+
get_config.cache_clear()
53+
54+
@override_settings(
55+
UNFOLD={
56+
**CONFIG_DEFAULTS,
57+
**{
58+
"COLORS": {
59+
"primary": {
60+
50: "240 249 255",
61+
100: "224 242 254",
62+
200: "186 230 253",
63+
300: "125 211 252",
64+
400: "56 189 248",
65+
500: "14 165 233",
66+
600: "2 132 199",
67+
700: "3 105 161",
68+
800: "7 89 133",
69+
900: "12 74 110",
70+
950: "8 47 73",
71+
}
72+
},
73+
},
74+
}
75+
)
76+
def test_colors_rgb(self):
77+
admin_site = UnfoldAdminSite()
78+
request = RequestFactory().get("/rand")
79+
request.user = AnonymousUser()
80+
context = admin_site.each_context(request)
81+
self.assertTrue("colors" in context)
82+
self.assertTrue("primary" in context["colors"])
83+
84+
self.assertEqual(context["colors"]["primary"][50], "240 249 255")
85+
self.assertEqual(context["colors"]["primary"][100], "224 242 254")
86+
self.assertEqual(context["colors"]["primary"][200], "186 230 253")
87+
self.assertEqual(context["colors"]["primary"][300], "125 211 252")
88+
self.assertEqual(context["colors"]["primary"][400], "56 189 248")
89+
self.assertEqual(context["colors"]["primary"][500], "14 165 233")
90+
self.assertEqual(context["colors"]["primary"][600], "2 132 199")
91+
self.assertEqual(context["colors"]["primary"][700], "3 105 161")
92+
self.assertEqual(context["colors"]["primary"][800], "7 89 133")
93+
self.assertEqual(context["colors"]["primary"][900], "12 74 110")
94+
self.assertEqual(context["colors"]["primary"][950], "8 47 73")
95+
96+
get_config.cache_clear()

0 commit comments

Comments
 (0)