Yet more progress!

This commit is contained in:
Simon Brooke 2018-06-30 12:51:52 +01:00
parent 78365f8c8b
commit 23a3e71464
58 changed files with 989 additions and 1141 deletions

View file

@ -1,4 +1,6 @@
{:dev true {:dev true
:port 3000 :port 3000
;; when :nrepl-port is set the application starts the nREPL server on load ;; when :nrepl-port is set the application starts the nREPL server on load
:nrepl-port 7000} :nrepl-port 7000
:site-title "Project Hope"
:site-logo "img/ProjectHopeLogo.png"}

View file

@ -24,6 +24,7 @@
[mount "0.1.11"] [mount "0.1.11"]
[org.clojure/clojure "1.8.0"] [org.clojure/clojure "1.8.0"]
[org.clojure/clojurescript "1.9.229" :scope "provided"] [org.clojure/clojurescript "1.9.229" :scope "provided"]
[org.clojure/core.memoize "0.7.1"]
[org.clojure/tools.cli "0.3.5"] [org.clojure/tools.cli "0.3.5"]
[org.clojure/tools.logging "0.3.1"] [org.clojure/tools.logging "0.3.1"]
[org.postgresql/postgresql "9.4.1212"] [org.postgresql/postgresql "9.4.1212"]

View file

@ -78,6 +78,7 @@ header {
margin-top: 0; margin-top: 0;
width:100%; width:100%;
max-width: 100%; max-width: 100%;
min-height: 96px; /* yes, we don't approve of pixel values; but this is to ensure the logo fits. */
background-color: rgb(7, 57, 106); background-color: rgb(7, 57, 106);
color: white; color: white;
} }
@ -238,6 +239,11 @@ th {
border-bottom: thin solid white; border-bottom: thin solid white;
} }
#site-logo {
padding: 0.5em;
float: left;
}
/* but magically appears on mouseover */ /* but magically appears on mouseover */
#cookies:hover #more-about-cookies { #cookies:hover #more-about-cookies {
display: block; display: block;

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View file

