From acfaf985fa775de8155ff6f216703f8f8d628022 Mon Sep 17 00:00:00 2001
From: Simon Brooke
Date: Wed, 20 Jun 2018 09:17:53 +0100
Subject: [PATCH] Much progress, nothing yet works.
---
project.clj | 3 +-
resources/sql/queries.auto.sql | 61 +-
resources/sql/youyesyet.postgres.sql | 902 ++++++++++++++++++
.../templates/auto/application-index.html | 2 +-
.../auto/form-addresses-Address.html | 134 +--
.../auto/form-authorities-Authority.html | 34 +-
.../auto/form-canvassers-Canvasser.html | 184 +---
.../auto/form-districts-District.html | 39 +-
.../auto/form-dwellings-Dwelling.html | 62 +-
.../templates/auto/form-electors-Elector.html | 120 +--
.../form-followupactions-Followupaction.html | 121 +--
.../form-followupmethods-Followupmethod.html | 34 +-
...form-followuprequests-Followuprequest.html | 111 +--
.../templates/auto/form-genders-Gender.html | 34 +-
.../auto/form-intentions-Intention.html | 71 +-
.../templates/auto/form-issues-Issue.html | 66 +-
.../templates/auto/form-options-Option.html | 34 +-
resources/templates/auto/form-roles-Role.html | 43 +-
resources/templates/auto/form-teams-Team.html | 106 +-
.../templates/auto/form-visits-Visit.html | 85 +-
.../auto/list-addresses-Addresses.html | 2 +-
.../auto/list-authorities-Authorities.html | 2 +-
.../auto/list-canvassers-Canvassers.html | 2 +-
.../auto/list-districts-Districts.html | 2 +-
.../auto/list-dwellings-Dwellings.html | 2 +-
.../auto/list-electors-Electors.html | 2 +-
.../list-followupactions-Followupactions.html | 2 +-
.../list-followupmethods-Followupmethods.html | 2 +-
...ist-followuprequests-Followuprequests.html | 2 +-
.../templates/auto/list-genders-Genders.html | 2 +-
.../auto/list-intentions-Intentions.html | 2 +-
.../templates/auto/list-issues-Issues.html | 2 +-
.../templates/auto/list-options-Options.html | 2 +-
.../templates/auto/list-roles-Roles.html | 2 +-
.../templates/auto/list-teams-Teams.html | 2 +-
.../templates/auto/list-visits-Visits.html | 2 +-
src/clj/youyesyet/db/core.clj | 1 -
src/clj/youyesyet/layout.clj | 102 +-
src/clj/youyesyet/routes/auto.clj | 704 +++++++-------
src/clj/youyesyet/routes/auto_json.clj | 3 +-
40 files changed, 1658 insertions(+), 1430 deletions(-)
create mode 100644 resources/sql/youyesyet.postgres.sql
diff --git a/project.clj b/project.clj
index d671ac7..404b692 100644
--- a/project.clj
+++ b/project.clj
@@ -3,7 +3,8 @@
:description "Canvassing tool for referenda"
:url "https://github.com/simon-brooke/youyesyet"
- :dependencies [[bouncer "1.0.1"]
+ :dependencies [[adl-support "0.1.0-SNAPSHOT"]
+ [bouncer "1.0.1"]
[ch.qos.logback/logback-classic "1.2.2"]
[clj-oauth "1.5.5"]
[cljsjs/react-leaflet "0.12.3-4"]
diff --git a/resources/sql/queries.auto.sql b/resources/sql/queries.auto.sql
index 637b92f..9de72ba 100644
--- a/resources/sql/queries.auto.sql
+++ b/resources/sql/queries.auto.sql
@@ -1,7 +1,7 @@
------------------------------------------------------------------------
-- File queries.sql
--
--- autogenerated by adl.to-hugsql-queries at 2018-06-17T11:05:53.294Z
+-- autogenerated by adl.to-hugsql-queries at 2018-06-19T18:51:50.013Z
--
-- See [Application Description
-- Language](https://github.com/simon-brooke/adl).
@@ -60,9 +60,9 @@ returning id
-- :name create-dwelling! :! :n
-- :doc creates a new dwelling record
INSERT INTO dwellings (address_id,
- sub-address)
+ sub_address)
VALUES (:address_id,
- :sub-address)
+ :sub_address)
returning id
-- :name create-elector! :! :n
@@ -294,7 +294,7 @@ ORDER BY districts.name,
SELECT * FROM dwellings
WHERE dwellings.id = :id
ORDER BY dwellings.address_id,
- dwellings.sub-address,
+ dwellings.sub_address,
dwellings.id
-- :name get-elector :? :1
@@ -469,7 +469,7 @@ ORDER BY lv_districts.name,
-- :doc lists all existing dwelling records
SELECT * FROM lv_dwellings
ORDER BY lv_dwellings.address_id,
- lv_dwellings.sub-address,
+ lv_dwellings.sub_address,
lv_dwellings.id
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
@@ -481,7 +481,7 @@ FROM lv_dwellings, dwellings
WHERE lv_dwellings.id = dwellings.id
AND dwellings.address_id = :id
ORDER BY lv_dwellings.address_id,
- lv_dwellings.sub-address,
+ lv_dwellings.sub_address,
lv_dwellings.id
-- :name list-electors :? :*
@@ -730,7 +730,13 @@ ORDER BY lv_visits.address_id,
SELECT * FROM lv_addresses
WHERE
address LIKE '%params.address%'
+ OR postcode = params.postcode
OR phone LIKE '%params.phone%'
+ OR district_id = params.district_id
+ OR latitude = params.latitude
+ OR longitude = params.longitude
+ OR locality = params.locality
+ OR id = params.id
ORDER BY lv_addresses.address,
lv_addresses.postcode,
lv_addresses.id
@@ -751,8 +757,13 @@ SELECT * FROM lv_canvassers
WHERE
username LIKE '%params.username%'
OR fullname LIKE '%params.fullname%'
+ OR elector_id = params.elector_id
+ OR address_id = params.address_id
OR phone LIKE '%params.phone%'
OR email LIKE '%params.email%'
+ OR authority_id = params.authority_id
+ OR authorised = params.authorised
+ OR id = params.id
ORDER BY lv_canvassers.username,
lv_canvassers.fullname,
lv_canvassers.email,
@@ -765,6 +776,7 @@ ORDER BY lv_canvassers.username,
SELECT * FROM lv_districts
WHERE
name LIKE '%params.name%'
+ OR id = params.id
ORDER BY lv_districts.name,
lv_districts.id
--~ (if (:offset params) "OFFSET :offset ")
@@ -774,9 +786,11 @@ ORDER BY lv_districts.name,
-- :doc selects existing dwelling records having any string field matching the parameter of the same name by substring match
SELECT * FROM lv_dwellings
WHERE
-sub-address LIKE '%params.sub-address%'
+address_id = params.address_id
+ OR sub_address LIKE '%params.sub-address%'
+ OR id = params.id
ORDER BY lv_dwellings.address_id,
- lv_dwellings.sub-address,
+ lv_dwellings.sub_address,
lv_dwellings.id
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
@@ -786,8 +800,11 @@ ORDER BY lv_dwellings.address_id,
SELECT * FROM lv_electors
WHERE
name LIKE '%params.name%'
+ OR dwelling_id = params.dwelling_id
OR phone LIKE '%params.phone%'
OR email LIKE '%params.email%'
+ OR gender = params.gender
+ OR id = params.id
ORDER BY lv_electors.name,
lv_electors.phone,
lv_electors.email,
@@ -800,7 +817,12 @@ ORDER BY lv_electors.name,
-- :doc selects existing followupaction records having any string field matching the parameter of the same name by substring match
SELECT * FROM lv_followupactions
WHERE
-notes LIKE '%params.notes%'
+request_id = params.request_id
+ OR actor = params.actor
+ OR date = 'params.date'
+ OR notes LIKE '%params.notes%'
+ OR closed = params.closed
+ OR id = params.id
ORDER BY lv_followupactions.date,
lv_followupactions.notes,
lv_followupactions.id
@@ -819,6 +841,11 @@ id LIKE '%params.id%'
-- :doc selects existing followuprequest records having any string field matching the parameter of the same name by substring match
SELECT * FROM lv_followuprequests
WHERE
+elector_id = params.elector_id
+ OR visit_id = params.visit_id
+ OR issue_id = params.issue_id
+ OR method_id = params.method_id
+ OR id = params.id
ORDER BY lv_followuprequests.elector_id,
lv_followuprequests.visit_id,
lv_followuprequests.issue_id,
@@ -838,6 +865,10 @@ id LIKE '%params.id%'
-- :doc selects existing intention records having any string field matching the parameter of the same name by substring match
SELECT * FROM lv_intentions
WHERE
+visit_id = params.visit_id
+ OR elector_id = params.elector_id
+ OR option_id = params.option_id
+ OR Id = params.Id
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
@@ -846,6 +877,7 @@ WHERE
SELECT * FROM lv_issues
WHERE
url LIKE '%params.url%'
+ OR current = params.current
OR id LIKE '%params.id%'
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
@@ -863,6 +895,7 @@ id LIKE '%params.id%'
SELECT * FROM lv_roles
WHERE
name LIKE '%params.name%'
+ OR id = params.id
ORDER BY lv_roles.name,
lv_roles.id
--~ (if (:offset params) "OFFSET :offset ")
@@ -873,6 +906,10 @@ ORDER BY lv_roles.name,
SELECT * FROM lv_teams
WHERE
name LIKE '%params.name%'
+ OR district_id = params.district_id
+ OR latitude = params.latitude
+ OR longitude = params.longitude
+ OR id = params.id
ORDER BY lv_teams.name,
lv_teams.id
--~ (if (:offset params) "OFFSET :offset ")
@@ -882,6 +919,10 @@ ORDER BY lv_teams.name,
-- :doc selects existing visit records having any string field matching the parameter of the same name by substring match
SELECT * FROM lv_visits
WHERE
+address_id = params.address_id
+ OR canvasser_id = params.canvasser_id
+ OR date = 'params.date'
+ OR id = params.id
ORDER BY lv_visits.address_id,
lv_visits.date,
lv_visits.id
@@ -923,7 +964,7 @@ WHERE districts.id = :id
-- :doc updates an existing dwelling record
UPDATE dwellings
SET address_id = :address_id,
- sub-address = :sub-address
+ sub_address = :sub-address
WHERE dwellings.id = :id
-- :name update-elector! :! :n
diff --git a/resources/sql/youyesyet.postgres.sql b/resources/sql/youyesyet.postgres.sql
new file mode 100644
index 0000000..6ca584c
--- /dev/null
+++ b/resources/sql/youyesyet.postgres.sql
@@ -0,0 +1,902 @@
+------------------------------------------------------------------------
+-- Database definition for application
+--
+-- youyesyet version 0.1.1
+--
+-- auto-generated by [Application Description Language framework]
+--
+-- (https://github.com/simon-brooke/adl) at 20180619T185151.055Z
+--
+--
+-- A web-app intended to be used by canvassers campaigning for a
+-- 'Yes' vote in the second independence referendum.
+--
+-- The web-app will be delivered to canvassers out knocking doors
+-- primarily through an HTML5/React single-page app designed to work on a
+-- mobile phone; it's possible that someone else may do an Android of
+-- iPhone native app to address the same back end but at present I have
+-- no plans for this.
+--
+-- There must also be an administrative interface through which
+-- privileged users can set the system up and authorise canvassers, and a
+-- 'followup' interface through which issue-expert specialist canvassers
+-- can address particular electors' queries.
+--
+------------------------------------------------------------------------
+
+------------------------------------------------------------------------
+-- security group admin
+------------------------------------------------------------------------
+
+CREATE GROUP admin;
+
+------------------------------------------------------------------------
+-- security group analysts
+------------------------------------------------------------------------
+
+CREATE GROUP analysts;
+
+------------------------------------------------------------------------
+-- security group canvassers
+------------------------------------------------------------------------
+
+CREATE GROUP canvassers;
+
+------------------------------------------------------------------------
+-- security group issueeditors
+------------------------------------------------------------------------
+
+CREATE GROUP issueeditors;
+
+------------------------------------------------------------------------
+-- security group issueexperts
+------------------------------------------------------------------------
+
+CREATE GROUP issueexperts;
+
+------------------------------------------------------------------------
+-- security group public
+------------------------------------------------------------------------
+
+CREATE GROUP public;
+
+------------------------------------------------------------------------
+-- security group teamorganisers
+------------------------------------------------------------------------
+
+CREATE GROUP teamorganisers;
+
+------------------------------------------------------------------------
+-- primary table addresses for entity addresses
+--
+-- Addresses of all buildings which contain dwellings.
+------------------------------------------------------------------------
+CREATE TABLE addresses
+(
+ id SERIAL NOT NULL PRIMARY KEY,
+ address VARCHAR(256) NOT NULL,
+ postcode VARCHAR(16) CONSTRAINT pattern_1 CHECK (postcode ~* '^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$'),
+ phone VARCHAR(16),
+ district_id INTEGER,
+ latitude DOUBLE PRECISION,
+ longitude DOUBLE PRECISION,
+ locality INTEGER
+);
+GRANT SELECT ON addresses TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+GRANT INSERT ON addresses TO admin ;
+GRANT UPDATE ON addresses TO admin ;
+GRANT DELETE ON addresses TO admin ;
+
+------------------------------------------------------------------------
+-- primary table authorities for entity authorities
+--
+-- Authorities which may authenticate canvassers to the system.
+------------------------------------------------------------------------
+CREATE TABLE authorities
+(
+ id VARCHAR(32) NOT NULL PRIMARY KEY
+);
+GRANT SELECT ON authorities TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+GRANT INSERT ON authorities TO admin ;
+GRANT UPDATE ON authorities TO admin ;
+GRANT DELETE ON authorities TO admin ;
+
+------------------------------------------------------------------------
+-- primary table canvassers for entity canvassers
+--
+-- Primary users of the system: those actually interviewing electors.
+------------------------------------------------------------------------
+CREATE TABLE canvassers
+(
+ id SERIAL NOT NULL PRIMARY KEY,
+ username VARCHAR(32) NOT NULL,
+ fullname VARCHAR(64) NOT NULL,
+ elector_id INTEGER,
+ address_id INTEGER NOT NULL,
+ phone VARCHAR(16),
+ email VARCHAR(128),
+ authority_id VARCHAR(32) NOT NULL,
+ authorised BOOLEAN
+);
+GRANT SELECT ON canvassers TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+GRANT INSERT ON canvassers TO admin,
+ canvassers,
+ teamorganisers ;
+GRANT UPDATE ON canvassers TO admin,
+ canvassers,
+ teamorganisers ;
+GRANT DELETE ON canvassers TO admin ;
+
+------------------------------------------------------------------------
+-- primary table districts for entity districts
+--
+-- Electoral districts: TODO: Shape (polygon) information will need to be
+-- added, for use in maps.
+------------------------------------------------------------------------
+CREATE TABLE districts
+(
+ id SERIAL NOT NULL PRIMARY KEY,
+ name VARCHAR(64) NOT NULL
+);
+GRANT SELECT ON districts TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ public,
+ teamorganisers ;
+GRANT INSERT ON districts TO admin ;
+GRANT UPDATE ON districts TO admin ;
+GRANT DELETE ON districts TO admin ;
+
+------------------------------------------------------------------------
+-- primary table dwellings for entity dwellings
+--
+-- All dwellings within addresses in the system; a dwelling is a house,
+-- flat or appartment in which electors live.
+------------------------------------------------------------------------
+CREATE TABLE dwellings
+(
+ id SERIAL NOT NULL PRIMARY KEY,
+ address_id INTEGER NOT NULL,
+ sub_address VARCHAR(32)
+);
+GRANT SELECT ON dwellings TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+GRANT INSERT ON dwellings TO admin ;
+GRANT UPDATE ON dwellings TO admin ;
+GRANT DELETE ON dwellings TO admin ;
+
+------------------------------------------------------------------------
+-- primary table electors for entity electors
+--
+-- All electors known to the system; electors are people believed to be
+-- entitled to vote in the current campaign.
+------------------------------------------------------------------------
+CREATE TABLE electors
+(
+ id SERIAL NOT NULL PRIMARY KEY,
+ name VARCHAR(64) NOT NULL,
+ dwelling_id INTEGER NOT NULL,
+ phone VARCHAR(16),
+ email VARCHAR(128),
+ gender VARCHAR(32) DEFAULT 'Unknown'
+);
+GRANT SELECT ON electors TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+GRANT INSERT ON electors TO admin ;
+GRANT UPDATE ON electors TO admin ;
+GRANT DELETE ON electors TO admin ;
+
+------------------------------------------------------------------------
+-- primary table followupactions for entity followupactions
+--
+-- Actions taken on followup requests.
+------------------------------------------------------------------------
+CREATE TABLE followupactions
+(
+ id SERIAL NOT NULL PRIMARY KEY,
+ request_id INTEGER NOT NULL,
+ actor INTEGER NOT NULL,
+ date TIMESTAMP DEFAULT 'now()' NOT NULL,
+ notes TEXT,
+ closed BOOLEAN DEFAULT false
+);
+GRANT SELECT ON followupactions TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts ;
+GRANT INSERT ON followupactions TO admin,
+ issueexperts ;
+GRANT UPDATE ON followupactions TO admin ;
+GRANT DELETE ON followupactions TO admin ;
+
+------------------------------------------------------------------------
+-- primary table followupmethods for entity followupmethods
+------------------------------------------------------------------------
+CREATE TABLE followupmethods
+(
+ id VARCHAR(32) NOT NULL PRIMARY KEY
+);
+GRANT SELECT ON followupmethods TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+GRANT INSERT ON followupmethods TO admin ;
+GRANT UPDATE ON followupmethods TO admin ;
+GRANT DELETE ON followupmethods TO admin ;
+
+------------------------------------------------------------------------
+-- primary table followuprequests for entity followuprequests
+--
+-- Requests for a followup with an issue expert
+------------------------------------------------------------------------
+CREATE TABLE followuprequests
+(
+ id SERIAL NOT NULL PRIMARY KEY,
+ elector_id INTEGER NOT NULL,
+ visit_id INTEGER NOT NULL,
+ issue_id VARCHAR(32) NOT NULL,
+ method_id VARCHAR(32) NOT NULL
+);
+GRANT SELECT ON followuprequests TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+GRANT INSERT ON followuprequests TO admin,
+ canvassers ;
+GRANT UPDATE ON followuprequests TO admin ;
+GRANT DELETE ON followuprequests TO admin ;
+
+------------------------------------------------------------------------
+-- primary table genders for entity genders
+--
+-- All genders which may be assigned to electors.
+------------------------------------------------------------------------
+CREATE TABLE genders
+(
+ id VARCHAR(32) NOT NULL PRIMARY KEY
+);
+GRANT SELECT ON genders TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+GRANT INSERT ON genders TO admin ;
+GRANT UPDATE ON genders TO admin ;
+GRANT DELETE ON genders TO admin ;
+
+------------------------------------------------------------------------
+-- primary table intentions for entity intentions
+--
+-- Link table.
+------------------------------------------------------------------------
+CREATE TABLE intentions
+(
+ Id SERIAL NOT NULL PRIMARY KEY,
+ visit_id INTEGER NOT NULL,
+ elector_id INTEGER NOT NULL,
+ option_id VARCHAR(32) NOT NULL
+);
+GRANT SELECT ON intentions TO admin,
+ analysts,
+ canvassers ;
+GRANT INSERT ON intentions TO admin,
+ canvassers ;
+GRANT UPDATE ON intentions TO admin ;
+GRANT DELETE ON intentions TO admin ;
+
+------------------------------------------------------------------------
+-- primary table issues for entity issues
+--
+-- Issues believed to be of interest to electors, about which they may
+-- have questions.
+------------------------------------------------------------------------
+CREATE TABLE issues
+(
+ id VARCHAR(32) NOT NULL PRIMARY KEY,
+ url VARCHAR(256),
+ current BOOLEAN DEFAULT true
+);
+GRANT SELECT ON issues TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+GRANT INSERT ON issues TO admin,
+ issueeditors ;
+GRANT UPDATE ON issues TO admin,
+ issueeditors ;
+GRANT DELETE ON issues TO admin ;
+
+------------------------------------------------------------------------
+-- primary table options for entity options
+--
+-- Options in the election or referendum being canvassed on
+------------------------------------------------------------------------
+CREATE TABLE options
+(
+ id VARCHAR(32) NOT NULL PRIMARY KEY
+);
+GRANT SELECT ON options TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+GRANT INSERT ON options TO admin ;
+GRANT UPDATE ON options TO admin ;
+GRANT DELETE ON options TO admin ;
+
+------------------------------------------------------------------------
+-- primary table roles for entity roles
+--
+-- A role (essentially, the same as a group, but application layer rather
+-- than database layer) of which a user may be a member.
+------------------------------------------------------------------------
+CREATE TABLE roles
+(
+ id SERIAL NOT NULL PRIMARY KEY,
+ name VARCHAR(64) NOT NULL
+);
+GRANT SELECT ON roles TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+GRANT INSERT ON roles TO admin ;
+GRANT UPDATE ON roles TO admin ;
+GRANT DELETE ON roles TO admin ;
+
+------------------------------------------------------------------------
+-- primary table teams for entity teams
+------------------------------------------------------------------------
+CREATE TABLE teams
+(
+ id SERIAL NOT NULL PRIMARY KEY,
+ name VARCHAR(64) NOT NULL,
+ district_id INTEGER NOT NULL,
+ latitude DOUBLE PRECISION,
+ longitude DOUBLE PRECISION
+);
+GRANT SELECT ON teams TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+GRANT INSERT ON teams TO admin,
+ teamorganisers ;
+GRANT UPDATE ON teams TO admin,
+ teamorganisers ;
+GRANT DELETE ON teams TO admin ;
+
+------------------------------------------------------------------------
+-- primary table visits for entity visits
+--
+-- All visits made by canvassers to dwellings in which opinions were
+-- recorded.
+------------------------------------------------------------------------
+CREATE TABLE visits
+(
+ id SERIAL NOT NULL PRIMARY KEY,
+ address_id INTEGER NOT NULL,
+ canvasser_id INTEGER NOT NULL,
+ date TIMESTAMP DEFAULT 'now()' NOT NULL
+);
+GRANT SELECT ON visits TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+GRANT INSERT ON visits TO admin,
+ canvassers,
+ teamorganisers ;
+GRANT UPDATE ON visits TO admin ;
+GRANT DELETE ON visits TO admin ;
+
+------------------------------------------------------------------------
+-- convenience view lv_addresses of entity addresses for lists, et cetera
+------------------------------------------------------------------------
+CREATE VIEW lv_addresses AS
+SELECT addresses.address,
+ addresses.postcode,
+ addresses.phone,
+ districts.name AS district_id_expanded,
+ addresses.district_id,
+ addresses.latitude,
+ addresses.longitude,
+ addresses.locality,
+ addresses.id
+FROM addresses, districts
+WHERE addresses.district_id = districts.id
+;
+GRANT SELECT ON lv_addresses TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+
+------------------------------------------------------------------------
+-- convenience view lv_authorities of entity authorities for lists, et
+-- cetera
+------------------------------------------------------------------------
+CREATE VIEW lv_authorities AS
+SELECT authorities.id
+FROM authorities
+;
+GRANT SELECT ON lv_authorities TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+
+------------------------------------------------------------------------
+-- convenience view lv_canvassers of entity canvassers for lists, et
+-- cetera
+------------------------------------------------------------------------
+CREATE VIEW lv_canvassers AS
+SELECT canvassers.username,
+ canvassers.fullname,
+ electors.name ||', '|| electors.phone ||', '|| electors.email ||', '|| genders.id AS elector_id_expanded,
+ canvassers.elector_id,
+ addresses.address ||', '|| addresses.postcode AS address_id_expanded,
+ canvassers.address_id,
+ canvassers.phone,
+ canvassers.email,
+ authorities.id AS authority_id_expanded,
+ canvassers.authority_id,
+ canvassers.authorised,
+ canvassers.id
+FROM canvassers, authorities, addresses, genders, electors
+WHERE canvassers.elector_id = electors.id
+ AND canvassers.address_id = addresses.id
+ AND canvassers.authority_id = authorities.id
+;
+GRANT SELECT ON lv_canvassers TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+
+------------------------------------------------------------------------
+-- convenience view lv_districts of entity districts for lists, et cetera
+------------------------------------------------------------------------
+CREATE VIEW lv_districts AS
+SELECT districts.name,
+ districts.id
+FROM districts
+;
+GRANT SELECT ON lv_districts TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ public,
+ teamorganisers ;
+
+------------------------------------------------------------------------
+-- convenience view lv_dwellings of entity dwellings for lists, et cetera
+------------------------------------------------------------------------
+CREATE VIEW lv_dwellings AS
+SELECT addresses.address ||', '|| addresses.postcode AS address_id_expanded,
+ dwellings.address_id,
+ dwellings.sub_address,
+ dwellings.id
+FROM dwellings, addresses
+WHERE dwellings.address_id = addresses.id
+;
+GRANT SELECT ON lv_dwellings TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+
+------------------------------------------------------------------------
+-- convenience view lv_electors of entity electors for lists, et cetera
+------------------------------------------------------------------------
+CREATE VIEW lv_electors AS
+SELECT electors.name,
+ addresses.address ||', '|| addresses.postcode ||', '|| dwellings.sub_address AS dwelling_id_expanded,
+ electors.dwelling_id,
+ electors.phone,
+ electors.email,
+ genders.id AS gender_expanded,
+ electors.gender,
+ electors.id
+FROM dwellings, addresses, genders, electors
+WHERE electors.dwelling_id = dwellings.id
+ AND electors.gender = genders.id
+;
+GRANT SELECT ON lv_electors TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+
+------------------------------------------------------------------------
+-- convenience view lv_followupactions of entity followupactions for
+-- lists, et cetera
+------------------------------------------------------------------------
+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,
+ followupactions.actor,
+ followupactions.date,
+ followupactions.notes,
+ followupactions.closed,
+ followupactions.id
+FROM followuprequests, visits, canvassers, addresses, followupactions, genders, issues, electors
+WHERE followupactions.request_id = followuprequests.id
+ AND followupactions.actor = canvassers.id
+;
+GRANT SELECT ON lv_followupactions TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts ;
+
+------------------------------------------------------------------------
+-- convenience view lv_followupmethods of entity followupmethods for
+-- lists, et cetera
+------------------------------------------------------------------------
+CREATE VIEW lv_followupmethods AS
+SELECT followupmethods.id
+FROM followupmethods
+;
+GRANT SELECT ON lv_followupmethods TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+
+------------------------------------------------------------------------
+-- convenience view lv_followuprequests of entity followuprequests for
+-- lists, et cetera
+------------------------------------------------------------------------
+CREATE VIEW lv_followuprequests AS
+SELECT electors.name ||', '|| electors.phone ||', '|| electors.email ||', '|| genders.id AS elector_id_expanded,
+ followuprequests.elector_id,
+ addresses.address ||', '|| addresses.postcode ||', '|| visits.date AS visit_id_expanded,
+ followuprequests.visit_id,
+ issues.id AS issue_id_expanded,
+ followuprequests.issue_id,
+ followupmethods.id AS method_id_expanded,
+ followuprequests.method_id,
+ followuprequests.id
+FROM followuprequests, visits, addresses, genders, issues, electors, followupmethods
+WHERE followuprequests.elector_id = electors.id
+ AND followuprequests.visit_id = visits.id
+ AND followuprequests.issue_id = issues.id
+ AND followuprequests.method_id = followupmethods.id
+;
+GRANT SELECT ON lv_followuprequests TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+
+------------------------------------------------------------------------
+-- convenience view lv_genders of entity genders for lists, et cetera
+------------------------------------------------------------------------
+CREATE VIEW lv_genders AS
+SELECT genders.id
+FROM genders
+;
+GRANT SELECT ON lv_genders TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+
+------------------------------------------------------------------------
+-- convenience view lv_intentions of entity intentions for lists, et
+-- cetera
+------------------------------------------------------------------------
+CREATE VIEW lv_intentions AS
+SELECT addresses.address ||', '|| addresses.postcode ||', '|| visits.date AS visit_id_expanded,
+ intentions.visit_id,
+ electors.name ||', '|| electors.phone ||', '|| electors.email ||', '|| genders.id AS elector_id_expanded,
+ intentions.elector_id,
+ options.id AS option_id_expanded,
+ intentions.option_id,
+ intentions.Id
+FROM visits, intentions, addresses, genders, electors, options
+WHERE intentions.visit_id = visits.id
+ AND intentions.elector_id = electors.id
+ AND intentions.option_id = options.id
+;
+GRANT SELECT ON lv_intentions TO admin,
+ analysts,
+ canvassers ;
+
+------------------------------------------------------------------------
+-- convenience view lv_issues of entity issues for lists, et cetera
+------------------------------------------------------------------------
+CREATE VIEW lv_issues AS
+SELECT issues.url,
+ issues.current,
+ issues.id
+FROM issues
+;
+GRANT SELECT ON lv_issues TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+
+------------------------------------------------------------------------
+-- convenience view lv_options of entity options for lists, et cetera
+------------------------------------------------------------------------
+CREATE VIEW lv_options AS
+SELECT options.id
+FROM options
+;
+GRANT SELECT ON lv_options TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+
+------------------------------------------------------------------------
+-- convenience view lv_roles of entity roles for lists, et cetera
+------------------------------------------------------------------------
+CREATE VIEW lv_roles AS
+SELECT roles.name,
+ roles.id
+FROM roles
+;
+GRANT SELECT ON lv_roles TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+
+------------------------------------------------------------------------
+-- convenience view lv_teams of entity teams for lists, et cetera
+------------------------------------------------------------------------
+CREATE VIEW lv_teams AS
+SELECT teams.name,
+ districts.name AS district_id_expanded,
+ teams.district_id,
+ teams.latitude,
+ teams.longitude,
+ teams.id
+FROM teams, districts
+WHERE teams.district_id = districts.id
+;
+GRANT SELECT ON lv_teams TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+
+------------------------------------------------------------------------
+-- convenience view lv_visits of entity visits for lists, et cetera
+------------------------------------------------------------------------
+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,
+ visits.canvasser_id,
+ visits.date,
+ visits.id
+FROM visits, canvassers, addresses
+WHERE visits.address_id = addresses.id
+ AND visits.canvasser_id = canvassers.id
+;
+GRANT SELECT ON lv_visits TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+
+------------------------------------------------------------------------
+-- referential integrity links for primary tables
+------------------------------------------------------------------------
+
+ALTER TABLE addresses ADD CONSTRAINT ri_addresses_districts_district_id
+ FOREIGN KEY( district_id )
+ REFERENCES districts(id)
+ ON DELETE NO ACTION ;
+
+ALTER TABLE canvassers ADD CONSTRAINT ri_canvassers_addresses_address_id
+ FOREIGN KEY( address_id )
+ REFERENCES addresses(id)
+ ON DELETE NO ACTION ;
+
+ALTER TABLE canvassers ADD CONSTRAINT ri_canvassers_authorities_authority_id
+ FOREIGN KEY( authority_id )
+ REFERENCES authorities(id)
+ ON DELETE NO ACTION ;
+
+ALTER TABLE canvassers ADD CONSTRAINT ri_canvassers_electors_elector_id
+ FOREIGN KEY( elector_id )
+ REFERENCES electors(id)
+ ON DELETE NO ACTION ;
+
+ALTER TABLE dwellings ADD CONSTRAINT ri_dwellings_addresses_address_id
+ FOREIGN KEY( address_id )
+ REFERENCES addresses(id)
+ ON DELETE NO ACTION ;
+
+ALTER TABLE electors ADD CONSTRAINT ri_electors_dwellings_dwelling_id
+ FOREIGN KEY( dwelling_id )
+ REFERENCES dwellings(id)
+ ON DELETE NO ACTION ;
+
+ALTER TABLE electors ADD CONSTRAINT ri_electors_genders_gender
+ FOREIGN KEY( gender )
+ REFERENCES genders(id)
+ ON DELETE NO ACTION ;
+
+ALTER TABLE followupactions ADD CONSTRAINT ri_followupactions_canvassers_actor
+ FOREIGN KEY( actor )
+ REFERENCES canvassers(id)
+ ON DELETE NO ACTION ;
+
+ALTER TABLE followupactions ADD CONSTRAINT ri_followupactions_followuprequests_request_id
+ FOREIGN KEY( request_id )
+ REFERENCES followuprequests(id)
+ ON DELETE NO ACTION ;
+
+ALTER TABLE followuprequests ADD CONSTRAINT ri_followuprequests_electors_elector_id
+ FOREIGN KEY( elector_id )
+ REFERENCES electors(id)
+ ON DELETE NO ACTION ;
+
+ALTER TABLE followuprequests ADD CONSTRAINT ri_followuprequests_issues_issue_id
+ FOREIGN KEY( issue_id )
+ REFERENCES issues(id)
+ ON DELETE NO ACTION ;
+
+ALTER TABLE followuprequests ADD CONSTRAINT ri_followuprequests_followupmethods_method_id
+ FOREIGN KEY( method_id )
+ REFERENCES followupmethods(id)
+ ON DELETE NO ACTION ;
+
+ALTER TABLE followuprequests ADD CONSTRAINT ri_followuprequests_visits_visit_id
+ FOREIGN KEY( visit_id )
+ REFERENCES visits(id)
+ ON DELETE NO ACTION ;
+
+ALTER TABLE intentions ADD CONSTRAINT ri_intentions_electors_elector_id
+ FOREIGN KEY( elector_id )
+ REFERENCES electors(id)
+ ON DELETE NO ACTION ;
+
+ALTER TABLE intentions ADD CONSTRAINT ri_intentions_options_option_id
+ FOREIGN KEY( option_id )
+ REFERENCES options(id)
+ ON DELETE NO ACTION ;
+
+ALTER TABLE intentions ADD CONSTRAINT ri_intentions_visits_visit_id
+ FOREIGN KEY( visit_id )
+ REFERENCES visits(id)
+ ON DELETE NO ACTION ;
+
+ALTER TABLE teams ADD CONSTRAINT ri_teams_districts_district_id
+ FOREIGN KEY( district_id )
+ REFERENCES districts(id)
+ ON DELETE NO ACTION ;
+
+ALTER TABLE visits ADD CONSTRAINT ri_visits_addresses_address_id
+ FOREIGN KEY( address_id )
+ REFERENCES addresses(id)
+ ON DELETE NO ACTION ;
+
+ALTER TABLE visits ADD CONSTRAINT ri_visits_canvassers_canvasser_id
+ FOREIGN KEY( canvasser_id )
+ REFERENCES canvassers(id)
+ ON DELETE NO ACTION ;
+
+------------------------------------------------------------------------
+-- link table joining canvassers with roles
+------------------------------------------------------------------------
+CREATE TABLE ln_canvassers_roles
+(
+ canvassers_id INTEGER,
+ roles_id INTEGER
+);
+GRANT SELECT ON ln_canvassers_roles TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+GRANT INSERT ON ln_canvassers_roles TO admin,
+ canvassers,
+ teamorganisers ;
+GRANT UPDATE ON ln_canvassers_roles TO admin,
+ canvassers,
+ teamorganisers ;
+GRANT DELETE ON ln_canvassers_roles TO admin ;
+
+ALTER TABLE ln_canvassers_roles ADD CONSTRAINT ri_ln_canvassers_roles_canvassers_canvassers_id
+ FOREIGN KEY( canvassers_id )
+ REFERENCES canvassers(id)
+ ON DELETE NO ACTION ;
+
+ALTER TABLE ln_canvassers_roles ADD CONSTRAINT ri_ln_canvassers_roles_roles_roles_id
+ FOREIGN KEY( roles_id )
+ REFERENCES roles(id)
+ ON DELETE NO ACTION ;
+
+
+
+------------------------------------------------------------------------
+-- link table joining teams with canvassers
+------------------------------------------------------------------------
+CREATE TABLE ln_canvassers_teams
+(
+ teams_id INTEGER,
+ canvassers_id INTEGER
+);
+GRANT SELECT ON ln_canvassers_teams TO admin,
+ analysts,
+ canvassers,
+ issueeditors,
+ issueexperts,
+ teamorganisers ;
+GRANT INSERT ON ln_canvassers_teams TO admin,
+ teamorganisers ;
+GRANT UPDATE ON ln_canvassers_teams TO admin,
+ teamorganisers ;
+GRANT DELETE ON ln_canvassers_teams TO admin ;
+
+ALTER TABLE ln_canvassers_teams ADD CONSTRAINT ri_ln_canvassers_teams_canvassers_canvassers_id
+ FOREIGN KEY( canvassers_id )
+ REFERENCES canvassers(id)
+ ON DELETE NO ACTION ;
+
+ALTER TABLE ln_canvassers_teams ADD CONSTRAINT ri_ln_canvassers_teams_teams_teams_id
+ FOREIGN KEY( teams_id )
+ REFERENCES teams(id)
+ ON DELETE NO ACTION ;
+
diff --git a/resources/templates/auto/application-index.html b/resources/templates/auto/application-index.html
index eecae38..b1c7666 100644
--- a/resources/templates/auto/application-index.html
+++ b/resources/templates/auto/application-index.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
diff --git a/resources/templates/auto/form-addresses-Address.html b/resources/templates/auto/form-addresses-Address.html
index b834a12..ac19037 100644
--- a/resources/templates/auto/form-addresses-Address.html
+++ b/resources/templates/auto/form-addresses-Address.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
@@ -24,7 +24,6 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
diff --git a/resources/templates/auto/form-authorities-Authority.html b/resources/templates/auto/form-authorities-Authority.html
index 1f29004..ba66240 100644
--- a/resources/templates/auto/form-authorities-Authority.html
+++ b/resources/templates/auto/form-authorities-Authority.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
@@ -35,33 +35,9 @@ id
{{record.id}}
-{% endifmemberof %}
-{% endifmemberof %}
-
-
-
-{% ifmemberof admin %}
-
{% else %}
-{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
-
-{{record.id}}
-
-{% endifmemberof %}
-{% endifmemberof %}
-
-
-
-{% ifmemberof admin %}
-
-{% else %}
-{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
-
-{{record.id}}
+
+You are not permitted to view id of authorities
{% endifmemberof %}
{% endifmemberof %}
@@ -70,13 +46,13 @@ id
-
+
-
+
diff --git a/resources/templates/auto/form-canvassers-Canvasser.html b/resources/templates/auto/form-canvassers-Canvasser.html
index 32fe009..8ca174a 100644
--- a/resources/templates/auto/form-canvassers-Canvasser.html
+++ b/resources/templates/auto/form-canvassers-Canvasser.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
@@ -24,7 +24,6 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
diff --git a/resources/templates/auto/form-districts-District.html b/resources/templates/auto/form-districts-District.html
index 1ba76eb..7ca8ef3 100644
--- a/resources/templates/auto/form-districts-District.html
+++ b/resources/templates/auto/form-districts-District.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
@@ -24,7 +24,6 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
diff --git a/resources/templates/auto/form-dwellings-Dwelling.html b/resources/templates/auto/form-dwellings-Dwelling.html
index 1c716e9..4df6725 100644
--- a/resources/templates/auto/form-dwellings-Dwelling.html
+++ b/resources/templates/auto/form-dwellings-Dwelling.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
@@ -24,7 +24,6 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
diff --git a/resources/templates/auto/form-electors-Elector.html b/resources/templates/auto/form-electors-Elector.html
index 4b1a2a4..6ebac98 100644
--- a/resources/templates/auto/form-electors-Elector.html
+++ b/resources/templates/auto/form-electors-Elector.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
@@ -24,7 +24,6 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
diff --git a/resources/templates/auto/form-followupactions-Followupaction.html b/resources/templates/auto/form-followupactions-Followupaction.html
index 4ab1afc..1e41b25 100644
--- a/resources/templates/auto/form-followupactions-Followupaction.html
+++ b/resources/templates/auto/form-followupactions-Followupaction.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
@@ -24,7 +24,6 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
diff --git a/resources/templates/auto/form-followupmethods-Followupmethod.html b/resources/templates/auto/form-followupmethods-Followupmethod.html
index dd0726b..7e2eb2e 100644
--- a/resources/templates/auto/form-followupmethods-Followupmethod.html
+++ b/resources/templates/auto/form-followupmethods-Followupmethod.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
@@ -35,33 +35,9 @@ id
{{record.id}}
-{% endifmemberof %}
-{% endifmemberof %}
-
-
-
-{% ifmemberof admin %}
-
{% else %}
-{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
-
-{{record.id}}
-
-{% endifmemberof %}
-{% endifmemberof %}
-
-
-
-{% ifmemberof admin %}
-
-{% else %}
-{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
-
-{{record.id}}
+
+You are not permitted to view id of followupmethods
{% endifmemberof %}
{% endifmemberof %}
@@ -70,13 +46,13 @@ id
-
+
-
+
diff --git a/resources/templates/auto/form-followuprequests-Followuprequest.html b/resources/templates/auto/form-followuprequests-Followuprequest.html
index d925dac..0edcbf9 100644
--- a/resources/templates/auto/form-followuprequests-Followuprequest.html
+++ b/resources/templates/auto/form-followuprequests-Followuprequest.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
@@ -24,7 +24,6 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
diff --git a/resources/templates/auto/form-genders-Gender.html b/resources/templates/auto/form-genders-Gender.html
index 516b224..7113f50 100644
--- a/resources/templates/auto/form-genders-Gender.html
+++ b/resources/templates/auto/form-genders-Gender.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
@@ -35,33 +35,9 @@ id
{{record.id}}
-{% endifmemberof %}
-{% endifmemberof %}
-
-
-
-{% ifmemberof admin %}
-
{% else %}
-{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
-
-{{record.id}}
-
-{% endifmemberof %}
-{% endifmemberof %}
-
-
-
-{% ifmemberof admin %}
-
-{% else %}
-{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
-
-{{record.id}}
+
+You are not permitted to view id of genders
{% endifmemberof %}
{% endifmemberof %}
@@ -70,13 +46,13 @@ id
-
+
-
+
diff --git a/resources/templates/auto/form-intentions-Intention.html b/resources/templates/auto/form-intentions-Intention.html
index 3991bf2..084901d 100644
--- a/resources/templates/auto/form-intentions-Intention.html
+++ b/resources/templates/auto/form-intentions-Intention.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
@@ -24,7 +24,6 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
diff --git a/resources/templates/auto/form-issues-Issue.html b/resources/templates/auto/form-issues-Issue.html
index e5268cc..682ea18 100644
--- a/resources/templates/auto/form-issues-Issue.html
+++ b/resources/templates/auto/form-issues-Issue.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
@@ -35,19 +35,9 @@ id
{{record.id}}
-{% endifmemberof %}
-{% endifmemberof %}
-
-
-
-{% ifmemberof issueeditors admin %}
-
{% else %}
-{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
-
-{{record.id}}
+
+You are not permitted to view id of issues
{% endifmemberof %}
{% endifmemberof %}
@@ -63,47 +53,9 @@ url
{{record.url}}
-{% endifmemberof %}
-{% endifmemberof %}
-
-
-
-{% ifmemberof issueeditors admin %}
-
{% else %}
-{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
-
-{{record.current}}
-
-{% endifmemberof %}
-{% endifmemberof %}
-
-
-
-{% ifmemberof issueeditors admin %}
-
-{% else %}
-{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
-
-{{record.id}}
-
-{% endifmemberof %}
-{% endifmemberof %}
-
-
-
-{% ifmemberof issueeditors admin %}
-
-{% else %}
-{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
-
-{{record.url}}
+
+You are not permitted to view url of issues
{% endifmemberof %}
{% endifmemberof %}
@@ -119,6 +71,10 @@ current
{{record.current}}
+{% else %}
+
+You are not permitted to view current of issues
+
{% endifmemberof %}
{% endifmemberof %}
@@ -126,13 +82,13 @@ current
-
+
-
+
diff --git a/resources/templates/auto/form-options-Option.html b/resources/templates/auto/form-options-Option.html
index b5c791c..90bc5ad 100644
--- a/resources/templates/auto/form-options-Option.html
+++ b/resources/templates/auto/form-options-Option.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
@@ -35,33 +35,9 @@ id
{{record.id}}
-{% endifmemberof %}
-{% endifmemberof %}
-
-
-
-{% ifmemberof admin %}
-
{% else %}
-{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
-
-{{record.id}}
-
-{% endifmemberof %}
-{% endifmemberof %}
-
-
-
-{% ifmemberof admin %}
-
-{% else %}
-{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
-
-{{record.id}}
+
+You are not permitted to view id of options
{% endifmemberof %}
{% endifmemberof %}
@@ -70,13 +46,13 @@ id
-
+
-
+
diff --git a/resources/templates/auto/form-roles-Role.html b/resources/templates/auto/form-roles-Role.html
index dad1065..2a8b4d8 100644
--- a/resources/templates/auto/form-roles-Role.html
+++ b/resources/templates/auto/form-roles-Role.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
@@ -24,7 +24,6 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
diff --git a/resources/templates/auto/form-teams-Team.html b/resources/templates/auto/form-teams-Team.html
index ff0da63..af9e574 100644
--- a/resources/templates/auto/form-teams-Team.html
+++ b/resources/templates/auto/form-teams-Team.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
@@ -24,7 +24,6 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
diff --git a/resources/templates/auto/form-visits-Visit.html b/resources/templates/auto/form-visits-Visit.html
index 0ac8647..1804624 100644
--- a/resources/templates/auto/form-visits-Visit.html
+++ b/resources/templates/auto/form-visits-Visit.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
@@ -24,7 +24,6 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
diff --git a/resources/templates/auto/list-addresses-Addresses.html b/resources/templates/auto/list-addresses-Addresses.html
index b7cf928..2d6d337 100644
--- a/resources/templates/auto/list-addresses-Addresses.html
+++ b/resources/templates/auto/list-addresses-Addresses.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
diff --git a/resources/templates/auto/list-authorities-Authorities.html b/resources/templates/auto/list-authorities-Authorities.html
index 05c6158..3271ca8 100644
--- a/resources/templates/auto/list-authorities-Authorities.html
+++ b/resources/templates/auto/list-authorities-Authorities.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
diff --git a/resources/templates/auto/list-canvassers-Canvassers.html b/resources/templates/auto/list-canvassers-Canvassers.html
index 1c18f20..01549e9 100644
--- a/resources/templates/auto/list-canvassers-Canvassers.html
+++ b/resources/templates/auto/list-canvassers-Canvassers.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
diff --git a/resources/templates/auto/list-districts-Districts.html b/resources/templates/auto/list-districts-Districts.html
index 834ad46..e25f1f2 100644
--- a/resources/templates/auto/list-districts-Districts.html
+++ b/resources/templates/auto/list-districts-Districts.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
diff --git a/resources/templates/auto/list-dwellings-Dwellings.html b/resources/templates/auto/list-dwellings-Dwellings.html
index 40943b9..aad96d1 100644
--- a/resources/templates/auto/list-dwellings-Dwellings.html
+++ b/resources/templates/auto/list-dwellings-Dwellings.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
diff --git a/resources/templates/auto/list-electors-Electors.html b/resources/templates/auto/list-electors-Electors.html
index e83a31a..0c4ebb3 100644
--- a/resources/templates/auto/list-electors-Electors.html
+++ b/resources/templates/auto/list-electors-Electors.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
diff --git a/resources/templates/auto/list-followupactions-Followupactions.html b/resources/templates/auto/list-followupactions-Followupactions.html
index af574bb..bba3be3 100644
--- a/resources/templates/auto/list-followupactions-Followupactions.html
+++ b/resources/templates/auto/list-followupactions-Followupactions.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
diff --git a/resources/templates/auto/list-followupmethods-Followupmethods.html b/resources/templates/auto/list-followupmethods-Followupmethods.html
index 7667db0..3949d0b 100644
--- a/resources/templates/auto/list-followupmethods-Followupmethods.html
+++ b/resources/templates/auto/list-followupmethods-Followupmethods.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
diff --git a/resources/templates/auto/list-followuprequests-Followuprequests.html b/resources/templates/auto/list-followuprequests-Followuprequests.html
index 79c4229..4889980 100644
--- a/resources/templates/auto/list-followuprequests-Followuprequests.html
+++ b/resources/templates/auto/list-followuprequests-Followuprequests.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
diff --git a/resources/templates/auto/list-genders-Genders.html b/resources/templates/auto/list-genders-Genders.html
index 8e5ca41..ebc8cf6 100644
--- a/resources/templates/auto/list-genders-Genders.html
+++ b/resources/templates/auto/list-genders-Genders.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
diff --git a/resources/templates/auto/list-intentions-Intentions.html b/resources/templates/auto/list-intentions-Intentions.html
index 37ef15e..fb8d0d6 100644
--- a/resources/templates/auto/list-intentions-Intentions.html
+++ b/resources/templates/auto/list-intentions-Intentions.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
diff --git a/resources/templates/auto/list-issues-Issues.html b/resources/templates/auto/list-issues-Issues.html
index 658c994..ccab390 100644
--- a/resources/templates/auto/list-issues-Issues.html
+++ b/resources/templates/auto/list-issues-Issues.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
diff --git a/resources/templates/auto/list-options-Options.html b/resources/templates/auto/list-options-Options.html
index 614a531..ed3dac1 100644
--- a/resources/templates/auto/list-options-Options.html
+++ b/resources/templates/auto/list-options-Options.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
diff --git a/resources/templates/auto/list-roles-Roles.html b/resources/templates/auto/list-roles-Roles.html
index 8578115..abe6b54 100644
--- a/resources/templates/auto/list-roles-Roles.html
+++ b/resources/templates/auto/list-roles-Roles.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
diff --git a/resources/templates/auto/list-teams-Teams.html b/resources/templates/auto/list-teams-Teams.html
index c7a2a3b..64a7f4a 100644
--- a/resources/templates/auto/list-teams-Teams.html
+++ b/resources/templates/auto/list-teams-Teams.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
diff --git a/resources/templates/auto/list-visits-Visits.html b/resources/templates/auto/list-visits-Visits.html
index 6b26d8a..9101021 100644
--- a/resources/templates/auto/list-visits-Visits.html
+++ b/resources/templates/auto/list-visits-Visits.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-
{% block head %}
diff --git a/src/clj/youyesyet/db/core.clj b/src/clj/youyesyet/db/core.clj
index 49bbe06..2158558 100644
--- a/src/clj/youyesyet/db/core.clj
+++ b/src/clj/youyesyet/db/core.clj
@@ -17,7 +17,6 @@
Timestamp
PreparedStatement]))
-;; (def ^:dynamic *db* {:name "java:comp/env/jdbc/EmployeeDB"})
(defstate ^:dynamic *db*
:start (conman/connect! {:jdbc-url-env (env :database-url)
:jdbc-url "jdbc:postgresql://127.0.0.1/youyesyet_dev?user=youyesyet&password=thisisnotsecure"
diff --git a/src/clj/youyesyet/layout.clj b/src/clj/youyesyet/layout.clj
index b38365d..88f3514 100644
--- a/src/clj/youyesyet/layout.clj
+++ b/src/clj/youyesyet/layout.clj
@@ -1,67 +1,55 @@
- (ns^{:doc "Render web pages using Selmer templating markup."
- :author "Simon Brooke"}
- youyesyet.layout
- (:require [selmer.parser :as parser]
- [selmer.filters :as filters]
- [markdown.core :refer [md-to-html-string]]
- [noir.session :as session]
- [ring.util.http-response :refer [content-type ok]]
- [ring.util.anti-forgery :refer [anti-forgery-field]]
- [ring.middleware.anti-forgery :refer [*anti-forgery-token*]]))
+(ns^{:doc "Render web pages using Selmer templating markup."
+ :author "Simon Brooke"}
+ youyesyet.layout
+ (:require [adl-support.tags :as tags]
+ [markdown.core :refer [md-to-html-string]]
+ [noir.session :as session]
+ [ring.util.http-response :refer [content-type ok]]
+ [ring.util.anti-forgery :refer [anti-forgery-field]]
+ [ring.middleware.anti-forgery :refer [*anti-forgery-token*]]
+ [selmer.parser :as parser]
+ [selmer.filters :as filters]
+ ))
- (declare ^:dynamic *app-context*)
- (parser/set-resource-path! (clojure.java.io/resource "templates"))
- (parser/add-tag! :csrf-field (fn [_ _] (anti-forgery-field)))
- (filters/add-filter! :markdown (fn [content] [:safe (md-to-html-string content)]))
+(declare ^:dynamic *app-context*)
+(parser/set-resource-path! (clojure.java.io/resource "templates"))
+(parser/add-tag! :csrf-field (fn [_ _] (anti-forgery-field)))
+(filters/add-filter! :markdown (fn [content] [:safe (md-to-html-string content)]))
- (parser/add-tag! :ifmemberof
- (fn [args context content]
- (let [permitted (if args (some (:user-groups context) args) false)]
- (if permitted
- (get-in content [:ifreadable :content]))))
- :else
- (fn [args context content]
- (let [permitted (if args (some (:user-groups context) args) false)]
- (if (not permitted)
- (get-in content [:else :content]))))
- :ifmemberof)
+(defn raw-get-user-roles [_]
+ #{"admin" "canvassers"})
+
+(def get-user-roles (memoize raw-get-user-roles))
- (defn raw-get-user-roles [_]
- #{"admin" "canvassers"})
-
- (def get-user-roles (memoize raw-get-user-roles))
-
-
- (defn render
- "renders the HTML template located relative to resources/templates"
- [template & [params]]
- (let [user (try session/get :user)]
- (content-type
- (ok
+(defn render
+ "renders the HTML template located relative to resources/templates"
+ [template & [params]]
+ (let [user (try session/get :user)]
+ (content-type
+ (ok
(parser/render-file
- template
- (assoc params
- :page template
- :csrf-token *anti-forgery-token*
- :user user
- :user-roles [get-user-roles user]
- :version (System/getProperty "youyesyet.version"))))
- "text/html; charset=utf-8")))
+ template
+ (assoc params
+ :page template
+ :csrf-token *anti-forgery-token*
+ :user user
+ :user-roles (get-user-roles user)
+ :version (System/getProperty "youyesyet.version"))))
+ "text/html; charset=utf-8")))
- (defn error-page
- "error-details should be a map containing the following keys:
- :status - error status
- :title - error title (optional)
- :message - detailed error message (optional)
-
- returns a response map with the error page as the body
- and the status specified by the status key"
- [error-details]
- {:status (:status error-details)
- :headers {"Content-Type" "text/html; charset=utf-8"}
- :body (parser/render-file "error.html" error-details)})
+(defn error-page
+ "error-details should be a map containing the following keys:
+ :status - error status
+ :title - error title (optional)
+ :message - detailed error message (optional)
+ returns a response map with the error page as the body
+ and the status specified by the status key"
+ [error-details]
+ {:status (:status error-details)
+ :headers {"Content-Type" "text/html; charset=utf-8"}
+ :body (parser/render-file "error.html" error-details)})
diff --git a/src/clj/youyesyet/routes/auto.clj b/src/clj/youyesyet/routes/auto.clj
index ade6436..e881916 100644
--- a/src/clj/youyesyet/routes/auto.clj
+++ b/src/clj/youyesyet/routes/auto.clj
@@ -1,7 +1,8 @@
(ns
youyesyet.routes.auto
- "User interface routes for Youyesyet auto-generated by [Application Description Language framework](https://github.com/simon-brooke/adl) at 20180617T110557.025Z"
+ "User interface routes for Youyesyet auto-generated by [Application Description Language framework](https://github.com/simon-brooke/adl) at 20180619T185151.309Z"
(:require
+ [adl-support.core :as support]
[clojure.java.io :as io]
[compojure.core :refer [defroutes GET POST]]
[hugsql.core :as hugsql]
@@ -13,119 +14,20 @@
[youyesyet.routes.manual :as m]))
(defn
- raw-resolve-template
- [n]
- (if
- (.exists (io/as-file (str "resources/templates/" n)))
- n
- (str "auto/" n)))
-
-(def resolve-template (memoize raw-resolve-template))
-
-(defn
- index
+ admin
[r]
(l/render
- (resolve-template "application-index.html")
+ (support/resolve-template "application-index.html")
{:title "Administrative menu"}))
-(defn
- list-electors-Electors
- [r]
- (let
- [p (:params r)]
- (l/render
- (resolve-template "list-electors-Electors.html")
- {:title "Electors",
- :params p,
- :records
- (if
- (not (empty? (remove nil? (vals p))))
- (db/search-strings-elector db/*db* p)
- (db/list-electors db/*db* {}))})))
-
-(defn
- form-electors-Elector
- [r]
- (let
- [p (:params r)]
- (l/render
- (resolve-template "form-electors-Elector.html")
- {:title "Elector",
- :params p,
- :record
- (if
- (empty? (remove nil? (vals p)))
- []
- (db/get-elector db/*db* p))})))
-
-(defn
- list-genders-Genders
- [r]
- (let
- [p (:params r)]
- (l/render
- (resolve-template "list-genders-Genders.html")
- {:title "Genders",
- :params p,
- :records
- (if
- (not (empty? (remove nil? (vals p))))
- (db/search-strings-gender db/*db* p)
- (db/list-genders db/*db* {}))})))
-
-(defn
- form-genders-Gender
- [r]
- (let
- [p (:params r)]
- (l/render
- (resolve-template "form-genders-Gender.html")
- {:title "Gender",
- :params p,
- :record
- (if
- (empty? (remove nil? (vals p)))
- []
- (db/get-gender db/*db* p))})))
-
-(defn
- list-dwellings-Dwellings
- [r]
- (let
- [p (:params r)]
- (l/render
- (resolve-template "list-dwellings-Dwellings.html")
- {:title "Dwellings",
- :params p,
- :records
- (if
- (not (empty? (remove nil? (vals p))))
- (db/search-strings-dwelling db/*db* p)
- (db/list-dwellings db/*db* {}))})))
-
-(defn
- form-dwellings-Dwelling
- [r]
- (let
- [p (:params r)]
- (l/render
- (resolve-template "form-dwellings-Dwelling.html")
- {:title "Dwelling",
- :params p,
- :record
- (if
- (empty? (remove nil? (vals p)))
- []
- (db/get-dwelling db/*db* p))})))
-
(defn
list-addresses-Addresses
[r]
(let
- [p (:params r)]
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
(l/render
- (resolve-template "list-addresses-Addresses.html")
+ (support/resolve-template "list-addresses-Addresses.html")
{:title "Addresses",
:params p,
:records
@@ -138,51 +40,24 @@
form-addresses-Address
[r]
(let
- [p (:params r)]
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
(l/render
- (resolve-template "form-addresses-Address.html")
+ (support/resolve-template "form-addresses-Address.html")
{:title "Address",
:params p,
:record
- (if
- (empty? (remove nil? (vals p)))
- []
- (db/get-address db/*db* p))})))
-
-(defn
- list-visits-Visits
- [r]
- (let
- [p (:params r)]
- (l/render
- (resolve-template "list-visits-Visits.html")
- {:title "Visits",
- :params p,
- :records
- (if
- (not (empty? (remove nil? (vals p))))
- (db/search-strings-visit db/*db* p)
- (db/list-visits db/*db* {}))})))
-
-(defn
- form-visits-Visit
- [r]
- (let
- [p (:params r)]
- (l/render
- (resolve-template "form-visits-Visit.html")
- {:title "Visit",
- :params p,
- :record
- (if (empty? (remove nil? (vals p))) [] (db/get-visit db/*db* p))})))
+ (if (empty? (remove nil? (vals p))) [] (db/get-address db/*db* p)),
+ :districts (db/list-districts db/*db*)})))
(defn
list-authorities-Authorities
[r]
(let
- [p (:params r)]
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
(l/render
- (resolve-template "list-authorities-Authorities.html")
+ (support/resolve-template "list-authorities-Authorities.html")
{:title "Authorities",
:params p,
:records
@@ -195,9 +70,10 @@
form-authorities-Authority
[r]
(let
- [p (:params r)]
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
(l/render
- (resolve-template "form-authorities-Authority.html")
+ (support/resolve-template "form-authorities-Authority.html")
{:title "Authority",
:params p,
:record
@@ -206,70 +82,14 @@
[]
(db/get-authority db/*db* p))})))
-(defn
- list-issues-Issues
- [r]
- (let
- [p (:params r)]
- (l/render
- (resolve-template "list-issues-Issues.html")
- {:title "Issues",
- :params p,
- :records
- (if
- (not (empty? (remove nil? (vals p))))
- (db/search-strings-issue db/*db* p)
- (db/list-issues db/*db* {}))})))
-
-(defn
- form-issues-Issue
- [r]
- (let
- [p (:params r)]
- (l/render
- (resolve-template "form-issues-Issue.html")
- {:title "Issue",
- :params p,
- :record
- (if (empty? (remove nil? (vals p))) [] (db/get-issue db/*db* p))})))
-
-(defn
- list-intentions-Intentions
- [r]
- (let
- [p (:params r)]
- (l/render
- (resolve-template "list-intentions-Intentions.html")
- {:title "Intentions",
- :params p,
- :records
- (if
- (not (empty? (remove nil? (vals p))))
- (db/search-strings-intention db/*db* p)
- (db/list-intentions db/*db* {}))})))
-
-(defn
- form-intentions-Intention
- [r]
- (let
- [p (:params r)]
- (l/render
- (resolve-template "form-intentions-Intention.html")
- {:title "Intention",
- :params p,
- :record
- (if
- (empty? (remove nil? (vals p)))
- []
- (db/get-intention db/*db* p))})))
-
(defn
list-canvassers-Canvassers
[r]
(let
- [p (:params r)]
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
(l/render
- (resolve-template "list-canvassers-Canvassers.html")
+ (support/resolve-template "list-canvassers-Canvassers.html")
{:title "Canvassers",
:params p,
:records
@@ -282,108 +102,29 @@
form-canvassers-Canvasser
[r]
(let
- [p (:params r)]
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
(l/render
- (resolve-template "form-canvassers-Canvasser.html")
+ (support/resolve-template "form-canvassers-Canvasser.html")
{:title "Canvasser",
:params p,
:record
(if
(empty? (remove nil? (vals p)))
[]
- (db/get-canvasser db/*db* p))})))
-
-(defn
- list-followuprequests-Followuprequests
- [r]
- (let
- [p (:params r)]
- (l/render
- (resolve-template "list-followuprequests-Followuprequests.html")
- {:title "Followuprequests",
- :params p,
- :records
- (if
- (not (empty? (remove nil? (vals p))))
- (db/search-strings-followuprequest db/*db* p)
- (db/list-followuprequests db/*db* {}))})))
-
-(defn
- form-followuprequests-Followuprequest
- [r]
- (let
- [p (:params r)]
- (l/render
- (resolve-template "form-followuprequests-Followuprequest.html")
- {:title "Followuprequest",
- :params p,
- :record
- (if
- (empty? (remove nil? (vals p)))
- []
- (db/get-followuprequest db/*db* p))})))
-
-(defn
- list-roles-Roles
- [r]
- (let
- [p (:params r)]
- (l/render
- (resolve-template "list-roles-Roles.html")
- {:title "Roles",
- :params p,
- :records
- (if
- (not (empty? (remove nil? (vals p))))
- (db/search-strings-role db/*db* p)
- (db/list-roles db/*db* {}))})))
-
-(defn
- form-roles-Role
- [r]
- (let
- [p (:params r)]
- (l/render
- (resolve-template "form-roles-Role.html")
- {:title "Role",
- :params p,
- :record
- (if (empty? (remove nil? (vals p))) [] (db/get-role db/*db* p))})))
-
-(defn
- list-teams-Teams
- [r]
- (let
- [p (:params r)]
- (l/render
- (resolve-template "list-teams-Teams.html")
- {:title "Teams",
- :params p,
- :records
- (if
- (not (empty? (remove nil? (vals p))))
- (db/search-strings-team db/*db* p)
- (db/list-teams db/*db* {}))})))
-
-(defn
- form-teams-Team
- [r]
- (let
- [p (:params r)]
- (l/render
- (resolve-template "form-teams-Team.html")
- {:title "Team",
- :params p,
- :record
- (if (empty? (remove nil? (vals p))) [] (db/get-team db/*db* p))})))
+ (db/get-canvasser db/*db* p)),
+ :electors (db/list-electors db/*db*),
+ :addresses (db/list-addresses db/*db*),
+ :authorities (db/list-authorities db/*db*)})))
(defn
list-districts-Districts
[r]
(let
- [p (:params r)]
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
(l/render
- (resolve-template "list-districts-Districts.html")
+ (support/resolve-template "list-districts-Districts.html")
{:title "Districts",
:params p,
:records
@@ -396,9 +137,10 @@
form-districts-District
[r]
(let
- [p (:params r)]
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
(l/render
- (resolve-template "form-districts-District.html")
+ (support/resolve-template "form-districts-District.html")
{:title "District",
:params p,
:record
@@ -407,13 +149,79 @@
[]
(db/get-district db/*db* p))})))
+(defn
+ list-dwellings-Dwellings
+ [r]
+ (let
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
+ (l/render
+ (support/resolve-template "list-dwellings-Dwellings.html")
+ {:title "Dwellings",
+ :params p,
+ :records
+ (if
+ (not (empty? (remove nil? (vals p))))
+ (db/search-strings-dwelling db/*db* p)
+ (db/list-dwellings db/*db* {}))})))
+
+(defn
+ form-dwellings-Dwelling
+ [r]
+ (let
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
+ (l/render
+ (support/resolve-template "form-dwellings-Dwelling.html")
+ {:title "Dwelling",
+ :params p,
+ :record
+ (if
+ (empty? (remove nil? (vals p)))
+ []
+ (db/get-dwelling db/*db* p)),
+ :addresses (db/list-addresses db/*db*)})))
+
+(defn
+ list-electors-Electors
+ [r]
+ (let
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
+ (l/render
+ (support/resolve-template "list-electors-Electors.html")
+ {:title "Electors",
+ :params p,
+ :records
+ (if
+ (not (empty? (remove nil? (vals p))))
+ (db/search-strings-elector db/*db* p)
+ (db/list-electors db/*db* {}))})))
+
+(defn
+ form-electors-Elector
+ [r]
+ (let
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
+ (l/render
+ (support/resolve-template "form-electors-Elector.html")
+ {:title "Elector",
+ :params p,
+ :record
+ (if (empty? (remove nil? (vals p))) [] (db/get-elector db/*db* p)),
+ :dwellings (db/list-dwellings db/*db*),
+ :genders (db/list-genders db/*db*)})))
+
(defn
list-followupactions-Followupactions
[r]
(let
- [p (:params r)]
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
(l/render
- (resolve-template "list-followupactions-Followupactions.html")
+ (support/resolve-template
+ "list-followupactions-Followupactions.html")
{:title "Followupactions",
:params p,
:records
@@ -426,54 +234,30 @@
form-followupactions-Followupaction
[r]
(let
- [p (:params r)]
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
(l/render
- (resolve-template "form-followupactions-Followupaction.html")
+ (support/resolve-template
+ "form-followupactions-Followupaction.html")
{:title "Followupaction",
:params p,
:record
(if
(empty? (remove nil? (vals p)))
[]
- (db/get-followupaction db/*db* p))})))
-
-(defn
- list-options-Options
- [r]
- (let
- [p (:params r)]
- (l/render
- (resolve-template "list-options-Options.html")
- {:title "Options",
- :params p,
- :records
- (if
- (not (empty? (remove nil? (vals p))))
- (db/search-strings-option db/*db* p)
- (db/list-options db/*db* {}))})))
-
-(defn
- form-options-Option
- [r]
- (let
- [p (:params r)]
- (l/render
- (resolve-template "form-options-Option.html")
- {:title "Option",
- :params p,
- :record
- (if
- (empty? (remove nil? (vals p)))
- []
- (db/get-option db/*db* p))})))
+ (db/get-followupaction db/*db* p)),
+ :followuprequests (db/list-followuprequests db/*db*),
+ :canvassers (db/list-canvassers db/*db*)})))
(defn
list-followupmethods-Followupmethods
[r]
(let
- [p (:params r)]
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
(l/render
- (resolve-template "list-followupmethods-Followupmethods.html")
+ (support/resolve-template
+ "list-followupmethods-Followupmethods.html")
{:title "Followupmethods",
:params p,
:records
@@ -486,9 +270,11 @@
form-followupmethods-Followupmethod
[r]
(let
- [p (:params r)]
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
(l/render
- (resolve-template "form-followupmethods-Followupmethod.html")
+ (support/resolve-template
+ "form-followupmethods-Followupmethod.html")
{:title "Followupmethod",
:params p,
:record
@@ -497,6 +283,262 @@
[]
(db/get-followupmethod db/*db* p))})))
+(defn
+ list-followuprequests-Followuprequests
+ [r]
+ (let
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
+ (l/render
+ (support/resolve-template
+ "list-followuprequests-Followuprequests.html")
+ {:title "Followuprequests",
+ :params p,
+ :records
+ (if
+ (not (empty? (remove nil? (vals p))))
+ (db/search-strings-followuprequest db/*db* p)
+ (db/list-followuprequests db/*db* {}))})))
+
+(defn
+ form-followuprequests-Followuprequest
+ [r]
+ (let
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
+ (l/render
+ (support/resolve-template
+ "form-followuprequests-Followuprequest.html")
+ {:title "Followuprequest",
+ :params p,
+ :record
+ (if
+ (empty? (remove nil? (vals p)))
+ []
+ (db/get-followuprequest db/*db* p)),
+ :electors (db/list-electors db/*db*),
+ :visits (db/list-visits db/*db*),
+ :issues (db/list-issues db/*db*),
+ :followupmethods (db/list-followupmethods db/*db*)})))
+
+(defn
+ list-genders-Genders
+ [r]
+ (let
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
+ (l/render
+ (support/resolve-template "list-genders-Genders.html")
+ {:title "Genders",
+ :params p,
+ :records
+ (if
+ (not (empty? (remove nil? (vals p))))
+ (db/search-strings-gender db/*db* p)
+ (db/list-genders db/*db* {}))})))
+
+(defn
+ form-genders-Gender
+ [r]
+ (let
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
+ (l/render
+ (support/resolve-template "form-genders-Gender.html")
+ {:title "Gender",
+ :params p,
+ :record
+ (if
+ (empty? (remove nil? (vals p)))
+ []
+ (db/get-gender db/*db* p))})))
+
+(defn
+ list-intentions-Intentions
+ [r]
+ (let
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
+ (l/render
+ (support/resolve-template "list-intentions-Intentions.html")
+ {:title "Intentions",
+ :params p,
+ :records
+ (if
+ (not (empty? (remove nil? (vals p))))
+ (db/search-strings-intention db/*db* p)
+ (db/list-intentions db/*db* {}))})))
+
+(defn
+ form-intentions-Intention
+ [r]
+ (let
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
+ (l/render
+ (support/resolve-template "form-intentions-Intention.html")
+ {:title "Intention",
+ :params p,
+ :record
+ (if
+ (empty? (remove nil? (vals p)))
+ []
+ (db/get-intention db/*db* p)),
+ :visits (db/list-visits db/*db*),
+ :electors (db/list-electors db/*db*),
+ :options (db/list-options db/*db*)})))
+
+(defn
+ list-issues-Issues
+ [r]
+ (let
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
+ (l/render
+ (support/resolve-template "list-issues-Issues.html")
+ {:title "Issues",
+ :params p,
+ :records
+ (if
+ (not (empty? (remove nil? (vals p))))
+ (db/search-strings-issue db/*db* p)
+ (db/list-issues db/*db* {}))})))
+
+(defn
+ form-issues-Issue
+ [r]
+ (let
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
+ (l/render
+ (support/resolve-template "form-issues-Issue.html")
+ {:title "Issue",
+ :params p,
+ :record
+ (if (empty? (remove nil? (vals p))) [] (db/get-issue db/*db* p))})))
+
+(defn
+ list-options-Options
+ [r]
+ (let
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
+ (l/render
+ (support/resolve-template "list-options-Options.html")
+ {:title "Options",
+ :params p,
+ :records
+ (if
+ (not (empty? (remove nil? (vals p))))
+ (db/search-strings-option db/*db* p)
+ (db/list-options db/*db* {}))})))
+
+(defn
+ form-options-Option
+ [r]
+ (let
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
+ (l/render
+ (support/resolve-template "form-options-Option.html")
+ {:title "Option",
+ :params p,
+ :record
+ (if
+ (empty? (remove nil? (vals p)))
+ []
+ (db/get-option db/*db* p))})))
+
+(defn
+ list-roles-Roles
+ [r]
+ (let
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
+ (l/render
+ (support/resolve-template "list-roles-Roles.html")
+ {:title "Roles",
+ :params p,
+ :records
+ (if
+ (not (empty? (remove nil? (vals p))))
+ (db/search-strings-role db/*db* p)
+ (db/list-roles db/*db* {}))})))
+
+(defn
+ form-roles-Role
+ [r]
+ (let
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
+ (l/render
+ (support/resolve-template "form-roles-Role.html")
+ {:title "Role",
+ :params p,
+ :record
+ (if (empty? (remove nil? (vals p))) [] (db/get-role db/*db* p))})))
+
+(defn
+ list-teams-Teams
+ [r]
+ (let
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
+ (l/render
+ (support/resolve-template "list-teams-Teams.html")
+ {:title "Teams",
+ :params p,
+ :records
+ (if
+ (not (empty? (remove nil? (vals p))))
+ (db/search-strings-team db/*db* p)
+ (db/list-teams db/*db* {}))})))
+
+(defn
+ form-teams-Team
+ [r]
+ (let
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
+ (l/render
+ (support/resolve-template "form-teams-Team.html")
+ {:title "Team",
+ :params p,
+ :record
+ (if (empty? (remove nil? (vals p))) [] (db/get-team db/*db* p)),
+ :districts (db/list-districts db/*db*)})))
+
+(defn
+ list-visits-Visits
+ [r]
+ (let
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
+ (l/render
+ (support/resolve-template "list-visits-Visits.html")
+ {:title "Visits",
+ :params p,
+ :records
+ (if
+ (not (empty? (remove nil? (vals p))))
+ (db/search-strings-visit db/*db* p)
+ (db/list-visits db/*db* {}))})))
+
+(defn
+ form-visits-Visit
+ [r]
+ (let
+ [p
+ (merge (support/query-string-to-map (:query-string r)) (:params r))]
+ (l/render
+ (support/resolve-template "form-visits-Visit.html")
+ {:title "Visit",
+ :params p,
+ :record
+ (if (empty? (remove nil? (vals p))) [] (db/get-visit db/*db* p)),
+ :addresses (db/list-addresses db/*db*),
+ :canvassers (db/list-canvassers db/*db*)})))
+
(defn
raw-resolve-handler
"Prefer the manually-written version of the handler with name `n`, if it exists, to the automatically generated one"
diff --git a/src/clj/youyesyet/routes/auto_json.clj b/src/clj/youyesyet/routes/auto_json.clj
index b95d993..42ea3a3 100644
--- a/src/clj/youyesyet/routes/auto_json.clj
+++ b/src/clj/youyesyet/routes/auto_json.clj
@@ -1,7 +1,8 @@
(ns
youyesyet.routes.auto-json
- "JSON routes for youyesyet auto-generated by [Application Description Language framework](https://github.com/simon-brooke/adl) at 20180617T110553.546Z"
+ "JSON routes for youyesyet auto-generated by [Application Description Language framework](https://github.com/simon-brooke/adl) at 20180619T185150.149Z"
(:require
+ [adl-support.core :as support]
[clojure.java.io :as io]
[compojure.core :refer [defroutes GET POST]]
[hugsql.core :as hugsql]