src/view/settings.lisp

DOWNLOAD
(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)))
    (murja.model.settings:with-cache
      (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"))))