Considerable progress on the issue experts workflow, not perfect yet.

This commit is contained in:
Simon Brooke 2018-09-03 12:45:48 +01:00
parent 3df314ecfc
commit 54ad57349c
4 changed files with 100 additions and 14 deletions

View file

@ -6,6 +6,7 @@
[clojure.string :as s]
[clojure.tools.logging :as log]
[clojure.walk :refer [keywordize-keys]]
[java-time :as jt]
[markdown.core :refer [md-to-html-string]]
[noir.util.route :as route]
[ring.util.http-response :as response]
@ -39,6 +40,11 @@
;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; TODO: Must lock record to expert when taking it from the list, unlock after
;;; thirty minutes or when the action is posted, whichever is sooner. If
;;; an expert opens a locked record, it must show up as locked. Also, expert should
;;; not be able to open a closed request.
(defn list-page [request]
(layout/render
"issue-expert/list.html"
@ -48,10 +54,10 @@
:records (db/list-open-requests db/*db* {:expert (:id user)})})))
(defn followup-request-page [request]
(defn get-followup-request-page [request]
(let
[params (support/massage-params request)
id (:id (keywordize-keys params))
id (:id params)
record (db/get-followuprequest db/*db* {:id id})
elector (if
record
@ -65,15 +71,11 @@
db/*db* {:id (:visit_id record)})))]
(layout/render
"issue-expert/request.html"
{:title (str "Request from " (:name elector) " at " (:date visit))
:user (:user (:session request))
:visit visit
:actions (map
{:actions (map
;; HTML-ise the notes in each action record
#(merge % {:notes (md-to-html-string (:notes %))})
(db/list-followupactions-by-followuprequest
db/*db* {:id id}))
:record record
:elector elector
:issue (let
[raw-issue (if
@ -82,13 +84,48 @@
(if raw-issue
(merge
raw-issue
{:brief (md-to-html-string (:brief raw-issue))})))})))
{:brief (md-to-html-string (:brief raw-issue))})))
:options (db/list-options db/*db* params)
:record record
:title (str "Request from " (:name elector) " at " (:date visit))
:user (:user (:session request))
:visit visit})))
(defn post-followup-action
"From this `request`, create a `followupaction` record, and, if an
`option_id` is present in the params, an `intention` record; show
the request list on success, to the request form on failure."
[request]
(support/do-or-log-error
(let
[params (support/massage-params request)
locality (:locality (db/get-locality-for-visit db/*db* {:id (:visit_id params)}))]
(log/debug "post-followup-request-page with request " request)
(db/create-followupaction!
db/*db*
(assoc
params
:actor (:id (:user (:session request)))
:date (jt/to-sql-timestamp (jt/local-date-time))
:closed (= (:closed params) "on")))
(if-not
(zero? (count (:option_id params)))
(if
(zero? (count (:signature (db/get-elector db/*db* {:id (:elector_id params)}))))
;; the elector has NOT recorded GDPR consent: explicitly bind elector_id to nil
(db/create-intention! db/*db* (assoc params :locality locality :elector_id nil))
;; else the elector HAS recorded GDPR consent
(db/create-intention! db/*db* (assoc params :locality locality))))
(list-page request))
:error-return
(get-followup-request-page request)))
(defroutes issue-expert-routes
(GET "/issue-expert/list" request
(route/restricted (list-page request)))
(GET "/issue-expert/followup-request" request
(route/restricted (followup-request-page request)))
(POST "/issue-expert/followup-request" request
(route/restricted (followup-request-page request))))
(route/restricted (get-followup-request-page request)))
(POST "/issue-expert/followup-action" request
(route/restricted (post-followup-action request))))