src/view/settings.lisp
(in-package :murja.view.settings)
(named-readtables:in-readtable :murja.ps)
(defroute save-settings ("/settings"
:method :post
:decorators (@db
@ssr-authenticated)) ()
(let ((abilities (coerce (murja.model.user:abilities *user*) 'list)))
(when (member "update-settings" abilities :test 'equal)
(let ((form (lisp-fixup:formdata->hashmap (hunchentoot:raw-post-data :force-text t)))
(settings (all-setting-names)))
(maphash (lambda (key value)
(when (member key settings :test 'equal)
(let* ((accessor (setting-getter key))
(old-value (funcall accessor))
(value (if (numberp old-value)
(parse-number:parse-number value)
value)))
(funcall accessor value))))
form)
(setf (hunchentoot:return-code*) 204)
""))))
(deftab settings (:url "/settings"
:title "Settings"
:require-login t
:needed-abilities ("update-settings"))
(let ((all-settings (all-setting-names)))
(:form.form-grid :action (murja.genurl:route->url 'save-settings) :method "post"
(dolist (setting all-settings)
(let ((getter (setting-getter setting)))
(if getter
(progn
(:label ("~a: " setting))
(:input :type (if (numberp (funcall getter))
:number
:text)
:value (funcall getter) :name setting))
(:div.alert ("~s is missing it's getter" setting)))))
(:input :type "submit" :value "Save settings"))))