@ -1,7 +1,7 @@
------------------------------------------------------------------------ ------------------------------------------------------------------------
-- File queries.sql -- File queries.sql
-- --
-- autogenerated by adl.to-hugsql-queries at 2018-06-29T22:21:53.869Z -- autogenerated by adl.to-hugsql-queries at 2018-06-30T11:35:59.388Z
-- --
-- See [Application Description -- See [Application Description
-- Language](https://github.com/simon-brooke/adl). -- Language](https://github.com/simon-brooke/adl).
@ -282,6 +282,8 @@ SELECT * FROM canvassers
WHERE canvassers.id = :id WHERE canvassers.id = :id
ORDER BY canvassers.username, ORDER BY canvassers.username,
canvassers.fullname, canvassers.fullname,
canvassers.address_id,
canvassers.phone,
canvassers.email, canvassers.email,
canvassers.id canvassers.id
@ -291,6 +293,8 @@ SELECT * FROM canvassers
WHERE canvassers.username = :username WHERE canvassers.username = :username
ORDER BY canvassers.username, ORDER BY canvassers.username,
canvassers.fullname, canvassers.fullname,
canvassers.address_id,
canvassers.phone,
canvassers.email, canvassers.email,
canvassers.id canvassers.id
@ -420,6 +424,8 @@ SELECT DISTINCT * FROM lv_authorities
SELECT DISTINCT * FROM lv_canvassers SELECT DISTINCT * FROM lv_canvassers
ORDER BY lv_canvassers.username, ORDER BY lv_canvassers.username,
lv_canvassers.fullname, lv_canvassers.fullname,
lv_canvassers.address_id,
lv_canvassers.phone,
lv_canvassers.email, lv_canvassers.email,
lv_canvassers.id lv_canvassers.id
--~ (if (:offset params) "OFFSET :offset ") --~ (if (:offset params) "OFFSET :offset ")
@ -433,6 +439,8 @@ WHERE lv_canvassers.id = canvassers.id
AND canvassers.address_id = :id AND canvassers.address_id = :id
ORDER BY lv_canvassers.username, ORDER BY lv_canvassers.username,
lv_canvassers.fullname, lv_canvassers.fullname,
lv_canvassers.address_id,
lv_canvassers.phone,
lv_canvassers.email, lv_canvassers.email,
lv_canvassers.id lv_canvassers.id
@ -444,6 +452,8 @@ WHERE lv_canvassers.id = canvassers.id
AND canvassers.authority_id = :id AND canvassers.authority_id = :id
ORDER BY lv_canvassers.username, ORDER BY lv_canvassers.username,
lv_canvassers.fullname, lv_canvassers.fullname,
lv_canvassers.address_id,
lv_canvassers.phone,
lv_canvassers.email, lv_canvassers.email,
lv_canvassers.id lv_canvassers.id
@ -455,6 +465,8 @@ WHERE lv_canvassers.id = canvassers.id
AND canvassers.elector_id = :id AND canvassers.elector_id = :id
ORDER BY lv_canvassers.username, ORDER BY lv_canvassers.username,
lv_canvassers.fullname, lv_canvassers.fullname,
lv_canvassers.address_id,
lv_canvassers.phone,
lv_canvassers.email, lv_canvassers.email,
lv_canvassers.id lv_canvassers.id
@ -466,6 +478,8 @@ WHERE canvassers.id = ln_canvassers_roles.canvasser_id
AND ln_canvassers_roles.role_id = :id AND ln_canvassers_roles.role_id = :id
ORDER BY canvassers.username, ORDER BY canvassers.username,
canvassers.fullname, canvassers.fullname,
canvassers.address_id,
canvassers.phone,
canvassers.email, canvassers.email,
canvassers.id canvassers.id
@ -783,6 +797,8 @@ WHERE false
--~ (if (:id params) "OR id = :id") --~ (if (:id params) "OR id = :id")
ORDER BY lv_canvassers.username, ORDER BY lv_canvassers.username,
lv_canvassers.fullname, lv_canvassers.fullname,
lv_canvassers.address_id,
lv_canvassers.phone,
lv_canvassers.email, lv_canvassers.email,
lv_canvassers.id lv_canvassers.id
--~ (if (:offset params) "OFFSET :offset ") --~ (if (:offset params) "OFFSET :offset ")

View file

@ -5,7 +5,7 @@
-- --
-- auto-generated by [Application Description Language framework] -- auto-generated by [Application Description Language framework]
-- --
-- (https://github.com/simon-brooke/adl) at 20180629T163619.639Z -- (https://github.com/simon-brooke/adl) at 20180630T113600.308Z
-- --
-- --
-- A web-app intended to be used by canvassers campaigning for a -- A web-app intended to be used by canvassers campaigning for a
@ -576,7 +576,7 @@ GRANT SELECT ON lv_electors TO admin,
CREATE VIEW lv_followupactions AS CREATE VIEW lv_followupactions AS
SELECT electors.name ||', '|| electors.phone ||', '|| electors.email ||', '|| genders.id ||', '|| addresses.address ||', '|| addresses.postcode ||', '|| visits.date ||', '|| issues.id AS request_id_expanded, SELECT electors.name ||', '|| electors.phone ||', '|| electors.email ||', '|| genders.id ||', '|| addresses.address ||', '|| addresses.postcode ||', '|| visits.date ||', '|| issues.id AS request_id_expanded,
followupactions.request_id, followupactions.request_id,
canvassers.username ||', '|| canvassers.fullname ||', '|| canvassers.email AS actor_expanded, canvassers.username ||', '|| canvassers.fullname ||', '|| addresses.address ||', '|| addresses.postcode ||', '|| canvassers.phone ||', '|| canvassers.email AS actor_expanded,
followupactions.actor, followupactions.actor,
followupactions.date, followupactions.date,
followupactions.notes, followupactions.notes,
@ -741,7 +741,7 @@ GRANT SELECT ON lv_teams TO admin,
CREATE VIEW lv_visits AS CREATE VIEW lv_visits AS
SELECT addresses.address ||', '|| addresses.postcode AS address_id_expanded, SELECT addresses.address ||', '|| addresses.postcode AS address_id_expanded,
visits.address_id, visits.address_id,
canvassers.username ||', '|| canvassers.fullname ||', '|| canvassers.email AS canvasser_id_expanded, canvassers.username ||', '|| canvassers.fullname ||', '|| addresses.address ||', '|| addresses.postcode ||', '|| canvassers.phone ||', '|| canvassers.email AS canvasser_id_expanded,
visits.canvasser_id, visits.canvasser_id,
visits.date, visits.date,
visits.id visits.id

View file

@ -0,0 +1,13 @@
{% extends "base.html" %}
{% block big-links %}
{% endblock %}
{% block content %}
<h2>
Alpha test code
</h2>
<p>
Although addresses in the database mostly are real, all personal data in the database
is randomly generated and does not represent real people.
</p>
{% endblock %}

View file

@ -1,4 +1,4 @@
{% extends "base-authenticated.html" %} {% extends "base.html" %}
{% block whole-page %} {% block whole-page %}
<div id="app"> <div id="app">
<div class="splash-screen"> <div class="splash-screen">
@ -23,13 +23,13 @@
</p> </p>
</div> </div>
{% endblock %} {% endblock %}
{% block extra-script %} {% block extra-tail %}
<!-- scripts and styles --> <!-- scripts and styles -->
<!-- ATTENTION \/ --> <!-- ATTENTION \/ -->
<!-- ATTENTION /\ -->
<!-- Leaflet --> <!-- Leaflet -->
<link rel="stylesheet" href="vendor/leaflet/dist/leaflet.css" /> <link rel="stylesheet" href="vendor/leaflet/dist/leaflet.css" />
<script src="vendor/leaflet/dist/leaflet.js"></script> <script src="vendor/leaflet/dist/leaflet.js"></script>
<!-- ATTENTION /\ -->
{% script "/js/app.js" %} {% script "/js/app.js" %}
{% endblock %} {% endblock %}

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File application-index.html generated 2018-06-29T22:21:55.471Z by adl.to-selmer-templates. <!-- File application-index.html generated 2018-06-30T11:36:00.890Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File form-addresses-Address.html generated 2018-06-29T16:36:20.128Z by adl.to-selmer-templates. <!-- File form-addresses-Address.html generated 2018-06-30T11:36:00.879Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File form-authorities-Authority.html generated 2018-06-29T16:36:20.148Z by adl.to-selmer-templates. <!-- File form-authorities-Authority.html generated 2018-06-30T11:36:00.898Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File form-canvassers-Canvasser.html generated 2018-06-29T16:36:20.151Z by adl.to-selmer-templates. <!-- File form-canvassers-Canvasser.html generated 2018-06-30T11:36:00.901Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File form-districts-District.html generated 2018-06-29T16:36:20.120Z by adl.to-selmer-templates. <!-- File form-districts-District.html generated 2018-06-30T11:36:00.870Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File form-dwellings-Dwelling.html generated 2018-06-29T16:36:20.162Z by adl.to-selmer-templates. <!-- File form-dwellings-Dwelling.html generated 2018-06-30T11:36:00.911Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File form-electors-Elector.html generated 2018-06-29T16:36:20.144Z by adl.to-selmer-templates. <!-- File form-electors-Elector.html generated 2018-06-30T11:36:00.894Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File form-followupactions-Followupaction.html generated 2018-06-29T16:36:20.165Z by adl.to-selmer-templates. <!-- File form-followupactions-Followupaction.html generated 2018-06-30T11:36:00.914Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@ -73,7 +73,7 @@ actor
<div class='select-box' farside='canvassers' found='true'> <div class='select-box' farside='canvassers' found='true'>
<input name='actor-search-box' onchange='/* javascript to repopulate the select widget */'/> <input name='actor-search-box' onchange='/* javascript to repopulate the select widget */'/>
<select id='actor' name='actor' comment='JavaScript stuff to fix up aynchronous loading'> <select id='actor' name='actor' comment='JavaScript stuff to fix up aynchronous loading'>
{% for record in canvassers %}<option value='{{record.id}}'>{{record.username}} {{record.fullname}} {{record.email}}</option>{% endfor %} {% for record in canvassers %}<option value='{{record.id}}'>{{record.username}} {{record.fullname}} {{record.address_id}} {{record.phone}} {{record.email}}</option>{% endfor %}
</select> </select>
</div> </div>
{% else %} {% else %}

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File form-followupmethods-Followupmethod.html generated 2018-06-29T16:36:20.167Z by adl.to-selmer-templates. <!-- File form-followupmethods-Followupmethod.html generated 2018-06-30T11:36:00.916Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File form-followuprequests-Followuprequest.html generated 2018-06-29T16:36:20.123Z by adl.to-selmer-templates. <!-- File form-followuprequests-Followuprequest.html generated 2018-06-30T11:36:00.874Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File form-genders-Gender.html generated 2018-06-29T16:36:20.114Z by adl.to-selmer-templates. <!-- File form-genders-Gender.html generated 2018-06-30T11:36:00.862Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File form-intentions-Intention.html generated 2018-06-29T16:36:20.158Z by adl.to-selmer-templates. <!-- File form-intentions-Intention.html generated 2018-06-30T11:36:00.908Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File form-issues-Issue.html generated 2018-06-29T16:36:20.133Z by adl.to-selmer-templates. <!-- File form-issues-Issue.html generated 2018-06-30T11:36:00.883Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File form-options-Option.html generated 2018-06-29T16:36:20.157Z by adl.to-selmer-templates. <!-- File form-options-Option.html generated 2018-06-30T11:36:00.907Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File form-roles-Role.html generated 2018-06-29T16:36:20.134Z by adl.to-selmer-templates. <!-- File form-roles-Role.html generated 2018-06-30T11:36:00.884Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@ -68,7 +68,7 @@ members
<div class='select-box' farside='canvassers' found='true'> <div class='select-box' farside='canvassers' found='true'>
<input name='members-search-box' onchange='/* javascript to repopulate the select widget */'/> <input name='members-search-box' onchange='/* javascript to repopulate the select widget */'/>
<select id='members' name='members' multiple='multiple' comment='JavaScript stuff to fix up aynchronous loading'> <select id='members' name='members' multiple='multiple' comment='JavaScript stuff to fix up aynchronous loading'>
{% for record in canvassers %}<option value='{{record.id}}'>{{record.username}} {{record.fullname}} {{record.email}}</option>{% endfor %} {% for record in canvassers %}<option value='{{record.id}}'>{{record.username}} {{record.fullname}} {{record.address_id}} {{record.phone}} {{record.email}}</option>{% endfor %}
</select> </select>
</div> </div>
{% else %} {% else %}

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File form-teams-Team.html generated 2018-06-29T16:36:20.141Z by adl.to-selmer-templates. <!-- File form-teams-Team.html generated 2018-06-30T11:36:00.891Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@ -109,7 +109,7 @@ members
<div class='select-box' farside='canvassers' found='true'> <div class='select-box' farside='canvassers' found='true'>
<input name='members-search-box' onchange='/* javascript to repopulate the select widget */'/> <input name='members-search-box' onchange='/* javascript to repopulate the select widget */'/>
<select id='members' name='members' multiple='multiple' comment='JavaScript stuff to fix up aynchronous loading'> <select id='members' name='members' multiple='multiple' comment='JavaScript stuff to fix up aynchronous loading'>
{% for record in canvassers %}<option value='{{record.id}}'>{{record.username}} {{record.fullname}} {{record.email}}</option>{% endfor %} {% for record in canvassers %}<option value='{{record.id}}'>{{record.username}} {{record.fullname}} {{record.address_id}} {{record.phone}} {{record.email}}</option>{% endfor %}
</select> </select>
</div> </div>
{% else %} {% else %}
@ -132,7 +132,7 @@ organisers
<div class='select-box' farside='canvassers' found='true'> <div class='select-box' farside='canvassers' found='true'>
<input name='organisers-search-box' onchange='/* javascript to repopulate the select widget */'/> <input name='organisers-search-box' onchange='/* javascript to repopulate the select widget */'/>
<select id='organisers' name='organisers' multiple='multiple' comment='JavaScript stuff to fix up aynchronous loading'> <select id='organisers' name='organisers' multiple='multiple' comment='JavaScript stuff to fix up aynchronous loading'>
{% for record in canvassers %}<option value='{{record.id}}'>{{record.username}} {{record.fullname}} {{record.email}}</option>{% endfor %} {% for record in canvassers %}<option value='{{record.id}}'>{{record.username}} {{record.fullname}} {{record.address_id}} {{record.phone}} {{record.email}}</option>{% endfor %}
</select> </select>
</div> </div>
{% else %} {% else %}

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File form-visits-Visit.html generated 2018-06-29T16:36:20.138Z by adl.to-selmer-templates. <!-- File form-visits-Visit.html generated 2018-06-30T11:36:00.888Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@ -73,7 +73,7 @@ canvasser_id
<div class='select-box' farside='canvassers' found='true'> <div class='select-box' farside='canvassers' found='true'>
<input name='canvasser_id-search-box' onchange='/* javascript to repopulate the select widget */'/> <input name='canvasser_id-search-box' onchange='/* javascript to repopulate the select widget */'/>
<select id='canvasser_id' name='canvasser_id' comment='JavaScript stuff to fix up aynchronous loading'> <select id='canvasser_id' name='canvasser_id' comment='JavaScript stuff to fix up aynchronous loading'>
{% for record in canvassers %}<option value='{{record.id}}'>{{record.username}} {{record.fullname}} {{record.email}}</option>{% endfor %} {% for record in canvassers %}<option value='{{record.id}}'>{{record.username}} {{record.fullname}} {{record.address_id}} {{record.phone}} {{record.email}}</option>{% endfor %}
</select> </select>
</div> </div>
{% else %} {% else %}

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File list-addresses-Addresses.html generated 2018-06-29T16:36:20.150Z by adl.to-selmer-templates. <!-- File list-addresses-Addresses.html generated 2018-06-30T11:36:00.900Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File list-authorities-Authorities.html generated 2018-06-29T16:36:20.122Z by adl.to-selmer-templates. <!-- File list-authorities-Authorities.html generated 2018-06-30T11:36:00.873Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File list-canvassers-Canvassers.html generated 2018-06-29T16:36:20.161Z by adl.to-selmer-templates. <!-- File list-canvassers-Canvassers.html generated 2018-06-30T11:36:00.910Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File list-districts-Districts.html generated 2018-06-29T16:36:20.155Z by adl.to-selmer-templates. <!-- File list-districts-Districts.html generated 2018-06-30T11:36:00.905Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File list-dwellings-Dwellings.html generated 2018-06-29T16:36:20.147Z by adl.to-selmer-templates. <!-- File list-dwellings-Dwellings.html generated 2018-06-30T11:36:00.897Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File list-electors-Electors.html generated 2018-06-29T16:36:20.132Z by adl.to-selmer-templates. <!-- File list-electors-Electors.html generated 2018-06-30T11:36:00.882Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File list-followupactions-Followupactions.html generated 2018-06-29T16:36:20.160Z by adl.to-selmer-templates. <!-- File list-followupactions-Followupactions.html generated 2018-06-30T11:36:00.910Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File list-followupmethods-Followupmethods.html generated 2018-06-29T16:36:20.137Z by adl.to-selmer-templates. <!-- File list-followupmethods-Followupmethods.html generated 2018-06-30T11:36:00.887Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File list-followuprequests-Followuprequests.html generated 2018-06-29T16:36:20.117Z by adl.to-selmer-templates. <!-- File list-followuprequests-Followuprequests.html generated 2018-06-30T11:36:00.866Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File list-genders-Genders.html generated 2018-06-29T16:36:20.110Z by adl.to-selmer-templates. <!-- File list-genders-Genders.html generated 2018-06-30T11:36:00.855Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File list-intentions-Intentions.html generated 2018-06-29T16:36:20.164Z by adl.to-selmer-templates. <!-- File list-intentions-Intentions.html generated 2018-06-30T11:36:00.913Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File list-issues-Issues.html generated 2018-06-29T16:36:20.156Z by adl.to-selmer-templates. <!-- File list-issues-Issues.html generated 2018-06-30T11:36:00.906Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File list-options-Options.html generated 2018-06-29T16:36:20.119Z by adl.to-selmer-templates. <!-- File list-options-Options.html generated 2018-06-30T11:36:00.868Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File list-roles-Roles.html generated 2018-06-29T16:36:20.136Z by adl.to-selmer-templates. <!-- File list-roles-Roles.html generated 2018-06-30T11:36:00.886Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File list-teams-Teams.html generated 2018-06-29T16:36:20.113Z by adl.to-selmer-templates. <!-- File list-teams-Teams.html generated 2018-06-30T11:36:00.860Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
<!-- File list-visits-Visits.html generated 2018-06-29T16:36:20.111Z by adl.to-selmer-templates. <!-- File list-visits-Visits.html generated 2018-06-30T11:36:00.858Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).--> See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block head %} {% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,79 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<link rel="stylesheet" type="text/css" href="css/yyy-common.css" />
<link rel="stylesheet" type="text/css" href="css/yyy-site.css" />
<link rel="stylesheet" type="text/css" href="css/spinner.css" />
<link href="https://fonts.googleapis.com/css?family=Archivo+Black|Archivo+Narrow" rel="stylesheet"/>
<title>{{title}}</title>
</head>
<body>
{% block whole-page %}
{% block top %}
<header>
<div id="nav">
<img id="nav-icon" src="img/threelines.png" alt="Menu"/>
<menu id="nav-menu" class="nav">
<li class=""><a href="home">Home</a></li>
<li class=""><a href="library">Library</a></li>
<li class=""><a href="register">Register</a></li>
<li class="">{% if user %}<a href="logout.html">Logout</a>
{% else %}<a href="login">Login</a>{% endif %}</li>
<li class=""><a href="about">About</a></li>
{% if user %}
<li id="user"><a href="profile">Logged in as {{user.fullname}}</a></li>
{% endif %}
</menu>
</div>
<h1>
{{title}}
</h1>
</header>
{% endblock %}
<div id="main-container" class="container">
<div id="back-link-container">
<a href="javascript:history.back()" id="back-link">Back</a>
</div>
<div id="big-links">
{% block big-links %}
{% endblock %}
</div>
<div if="#content">
{% block content %}
{% endblock %}
</div>
</div>
{% block foot %}
<footer>
<div id="credits">
<div>
<img src="img/credits/ric-logo.png" width="24" height="24"/>
A project of the
<a href="https://radical.scot/">Radical Independence Campaign</a> ||
Version {{version}}
</div>
<div>
<img height="16" width="16" alt="Clojure" src="img/credits/luminus-logo.png"/>Built with <a href="http://www.luminusweb.net/">LuminusWeb</a> ||
<img height="16" width="16" alt="Clojure" src="img/credits/clojure-icon.gif"/> Powered by <a href="http://clojure.org">Clojure</a> ||
<img height="16" width="16" alt="GitHub" src="img/credits/github-logo-transparent.png"/>Find me/fork me on <a href="https://github.com/simon-brooke/smeagol">Github</a> ||
<img height="16" width="16" alt="Free Software Foundation" src="img/credits/gnu.small.png"/>Licensed under the <a href="http://www.gnu.org/licenses/gpl-2.0.html">GNU General Public License version 2.0</a>
</div>
</div>
</footer>
{% endblock %}
{% endblock %}
<script type="text/javascript">
var context = "{{servlet-context}}";
var csrfToken = "{{csrf-token}}";
</script>
{% block extra-script %}
{% endblock %}
</body>
</html>

View file

@ -1,59 +0,0 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:html="http://www.w3.org/1999/xhtml">
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="css/yyy-common.css" />
<link rel="stylesheet" type="text/css" href="css/yyy-site.css" />
<link href="https://fonts.googleapis.com/css?family=Archivo+Black|Archivo+Narrow" rel="stylesheet"/>
<title>{% block title %}{% endblock %}{{title}}</title>
</head>
<body>
<header>
<div id="nav">
<img id="nav-icon" src="img/threelines.png" alt="Menu"/>
<menu id="nav-menu" class="nav">
<li class=""><a href="home">Home</a></li>
<li class=""><a href="auth">Login</a></li>
<li class=""><a href="about">About</a></li>
</menu>
</div>
<h1>
{{title}}
</h1>
</header>
<div id="main-container" class="container">
<div id="big-links">
{% block big-links %}
{% endblock %}
</div>
<div if="#content">
{% block content %}
{% endblock %}
</div>
</div>
<footer>
<div id="credits">
<div>
<img src="img/credits/ric-logo.png" width="24" height="24"/>
A project of the
<a href="https://radical.scot/">Radical Independence Campaign</a> ||
Version {{version}}
</div>
<div>
<img height="16" width="16" alt="Clojure" src="img/credits/luminus-logo.png"/>Built with <a href="http://www.luminusweb.net/">LuminusWeb</a> ||
<img height="16" width="16" alt="Clojure" src="img/credits/clojure-icon.gif"/> Powered by <a href="http://clojure.org">Clojure</a> ||
<img height="16" width="16" alt="GitHub" src="img/credits/github-logo-transparent.png"/>Find me/fork me on <a href="https://github.com/simon-brooke/smeagol">Github</a> ||
<img height="16" width="16" alt="Free Software Foundation" src="img/credits/gnu.small.png"/>Licensed under the <a href="http://www.gnu.org/licenses/gpl-2.0.html">GNU General Public License version 2.0</a>
</div>
</div>
</footer>
<script type="text/javascript">
var context = "{{servlet-context}}";
var csrfToken = "{{csrf-token}}";
</script>
</body>
</html>

View file

@ -7,10 +7,15 @@
<link rel="stylesheet" type="text/css" href="css/yyy-site.css" /> <link rel="stylesheet" type="text/css" href="css/yyy-site.css" />
<link rel="stylesheet" type="text/css" href="css/spinner.css" /> <link rel="stylesheet" type="text/css" href="css/spinner.css" />
<link href="https://fonts.googleapis.com/css?family=Archivo+Black|Archivo+Narrow" rel="stylesheet"/> <link href="https://fonts.googleapis.com/css?family=Archivo+Black|Archivo+Narrow" rel="stylesheet"/>
<title>{{title}}</title> <title>{{site-title}}: {{title}}</title>
{% block extra-head %}
<!-- extra-head: put any additional markup to go into the head of your document into this block -->
<!-- e.g. script tags, link tags -->
{% endblock %}
</head> </head>
<body> <body>
{% block whole-page %} {% block whole-page %}
<!-- whole-page: if you want an entire custom page layout, override this block. -->
{% block top %} {% block top %}
<header> <header>
<div id="nav"> <div id="nav">
@ -27,10 +32,8 @@
{% endif %} {% endif %}
</menu> </menu>
</div> </div>
<img id="site-logo" src="{{site-logo}}" alt="{{site-title}}" width="64" height="64"/>
<h1> <h1>{{title}}</h1>
{{title}}
</h1>
</header> </header>
{% endblock %} {% endblock %}
<div id="main-container" class="container"> <div id="main-container" class="container">
@ -39,15 +42,18 @@
</div> </div>
<div id="big-links"> <div id="big-links">
{% block big-links %} {% block big-links %}
<!-- big-links: put any main navigation links into this block -->
{% endblock %} {% endblock %}
</div> </div>
<div if="#content"> <div if="#content">
{% block content %} {% block content %}
<!-- content: put your main page content into this block -->
{% endblock %} {% endblock %}
</div> </div>
<br clear="both"/> <br clear="both"/>
</div> </div>
{% block foot %} {% block foot %}
<!-- foot: override this block if you don't want the standard footer -->
<footer> <footer>
<div id="credits"> <div id="credits">
<div> <div>
@ -66,11 +72,18 @@
</footer> </footer>
{% endblock %} {% endblock %}
{% endblock %} {% endblock %}
{% block extra-tail %}
<!-- extra-tail: put markup here which needs to be at the very end of the body -->
<!-- e.g. some javascript script tags, some link tags -->
{% endblock %}
<script type="text/javascript"> <script type="text/javascript">
//<![CDATA[
var context = "{{servlet-context}}"; var context = "{{servlet-context}}";
var csrfToken = "{{csrf-token}}"; var csrfToken = "{{csrf-token}}";
{% block extra-script %} {% block extra-script %}
/* extra-script: put any actual javascript source text you need into this block */
{% endblock %} {% endblock %}
//]]>
</script> </script>
</body> </body>
</html> </html>

View file

@ -1,41 +1,15 @@
{% extends "base-unauthenticated.html" %} {% extends "base.html" %}
{% block big-links %} {% block big-links %}
<div id="back-link-container">
<a href="javascript:history.back()" id="back-link">Back</a>
</div>
<div class="big-link-container"> <div class="big-link-container">
<a href="library" class="big-link" id="library-link">Browse&nbsp;the&nbsp;issues</a> <a href="library" class="big-link" id="library-link">Browse&nbsp;the&nbsp;issues</a>
</div> </div>
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<h2>
We'll be in touch!
</h2>
<p> <p>
Thank you, {{name}}. Someone will call you shortly on {{phone}} to talk to you about Thank you, {{name}}. Someone will call you shortly on {{phone}} to talk to you about
{{concern}}. {{concern}}.
</p> </p>
<form action="call-me" method="post">
<p class="widget">
<label for="name">Your name</label>
<input type="text" id="name" name="name"/>
</p>
<p class="widget">
<label for="postcode">Your post-code</label>
<input type="text" id="postcode" name="postcode"/>
</p>
<p class="widget">
<label for="phone">Your phone number</label>
<input type="text" id="phone" name="phone"/>
</p>
<p class="widget">
<label for="concern">Your concerns</label>
<select name="concern" id="concern">
{% for concern in concerns %}
<option>{{concern.title}}</option>
{% endfor %}
</select>
</p>
<p class="widget">
<label for="submit">&nbsp;</label>
<input name="submit" id="submit" type="submit" class="action" value="Call me!"/>
</p>
</form>
{% endblock %} {% endblock %}

View file

@ -1,14 +1,10 @@
{% extends "base-unauthenticated.html" %} {% extends "base.html" %}
{% block big-links %}
<div id="back-link-container">
<a href="javascript:history.back()" id="back-link">Back</a>
</div>
{% endblock %}
{% block content %} {% block content %}
<p> <p>
Use this form to request someone to phone you to discuss your concerns about independence. Use this form to request someone to phone you to discuss your concerns about independence.
</p> </p>
<form action="call-me" method="post"> <form action="call-me" method="post">
{% csrf-field %}
<p class="widget"> <p class="widget">
<label for="name">Your name</label> <label for="name">Your name</label>
<input type="text" id="name" name="name"/> <input type="text" id="name" name="name"/>
@ -25,7 +21,7 @@
<label for="concern">Your concerns</label> <label for="concern">Your concerns</label>
<select name="concern" id="concern"> <select name="concern" id="concern">
{% for concern in concerns %} {% for concern in concerns %}
<option>{{concern.title}}</option> <option>{{concern.id}}</option>
{% endfor %} {% endfor %}
</select> </select>
</p> </p>

View file

@ -1,4 +1,4 @@
{% extends "base-authenticated.html" %} {% extends "base.html" %}
{% block title %} {% block title %}
{% endblock %} {% endblock %}
{% block content %} {% block content %}

View file

@ -1,4 +1,4 @@
{% extends "base-unauthenticated.html" %} {% extends "base.html" %}
{% block big-links %} {% block big-links %}
<div class="big-link-container"> <div class="big-link-container">
<a href="supporter" class="big-link" id="yes-link">Yes</a> <a href="supporter" class="big-link" id="yes-link">Yes</a>
@ -7,3 +7,13 @@
<a href="notyet" class="big-link" id="not-yet-link">No</a> <a href="notyet" class="big-link" id="not-yet-link">No</a>
</div> </div>
{% endblock %} {% endblock %}
{% block content %}
<h2>
Alpha test code
</h2>
<p>
Although addresses in the database mostly are real, all personal data in the database
is randomly generated and does not represent real people.
</p>
{% endblock %}

View file

@ -1,8 +1,5 @@
{% extends "base-unauthenticated.html" %} {% extends "base.html" %}
{% block content %} {% block big-links %}
<div id="back-link-container">
<a href="javascript:history.back()" id="back-link">Back</a>
</div>
{% for authority in authorities %} {% for authority in authorities %}
<div class="big-link-container"> <div class="big-link-container">
<a href="auth?authority={{authority.id}}" class="big-link" id="{{authority.id}}-link"> <a href="auth?authority={{authority.id}}" class="big-link" id="{{authority.id}}-link">
@ -11,6 +8,9 @@
</a> </a>
</div> </div>
{% endfor %} {% endfor %}
{% endblock %}
{% block content %}
<form action="auth" method="post"> <form action="auth" method="post">
{% csrf-field %} {% csrf-field %}
<h2> <h2>

View file

@ -1,4 +1,4 @@
{% extends "base-unauthenticated.html" %} {% extends "base.html" %}
{% block big-links %} {% block big-links %}
<div id="back-link-container"> <div id="back-link-container">
<a href="javascript:history.back()" id="back-link">Back</a> <a href="javascript:history.back()" id="back-link">Back</a>

View file

@ -1,4 +1,4 @@
{% extends "base-authenticated.html" %} {% extends "base.html" %}
{% block title %} {% block title %}
{{ user }} {{ user }}
{% endblock %} {% endblock %}

View file

@ -1,8 +1,5 @@
{% extends "base-unauthenticated.html" %} {% extends "base.html" %}
{% block big-links %} {% block big-links %}
<div id="back-link-container">
<a href="javascript:history.back()" id="back-link">Back</a>
</div>
<div class="big-link-container"> <div class="big-link-container">
<a href="auth" class="big-link" id="yes-link">Yes</a> <a href="auth" class="big-link" id="yes-link">Yes</a>
</div> </div>

View file

@ -10,9 +10,32 @@
[ring.middleware.anti-forgery :refer [*anti-forgery-token*]] [ring.middleware.anti-forgery :refer [*anti-forgery-token*]]
[selmer.parser :as parser] [selmer.parser :as parser]
[selmer.filters :as filters] [selmer.filters :as filters]
[youyesyet.config :refer [env]]
[youyesyet.db.core :as db] [youyesyet.db.core :as db]
)) ))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;
;;;; youyesyet.layout: lay out Selmer-templated web pages.
;;;;
;;;; This program is free software; you can redistribute it and/or
;;;; modify it under the terms of the GNU General Public License
;;;; as published by the Free Software Foundation; either version 2
;;;; of the License, or (at your option) any later version.
;;;;
;;;; This program is distributed in the hope that it will be useful,
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;;; GNU General Public License for more details.
;;;;
;;;; You should have received a copy of the GNU General Public License
;;;; along with this program; if not, write to the Free Software
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
;;;; USA.
;;;;
;;;; Copyright (C) 2016 Simon Brooke for Radical Independence Campaign
;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(declare ^:dynamic *app-context*) (declare ^:dynamic *app-context*)
@ -47,6 +70,8 @@
:csrf-token *anti-forgery-token* :csrf-token *anti-forgery-token*
:user user :user user
:user-roles (get-user-roles user) :user-roles (get-user-roles user)
:site-title (:site-title env)
:site-logo (:site-logo env)
:version (System/getProperty "youyesyet.version")))) :version (System/getProperty "youyesyet.version"))))
"text/html; charset=utf-8"))) "text/html; charset=utf-8")))

