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).-->
{% csrf-field %} -

@@ -50,6 +53,10 @@ address {{record.address}} +{% else %} + +You are not permitted to view address of addresses + {% endifmemberof %} {% endifmemberof %}

@@ -64,6 +71,10 @@ postcode {{record.postcode}} +{% else %} + +You are not permitted to view postcode of addresses + {% endifmemberof %} {% endifmemberof %}

@@ -78,6 +89,10 @@ phone {{record.phone}} +{% else %} + +You are not permitted to view phone of addresses + {% endifmemberof %} {% endifmemberof %}

@@ -97,108 +112,9 @@ district_id {{record.district_id}} -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin %} - {% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.latitude}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin %} - -{% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.longitude}} - -{% 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.address}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin %} - -{% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.postcode}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin %} - -{% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.phone}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin %} -

- - -
-{% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.district_id}} + +You are not permitted to view district_id of addresses {% endifmemberof %} {% endifmemberof %} @@ -214,6 +130,10 @@ latitude {{record.latitude}} +{% else %} + +You are not permitted to view latitude of addresses + {% endifmemberof %} {% endifmemberof %}

@@ -228,6 +148,10 @@ longitude {{record.longitude}} +{% else %} + +You are not permitted to view longitude of addresses + {% endifmemberof %} {% endifmemberof %}

@@ -235,13 +159,13 @@ longitude - +

- +

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).-->
{% csrf-field %} -

@@ -50,6 +53,10 @@ username {{record.username}} +{% else %} + +You are not permitted to view username of canvassers + {% endifmemberof %} {% endifmemberof %}

@@ -64,6 +71,10 @@ fullname {{record.fullname}} +{% else %} + +You are not permitted to view fullname of canvassers + {% endifmemberof %} {% endifmemberof %}

@@ -83,146 +94,9 @@ elector_id {{record.elector_id}} -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} -

- - -
{% else %} -{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.address_id}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} - -{% else %} -{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.phone}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} - -{% else %} -{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.email}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} -

- - -
-{% else %} -{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.authority_id}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} - -{% else %} -{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.authorised}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} - -{% else %} -{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.id}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} - -{% else %} -{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.username}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} - -{% else %} -{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.fullname}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} -

- - -
-{% else %} -{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.elector_id}} + +You are not permitted to view elector_id of canvassers {% endifmemberof %} {% endifmemberof %} @@ -243,6 +117,10 @@ address_id {{record.address_id}} +{% else %} + +You are not permitted to view address_id of canvassers + {% endifmemberof %} {% endifmemberof %}

@@ -257,6 +135,10 @@ phone {{record.phone}} +{% else %} + +You are not permitted to view phone of canvassers + {% endifmemberof %} {% endifmemberof %}

@@ -271,6 +153,10 @@ email {{record.email}} +{% else %} + +You are not permitted to view email of canvassers + {% endifmemberof %} {% endifmemberof %}

@@ -290,6 +176,10 @@ authority_id {{record.authority_id}} +{% else %} + +You are not permitted to view authority_id of canvassers + {% endifmemberof %} {% endifmemberof %}

@@ -304,6 +194,10 @@ authorised {{record.authorised}} +{% else %} + +You are not permitted to view authorised of canvassers + {% endifmemberof %} {% endifmemberof %}

@@ -322,6 +216,10 @@ roles {{record.roles}} +{% else %} + +You are not permitted to view roles of canvassers + {% endifmemberof %} {% endifmemberof %}

@@ -329,13 +227,13 @@ roles - +

- +

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).-->
{% csrf-field %} -

@@ -50,33 +53,9 @@ name {{record.name}} -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin admin %} - {% else %} -{% ifmemberof public admin canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.id}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin admin %} - -{% else %} -{% ifmemberof public admin canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.name}} + +You are not permitted to view name of districts {% endifmemberof %} {% endifmemberof %} @@ -85,13 +64,13 @@ name - +

- +

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).-->
{% csrf-field %} -

