Nom d'événement¶
Objectif : comprendre le nom d'événement et comment Forge le normalise et le valide.
Ce que vous allez apprendre : un nom est un identifiant snake_case.
normalize_event_name le met en forme (« Page View » → page_view) ;
validate_event_name refuse les caractères interdits (un point, par exemple).
Deuxième palier du niveau débutant de la progression stats.
Module opt-in
Ce starter suppose forge-mvc-stats installé (palier « Installation »).
Ce que ce starter montre¶
normalize_event_name(name)→ formesnake_case;validate_event_name(name)→ validité (ouStatsEventError) ;- une transformation pure.
Classes Forge utilisées¶
| Classe / fonction | Rôle dans ce starter | Référence |
|---|---|---|
forge_mvc_stats.normalize_event_name |
Normaliser un nom d'événement. | Stats |
forge_mvc_stats.validate_event_name |
Refuser un nom invalide. | Stats |
Tester¶
Ouvrez https://localhost:8000/stats-event?name=Page View → page_view.
Le contrôleur¶
# mvc/controllers/stats_event_controller.py
from core.http.request import Request
from core.http.response import Response
from core.mvc.controller.base_controller import BaseController
from forge_mvc_stats import StatsEventError, normalize_event_name, validate_event_name
_DEMO_NAME = "Page View"
def _event_view(raw: str) -> dict:
try:
normalized = normalize_event_name(raw)
validate_event_name(raw)
return {"input": raw, "normalized": normalized, "valid": True, "error": None}
except StatsEventError as exc:
return {"input": raw, "normalized": None, "valid": False, "error": str(exc)}
class StatsEventController(BaseController):
@staticmethod
def index(request: Request) -> Response:
raw = request.query("name") or _DEMO_NAME
return BaseController.render(
"stats_event/index.html", context=_event_view(raw), request=request
)
Comprendre ce code¶
- Le nom
snake_caseest l'identifiant stable de l'événement ; le libellé reste
libre pour l'affichage. - Normaliser avant de comparer/agréger évite de disperser un même événement sous
plusieurs noms. - Un caractère interdit (point, accent) lève
StatsEventError.
La vue¶
<!-- mvc/views/stats_event/index.html -->
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Nom d'événement — Forge</title>
</head>
<body>
<h1>Nom d'événement</h1>
<form method="get" action="/stats-event">
<input type="text" name="name" value="{{ input }}" size="40">
<button type="submit">Normaliser & valider</button>
</form>
<ul>
<li>Entrée : <code>{{ input }}</code></li>
<li>Normalisé : <code>{{ normalized }}</code></li>
<li>Valide : <strong>{% if valid %}oui{% else %}non{% endif %}</strong>{% if error %} — {{ error }}{% endif %}</li>
</ul>
<p>Essayez <code>Page View</code> (→ <code>page_view</code>) puis <code>page.view</code>
(refusé : le point n'est pas autorisé).</p>
</body>
</html>
La route¶
Dans mvc/routes.py, ajoutez l'import en tête de fichier et la route dans le groupe public.
# mvc/routes.py
from mvc.controllers.stats_event_controller import StatsEventController
with router.group("", public=True) as public:
public.add("GET", "/stats-event", StatsEventController.index, name="stats_event_index")
À retenir¶
- Un nom d'événement est un identifiant
snake_casenormalisé. - Cohérence des noms = agrégats fiables.
- Normaliser puis valider.
Après ce starter¶
La suite : le schéma SQL de la table des événements.