View file

@ -1,6 +1,6 @@
(ns (ns
youyesyet.routes.auto youyesyet.routes.auto
"User interface routes for Youyesyet auto-generated by [Application Description Language framework](https://github.com/simon-brooke/adl) at 20180629T222155.170Z" "User interface routes for Youyesyet auto-generated by [Application Description Language framework](https://github.com/simon-brooke/adl) at 20180630T113600.562Z"
(:require (:require
[adl-support.core :as support] [adl-support.core :as support]
[clojure.java.io :as io] [clojure.java.io :as io]
@ -18,6 +18,7 @@
[r] [r]
(l/render (l/render
(support/resolve-template "application-index.html") (support/resolve-template "application-index.html")
(:session r)
{:title "Administrative menu"})) {:title "Administrative menu"}))
(defn (defn

File diff suppressed because it is too large Load diff

View file

@ -6,8 +6,9 @@
[noir.response :as nresponse] [noir.response :as nresponse]
[noir.util.route :as route] [noir.util.route :as route]
[ring.util.http-response :refer [content-type ok]] [ring.util.http-response :refer [content-type ok]]
[youyesyet.layout :as layout] [youyesyet.config :refer [env]]
[youyesyet.db.core :as db-core] [youyesyet.db.core :as db-core]
[youyesyet.layout :as layout]
[youyesyet.oauth :as oauth] [youyesyet.oauth :as oauth]
[compojure.core :refer [defroutes GET POST]] [compojure.core :refer [defroutes GET POST]]
[ring.util.http-response :as response] [ring.util.http-response :as response]
@ -41,7 +42,7 @@
(defn about-page [] (defn about-page []
(layout/render "about.html" {})) (layout/render "about.html" {} {:title (str "About " (:site-title env))}))
(defn call-me-page [request] (defn call-me-page [request]
@ -53,7 +54,7 @@
(layout/render "call-me.html" (:session request) (layout/render "call-me.html" (:session request)
{:title "Please call me!" {:title "Please call me!"
;; TODO: Issues need to be fetched from the database ;; TODO: Issues need to be fetched from the database
:concerns nil}))) :concerns (db-core/list-issues db-core/*db* {})})))
(defn roles-page [request] (defn roles-page [request]
@ -72,7 +73,7 @@
(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

View file

@ -81,7 +81,7 @@
generally.</documentation> generally.</documentation>
</group> </group>
<entity name="electors" magnitude="6"> <entity name="electors" magnitude="6" volatility="5">
<documentation>All electors known to the system; electors are people believed to be entitled to vote in the current campaign.</documentation> <documentation>All electors known to the system; electors are people believed to be entitled to vote in the current campaign.</documentation>
<key> <key>
<property required="true" type="integer" name="id" column="id" immutable="true" distinct="system"> <property required="true" type="integer" name="id" column="id" immutable="true" distinct="system">
@ -92,7 +92,7 @@
<prompt prompt="name" locale="en-GB"/> <prompt prompt="name" locale="en-GB"/>
</property> </property>
<property required="true" type="entity" name="dwelling_id" column="dwelling_id" entity="dwellings" farkey="id"> <property required="true" type="entity" name="dwelling_id" column="dwelling_id" entity="dwellings" farkey="id">
<prompt prompt="Flat" locale="en-GB"/> <prompt prompt="home" locale="en-GB"/>
</property> </property>
<property size="16" type="string" name="phone" column="phone" distinct="user"> <property size="16" type="string" name="phone" column="phone" distinct="user">
<prompt prompt="phone" locale="en-GB"/> <prompt prompt="phone" locale="en-GB"/>
@ -113,7 +113,7 @@
<permission group="issueeditors" permission="read"/> <permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/> <permission group="admin" permission="all"/>
</entity> </entity>
<entity name="genders" magnitude="1"> <entity name="genders" magnitude="1" volatility="6">
<documentation>All genders which may be assigned to electors.</documentation> <documentation>All genders which may be assigned to electors.</documentation>
<key> <key>
<property name="id" type="string" size="32" distinct="all"> <property name="id" type="string" size="32" distinct="all">
@ -129,7 +129,7 @@
<permission group="issueeditors" permission="read"/> <permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/> <permission group="admin" permission="all"/>
</entity> </entity>
<entity name="dwellings" magnitude="6"> <entity name="dwellings" magnitude="6" volatility="6">
<documentation>All dwellings within addresses in the system; a dwelling is a <documentation>All dwellings within addresses in the system; a dwelling is a
house, flat or appartment in which electors live. Every address should have house, flat or appartment in which electors live. Every address should have
at least one dwelling; essentially, an address maps onto a street door and at least one dwelling; essentially, an address maps onto a street door and
@ -154,7 +154,7 @@
<permission group="issueeditors" permission="read"/> <permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/> <permission group="admin" permission="all"/>
</entity> </entity>
<entity name="addresses" magnitude="6"> <entity name="addresses" magnitude="6" volatility="6">
<documentation>Addresses of all buildings which contain dwellings.</documentation> <documentation>Addresses of all buildings which contain dwellings.</documentation>
<key> <key>
<property required="true" type="integer" name="id" column="id" immutable="true" distinct="system"> <property required="true" type="integer" name="id" column="id" immutable="true" distinct="system">
@ -220,7 +220,7 @@
<permission group="issueeditors" permission="read"/> <permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/> <permission group="admin" permission="all"/>
</entity> </entity>
<entity name="visits" magnitude="7"> <entity name="visits" magnitude="7" volatility="2">
<documentation>All visits made by canvassers to dwellings in which opinions were recorded.</documentation> <documentation>All visits made by canvassers to dwellings in which opinions were recorded.</documentation>
<key> <key>
<property required="true" type="integer" name="id" column="id" distinct="system"> <property required="true" type="integer" name="id" column="id" distinct="system">
@ -256,7 +256,7 @@
<permission permission="read" group="issueeditors"/> <permission permission="read" group="issueeditors"/>
<permission permission="all" group="admin"/> <permission permission="all" group="admin"/>
</entity> </entity>
<entity name="authorities" magnitude="2"> <entity name="authorities" magnitude="2" volatility="7">
<documentation>Authorities which may authenticate canvassers to the system.</documentation> <documentation>Authorities which may authenticate canvassers to the system.</documentation>
<key> <key>
<property required="true" type="string" name="id" column="id" size="32" distinct="all"> <property required="true" type="string" name="id" column="id" size="32" distinct="all">
@ -289,7 +289,7 @@
<permission group="issueeditors" permission="read"/> <permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/> <permission group="admin" permission="all"/>
</entity> </entity>
<entity name="issues" magnitude="1"> <entity name="issues" magnitude="1" volatility="3">
<documentation>Issues believed to be of interest to electors, about which they may have questions.</documentation> <documentation>Issues believed to be of interest to electors, about which they may have questions.</documentation>
<key> <key>
<property required="true" type="string" name="id" column="id" size="32" immutable="true" distinct="all"> <property required="true" type="string" name="id" column="id" size="32" immutable="true" distinct="all">
@ -311,7 +311,7 @@
<permission group="issueeditors" permission="edit"/> <permission group="issueeditors" permission="edit"/>
<permission group="admin" permission="all"/> <permission group="admin" permission="all"/>
</entity> </entity>
<entity name="intentions" magnitude="6"> <entity name="intentions" magnitude="6" volatility="2">
<documentation>Intentions of electors to vote for options elicited in visits.</documentation> <documentation>Intentions of electors to vote for options elicited in visits.</documentation>
<property required="true" type="entity" entity="visits" farkey="id" name="visit_id" <property required="true" type="entity" entity="visits" farkey="id" name="visit_id"
column="visit_id"> column="visit_id">
@ -344,7 +344,7 @@
<permission group="issueeditors" permission="none"/> <permission group="issueeditors" permission="none"/>
<permission group="admin" permission="all"/> <permission group="admin" permission="all"/>
</entity> </entity>
<entity name="canvassers" magnitude="5"> <entity name="canvassers" magnitude="5" volatility="4">
<documentation>Primary users of the system: those actually interviewing electors.</documentation> <documentation>Primary users of the system: those actually interviewing electors.</documentation>
<key> <key>
<property type="integer" name="id" column="id" distinct="system" immutable="true"> <property type="integer" name="id" column="id" distinct="system" immutable="true">
@ -400,7 +400,7 @@
<permission group="issueeditors" permission="read"/> <permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/> <permission group="admin" permission="all"/>
</entity> </entity>
<entity name="followuprequests" magnitude="7"> <entity name="followuprequests" magnitude="7" volatility="2">
<documentation>Requests for a followup with an issue expert</documentation> <documentation>Requests for a followup with an issue expert</documentation>
<key> <key>
<property required="true" type="integer" name="id" column="id" distinct="system"> <property required="true" type="integer" name="id" column="id" distinct="system">
@ -432,7 +432,7 @@
<permission group="issueeditors" permission="read"/> <permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/> <permission group="admin" permission="all"/>
</entity> </entity>
<entity name="roles" magnitude="1"> <entity name="roles" magnitude="1" volatility="7">
<documentation>A role (essentially, the same as a group, but application layer rather than database layer) of which a user may be a member.</documentation> <documentation>A role (essentially, the same as a group, but application layer rather than database layer) of which a user may be a member.</documentation>
<key> <key>
<property type="integer" name="id" column="id" immutable="true" distinct="system"> <property type="integer" name="id" column="id" immutable="true" distinct="system">
@ -454,7 +454,7 @@
<permission group="issueeditors" permission="read"/> <permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/> <permission group="admin" permission="all"/>
</entity> </entity>
<entity name="teams" magnitude="4"> <entity name="teams" magnitude="4" volatility="4">
<key> <key>
<property type="integer" name="id" column="id" distinct="system" immutable="true"> <property type="integer" name="id" column="id" distinct="system" immutable="true">
<prompt prompt="id" locale="en-GB"/> <prompt prompt="id" locale="en-GB"/>
@ -499,7 +499,7 @@
<permission permission="read" group="issueeditors"/> <permission permission="read" group="issueeditors"/>
<permission permission="all" group="admin"/> <permission permission="all" group="admin"/>
</entity> </entity>
<entity name="districts" magnitude="4"> <entity name="districts" magnitude="4" volatility="7">
<documentation>Electoral districts: TODO: Shape (polygon) information will need to be added, for use in maps.</documentation> <documentation>Electoral districts: TODO: Shape (polygon) information will need to be added, for use in maps.</documentation>
<key> <key>
<property required="true" type="integer" name="id" column="id" immutable="true" distinct="system"> <property required="true" type="integer" name="id" column="id" immutable="true" distinct="system">
@ -520,7 +520,7 @@
<permission group="issueeditors" permission="read"/> <permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/> <permission group="admin" permission="all"/>
</entity> </entity>
<entity name="followupactions" magnitude="7"> <entity name="followupactions" magnitude="7" volatility="0">
<documentation>Actions taken on followup requests.</documentation> <documentation>Actions taken on followup requests.</documentation>
<key> <key>
<property required="true" type="integer" name="id" column="id" distinct="system"> <property required="true" type="integer" name="id" column="id" distinct="system">
@ -555,7 +555,7 @@
<permission group="issueeditors" permission="read"/> <permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/> <permission group="admin" permission="all"/>
</entity> </entity>
<entity name="options" magnitude="1"> <entity name="options" magnitude="1" volatility="7">
<documentation>Options in the election or referendum being canvassed on</documentation> <documentation>Options in the election or referendum being canvassed on</documentation>
<key> <key>
<property required="true" type="string" name="id" column="id" size="32" immutable="true" distinct="all"> <property required="true" type="string" name="id" column="id" size="32" immutable="true" distinct="all">
@ -571,7 +571,7 @@
<permission group="issueeditors" permission="read"/> <permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/> <permission group="admin" permission="all"/>
</entity> </entity>
<entity name="followupmethods" magnitude="1"> <entity name="followupmethods" magnitude="1" volatility="7">
<key> <key>
<property required="true" type="string" size="32" name="id" column="id" immutable="true" distinct="all"> <property required="true" type="string" size="32" name="id" column="id" immutable="true" distinct="all">
<prompt prompt="id" locale="en-GB"/> <prompt prompt="id" locale="en-GB"/>

View file

@ -91,7 +91,7 @@
<!-- <!--
entity electors already has a key - not generating one entity electors already has a key - not generating one
--> -->
<entity table="electors" name="electors" magnitude="6"> <entity table="electors" name="electors" magnitude="6" volatility="5">
<documentation>All electors known to the system; electors are people believed to be entitled to vote in the current campaign.</documentation> <documentation>All electors known to the system; electors are people believed to be entitled to vote in the current campaign.</documentation>
<key> <key>
<property required="true" type="integer" name="id" column="id" immutable="true" distinct="system"> <property required="true" type="integer" name="id" column="id" immutable="true" distinct="system">
@ -125,7 +125,7 @@
<!-- <!--
entity genders already has a key - not generating one entity genders already has a key - not generating one
--> -->
<entity table="genders" name="genders" magnitude="1"> <entity table="genders" name="genders" magnitude="1" volatility="6">
<documentation>All genders which may be assigned to electors.</documentation> <documentation>All genders which may be assigned to electors.</documentation>
<key> <key>
<property name="id" type="string" size="32" distinct="all"> <property name="id" type="string" size="32" distinct="all">
@ -144,7 +144,7 @@
<!-- <!--
entity dwellings already has a key - not generating one entity dwellings already has a key - not generating one
--> -->
<entity table="dwellings" name="dwellings" magnitude="6"> <entity table="dwellings" name="dwellings" magnitude="6" volatility="6">
<documentation>All dwellings within addresses in the system; a dwelling is a <documentation>All dwellings within addresses in the system; a dwelling is a
house, flat or appartment in which electors live. Every address should have house, flat or appartment in which electors live. Every address should have
at least one dwelling; essentially, an address maps onto a street door and at least one dwelling; essentially, an address maps onto a street door and
@ -172,7 +172,7 @@
<!-- <!--
entity addresses already has a key - not generating one entity addresses already has a key - not generating one
--> -->
<entity table="addresses" name="addresses" magnitude="6"> <entity table="addresses" name="addresses" magnitude="6" volatility="6">
<documentation>Addresses of all buildings which contain dwellings.</documentation> <documentation>Addresses of all buildings which contain dwellings.</documentation>
<key> <key>
<property required="true" type="integer" name="id" column="id" immutable="true" distinct="system"> <property required="true" type="integer" name="id" column="id" immutable="true" distinct="system">
@ -241,7 +241,7 @@
<!-- <!--
entity visits already has a key - not generating one entity visits already has a key - not generating one
--> -->
<entity table="visits" name="visits" magnitude="7"> <entity table="visits" name="visits" magnitude="7" volatility="2">
<documentation>All visits made by canvassers to dwellings in which opinions were recorded.</documentation> <documentation>All visits made by canvassers to dwellings in which opinions were recorded.</documentation>
<key> <key>
<property required="true" type="integer" name="id" column="id" distinct="system"> <property required="true" type="integer" name="id" column="id" distinct="system">
@ -278,7 +278,7 @@
<!-- <!--
entity authorities already has a key - not generating one entity authorities already has a key - not generating one
--> -->
<entity table="authorities" name="authorities" magnitude="2"> <entity table="authorities" name="authorities" magnitude="2" volatility="7">
<documentation>Authorities which may authenticate canvassers to the system.</documentation> <documentation>Authorities which may authenticate canvassers to the system.</documentation>
<key> <key>
<property required="true" type="string" name="id" column="id" size="32" distinct="all"> <property required="true" type="string" name="id" column="id" size="32" distinct="all">
@ -307,7 +307,7 @@
<!-- <!--
entity issues already has a key - not generating one entity issues already has a key - not generating one
--> -->
<entity table="issues" name="issues" magnitude="1"> <entity table="issues" name="issues" magnitude="1" volatility="3">
<documentation>Issues believed to be of interest to electors, about which they may have questions.</documentation> <documentation>Issues believed to be of interest to electors, about which they may have questions.</documentation>
<key> <key>
<property required="true" type="string" name="id" column="id" size="32" immutable="true" distinct="all"> <property required="true" type="string" name="id" column="id" size="32" immutable="true" distinct="all">
@ -332,7 +332,7 @@
<!-- <!--
entity intentions has no key - generating one entity intentions has no key - generating one
--> -->
<entity table="intentions" name="intentions" magnitude="6"> <entity table="intentions" name="intentions" magnitude="6" volatility="0">
<documentation>Intentions of electors to vote for options elicited in visits.</documentation> <documentation>Intentions of electors to vote for options elicited in visits.</documentation>
<key> <key>
<property type="integer" distinct="system" required="true" name="Id"> <property type="integer" distinct="system" required="true" name="Id">
@ -402,7 +402,7 @@
<!-- <!--
entity canvassers already has a key - not generating one entity canvassers already has a key - not generating one
--> -->
<entity table="canvassers" name="canvassers" magnitude="5"> <entity table="canvassers" name="canvassers" magnitude="5" volatility="4">
<documentation>Primary users of the system: those actually interviewing electors.</documentation> <documentation>Primary users of the system: those actually interviewing electors.</documentation>
<key> <key>
<property type="integer" name="id" column="id" distinct="system" immutable="true"> <property type="integer" name="id" column="id" distinct="system" immutable="true">
@ -418,10 +418,10 @@
<property type="entity" name="elector_id" column="elector_id" entity="electors" farkey="id"> <property type="entity" name="elector_id" column="elector_id" entity="electors" farkey="id">
<prompt prompt="elector_id" locale="en-GB"/> <prompt prompt="elector_id" locale="en-GB"/>
</property> </property>
<property required="true" type="entity" name="address_id" column="address_id" entity="addresses" farkey="id"> <property required="true" type="entity" name="address_id" column="address_id" entity="addresses" farkey="id" distinct="user">
<prompt prompt="address_id" locale="en-GB"/> <prompt prompt="address_id" locale="en-GB"/>
</property> </property>
<property type="string" name="phone" column="phone" size="16"> <property type="string" name="phone" column="phone" size="16" distinct="user">
<prompt prompt="phone" locale="en-GB"/> <prompt prompt="phone" locale="en-GB"/>
</property> </property>
<property type="string" name="email" column="email" size="128" distinct="user"> <property type="string" name="email" column="email" size="128" distinct="user">
@ -459,7 +459,7 @@
<!-- <!--
entity followuprequests already has a key - not generating one entity followuprequests already has a key - not generating one
--> -->
<entity table="followuprequests" name="followuprequests" magnitude="7"> <entity table="followuprequests" name="followuprequests" magnitude="7" volatility="2">
<documentation>Requests for a followup with an issue expert</documentation> <documentation>Requests for a followup with an issue expert</documentation>
<key> <key>
<property required="true" type="integer" name="id" column="id" distinct="system"> <property required="true" type="integer" name="id" column="id" distinct="system">
@ -490,7 +490,7 @@
<!-- <!--
entity roles already has a key - not generating one entity roles already has a key - not generating one
--> -->
<entity table="roles" name="roles" magnitude="1"> <entity table="roles" name="roles" magnitude="1" volatility="7">
<documentation>A role (essentially, the same as a group, but application layer rather than database layer) of which a user may be a member.</documentation> <documentation>A role (essentially, the same as a group, but application layer rather than database layer) of which a user may be a member.</documentation>
<key> <key>
<property type="integer" name="id" column="id" immutable="true" distinct="system"> <property type="integer" name="id" column="id" immutable="true" distinct="system">
@ -515,7 +515,7 @@
<!-- <!--
entity teams already has a key - not generating one entity teams already has a key - not generating one
--> -->
<entity table="teams" name="teams" magnitude="4"> <entity table="teams" name="teams" magnitude="4" volatility="4">
<key> <key>
<property type="integer" name="id" column="id" distinct="system" immutable="true"> <property type="integer" name="id" column="id" distinct="system" immutable="true">
<prompt prompt="id" locale="en-GB"/> <prompt prompt="id" locale="en-GB"/>
@ -562,7 +562,7 @@
<!-- <!--
entity districts already has a key - not generating one entity districts already has a key - not generating one
--> -->
<entity table="districts" name="districts" magnitude="4"> <entity table="districts" name="districts" magnitude="4" volatility="7">
<documentation>Electoral districts: TODO: Shape (polygon) information will need to be added, for use in maps.</documentation> <documentation>Electoral districts: TODO: Shape (polygon) information will need to be added, for use in maps.</documentation>
<key> <key>
<property required="true" type="integer" name="id" column="id" immutable="true" distinct="system"> <property required="true" type="integer" name="id" column="id" immutable="true" distinct="system">
@ -586,7 +586,7 @@
<!-- <!--
entity followupactions already has a key - not generating one entity followupactions already has a key - not generating one
--> -->
<entity table="followupactions" name="followupactions" magnitude="7"> <entity table="followupactions" name="followupactions" magnitude="7" volatility="0">
<documentation>Actions taken on followup requests.</documentation> <documentation>Actions taken on followup requests.</documentation>
<key> <key>
<property required="true" type="integer" name="id" column="id" distinct="system"> <property required="true" type="integer" name="id" column="id" distinct="system">
@ -622,7 +622,7 @@
<!-- <!--
entity options already has a key - not generating one entity options already has a key - not generating one
--> -->
<entity table="options" name="options" magnitude="1"> <entity table="options" name="options" magnitude="1" volatility="7">
<documentation>Options in the election or referendum being canvassed on</documentation> <documentation>Options in the election or referendum being canvassed on</documentation>
<key> <key>
<property required="true" type="string" name="id" column="id" size="32" immutable="true" distinct="all"> <property required="true" type="string" name="id" column="id" size="32" immutable="true" distinct="all">
@ -641,7 +641,7 @@
<!-- <!--
entity followupmethods already has a key - not generating one entity followupmethods already has a key - not generating one
--> -->
<entity table="followupmethods" name="followupmethods" magnitude="1"> <entity table="followupmethods" name="followupmethods" magnitude="1" volatility="7">
<key> <key>
<property required="true" type="string" size="32" name="id" column="id" immutable="true" distinct="all"> <property required="true" type="string" size="32" name="id" column="id" immutable="true" distinct="all">
<prompt prompt="id" locale="en-GB"/> <prompt prompt="id" locale="en-GB"/>