Beginnings of a working role-routing page

(also the first actual database reads)
This commit is contained in:
simon 2017-07-15 17:49:32 +01:00
parent d534302fd8
commit be324e9d06
4 changed files with 127 additions and 11 deletions

View file

@ -66,6 +66,10 @@ WHERE id = :id
SELECT * FROM authorities SELECT * FROM authorities
WHERE id = :id WHERE id = :id
-- :name get-authorities :? :0
-- :doc retrieve all authorities
SELECT id FROM authorities
-- :name delete-authority! :! :n -- :name delete-authority! :! :n
-- :doc delete a authority given the id -- :doc delete a authority given the id
DELETE FROM authorities DELETE FROM authorities
@ -89,6 +93,16 @@ WHERE id = :id
SELECT * FROM canvassers SELECT * FROM canvassers
WHERE id = :id WHERE id = :id
-- :name get-canvasser-by-username :? :1
-- :doc rerieve a canvasser given the username.
SELECT * FROM canvassers
WHERE username = :username
-- :name get-canvasser-by-email :? :1
-- :doc rerieve a canvasser given the email address.
SELECT * FROM canvassers
WHERE email = :email
-- :name delete-canvasser! :! :n -- :name delete-canvasser! :! :n
-- :doc delete a canvasser given the id -- :doc delete a canvasser given the id
DELETE FROM canvassers DELETE FROM canvassers

View file

@ -0,0 +1,60 @@
{% extends "base-authenticated.html" %}
{% block title %}
{% endblock %}
{% block content %}
<form action="edit-canvasser" method="post">
{% if canvasser %}
<input type="hidden" name="id" id="id" value="{{canvasser.id}}"/>
{% endif %}
<p class="widget">
<label for="fullname">Full name</label>
<input type="text" name="fullname" id="fullname" value="{{canvasser.fullname}}"/>
</p>
<p class="widget">
(TODO: Not absolutely sure what I'm going to do for an elector id widget yet.)
</p>
<p class="widget">
<label for="address">Address</label>
{% if address.id %}
<!-- if we already have an address, just show it with a link to edit it -->
<span class="pseudo-widget" id="address">
{{address.address}}
</span>
{% else %}
(TODO: Some sort of address lookup widget goes here.)
{% endif %}
</p>
<p class="widget">
<label for="phone">Phone number</label>
<input type="tel" name="phone" id="phone" value="{{canvasser.phone}}"/>
</p>
<p class="widget">
<label for="email">Email address</label>
<input type="email" name="email" id="email" value="{{canvasser.email}}"/>
</p>
<p class="widget">
<label for="authority_id">Authorised by</label>
<select name="authority_id" id="authority_id">
{% for authority in authorities %}
<option value="{{authority.id}}"
{% ifequal authority.id canvasser.authority_id %}selected {% endifequal %}>
{{authority.id}}
</option>
</select>
</p>
</p>
id serial,
username character varying(32) NOT NULL,
fullname character varying(64) NOT NULL,
elector_id integer,
address_id integer NOT NULL,
phone character varying(16),
email character varying(128),
authority_id character varying(32) NOT NULL,
introduced_by int references canvassers(id),
authorised boolean
</form>
{% endblock %}

View file

@ -33,15 +33,34 @@
;;; This code adapted from http://www.luminusweb.net/docs#accessing_the_database ;;; This code adapted from http://www.luminusweb.net/docs#accessing_the_database
(defn canvasser-page (defn post?
"Return true if the argument is a ring request which is a post request"
[request] [request]
(if true)
(defn canvasser-page
"Process this canvasser request, and render the canvasser page"
[request]
(let [canvasser (if
(:params request) (:params request)
(let [params (:params request)] (let [params (:params request)]
(if (:id params) (if (:id params)
(db/update-canvasser! params) (if (post? request)
(db/create-canvasser! params)) (db/update-canvasser! params)
))) (db/create-canvasser! params))
(db/get-canvasser (:id params)))
))]
(layout/render
"canvasser.html"
{:title (if canvasser
(str
"Edit canvasser "
(:fullname canvasser)
" "
(:email canvasser))
"Add new canvasser")
:canvasser canvasser
:address (if (:address_id canvasser) (db/get-address (:address_id canvasser)))})))
(defn routing-page (defn routing-page
"Render the routing page, which offers routes according to the user's roles" "Render the routing page, which offers routes according to the user's roles"

View file

@ -48,28 +48,51 @@
;; TODO: Issues need to be fetched from the database ;; TODO: Issues need to be fetched from the database
:concerns nil}))) :concerns nil})))
(defn roles-page [request]
(let
[session (:session request)
username (:user session)
user (if username (db-core/get-canvasser-by-username db-core/*db* {:username username}))
roles (if user (db-core/get-roles-by-canvasser db-core/*db* {:canvasser (:id user)}))]
(cond
roles (layout/render "roles.html"
{:title (str "Welcome " (:fullname user))
:roles roles})
true (assoc (response/found "/login") :session (dissoc session :user))
)))
(defn home-page [] (defn home-page []
(layout/render "home.html" {:title "You Yes Yet?"})) (layout/render "home.html" {:title "You Yes Yet?"}))
(defn login-page (defn login-page
"This is very temporary. We're going to do authentication by oauth." "This is very temporary. We're going to do authentication by oauth."
[request] [request]
(let [params (keywordize-keys (:form-params request)) (let [params (keywordize-keys (:form-params request))
session (:session request) session (:session request)
username (:username params) username (:username params)
user (if username (db-core/get-canvasser-by-username db-core/*db* {:username username}))
password (:password params) password (:password params)
redirect-to (or (:redirect-to params) "app")] redirect-to (or (:redirect-to params) "roles")]
(if (cond
(and (= username "test") (= password "test")) ;; this is obviously, ABSURDLY, insecure. I don't want to put just-about-good-enough,
(do ;; it-will-do-for-now security in place; instead, I want this to be test code only
(assoc (response/found redirect-to) :session (assoc session :user username))) ;; until we have o-auth properly working.
(layout/render "login.html" {:title "Please log in" :redirect-to redirect-to})))) (and user (= username password))
(assoc (response/found redirect-to) :session (assoc session :user username))
user
(layout/render "login.html" {:title (str "User " username " is unknown") :redirect-to redirect-to})
true
(layout/render "login.html" {:title "Please log in" :redirect-to redirect-to}))))
(defroutes home-routes (defroutes home-routes
(GET "/" [] (home-page)) (GET "/" [] (home-page))
(GET "/home" [] (home-page)) (GET "/home" [] (home-page))
(GET "/about" [] (about-page)) (GET "/about" [] (about-page))
(GET "/roles" request (route/restricted (roles-page request)))
(GET "/app" [] (route/restricted (app-page))) (GET "/app" [] (route/restricted (app-page)))
(GET "/call-me" [] (call-me-page nil)) (GET "/call-me" [] (call-me-page nil))
(POST "/call-me" request (call-me-page request)) (POST "/call-me" request (call-me-page request))