Commit c5bc2cc
feat(spa): read --dar-primary from AdminSite.site_primary_color (#631)
Mirrors how `BRAND_TITLE` / `BRAND_LOGO_URL` already fall through to
`AdminSite.site_header` / `site_logo`: a consumer with a custom
`AdminSite` subclass can now brand the whole admin (legacy + SPA)
from one place — set `site_primary_color` on the AdminSite, skip
the `settings.DJANGO_ADMIN_REACT["PRIMARY_COLOR"]` dance.
Resolution order (per-deployment override → structural default →
built-in fallback):
1. `DJANGO_ADMIN_REACT["PRIMARY_COLOR"]` setting, when set.
2. `admin_site.site_primary_color` attr.
3. `DEFAULT_PRIMARY_COLOR` (= `#2563eb`, unchanged).
Every layer runs through the existing hex-regex gate, so CSS
injection is impossible at any source — same trust boundary as
before.
DEFAULTS["PRIMARY_COLOR"] flipped from `"#2563eb"` to `None` so the
resolver can distinguish "consumer set this" from "default is in
effect"; the actual fallback hex now lives in a re-exported
`DEFAULT_PRIMARY_COLOR` constant.
Locked by three new tests in `test_spa_index.py`:
- AdminSite attr is honoured when no setting is configured.
- Explicit setting wins over the AdminSite attr.
- Non-hex AdminSite attr can't inject CSS — falls through to default.
Closes #631.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>1 parent 949aaa9 commit c5bc2cc
3 files changed
Lines changed: 97 additions & 10 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
23 | 29 | | |
24 | 30 | | |
25 | 31 | | |
| |||
59 | 65 | | |
60 | 66 | | |
61 | 67 | | |
62 | | - | |
63 | | - | |
64 | | - | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
65 | 78 | | |
66 | 79 | | |
67 | 80 | | |
| |||
149 | 162 | | |
150 | 163 | | |
151 | 164 | | |
152 | | - | |
| 165 | + | |
153 | 166 | | |
154 | 167 | | |
155 | 168 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
115 | 115 | | |
116 | 116 | | |
117 | 117 | | |
118 | | - | |
| 118 | + | |
119 | 119 | | |
120 | 120 | | |
121 | 121 | | |
| |||
315 | 315 | | |
316 | 316 | | |
317 | 317 | | |
318 | | - | |
| 318 | + | |
319 | 319 | | |
320 | 320 | | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
321 | 332 | | |
322 | 333 | | |
323 | | - | |
324 | | - | |
325 | | - | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
326 | 338 | | |
327 | 339 | | |
328 | 340 | | |
329 | 341 | | |
330 | | - | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
331 | 346 | | |
332 | 347 | | |
333 | 348 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
508 | 508 | | |
509 | 509 | | |
510 | 510 | | |
| 511 | + | |
| 512 | + | |
| 513 | + | |
| 514 | + | |
| 515 | + | |
| 516 | + | |
| 517 | + | |
| 518 | + | |
| 519 | + | |
| 520 | + | |
| 521 | + | |
| 522 | + | |
| 523 | + | |
| 524 | + | |
| 525 | + | |
| 526 | + | |
| 527 | + | |
| 528 | + | |
| 529 | + | |
| 530 | + | |
| 531 | + | |
| 532 | + | |
| 533 | + | |
| 534 | + | |
| 535 | + | |
| 536 | + | |
| 537 | + | |
| 538 | + | |
| 539 | + | |
| 540 | + | |
| 541 | + | |
| 542 | + | |
| 543 | + | |
| 544 | + | |
| 545 | + | |
| 546 | + | |
| 547 | + | |
| 548 | + | |
| 549 | + | |
| 550 | + | |
| 551 | + | |
| 552 | + | |
| 553 | + | |
| 554 | + | |
| 555 | + | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + | |
| 564 | + | |
| 565 | + | |
| 566 | + | |
| 567 | + | |
| 568 | + | |
| 569 | + | |
511 | 570 | | |
512 | 571 | | |
513 | 572 | | |
| |||
0 commit comments