@@ -55,52 +58,9 @@ address_id {{record.address_id}} -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin %} - {% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.sub-address}} - -{% 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.address_id}} + +You are not permitted to view address_id of dwellings {% endifmemberof %} {% endifmemberof %} @@ -116,6 +76,10 @@ sub-address {{record.sub-address}} +{% else %} + +You are not permitted to view sub-address of dwellings + {% endifmemberof %} {% endifmemberof %}

@@ -123,13 +87,13 @@ sub-address - +

- +

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).-->
{% csrf-field %} -

@@ -50,6 +53,10 @@ name {{record.name}} +{% else %} + +You are not permitted to view name of electors + {% endifmemberof %} {% endifmemberof %}

@@ -69,6 +76,10 @@ dwelling_id {{record.dwelling_id}} +{% else %} + +You are not permitted to view dwelling_id of electors + {% endifmemberof %} {% endifmemberof %}

@@ -83,6 +94,10 @@ phone {{record.phone}} +{% else %} + +You are not permitted to view phone of electors + {% endifmemberof %} {% endifmemberof %}

@@ -97,6 +112,10 @@ email {{record.email}} +{% else %} + +You are not permitted to view email of electors + {% endifmemberof %} {% endifmemberof %}

@@ -115,98 +134,9 @@ gender {{record.gender}} -{% 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.name}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin %} -

- - -
-{% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.dwelling_id}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin %} - -{% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.phone}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin %} - -{% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.email}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin %} -

- -
-{% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.gender}} + +You are not permitted to view gender of electors {% endifmemberof %} {% endifmemberof %} @@ -215,13 +145,13 @@ gender - +

- +

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).-->
{% csrf-field %} -

@@ -55,99 +58,9 @@ request_id {{record.request_id}} -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin %} -

- - -
{% else %} -{% ifmemberof issueexperts canvassers analysts issueeditors admin %} - -{{record.actor}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin %} - -{% else %} -{% ifmemberof issueexperts canvassers analysts issueeditors admin %} - -{{record.date}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin %} - -{% else %} -{% ifmemberof issueexperts canvassers analysts issueeditors admin %} - -{{record.notes}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin %} - -{% else %} -{% ifmemberof issueexperts canvassers analysts issueeditors admin %} - -{{record.closed}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin %} - -{% else %} -{% ifmemberof issueexperts canvassers analysts issueeditors admin %} - -{{record.id}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin %} -

- - -
-{% else %} -{% ifmemberof issueexperts canvassers analysts issueeditors admin %} - -{{record.request_id}} + +You are not permitted to view request_id of followupactions {% endifmemberof %} {% endifmemberof %} @@ -168,6 +81,10 @@ actor {{record.actor}} +{% else %} + +You are not permitted to view actor of followupactions + {% endifmemberof %} {% endifmemberof %}

@@ -182,6 +99,10 @@ date {{record.date}} +{% else %} + +You are not permitted to view date of followupactions + {% endifmemberof %} {% endifmemberof %}

@@ -196,6 +117,10 @@ notes {{record.notes}} +{% else %} + +You are not permitted to view notes of followupactions + {% endifmemberof %} {% endifmemberof %}

@@ -210,6 +135,10 @@ closed {{record.closed}} +{% else %} + +You are not permitted to view closed of followupactions + {% endifmemberof %} {% endifmemberof %}

@@ -217,13 +146,13 @@ closed - +

- +

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).-->
{% csrf-field %} -

@@ -55,93 +58,9 @@ elector_id {{record.elector_id}} -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin %} -

- - -
{% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.visit_id}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin %} -

- -
-{% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.issue_id}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin %} -

- -
-{% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.method_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.elector_id}} + +You are not permitted to view elector_id of followuprequests {% endifmemberof %} {% endifmemberof %} @@ -162,6 +81,10 @@ visit_id {{record.visit_id}} +{% else %} + +You are not permitted to view visit_id of followuprequests + {% endifmemberof %} {% endifmemberof %}

