implement cfg.puzzle.extra_days

This commit is contained in:
Jörn-Michael Miehe 2023-11-24 01:40:54 +01:00
parent 082f50c66b
commit 090da8c679
6 changed files with 34 additions and 13 deletions

View file

@ -1,6 +1,5 @@
# MUSS
- api: Config-Liste von Extra-Türchen (kein Buchstabe, nur manuelles Bild)
# KANN
@ -21,3 +20,4 @@
- api: admin Login case sensitivity (username "admin" == "AdMiN")
- api: `config.solution` - whitespace="IGNORE"->"REMOVE" umbenennen, +Sonderzeichen
- api: Config-Option "Überspringe leere Türchen" (standard ja)
- api: Config-Liste von Extra-Türchen (kein Buchstabe, nur manuelles Bild)

View file

@ -34,9 +34,6 @@ class Site(BaseModel):
class Puzzle(BaseModel):
# Türchen ohne Buchstabe überspringen
skip_empty: bool = True
# Tag, an dem der Kalender startet
begin_day: int = 1
@ -46,6 +43,12 @@ class Puzzle(BaseModel):
# Kalender so viele Tage nach der letzten Türöffnung schließen
close_after: int = 90
# Tage, für die kein Buchstabe vorgesehen wird
extra_days: set[int] = set()
# Türchen ohne Buchstabe überspringen
skip_empty: bool = True
class Image(BaseModel):
# Quadrat, Seitenlänge in px

View file

@ -1,5 +1,4 @@
import re
from collections import defaultdict
from dataclasses import dataclass
from datetime import date
from io import BytesIO
@ -42,6 +41,11 @@ async def get_all_parts(
Lösung auf vorhandene Tage aufteilen
"""
# noch keine Buchstaben verteilt
result = {day: "" for day in days}
# extra-Tage ausfiltern
days = [day for day in days if day not in cfg.puzzle.extra_days]
solution_length = len(cfg.solution.clean)
num_days = len(days)
@ -55,12 +59,9 @@ async def get_all_parts(
*rnd.sample(days, solution_length % num_days),
]
result: defaultdict[int, str] = defaultdict(str)
for day, letter in zip(solution_days, cfg.solution.clean):
result[day] += letter
result |= {missed_day: "" for missed_day in set(days) - set(result.keys())}
return result
@ -74,7 +75,7 @@ async def get_all_event_dates(
"""
if cfg.puzzle.skip_empty:
days = [day for day in days if parts[day] != ""]
days = [day for day in days if parts[day] != "" or day in cfg.puzzle.extra_days]
return EventDates(
today=date.today(),

View file

@ -36,12 +36,13 @@ class AdminConfigModel(BaseModel):
clean: str
class __Puzzle(BaseModel):
skip_empty: bool
first: date
next: date | None
last: date
end: date
seed: str
extra_days: list[int]
skip_empty: bool
class __Calendar(BaseModel):
config_file: str
@ -88,12 +89,13 @@ async def get_config_model(
"clean": cfg.solution.clean,
},
"puzzle": {
"skip_empty": cfg.puzzle.skip_empty,
"first": event_dates.first,
"next": event_dates.next,
"last": event_dates.last,
"end": event_dates.end,
"seed": cfg.random_seed,
"extra_days": sorted(cfg.puzzle.extra_days),
"skip_empty": cfg.puzzle.skip_empty,
},
"calendar": {
"config_file": cfg.calendar,

View file

@ -69,6 +69,19 @@
"{{ admin_config_model.puzzle.seed }}"
</dd>
<dt>Extra-Tage</dt>
<dd>
<template
v-for="(day, index) in admin_config_model.puzzle.extra_days"
:key="`extra_day-${index}`"
>
<span>
<template v-if="index > 0">, </template>
{{ day }}
</span>
</template>
</dd>
<dt>Leere Türchen</dt>
<dd v-if="admin_config_model.puzzle.skip_empty">Überspringen</dd>
<dd v-else>Anzeigen</dd>
@ -199,12 +212,13 @@ export default class extends Vue {
clean: "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
},
puzzle: {
skip_empty: true,
first: "2023-12-01",
next: "2023-12-01",
last: "2023-12-24",
end: "2024-04-01",
seed: "",
extra_days: [],
skip_empty: true,
},
calendar: {
config_file: "lorem ipsum",

View file

@ -7,12 +7,13 @@ export interface AdminConfigModel {
clean: string;
};
puzzle: {
skip_empty: boolean;
first: string;
next: string | null;
last: string;
end: string;
seed: string;
extra_days: number[];
skip_empty: boolean;
};
calendar: {
config_file: string;