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"))))