LOEP-Module
TLDR: Module erlauben LOEP, sehr flexibel an deinen individuellen Anwendungsfall angepasst zu werden. Wenn du dich fragst "Aber kann LOEP auch [irgendwas was nicht eh schon in LOEP drin ist] machen?", dann ist die Antwort vermutlich "Ja, wenn du ein Modul dafür erstellst".
Ich gehe davon aus, dass du vor dem Lesen dieser Seite die Was ist LOEP überhaupt?-Seite gelesen hast.
Überblick
- Jeder Anwendungsfall hat eigene Anforderungen
- LOEP ist durch Module individuell anpassbar
- Wie kann ich ein eigenes Modul erstellen?
- Zusammenfassung
Das Problem: LOEP individuell anpassen
LOEP soll dir ermöglichen, deine individuellen Ideen darüber, wie man ein ROM-System gestalten kann, umzusetzen. Um möglichst viele verschiedene Ideen tatsächlich umsetzen zu können, ist es notwendig, dass LOEP möglichst flexibel erweiterbar ist. Hierbei muss eine Balance erreicht werden: LOEP soll mit möglichst wenig Aufwand / Einarbeitung bedienbar bleiben, aber gleichzeitig bei Bedarf viel Spielraum und Anpassungsfähigkeit bieten. Die Tagline "Simple by default, powerful when needed" des Software-Projekts KDE (www.kde.org) beschreibt diesen Anspruch meiner Meinung nach hervorragend.
Die Lösung: Module
Auch ohne die Verwendung von Modulen bietet LOEP bereits Raum zur individuellen Anpassung: Du kannst beliebig viele eigene Fragebögen anlegen und mit Online-Fragebogen-üblichen Werkzeugen (unterschiedliche Antwortformate, Filterfragen, ...) gestalten. Irgendwann findest du aber vielleicht ein Limit dieser Möglichkeiten, zum Beispiel wenn du
- Gesamt-Scores verwendeter Fragebögen sehr komplex berechnen lassen möchtest
- nach dem Ausfüllen bestimmter Fragebögen automatisch eine Zusammenfassungs-Mail an den*die Therapeut*in verschicken lassen möchtest
- komplexes Feedback (Grafiken, Tabellen, ...) generieren möchtest
Und hier kommen Module ins Spiel: Wenn du ein eigenes Modul erstellst, kannst du nahezu beliebig komplexe Logik in deine Fragbögen einbinden. Die Daumenregel ist: Was du in Python schreiben kannst, kann jetzt auch dein Fragebogen.
Was ist in einem Modul drin?
... und wie erstellt man ein Modul?
Ab hier wird's natürlich etwas technischer.
Wenn dir das unübersichtlich oder nicht ganz verständlich ist und du aber
trotzdem gern wüsstest, ob deine Idee mithilfe eines Moduls in LOEP
umgesetzt werden kann, dann schreib mir gern eine Mail:
maxhag[at]mailbox.org.
Im Folgenden erkläre ich alles anhand eines Beispielmoduls mit dem Namen
loepmod-example.
In dessen Codeberg-Repo
(codeberg.org/loep/loepmod-example)
kannst du bei Bedarf also nochmal "nachlesen", was dich genauer interessiert.
Ein Modul ist einfach eine Handvoll Dateien, die in einer bestimmten Weise
strukturiert sind.
Hier ist zum Beispiel die Verzeichnisstruktur vom
loepmod-example:
loepmod-example/
module.json
module/
data/
example-monitor.json
example-monitor-answers.csv
example-sdec.json
survey-groups.csv
users/
hiwis.csv
patients.csv
tech.csv
therapists.csv
datasets/
item_backends/
feedback_symptoms.py
sessno_table.py
scripts/
init_example_instance.sh
survey_scripts/
write_page_file.py
write_summary_file.py
Und was liegt in den Verzeichnissen und Dateien jeweils?
Gehen wir das mal schrittweise durch.
module.json
Diese Datei ist das "Namensschild" des Moduls und enthält die zentralen Metadaten:
{
"name": "example",
"version": "1.0.0",
}
Das Attribut name sollte exakt dem Verzeichnisnamen
entsprechen, in dem das Modul liegt.
Die version kannst du frei wählen, die ist nur für dich, damit
du einen Überblick hast, welche Version deines Moduls du gerade installiert
hast.
In diesem Modul nicht verwendet, aber theoretisch möglich:
Die module.json kann auch spezifizieren, welche R-, Python- und
apt-Packages dieses Modul benötigt.
Das ist praktisch, falls du zB dein Therapie-Feedback mithilfe eines
speziellen R-Packages berechnen lässt.
Solche zusätzlichen Packages würdest du wie folgt spezifizieren:
{
"name": "example",
"version": "1.0.0",
"apt_packages": "neovim emacs",
"python_packages": "rpy2==3.6.5 rpy2-rinterface==3.6.4 rpy2-robjects==3.6.3",
"r_packages": "scales lme4 ltm"
}
Wenn du LOEP via Docker
(also mit dem mitgelieferten Build-Script:
./build/build.sh run)
verwendest, kann es automatisch diese erforderlichen Packages installieren.
Wenn du LOEP stattdessen direkt über python manage.py runserver
laufen lässt, musst du eventuell erforderliche Packages selbst installieren.
data
Hier kannst du beliebig viele Dateien ablegen. Die Idee ist, dass hier nur Dateien liegen, welche in LOEP importiert werden können. Imloepmod-example sind das:
-
example-monitor.json: JSON-Konfigurationsdatei für eine Survey -
example-monitor-answers.csv: CSV-Datenexport, mit einer SDEC angefertigt -
example-sdec.json: JSON-Konfigurationsdatei für eine Survey Data Export Configuration (SDEC; beschreibt eindeutig und reproduzierbar, wie Daten-Exporte z.B. für wissenschaftliche Forschungszwecke erstellt werden sollen) -
survey-groups.csv: CSV-Tabellen, welche den automatischen Import von Survey Groups (halb so wild falls du jetzt nicht weißt was das ist) erlauben -
Im Unterverzeichnis
users/gesammelt: CSV-Usertabellen, erlauben automatischen Import von mehreren Usern auf ein Mal
datasets
Ähnlich zu data/ legst du auch hier keine Scripts mit
Anweisungen ab, sondern Daten.
Während data/ aber ausschließlich LOEP-spezifische Datenformate
enthalten soll, ist datasets/ der richtige Ort für alle anderen
Daten (z.B. Vergleichsdatensätze für Feedback-Berechnung).
Im loepmod-example liegt hier nix.
item_backends
In den Online-Fragebögen von LOEP kannst du nicht nur die vordefinierten Standard-Itemtypen (Freitext, Single Choice, Multiple Choice, Slider, ...) verwenden, sondern auch beliebige andere, sogenannte "Custom HTML"-Items definieren. Und der Backend-Code dazu, der also im Hintergrund bestimmt, wie dieses Item eigentlich auszusehen und sich zu verhalten hat, liegt hier.
Für jeden von dir definierten Item-Typ liegt hier eine Datei.
In loepmod-example sind zwei Custom HTML Items definiert:
-
feedback_symptoms.pystellt in einem Diagramm graphisch den Symptomverlauf über die bisherigen Sitzungen hinweg dar -
sessno_table.pylistet tabellarisch die bisher in LOEP für diese*n Patient*in erfassten Sitzungen, damit man vor der nächsten Sitzung direkt einen guten Überblick hat.
Wenn du also zum Beispiel eine eigene Vorstellung davon hast, wie dein
ROM-Feedback aussehen sollte, dann ist item_backends/ die
richtige Adresse, um diese Vorstellung umzusetzen.
scripts
Hier kannst du beliebige Scripts zum manuellen Ausführen ablegen.
Im Fall von loepmod-example liegt hier
init_example_instance.sh:
Dieses Script lädt alle Beispiel-Daten aus data/, sodass eine
fertig mit Beispiel-Daten gefütterte LOEP-Instanz entsteht, mit der man
ausprobieren kann, wie sich LOEP bedienen lässt.
survey_scripts
Wenn du eine Survey (also einen Fragebogen) definierst, kannst du spezifizieren, dass zu bestimmten Zeitpunkten (z.B. nach dem Beantworten einer bestimmten Seite oder nach dem Beantworten der gesamten Survey) ein von dir geschriebenes Python-Script ausgeführt werden soll. Solche Scripts legst du in diesem Verzeichnis ab.
Im Falle von loepmod-example sind diese Scripts ziemlich
langweilig:
-
write_page_file.pyist dafür gedacht, nach einer bestimmten Fragebogen-Seite aufgerufen zu werden und erstellt dann eine kleine Text-Datei mit sinnlosem Inhalt auf dem Server. -
write_summary_file.pyist dafür gedacht, nach einer kompletten Survey aufgerufen zu werden und erstellt dann ebenfalls eine kleine Text-Datei mit sinnlosem Inhalt auf dem Server.
Weil diese Script Zugriff auf die erhobenen Daten haben, stehen dir aber unzählige tatsächlich nützliche Optionen zur Verfügung. Du könntest zum Beispiel ein Script schreiben, welches nach Beantwortung eines Fragebogens automatische eine Auswertung des Fragebogens per Mail an die Therapeutin verschickt. Oder ein Script, welches nach Beantwortung eines Fragebogens automatisch die Einladung zum Fragebogen der nächsten Woche erstellt. Oder ein Script, welches basierend auf den bisherigen Fragebogen-Antworten entscheidet, welche Fragebögen der Patient in Zukunft standardmäßig erhalten sollte. Oder oder oder...
Zusammenfassung
Wenn du dich fragst, ob du mit LOEP eine komplizierte Idee umsetzen kannst, dann ist die Antwort vermutlich "Ja, indem du ein Modul dafür erstellst". Und wenn du dir nicht sicher bist, ob du dieses Modul erstellt kriegst, können wir auch gern darüber reden (maxhag[at]mailbox.org), wie ich dir dabei helfen kann. Ich freu mich über mehr Verwendungsmöglichkeiten für LOEP!