correct application of playlists rules
This commit is contained in:
@@ -1,25 +1,67 @@
|
||||
# playlists/playlist_model.py
|
||||
from pydantic import BaseModel, Field, validator
|
||||
from pydantic import BaseModel, Field, validator, field_validator
|
||||
from typing import List, Optional, Literal
|
||||
from datetime import date, datetime
|
||||
import json
|
||||
import db
|
||||
|
||||
|
||||
from typing import Optional, List, Literal
|
||||
from pydantic import BaseModel, Field
|
||||
import json
|
||||
|
||||
class RuleSet(BaseModel):
|
||||
include_labels: List[str] = []
|
||||
exclude_labels: List[str] = []
|
||||
include_playlists: List[str] = []
|
||||
exclude_playlists: List[str] = []
|
||||
include_playlists: List[int] = []
|
||||
exclude_playlists: List[int] = []
|
||||
date_after: Optional[str] = None
|
||||
date_before: Optional[str] = None
|
||||
date_delta_days: Optional[int] = None
|
||||
difficulty: Optional[str] = None
|
||||
day_of_week: Optional[str] = None
|
||||
address_keyword: Optional[str] = None
|
||||
label_logic: Literal["AND", "OR"] = "AND"
|
||||
logic: Literal["AND", "OR"] = "AND"
|
||||
|
||||
# --- Normalisation des dates (entrée) ---
|
||||
@field_validator("date_after", "date_before", mode="before")
|
||||
def normalize_date(cls, v):
|
||||
"""Convertit automatiquement date/datetime en str ISO avant stockage."""
|
||||
if isinstance(v, (date, datetime)):
|
||||
return v.isoformat()
|
||||
return v
|
||||
|
||||
def model_dump(self, *args, **kwargs):
|
||||
"""Force la sortie JSON-safe (dates converties en str)."""
|
||||
data = super().model_dump(*args, **kwargs)
|
||||
for key in ["date_after", "date_before"]:
|
||||
v = data.get(key)
|
||||
if isinstance(v, (date, datetime)):
|
||||
data[key] = v.isoformat()
|
||||
return data
|
||||
|
||||
@validator("date_after", "date_before", pre=True, always=True)
|
||||
def convert_date(cls, v):
|
||||
"""Convertit automatiquement les objets date/datetime en ISO string."""
|
||||
if isinstance(v, (date, datetime)):
|
||||
return v.isoformat()
|
||||
return v
|
||||
|
||||
def dict(self, *args, **kwargs):
|
||||
"""S’assure que toutes les dates sont des chaînes sérialisables."""
|
||||
data = super().dict(*args, **kwargs)
|
||||
for key in ["date_after", "date_before"]:
|
||||
v = data.get(key)
|
||||
if isinstance(v, (date, datetime)):
|
||||
data[key] = v.isoformat()
|
||||
return data
|
||||
|
||||
def to_json(self) -> str:
|
||||
return json.dumps(self.dict(), ensure_ascii=False, indent=2)
|
||||
|
||||
@classmethod
|
||||
def from_json(cls, raw):
|
||||
"""Accepte None, str vide ou dict JSON."""
|
||||
if not raw:
|
||||
return cls()
|
||||
if isinstance(raw, dict):
|
||||
|
||||
Reference in New Issue
Block a user