Ajoute un suivi xAPI optionnel (bolt-on) au paquet SCORM exporté
Greffe l'envoi de statements xAPI vers un LRS configurable par le créateur du jeu, en parallèle du reporting SCORM existant : réglages stockés en base (_meta), formulaire dans la modale d'export, injection dans le paquet exporté. Relié aussi bien à l'action de flow "Modifier un score/statut" qu'au parcours quête/quiz (qui alimentait déjà le SCORM classique via un chemin séparé). L'export ne se lance plus automatiquement à l'ouverture de la modale, pour laisser le temps d'enregistrer les réglages xAPI avant de générer le paquet.
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
from ..connection import connect
|
||||
|
||||
|
||||
def get_xapi_settings(slug):
|
||||
"""Réglages xAPI de CE jeu (voir set_xapi_settings.py — stockés dans
|
||||
_meta, même convention que 'name'/'onboarding_type', voir
|
||||
db/games/game_type_catalog.py) : URL du LRS (Learning Record Store)
|
||||
+ identifiants, saisis une seule fois par le créateur du jeu (voir
|
||||
routes/publish/xapi_settings.py) plutôt que négociés à chaque
|
||||
lancement (jamais le protocole cmi5 complet, voir publish/
|
||||
build_scorm_package.py::build_scorm_zip). Chaînes vides si non
|
||||
configuré — `endpoint` vide signifie "xAPI désactivé pour ce jeu"."""
|
||||
conn = connect(slug)
|
||||
rows = conn.execute(
|
||||
"SELECT key, value FROM _meta WHERE key IN ('xapi_lrs_endpoint', 'xapi_lrs_login', 'xapi_lrs_password')"
|
||||
).fetchall()
|
||||
conn.close()
|
||||
values = {row["key"]: row["value"] for row in rows}
|
||||
return {
|
||||
"endpoint": values.get("xapi_lrs_endpoint") or "",
|
||||
"login": values.get("xapi_lrs_login") or "",
|
||||
"password": values.get("xapi_lrs_password") or "",
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
from ..connection import connect
|
||||
|
||||
|
||||
def set_xapi_settings(slug, endpoint, login, password=None):
|
||||
"""Enregistre les réglages xAPI de CE jeu (voir get_xapi_settings.py).
|
||||
`password=None` (champ laissé vide côté formulaire, voir
|
||||
routes/publish/xapi_settings.py) laisse le mot de passe déjà
|
||||
enregistré INCHANGÉ — jamais écrasé par une chaîne vide, pour ne pas
|
||||
obliger à le retaper à chaque modification de l'URL/du login, et pour
|
||||
que la route GET puisse ne jamais renvoyer sa valeur au navigateur
|
||||
(juste un booléen "déjà configuré")."""
|
||||
conn = connect(slug)
|
||||
conn.execute(
|
||||
"INSERT OR REPLACE INTO _meta (key, value) VALUES ('xapi_lrs_endpoint', ?)", (endpoint or "",)
|
||||
)
|
||||
conn.execute(
|
||||
"INSERT OR REPLACE INTO _meta (key, value) VALUES ('xapi_lrs_login', ?)", (login or "",)
|
||||
)
|
||||
if password is not None:
|
||||
conn.execute(
|
||||
"INSERT OR REPLACE INTO _meta (key, value) VALUES ('xapi_lrs_password', ?)", (password,)
|
||||
)
|
||||
conn.commit()
|
||||
conn.close()
|
||||
Reference in New Issue
Block a user