@@ -180,6 +103,10 @@ issue_id {{record.issue_id}} +{% else %} + +You are not permitted to view issue_id of followuprequests + {% endifmemberof %} {% endifmemberof %}

@@ -198,6 +125,10 @@ method_id {{record.method_id}} +{% else %} + +You are not permitted to view method_id of followuprequests + {% endifmemberof %} {% endifmemberof %}

@@ -205,13 +136,13 @@ method_id - +

- +

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).-->
{% csrf-field %} -

@@ -60,61 +63,9 @@ elector_id {{record.elector_id}} -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin %} -

- -
{% else %} -{% ifmemberof canvassers analysts admin %} - -{{record.option_id}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin %} -

- - -
-{% else %} -{% ifmemberof canvassers analysts admin %} - -{{record.visit_id}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin %} -

- - -
-{% else %} -{% ifmemberof canvassers analysts admin %} - -{{record.elector_id}} + +You are not permitted to view elector_id of intentions {% endifmemberof %} {% endifmemberof %} @@ -134,6 +85,10 @@ option_id {{record.option_id}} +{% else %} + +You are not permitted to view option_id of intentions + {% endifmemberof %} {% endifmemberof %}

@@ -141,13 +96,13 @@ option_id - +

- +

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).-->
{% csrf-field %} -

@@ -50,33 +53,9 @@ name {{record.name}} -{% 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.name}} + +You are not permitted to view name of roles {% endifmemberof %} {% endifmemberof %} @@ -97,6 +76,10 @@ members {{record.members}} +{% else %} + +You are not permitted to view members of roles + {% endifmemberof %} {% endifmemberof %}

@@ -104,13 +87,13 @@ members - +

- +

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).-->
{% csrf-field %} -

@@ -50,6 +53,10 @@ name {{record.name}} +{% else %} + +You are not permitted to view name of teams + {% endifmemberof %} {% endifmemberof %}

@@ -69,80 +76,9 @@ district_id {{record.district_id}} -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof teamorganisers admin %} - {% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.latitude}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof teamorganisers admin %} - -{% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.longitude}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof teamorganisers admin %} - -{% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.id}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof teamorganisers admin %} - -{% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.name}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof teamorganisers admin %} -

- - -
-{% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.district_id}} + +You are not permitted to view district_id of teams {% endifmemberof %} {% endifmemberof %} @@ -158,6 +94,10 @@ latitude {{record.latitude}} +{% else %} + +You are not permitted to view latitude of teams + {% endifmemberof %} {% endifmemberof %}

@@ -177,6 +117,10 @@ members {{record.members}} +{% else %} + +You are not permitted to view members of teams + {% endifmemberof %} {% endifmemberof %}

@@ -196,6 +140,10 @@ organisers {{record.organisers}} +{% else %} + +You are not permitted to view organisers of teams + {% endifmemberof %} {% endifmemberof %}

@@ -210,6 +158,10 @@ longitude {{record.longitude}} +{% else %} + +You are not permitted to view longitude of teams + {% endifmemberof %} {% endifmemberof %}

@@ -217,13 +169,13 @@ longitude - +

- +

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).-->
{% csrf-field %} -

@@ -55,71 +58,9 @@ address_id {{record.address_id}} -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin admin %} -

- - -
{% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.canvasser_id}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin admin %} - -{% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.date}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin admin %} - -{% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.id}} - -{% endifmemberof %} -{% endifmemberof %} -

-

- -{% ifmemberof admin admin %} -

- - -
-{% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers issueexperts analysts issueeditors admin %} - -{{record.address_id}} + +You are not permitted to view address_id of visits {% endifmemberof %} {% endifmemberof %} @@ -140,6 +81,10 @@ canvasser_id {{record.canvasser_id}} +{% else %} + +You are not permitted to view canvasser_id of visits + {% endifmemberof %} {% endifmemberof %}

@@ -154,6 +99,10 @@ date {{record.date}} +{% else %} + +You are not permitted to view date of visits + {% endifmemberof %} {% endifmemberof %}

@@ -161,13 +110,13 @@ date - +

- +

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]