Work with qa url scheme based on forms file system
This commit is contained in:
parent
5ce33edeca
commit
659fa037d5
5 changed files with 26 additions and 20 deletions
|
@ -1,16 +1,20 @@
|
|||
(in-package :ml-survey/handlers)
|
||||
|
||||
(defparameter *url-key-map*
|
||||
'((:survey-id . 1)
|
||||
(:language . 2)
|
||||
(:questionnaire . 3)))
|
||||
|
||||
(defun split-uri (uri)
|
||||
(check-type uri string)
|
||||
(remove-if #'string-empty-p
|
||||
(uiop:split-string uri :separator "/")))
|
||||
|
||||
(defun get-resource-id (resource request)
|
||||
(case resource
|
||||
(survey (second (split-uri request)))))
|
||||
|
||||
(defun get-survey-id (request)
|
||||
(get-resource-id 'survey request))
|
||||
(defun extract-from (url key)
|
||||
(let* ((parts (split-uri url))
|
||||
(index (cdr (assoc key *url-key-map*))))
|
||||
(when (and parts index)
|
||||
(nth index parts))))
|
||||
|
||||
(defun today ()
|
||||
"Return today's date formatted as ISO-8601."
|
||||
|
|
|
@ -1,20 +1,20 @@
|
|||
(in-package :ml-survey/handlers)
|
||||
|
||||
(defun questionnaire-uri-p (uri)
|
||||
"Check if the request URI matches the pattern '/survey/<numeric>/questionnaire/type'"
|
||||
"Check if the request URI matches the pattern '/survey/<numeric>/lang/type'"
|
||||
(let ((parts (split-uri uri)))
|
||||
(and (= (length parts) 4)
|
||||
(string= (first parts) "survey")
|
||||
(every #'digit-char-p (second parts))
|
||||
(string= (third parts) "questionnaire"))))
|
||||
(= 2 (length (third parts))))))
|
||||
|
||||
(defun questionnaire-uri (request)
|
||||
(questionnaire-uri-p (request-uri request)))
|
||||
|
||||
(defun process-questionnaire-get (lang)
|
||||
(defun process-questionnaire-get (lang questionnaire)
|
||||
(check-type lang string)
|
||||
(setf ml-survey:*html-lang* lang)
|
||||
(ml-survey/views:sus-form))
|
||||
(ml-survey/views:sus-form questionnaire))
|
||||
|
||||
(defun process-questionnaire-post (request survey)
|
||||
(let* ((post-params (post-parameters* request))
|
||||
|
@ -25,8 +25,10 @@
|
|||
(ml-survey/views:questionnaire-submit)))
|
||||
|
||||
(define-easy-handler (questionnaire :uri #'questionnaire-uri) (lang)
|
||||
(let ((s (make-instance 'ml-survey:survey :id (get-survey-id (request-uri*)))))
|
||||
(let ((s (make-instance 'ml-survey:survey
|
||||
:id (extract-from (request-uri*) :survey-id))))
|
||||
(cond ((eq (hunchentoot:request-method*) :get)
|
||||
(process-questionnaire-get lang))
|
||||
(process-questionnaire-get (extract-from (request-uri*) :language)
|
||||
(extract-from (request-uri*) :questionnaire)))
|
||||
((eq (hunchentoot:request-method*) :post)
|
||||
(process-questionnaire-post *request* s)))))
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#:survey-properties-description
|
||||
#:ensure-data-dir
|
||||
#:ensure-data-file-exist
|
||||
#:ensure-forms-dir
|
||||
#:forms-dir
|
||||
#:forms-list-files
|
||||
#:extract-lang-and-filename
|
||||
|
|
|
@ -48,7 +48,7 @@
|
|||
(cdr (assoc "description" (survey-properties survey) :test #'string-equal)))
|
||||
|
||||
(defun build-questionnaire-link (survey-id resource)
|
||||
(format nil "/survey/~a/questionnaire~a" survey-id resource))
|
||||
(format nil "/survey/~a~a" survey-id resource))
|
||||
|
||||
(defmethod survey-html ((survey survey))
|
||||
(spinneret:with-html
|
||||
|
|
|
@ -1,12 +1,11 @@
|
|||
(in-package :ml-survey/views)
|
||||
|
||||
(defun load-form (lang form-file-name)
|
||||
(defun load-form (lang questionnaire)
|
||||
"Load a Lisp file containing form definitions."
|
||||
(check-type lang string)
|
||||
(check-type form-file-name string)
|
||||
(let* ((relative-path (concatenate 'string "src/views/forms/" lang "/"))
|
||||
(full-path (uiop:merge-pathnames* relative-path (uiop:getcwd)))
|
||||
(form-path (uiop:merge-pathnames* form-file-name full-path)))
|
||||
(check-type questionnaire string)
|
||||
(let* ((full-path (uiop:merge-pathnames* (format nil "~a/~a.lisp" lang questionnaire)
|
||||
(ml-survey:ensure-forms-dir))))
|
||||
(unless (probe-file form-path)
|
||||
(error "Form file ~A does not exist." form-path))
|
||||
(load form-path))
|
||||
|
@ -31,7 +30,7 @@ available in its environment for full functionality."
|
|||
(btn-primary (:type "submit")
|
||||
(find-l10n "submit" ml-survey:*html-lang* *l10n*))))))
|
||||
|
||||
(defun sus-form ()
|
||||
(defun sus-form (questionnaire)
|
||||
(with-page (:title "SUS Form")
|
||||
(body-header "System Usability Form")
|
||||
(with-form (load-form ml-survey:*html-lang* "sus.lisp"))))
|
||||
(with-form (load-form ml-survey:*html-lang* questionnaire))))
|
||||
|
|
Loading…
Add table
Reference in a new issue