Add functions to parse questionnaires for assessments

This commit is contained in:
Marcus Kammer 2025-02-19 23:54:35 +01:00
parent fae94a6af9
commit aaadcc7463
Signed by: marcuskammer
GPG key ID: C374817BE285268F

View file

@ -16,7 +16,8 @@
#:calculate-statistics #:calculate-statistics
#:average) #:average)
(:export #:assessment-results-html (:export #:assessment-results-html
#:parse-assessments)) #:parse-assessments
#:parse-questionnaires))
(in-package :ml-qmetrics/assessment) (in-package :ml-qmetrics/assessment)
@ -112,11 +113,14 @@ ENTRY: Entry from a response."
(append (getf acc cat-name) value)) (append (getf acc cat-name) value))
acc)) acc))
(defun create-assessment (type responses) (defun create-assessment (name responses)
(ecase type (cond ((string= name "VISAWI")
(:visawi (make-instance 'visawi-assessment :responses responses)) (make-instance 'visawi-assessment :responses responses))
(:sus (make-instance 'sus-assessment :responses responses)) ((string= name "SUS")
(:nps (make-instance 'nps-assessment :responses responses)))) (make-instance 'sus-assessment :responses responses))
((string= name "NPS")
(make-instance 'nps-assessment :responses responses))
(t nil)))
(defun parse-assessments (categorized-responses) (defun parse-assessments (categorized-responses)
(loop for (type data) on categorized-responses by #'cddr (loop for (type data) on categorized-responses by #'cddr
@ -127,6 +131,33 @@ ENTRY: Entry from a response."
(mapcar entry-fn responses) (mapcar entry-fn responses)
:initial-value '())) :initial-value '()))
(defun extract-names (questionnaires)
"Extract unique names from a list of questionnaires."
(remove-duplicates (mapcar (lambda (q)
(getf q :name))
questionnaires)
:test #'string=))
(defun filter-questionnaires (questionnaires name)
"Return a list of questionnaires with the given name."
(remove-if-not (lambda (q)
(string= (getf q :name) name))
questionnaires))
(defun extract-data (questionnaire)
"Extract timestamp-created and post-params from a questionnaire."
(cons (getf questionnaire :timestamp-created)
(getf questionnaire :post-params)))
(defun parse-questionnaires (questionnaires)
"Parse a list of questionnaires and create assessments for each unique name."
(let ((names (extract-names questionnaires)))
(mapcar (lambda (name)
(create-assessment (string-upcase name)
(mapcar #'extract-data
(filter-questionnaires questionnaires name))))
names)))
(defun average-score-per-group (entry-fn responses) (defun average-score-per-group (entry-fn responses)
(let* ((values-per-group (aggregate-values-per-group entry-fn responses)) (let* ((values-per-group (aggregate-values-per-group entry-fn responses))
(average-scores (loop for (category values) on values-per-group by #'cddr (average-scores (loop for (category values) on values-per-group by #'cddr