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
:port 3000
;; 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"]
[org.clojure/clojure "1.8.0"]
[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.logging "0.3.1"]
[org.postgresql/postgresql "9.4.1212"]

View file

@ -78,6 +78,7 @@ header {
margin-top: 0;
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);
color: white;
}
@ -238,6 +239,11 @@ th {
border-bottom: thin solid white;
}
#site-logo {
padding: 0.5em;
float: left;
}
/* but magically appears on mouseover */
#cookies:hover #more-about-cookies {
display: block;

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View file

@ -1,7 +1,7 @@
------------------------------------------------------------------------
-- 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
-- Language](https://github.com/simon-brooke/adl).
@ -282,6 +282,8 @@ SELECT * FROM canvassers
WHERE canvassers.id = :id
ORDER BY canvassers.username,
canvassers.fullname,
canvassers.address_id,
canvassers.phone,
canvassers.email,
canvassers.id
@ -291,6 +293,8 @@ SELECT * FROM canvassers
WHERE canvassers.username = :username
ORDER BY canvassers.username,
canvassers.fullname,
canvassers.address_id,
canvassers.phone,
canvassers.email,
canvassers.id
@ -420,6 +424,8 @@ SELECT DISTINCT * FROM lv_authorities
SELECT DISTINCT * FROM lv_canvassers
ORDER BY lv_canvassers.username,
lv_canvassers.fullname,
lv_canvassers.address_id,
lv_canvassers.phone,
lv_canvassers.email,
lv_canvassers.id
--~ (if (:offset params) "OFFSET :offset ")
@ -433,6 +439,8 @@ WHERE lv_canvassers.id = canvassers.id
AND canvassers.address_id = :id
ORDER BY lv_canvassers.username,
lv_canvassers.fullname,
lv_canvassers.address_id,
lv_canvassers.phone,
lv_canvassers.email,
lv_canvassers.id
@ -444,6 +452,8 @@ WHERE lv_canvassers.id = canvassers.id
AND canvassers.authority_id = :id
ORDER BY lv_canvassers.username,
lv_canvassers.fullname,
lv_canvassers.address_id,
lv_canvassers.phone,
lv_canvassers.email,
lv_canvassers.id
@ -455,6 +465,8 @@ WHERE lv_canvassers.id = canvassers.id
AND canvassers.elector_id = :id
ORDER BY lv_canvassers.username,
lv_canvassers.fullname,
lv_canvassers.address_id,
lv_canvassers.phone,
lv_canvassers.email,
lv_canvassers.id
@ -466,6 +478,8 @@ WHERE canvassers.id = ln_canvassers_roles.canvasser_id
AND ln_canvassers_roles.role_id = :id
ORDER BY canvassers.username,
canvassers.fullname,
canvassers.address_id,
canvassers.phone,
canvassers.email,
canvassers.id
@ -783,6 +797,8 @@ WHERE false
--~ (if (:id params) "OR id = :id")
ORDER BY lv_canvassers.username,
lv_canvassers.fullname,
lv_canvassers.address_id,
lv_canvassers.phone,
lv_canvassers.email,
lv_canvassers.id
--~ (if (:offset params) "OFFSET :offset ")

View file

@ -5,7 +5,7 @@
--
-- 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
@ -576,7 +576,7 @@ GRANT SELECT ON lv_electors TO admin,
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,
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.date,
followupactions.notes,
@ -741,7 +741,7 @@ GRANT SELECT ON lv_teams TO admin,
CREATE VIEW lv_visits AS
SELECT addresses.address ||', '|| addresses.postcode AS address_id_expanded,
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.date,
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 %}
<div id="app">
<div class="splash-screen">
@ -23,13 +23,13 @@
</p>
</div>
{% endblock %}
{% block extra-script %}
{% block extra-tail %}
<!-- scripts and styles -->
<!-- ATTENTION \/ -->
<!-- ATTENTION /\ -->
<!-- Leaflet -->
<link rel="stylesheet" href="vendor/leaflet/dist/leaflet.css" />
<script src="vendor/leaflet/dist/leaflet.js"></script>
<!-- ATTENTION /\ -->
{% script "/js/app.js" %}
{% endblock %}

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@ -73,7 +73,7 @@ actor
<div class='select-box' farside='canvassers' found='true'>
<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'>
{% 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>
</div>
{% else %}

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@ -68,7 +68,7 @@ members
<div class='select-box' farside='canvassers' found='true'>
<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'>
{% 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>
</div>
{% else %}

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
@ -109,7 +109,7 @@ members
<div class='select-box' farside='canvassers' found='true'>
<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'>
{% 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>
</div>
{% else %}
@ -132,7 +132,7 @@ organisers
<div class='select-box' farside='canvassers' found='true'>
<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'>
{% 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>
</div>
{% else %}

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<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'>
<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'>
{% 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>
</div>
{% else %}

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

View file

@ -1,5 +1,5 @@
{% 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).-->
{% block head %}
<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/spinner.css" />
<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>
<body>
{% block whole-page %}
<!-- whole-page: if you want an entire custom page layout, override this block. -->
{% block top %}
<header>
<div id="nav">
@ -27,10 +32,8 @@
{% endif %}
</menu>
</div>
<h1>
{{title}}
</h1>
<img id="site-logo" src="{{site-logo}}" alt="{{site-title}}" width="64" height="64"/>
<h1>{{title}}</h1>
</header>
{% endblock %}
<div id="main-container" class="container">
@ -39,15 +42,18 @@
</div>
<div id="big-links">
{% block big-links %}
<!-- big-links: put any main navigation links into this block -->
{% endblock %}
</div>
<div if="#content">
{% block content %}
<!-- content: put your main page content into this block -->
{% endblock %}
</div>
<br clear="both"/>
</div>
{% block foot %}
<!-- foot: override this block if you don't want the standard footer -->
<footer>
<div id="credits">
<div>
@ -66,11 +72,18 @@
</footer>
{% 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">
//<![CDATA[
var context = "{{servlet-context}}";
var csrfToken = "{{csrf-token}}";
{% block extra-script %}
/* extra-script: put any actual javascript source text you need into this block */
{% endblock %}
//]]>
</script>
</body>
</html>

View file

@ -1,41 +1,15 @@
{% 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>
<div class="big-link-container">
<a href="library" class="big-link" id="library-link">Browse&nbsp;the&nbsp;issues</a>
</div>
{% endblock %}
{% block content %}
<h2>
We'll be in touch!
</h2>
<p>
Thank you, {{name}}. Someone will call you shortly on {{phone}} to talk to you about
{{concern}}.
</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 %}

View file

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

View file

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

View file

@ -1,4 +1,4 @@
{% extends "base-unauthenticated.html" %}
{% extends "base.html" %}
{% block big-links %}
<div class="big-link-container">
<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>
</div>
{% 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,9 +1,6 @@
{% extends "base-unauthenticated.html" %}
{% block content %}
<div id="back-link-container">
<a href="javascript:history.back()" id="back-link">Back</a>
</div>
{% for authority in authorities %}
{% extends "base.html" %}
{% block big-links %}
{% for authority in authorities %}
<div class="big-link-container">
<a href="auth?authority={{authority.id}}" class="big-link" id="{{authority.id}}-link">
<img src="img/authorities/{{authority.id}}.png" width="32" height="32" alt="{{authority.id}}"/>
@ -11,6 +8,9 @@
</a>
</div>
{% endfor %}
{% endblock %}
{% block content %}
<form action="auth" method="post">
{% csrf-field %}
<h2>

View file

@ -1,4 +1,4 @@
{% 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>

View file

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

View file

@ -1,9 +1,6 @@
{% 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>
<div class="big-link-container">
<div class="big-link-container">
<a href="auth" class="big-link" id="yes-link">Yes</a>
</div>
<div class="big-link-container">

View file

@ -10,9 +10,32 @@
[ring.middleware.anti-forgery :refer [*anti-forgery-token*]]
[selmer.parser :as parser]
[selmer.filters :as filters]
[youyesyet.config :refer [env]]
[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*)
@ -47,6 +70,8 @@
:csrf-token *anti-forgery-token*
:user user
:user-roles (get-user-roles user)
:site-title (:site-title env)
:site-logo (:site-logo env)
:version (System/getProperty "youyesyet.version"))))
"text/html; charset=utf-8")))

View file

@ -1,6 +1,6 @@
(ns
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
[adl-support.core :as support]
[clojure.java.io :as io]
@ -18,6 +18,7 @@
[r]
(l/render
(support/resolve-template "application-index.html")
(:session r)
{:title "Administrative menu"}))
(defn

File diff suppressed because it is too large Load diff

View file

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

View file

@ -81,7 +81,7 @@
generally.</documentation>
</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>
<key>
<property required="true" type="integer" name="id" column="id" immutable="true" distinct="system">
@ -92,7 +92,7 @@
<prompt prompt="name" locale="en-GB"/>
</property>
<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 size="16" type="string" name="phone" column="phone" distinct="user">
<prompt prompt="phone" locale="en-GB"/>
@ -113,7 +113,7 @@
<permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/>
</entity>
<entity name="genders" magnitude="1">
<entity name="genders" magnitude="1" volatility="6">
<documentation>All genders which may be assigned to electors.</documentation>
<key>
<property name="id" type="string" size="32" distinct="all">
@ -129,7 +129,7 @@
<permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/>
</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
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
@ -154,7 +154,7 @@
<permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/>
</entity>
<entity name="addresses" magnitude="6">
<entity name="addresses" magnitude="6" volatility="6">
<documentation>Addresses of all buildings which contain dwellings.</documentation>
<key>
<property required="true" type="integer" name="id" column="id" immutable="true" distinct="system">
@ -220,7 +220,7 @@
<permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/>
</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>
<key>
<property required="true" type="integer" name="id" column="id" distinct="system">
@ -256,7 +256,7 @@
<permission permission="read" group="issueeditors"/>
<permission permission="all" group="admin"/>
</entity>
<entity name="authorities" magnitude="2">
<entity name="authorities" magnitude="2" volatility="7">
<documentation>Authorities which may authenticate canvassers to the system.</documentation>
<key>
<property required="true" type="string" name="id" column="id" size="32" distinct="all">
@ -289,7 +289,7 @@
<permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/>
</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>
<key>
<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="admin" permission="all"/>
</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>
<property required="true" type="entity" entity="visits" farkey="id" name="visit_id"
column="visit_id">
@ -344,7 +344,7 @@
<permission group="issueeditors" permission="none"/>
<permission group="admin" permission="all"/>
</entity>
<entity name="canvassers" magnitude="5">
<entity name="canvassers" magnitude="5" volatility="4">
<documentation>Primary users of the system: those actually interviewing electors.</documentation>
<key>
<property type="integer" name="id" column="id" distinct="system" immutable="true">
@ -400,7 +400,7 @@
<permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/>
</entity>
<entity name="followuprequests" magnitude="7">
<entity name="followuprequests" magnitude="7" volatility="2">
<documentation>Requests for a followup with an issue expert</documentation>
<key>
<property required="true" type="integer" name="id" column="id" distinct="system">
@ -432,7 +432,7 @@
<permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/>
</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>
<key>
<property type="integer" name="id" column="id" immutable="true" distinct="system">
@ -454,7 +454,7 @@
<permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/>
</entity>
<entity name="teams" magnitude="4">
<entity name="teams" magnitude="4" volatility="4">
<key>
<property type="integer" name="id" column="id" distinct="system" immutable="true">
<prompt prompt="id" locale="en-GB"/>
@ -499,7 +499,7 @@
<permission permission="read" group="issueeditors"/>
<permission permission="all" group="admin"/>
</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>
<key>
<property required="true" type="integer" name="id" column="id" immutable="true" distinct="system">
@ -520,7 +520,7 @@
<permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/>
</entity>
<entity name="followupactions" magnitude="7">
<entity name="followupactions" magnitude="7" volatility="0">
<documentation>Actions taken on followup requests.</documentation>
<key>
<property required="true" type="integer" name="id" column="id" distinct="system">
@ -555,7 +555,7 @@
<permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/>
</entity>
<entity name="options" magnitude="1">
<entity name="options" magnitude="1" volatility="7">
<documentation>Options in the election or referendum being canvassed on</documentation>
<key>
<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="admin" permission="all"/>
</entity>
<entity name="followupmethods" magnitude="1">
<entity name="followupmethods" magnitude="1" volatility="7">
<key>
<property required="true" type="string" size="32" name="id" column="id" immutable="true" distinct="all">
<prompt prompt="id" locale="en-GB"/>

View file

@ -89,9 +89,9 @@
generally.</documentation>
</group>
<!--
entity electors already has a key - not generating one
-->
<entity table="electors" name="electors" magnitude="6">
entity electors already has a key - not generating one
-->
<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>
<key>
<property required="true" type="integer" name="id" column="id" immutable="true" distinct="system">
@ -123,9 +123,9 @@
<permission group="admin" permission="all"/>
</entity>
<!--
entity genders already has a key - not generating one
-->
<entity table="genders" name="genders" magnitude="1">
entity genders already has a key - not generating one
-->
<entity table="genders" name="genders" magnitude="1" volatility="6">
<documentation>All genders which may be assigned to electors.</documentation>
<key>
<property name="id" type="string" size="32" distinct="all">
@ -142,9 +142,9 @@
<permission group="admin" permission="all"/>
</entity>
<!--
entity dwellings already has a key - not generating one
-->
<entity table="dwellings" name="dwellings" magnitude="6">
entity dwellings already has a key - not generating one
-->
<entity table="dwellings" name="dwellings" magnitude="6" volatility="6">
<documentation>All dwellings within addresses in the system; a dwelling is a
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
@ -170,9 +170,9 @@
<permission group="admin" permission="all"/>
</entity>
<!--
entity addresses already has a key - not generating one
-->
<entity table="addresses" name="addresses" magnitude="6">
entity addresses already has a key - not generating one
-->
<entity table="addresses" name="addresses" magnitude="6" volatility="6">
<documentation>Addresses of all buildings which contain dwellings.</documentation>
<key>
<property required="true" type="integer" name="id" column="id" immutable="true" distinct="system">
@ -239,9 +239,9 @@
<permission group="admin" permission="all"/>
</entity>
<!--
entity visits already has a key - not generating one
-->
<entity table="visits" name="visits" magnitude="7">
entity visits already has a key - not generating one
-->
<entity table="visits" name="visits" magnitude="7" volatility="2">
<documentation>All visits made by canvassers to dwellings in which opinions were recorded.</documentation>
<key>
<property required="true" type="integer" name="id" column="id" distinct="system">
@ -276,9 +276,9 @@
<permission permission="all" group="admin"/>
</entity>
<!--
entity authorities already has a key - not generating one
-->
<entity table="authorities" name="authorities" magnitude="2">
entity authorities already has a key - not generating one
-->
<entity table="authorities" name="authorities" magnitude="2" volatility="7">
<documentation>Authorities which may authenticate canvassers to the system.</documentation>
<key>
<property required="true" type="string" name="id" column="id" size="32" distinct="all">
@ -305,9 +305,9 @@
<permission group="admin" permission="all"/>
</entity>
<!--
entity issues already has a key - not generating one
-->
<entity table="issues" name="issues" magnitude="1">
entity issues already has a key - not generating one
-->
<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>
<key>
<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 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>
<key>
<property type="integer" distinct="system" required="true" name="Id">
@ -400,9 +400,9 @@
</form>
</entity>
<!--
entity canvassers already has a key - not generating one
-->
<entity table="canvassers" name="canvassers" magnitude="5">
entity canvassers already has a key - not generating one
-->
<entity table="canvassers" name="canvassers" magnitude="5" volatility="4">
<documentation>Primary users of the system: those actually interviewing electors.</documentation>
<key>
<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">
<prompt prompt="elector_id" locale="en-GB"/>
</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"/>
</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"/>
</property>
<property type="string" name="email" column="email" size="128" distinct="user">
@ -457,9 +457,9 @@
<permission group="admin" permission="all"/>
</entity>
<!--
entity followuprequests already has a key - not generating one
-->
<entity table="followuprequests" name="followuprequests" magnitude="7">
entity followuprequests already has a key - not generating one
-->
<entity table="followuprequests" name="followuprequests" magnitude="7" volatility="2">
<documentation>Requests for a followup with an issue expert</documentation>
<key>
<property required="true" type="integer" name="id" column="id" distinct="system">
@ -488,9 +488,9 @@
<permission group="admin" permission="all"/>
</entity>
<!--
entity roles already has a key - not generating one
-->
<entity table="roles" name="roles" magnitude="1">
entity roles already has a key - not generating one
-->
<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>
<key>
<property type="integer" name="id" column="id" immutable="true" distinct="system">
@ -513,9 +513,9 @@
<permission group="admin" permission="all"/>
</entity>
<!--
entity teams already has a key - not generating one
-->
<entity table="teams" name="teams" magnitude="4">
entity teams already has a key - not generating one
-->
<entity table="teams" name="teams" magnitude="4" volatility="4">
<key>
<property type="integer" name="id" column="id" distinct="system" immutable="true">
<prompt prompt="id" locale="en-GB"/>
@ -560,9 +560,9 @@
<permission permission="all" group="admin"/>
</entity>
<!--
entity districts already has a key - not generating one
-->
<entity table="districts" name="districts" magnitude="4">
entity districts already has a key - not generating one
-->
<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>
<key>
<property required="true" type="integer" name="id" column="id" immutable="true" distinct="system">
@ -584,9 +584,9 @@
<permission group="admin" permission="all"/>
</entity>
<!--
entity followupactions already has a key - not generating one
-->
<entity table="followupactions" name="followupactions" magnitude="7">
entity followupactions already has a key - not generating one
-->
<entity table="followupactions" name="followupactions" magnitude="7" volatility="0">
<documentation>Actions taken on followup requests.</documentation>
<key>
<property required="true" type="integer" name="id" column="id" distinct="system">
@ -620,9 +620,9 @@
<permission group="admin" permission="all"/>
</entity>
<!--
entity options already has a key - not generating one
-->
<entity table="options" name="options" magnitude="1">
entity options already has a key - not generating one
-->
<entity table="options" name="options" magnitude="1" volatility="7">
<documentation>Options in the election or referendum being canvassed on</documentation>
<key>
<property required="true" type="string" name="id" column="id" size="32" immutable="true" distinct="all">
@ -639,9 +639,9 @@
<permission group="admin" permission="all"/>
</entity>
<!--
entity followupmethods already has a key - not generating one
-->
<entity table="followupmethods" name="followupmethods" magnitude="1">
entity followupmethods already has a key - not generating one
-->
<entity table="followupmethods" name="followupmethods" magnitude="1" volatility="7">
<key>
<property required="true" type="string" size="32" name="id" column="id" immutable="true" distinct="all">
<prompt prompt="id" locale="en-GB"/>