diff of 0c485fb83599e6cd096379f89fb6fbd35f229029

0c485fb83599e6cd096379f89fb6fbd35f229029
diff --git a/src/model/settings.lisp b/src/model/settings.lisp
index 084533c..8eba5c1 100644
--- a/src/model/settings.lisp
+++ b/src/model/settings.lisp
@@ -1,6 +1,6 @@
 (defpackage murja.model.settings
   (:use :cl)
-  (:export :setting-getter :all-setting-names :update-setting :defsetting :define-settings)
+  (:export :setting-getter :all-setting-names :update-setting :defsetting :define-settings :create-settings)
   (:import-from :com.inuoe.jzon :stringify :parse)
   (:documentation "This package specifies macros define-settings and defsetting, which are used thus:
 
@@ -45,11 +45,18 @@ These changes are saved in murja's table `blog.Settings`."))
 (defun update-setting (k v)
   (postmodern:execute "INSERT INTO blog.Settings (key, value) VALUES ($1, $2) ON CONFLICT (key) DO UPDATE SET value = excluded.value" k (stringify v)))
 
+(defparameter setting-name-cleaner (alexandria:compose (alexandria:curry #'str:replace-all ":" "")
+						       #'string-downcase
+						       #'prin1-to-string
+						       #'setting-name-access))
+
+(defparameter setting-name-kwcleaner (alexandria:compose (alexandria:curry #'str:replace-all ":" "")
+							 #'string-downcase
+							 #'prin1-to-string))
+
 (defun all-setting-names ()
   "Returns all known setting names as \"strings\""
-  (map 'list (alexandria:compose (alexandria:curry #'str:replace-all ":" "")
-				 #'prin1-to-string
-				 #'setting-name-access)
+  (map 'list setting-name-cleaner
        *setting-fields*))
 
 (defun setting-getter (setting-name-str)
@@ -97,10 +104,12 @@ These changes are saved in murja's table `blog.Settings`."))
 			   (progn
 			     (setf ,(kw-to-sym setting-name) value)
 			     (murja.middleware.db:with-db
-				 (update-setting ,(kw-to-sym setting-name) value))
+				 (update-setting ,(prin1-to-string (kw-to-sym setting-name)) value))
 			     value)
 			   ,(kw-to-sym setting-name))))
-		   (setf (gethash ,(prin1-to-string setting-name) *setting->getter*) (function ,(kw-to-sym setting-name))))))
+		   (setf (gethash ,(funcall setting-name-kwcleaner setting-name)
+				  *setting->getter*)
+			 (function ,(kw-to-sym setting-name))))))
 		
 	    *setting-fields*)
 
diff --git a/src/setting-definitions.lisp b/src/setting-definitions.lisp
index d945cc6..1175d20 100644
--- a/src/setting-definitions.lisp
+++ b/src/setting-definitions.lisp
@@ -3,7 +3,9 @@
   (:export :page-size :rss-email :rss-lang :rss-description :rss-link :rss-title
 	   :blog-title :domain :previously_label :recent-post-count :time-format))
 
-(in-package murja.setting-definitions)
+(in-package :murja.setting-definitions)
+
+(named-readtables:in-readtable :murja.ps)
 
 (define-settings 
   (defsetting time-format "dd.MM.yyyy HH:mm")
diff --git a/src/view/settings.lisp b/src/view/settings.lisp
index 335b577..d0fa314 100644
--- a/src/view/settings.lisp
+++ b/src/view/settings.lisp
@@ -1,18 +1,43 @@
 (defpackage murja.view.settings
   (:use :cl :binding-arrows :spinneret :easy-routes :murja.model.settings)
+  (:import-from :murja.middleware.db :@transaction :@db)
+  (:import-from :murja.middleware.auth :@authenticated :@ssr-authenticated :*user*)
   (:import-from :murja.view.components.tabs :deftab))
 
 (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)))
+		       (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 :action "/settings" :method "post"
+    (:form.form-grid :action "/settings" :method "post"
 	   (dolist (setting all-settings)
 	     (let ((getter (setting-getter setting)))
-	       (if getter 
-	       (:label ("~a: " setting)
-		       (:input :type :text :value (funcall getter) :name setting))
-	       (:div.alert ("~a is missing it's getter" setting))))))))
+	       (if getter
+		   (progn 
+		     (:label ("~a: " setting))
+		     (:input :type :text :value (funcall getter) :name setting))
+		   (:div.alert ("~s is missing it's getter" setting)))))
+
+	   (:input :type "submit" :value "Save settings"))))