From 0026218993cbd1051b59ed0b3a531483e8398a2a Mon Sep 17 00:00:00 2001 From: Simon Brooke Date: Sat, 7 Jul 2018 10:21:09 +0100 Subject: [PATCH] Tactical commit; much progress but not ready for release. --- .gitignore | 3 + env/dev/resources/config.edn | 3 +- resources/motd.md | 9 + resources/sql/queries.auto.sql | 120 +- resources/sql/test-canvassers.sql | 65 + resources/sql/youyesyet.postgres.sql | 275 +++- resources/templates/about.html | 8 +- .../templates/auto/application-index.html | 73 +- .../auto/form-addresses-Address.html | 16 +- .../auto/form-authorities-Authority.html | 14 +- .../auto/form-canvassers-Canvasser.html | 43 +- .../auto/form-districts-District.html | 6 +- .../auto/form-dwellings-Dwelling.html | 8 +- .../templates/auto/form-electors-Elector.html | 14 +- .../templates/auto/form-events-Events.html | 205 +++ .../form-followupactions-Followupaction.html | 14 +- .../form-followupmethods-Followupmethod.html | 4 +- ...form-followuprequests-Followuprequest.html | 12 +- .../templates/auto/form-genders-Gender.html | 4 +- .../auto/form-intentions-Intention.html | 10 +- .../templates/auto/form-issues-Issue.html | 10 +- .../templates/auto/form-options-Option.html | 4 +- resources/templates/auto/form-roles-Role.html | 8 +- resources/templates/auto/form-teams-Team.html | 16 +- .../templates/auto/form-visits-Visit.html | 10 +- .../auto/list-addresses-Addresses.html | 24 +- .../auto/list-authorities-Authorities.html | 10 +- .../auto/list-canvassers-Canvassers.html | 20 +- .../auto/list-districts-Districts.html | 6 +- .../auto/list-dwellings-Dwellings.html | 8 +- .../auto/list-electors-Electors.html | 14 +- .../templates/auto/list-events-Events.html | 148 +++ .../list-followupactions-Followupactions.html | 14 +- .../list-followupmethods-Followupmethods.html | 4 +- ...ist-followuprequests-Followuprequests.html | 12 +- .../templates/auto/list-genders-Genders.html | 4 +- .../auto/list-intentions-Intentions.html | 12 +- .../templates/auto/list-issues-Issues.html | 10 +- .../templates/auto/list-options-Options.html | 4 +- .../templates/auto/list-roles-Roles.html | 6 +- .../templates/auto/list-teams-Teams.html | 12 +- .../templates/auto/list-visits-Visits.html | 10 +- resources/templates/base.html | 8 +- resources/templates/error.html | 43 +- resources/templates/home.html | 34 +- resources/templates/login.html | 2 +- resources/templates/roles.html | 2 +- resources/templates/roles/analyst.html | 1 + resources/templates/supporter.html | 2 +- src/clj/youyesyet/db/core.clj | 2 +- src/clj/youyesyet/handler.clj | 11 +- src/clj/youyesyet/layout.clj | 2 +- src/clj/youyesyet/routes/auto.clj | 139 +- src/clj/youyesyet/routes/auto_json.clj | 371 +++--- src/clj/youyesyet/routes/home.clj | 52 +- src/clj/youyesyet/routes/roles.clj | 71 + src/clj/youyesyet/routes/services.clj | 15 +- src/clj/youyesyet/tags.clj | 20 - .../youyesyet/canvasser_app/views/about.cljs | 2 +- youyesyet.adl.xml | 1148 +++++++++++++---- youyesyet.canonical.adl.xml | 754 +++++++++-- 61 files changed, 2920 insertions(+), 1031 deletions(-) create mode 100644 resources/motd.md create mode 100644 resources/sql/test-canvassers.sql create mode 100644 resources/templates/auto/form-events-Events.html create mode 100644 resources/templates/auto/list-events-Events.html create mode 100644 resources/templates/roles/analyst.html create mode 100644 src/clj/youyesyet/routes/roles.clj delete mode 100644 src/clj/youyesyet/tags.clj diff --git a/.gitignore b/.gitignore index 5e02010..6779fd4 100644 --- a/.gitignore +++ b/.gitignore @@ -23,5 +23,8 @@ pom.xml.asc profiles\.clj .bowerrc bower.json +.idea src/clj/youyesyet/scratchpad\.clj + +*.iml diff --git a/env/dev/resources/config.edn b/env/dev/resources/config.edn index c261b18..0a5f540 100644 --- a/env/dev/resources/config.edn +++ b/env/dev/resources/config.edn @@ -3,4 +3,5 @@ ;; when :nrepl-port is set the application starts the nREPL server on load :nrepl-port 7000 :site-title "Project Hope" - :site-logo "img/ProjectHopeLogo.png"} + :site-logo "img/ProjectHopeLogo.png" + :motd "motd.md"} diff --git a/resources/motd.md b/resources/motd.md new file mode 100644 index 0000000..3d6bed8 --- /dev/null +++ b/resources/motd.md @@ -0,0 +1,9 @@ +## Welcome to Project Hope + +### Alpha test code + +This is a voter intention information system intended to be used by the 'Yes' side in the next Scottish independence referendum. + +Design documentation is [here](https://github.com/simon-brooke/youyesyet/blob/master/doc/specification/userspec.md). + +Although addresses in the database mostly are real, all personal data in the database is randomly generated and does not represent real people. diff --git a/resources/sql/queries.auto.sql b/resources/sql/queries.auto.sql index dc97b4a..4797930 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-07-05T10:14:16.954Z +-- autogenerated by adl.to-hugsql-queries at 2018-07-07T08:09:48.253Z -- -- See [Application Description -- Language](https://github.com/simon-brooke/adl). @@ -45,6 +45,8 @@ returning id -- :doc creates a new canvasser record INSERT INTO canvassers (username, fullname, + avatar, + bio, elector_id, address_id, phone, @@ -53,6 +55,8 @@ INSERT INTO canvassers (username, authorised) VALUES (:username, :fullname, + :avatar, + :bio, :elector_id, :address_id, :phone, @@ -89,6 +93,20 @@ VALUES (:name, :gender) returning id +-- :name create-event! :! :n +-- :doc creates a new event record +INSERT INTO events (name, + date, + time, + decription, + cancelled) +VALUES (:name, + :date, + :time, + :decription, + :cancelled) +returning id + -- :name create-followupaction! :! :n -- :doc creates a new followupaction record INSERT INTO followupactions (request_id, @@ -137,7 +155,7 @@ VALUES (:visit_id, :elector_id, :option_id, :locality) -returning Id +returning id -- :name create-issue! :! :n -- :doc creates a new issue record @@ -215,6 +233,11 @@ WHERE dwellings.id = :id DELETE FROM electors WHERE electors.id = :id +-- :name delete-event! :! :n +-- :doc updates an existing event record +DELETE FROM events +WHERE events.id = :id + -- :name delete-followupaction! :! :n -- :doc updates an existing followupaction record DELETE FROM followupactions @@ -238,7 +261,7 @@ WHERE genders.id = :id -- :name delete-intention! :! :n -- :doc updates an existing intention record DELETE FROM intentions -WHERE intentions.Id = :Id +WHERE intentions.id = :id -- :name delete-issue! :! :n -- :doc updates an existing issue record @@ -325,6 +348,15 @@ ORDER BY electors.name, electors.gender, electors.id +-- :name get-event :? :1 +-- :doc selects an existing event record +SELECT * FROM events +WHERE events.id = :id +ORDER BY events.name, + events.date, + events.time, + events.id + -- :name get-followupaction :? :1 -- :doc selects an existing followupaction record SELECT * FROM followupactions @@ -355,7 +387,7 @@ WHERE genders.id = :id -- :name get-intention :? :1 -- :doc selects an existing intention record SELECT * FROM intentions -WHERE intentions.Id = :Id +WHERE intentions.id = :id -- :name get-issue :? :1 -- :doc selects an existing issue record @@ -475,9 +507,9 @@ ORDER BY lv_canvassers.username, -- :name list-canvassers-by-role :? :* -- :doc links all existing canvasser records related to a given role SELECT * -FROM canvassers, ln_canvassers_roles -WHERE canvassers.id = ln_canvassers_roles.canvasser_id - AND ln_canvassers_roles.role_id = :id +FROM canvassers, ln_roles_canvassers_roles +WHERE canvassers.id = ln_roles_canvassers_roles.canvasser_id + AND ln_roles_canvassers_roles.role_id = :id ORDER BY canvassers.username, canvassers.fullname, canvassers.address_id, @@ -547,6 +579,27 @@ ORDER BY lv_electors.name, lv_electors.gender, lv_electors.id +-- :name list-events :? :* +-- :doc lists all existing event records +SELECT DISTINCT * FROM lv_events +ORDER BY lv_events.name, + lv_events.date, + lv_events.time, + lv_events.id +--~ (if (:offset params) "OFFSET :offset ") +--~ (if (:limit params) "LIMIT :limit" "LIMIT 100") + +-- :name list-events-by-team :? :* +-- :doc links all existing event records related to a given team +SELECT * +FROM events, ln_teams_events_teams +WHERE events.id = ln_teams_events_teams.event_id + AND ln_teams_events_teams.team_id = :id +ORDER BY events.name, + events.date, + events.time, + events.id + -- :name list-followupactions :? :* -- :doc lists all existing followupaction records SELECT DISTINCT * FROM lv_followupactions @@ -652,21 +705,21 @@ SELECT DISTINCT * FROM lv_intentions -- :doc lists all existing intention records related to a given elector SELECT * FROM lv_intentions, intentions -WHERE lv_intentions.Id = intentions.Id +WHERE lv_intentions.id = intentions.id AND intentions.elector_id = :id -- :name list-intentions-by-option :? :* -- :doc lists all existing intention records related to a given option SELECT * FROM lv_intentions, intentions -WHERE lv_intentions.Id = intentions.Id +WHERE lv_intentions.id = intentions.id AND intentions.option_id = :id -- :name list-intentions-by-visit :? :* -- :doc lists all existing intention records related to a given visit SELECT * FROM lv_intentions, intentions -WHERE lv_intentions.Id = intentions.Id +WHERE lv_intentions.id = intentions.id AND intentions.visit_id = :id -- :name list-issues :? :* @@ -692,9 +745,9 @@ ORDER BY lv_roles.name, -- :name list-roles-by-canvasser :? :* -- :doc links all existing role records related to a given canvasser SELECT * -FROM roles, ln_canvassers_roles -WHERE roles.id = ln_canvassers_roles.role_id - AND ln_canvassers_roles.canvasser_id = :id +FROM roles, ln_members_roles_canvassers +WHERE roles.id = ln_members_roles_canvassers.role_id + AND ln_members_roles_canvassers.canvasser_id = :id ORDER BY roles.name, roles.id @@ -709,9 +762,9 @@ ORDER BY lv_teams.name, -- :name list-teams-by-canvasser :? :* -- :doc links all existing team records related to a given canvasser SELECT * -FROM teams, ln_canvassers_teams -WHERE teams.id = ln_canvassers_teams.team_id - AND ln_canvassers_teams.canvasser_id = :id +FROM teams, ln_organisers_teams_canvassers +WHERE teams.id = ln_organisers_teams_canvassers.team_id + AND ln_organisers_teams_canvassers.canvasser_id = :id ORDER BY teams.name, teams.id @@ -790,6 +843,8 @@ SELECT DISTINCT * FROM lv_canvassers WHERE false --~ (if (:username params) "OR username LIKE '%:username%'") --~ (if (:fullname params) "OR fullname LIKE '%:fullname%'") + --~ (if (:avatar params) "OR avatar = :avatar") + --~ (if (:bio params) "OR bio LIKE '%:bio%'") --~ (if (:elector_id params) "OR elector_id = :elector_id") --~ (if (:address_id params) "OR address_id = :address_id") --~ (if (:phone params) "OR phone LIKE '%:phone%'") @@ -848,6 +903,23 @@ ORDER BY lv_electors.name, --~ (if (:offset params) "OFFSET :offset ") --~ (if (:limit params) "LIMIT :limit" "LIMIT 100") +-- :name search-strings-events :? :1 +-- :doc selects existing event records having any string field matching the parameter of the same name by substring match +SELECT DISTINCT * FROM lv_events +WHERE false + --~ (if (:name params) "OR name LIKE '%:name%'") + --~ (if (:date params) "OR date = ':date'") + --~ (if (:time params) "OR time = ':time'") + --~ (if (:decription params) "OR decription LIKE '%:decription%'") + --~ (if (:cancelled params) "OR cancelled = :cancelled") + --~ (if (:id params) "OR id = :id") +ORDER BY lv_events.name, + lv_events.date, + lv_events.time, + lv_events.id +--~ (if (:offset params) "OFFSET :offset ") +--~ (if (:limit params) "LIMIT :limit" "LIMIT 100") + -- :name search-strings-followupactions :? :1 -- :doc selects existing followupaction records having any string field matching the parameter of the same name by substring match SELECT DISTINCT * FROM lv_followupactions @@ -904,7 +976,7 @@ WHERE false --~ (if (:elector_id params) "OR elector_id = :elector_id") --~ (if (:option_id params) "OR option_id LIKE '%:option_id%'") --~ (if (:locality params) "OR locality = :locality") - --~ (if (:Id params) "OR Id = :Id") + --~ (if (:id params) "OR id = :id") --~ (if (:offset params) "OFFSET :offset ") --~ (if (:limit params) "LIMIT :limit" "LIMIT 100") @@ -994,6 +1066,8 @@ WHERE authorities.id = :id UPDATE canvassers SET username = :username, fullname = :fullname, + avatar = :avatar, + bio = :bio, elector_id = :elector_id, address_id = :address_id, phone = :phone, @@ -1025,6 +1099,16 @@ SET name = :name, gender = :gender WHERE electors.id = :id +-- :name update-event! :! :n +-- :doc updates an existing event record +UPDATE events +SET name = :name, + date = :date, + time = :time, + decription = :decription, + cancelled = :cancelled +WHERE events.id = :id + -- :name update-followupaction! :! :n -- :doc updates an existing followupaction record UPDATE followupactions @@ -1063,7 +1147,7 @@ SET visit_id = :visit_id, elector_id = :elector_id, option_id = :option_id, locality = :locality -WHERE intentions.Id = :Id +WHERE intentions.id = :id -- :name update-issue! :! :n -- :doc updates an existing issue record diff --git a/resources/sql/test-canvassers.sql b/resources/sql/test-canvassers.sql new file mode 100644 index 0000000..0bfb6b8 --- /dev/null +++ b/resources/sql/test-canvassers.sql @@ -0,0 +1,65 @@ + +insert into canvassers (username, fullname, elector_id, address_id, authority_id) + values ('test_admin', 'Michael Thomson', 14, 4, 'Twitter'); + +insert into canvassers (username, fullname, elector_id, address_id, authority_id) + values ('test_analyst', 'Jack Lang', 13, 4, 'Twitter'); + +insert into canvassers (username, fullname, elector_id, address_id, authority_id) + values ('test_canvasser', 'Catriona Lang', 12, 4, 'Twitter'); + +insert into canvassers (username, fullname, elector_id, address_id, authority_id) + values ('test_editor', 'Ursula Lang', 11, 4, 'Twitter'); + +insert into canvassers (username, fullname, elector_id, address_id, authority_id) + values ('test_expert', 'Charlie Gourlay', 18, 5, 'Twitter'); + +insert into canvassers (username, fullname, elector_id, address_id, authority_id) + values ('test_organiser', 'Jude Morrison', 15, 5, 'Twitter'); + +insert into ln_members_roles_canvassers + values (1, (select id from canvassers where username='test_admin')); +insert into ln_members_roles_canvassers + values (2, (select id from canvassers where username='test_analyst')); +insert into ln_members_roles_canvassers + values (3, (select id from canvassers where username='test_editor')); +insert into ln_members_roles_canvassers + values (4, (select id from canvassers where username='test_organiser')); +insert into ln_members_roles_canvassers + values (5, (select id from canvassers where username='test_expert')); +insert into ln_members_roles_canvassers + values (6, (select id from canvassers where username='test_canvasser')); + +insert into teams (name, district_id, latitude, longitude) +values ('Yes Stewartry', 1, 54.94, -3.94); + +insert into ln_members_teams_canvassers +values ( + (select id from teams where name='Yes Stewartry'), + (select id from canvassers where username='test_admin')); + +insert into ln_members_teams_canvassers +values ( + (select id from teams where name='Yes Stewartry'), + (select id from canvassers where username='test_analyst')); + +insert into ln_members_teams_canvassers +values ( + (select id from teams where name='Yes Stewartry'), + (select id from canvassers where username='test_editor')); + +insert into ln_members_teams_canvassers +values ( + (select id from teams where name='Yes Stewartry'), + (select id from canvassers where username='test_organiser')); + +insert into ln_members_teams_canvassers +values ( + (select id from teams where name='Yes Stewartry'), + (select id from canvassers where username='test_expert')); + +insert into ln_members_teams_canvassers +values ( + (select id from teams where name='Yes Stewartry'), + (select id from canvassers where username='test_canvasser')); + diff --git a/resources/sql/youyesyet.postgres.sql b/resources/sql/youyesyet.postgres.sql index 3cfd37b..3143ff6 100644 --- a/resources/sql/youyesyet.postgres.sql +++ b/resources/sql/youyesyet.postgres.sql @@ -5,23 +5,19 @@ -- -- auto-generated by [Application Description Language framework] -- --- (https://github.com/simon-brooke/adl) at 20180705T101417.868Z +-- (https://github.com/simon-brooke/adl) at 20180707T080949.294Z -- --- --- 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. --- +-- 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. ------------------------------------------------------------------------ ------------------------------------------------------------------------ @@ -69,7 +65,8 @@ CREATE GROUP teamorganisers; ------------------------------------------------------------------------ -- primary table addresses for entity addresses -- --- Addresses of all buildings which contain dwellings. +-- Addresses of all buildings which contain +-- dwellings. ------------------------------------------------------------------------ CREATE TABLE addresses ( @@ -95,7 +92,8 @@ GRANT DELETE ON addresses TO admin ; ------------------------------------------------------------------------ -- primary table authorities for entity authorities -- --- Authorities which may authenticate canvassers to the system. +-- Authorities which may authenticate canvassers to +-- the system. ------------------------------------------------------------------------ CREATE TABLE authorities ( @@ -119,13 +117,16 @@ GRANT DELETE ON authorities TO admin ; ------------------------------------------------------------------------ -- primary table canvassers for entity canvassers -- --- Primary users of the system: those actually interviewing electors. +-- 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, + avatar VARCHAR(), + bio TEXT, elector_id INTEGER, address_id INTEGER NOT NULL, phone VARCHAR(16), @@ -150,8 +151,9 @@ 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. +-- Electoral districts: TODO: Shape (polygon) +-- information will need to be added, for use in +-- maps. ------------------------------------------------------------------------ CREATE TABLE districts ( @@ -172,15 +174,12 @@ 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. Every address --- should have --- at least one dwelling; essentially, an address maps onto a --- street door and --- dwellings map onto what's behind that door. So a tenement or a --- block of flats --- would be one address with many dwellings. --- +-- All dwellings within addresses in the system; a +-- dwelling is a house, flat or appartment in which electors live. +-- Every address should have at least one dwelling; essentially, +-- an address maps onto a street door and dwellings map onto +-- what's behind that door. So a tenement or a block of flats +-- would be one address with many dwellings. ------------------------------------------------------------------------ CREATE TABLE dwellings ( @@ -201,8 +200,9 @@ 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. +-- All electors known to the system; electors are +-- people believed to be entitled to vote in the current +-- campaign. ------------------------------------------------------------------------ CREATE TABLE electors ( @@ -223,10 +223,42 @@ GRANT INSERT ON electors TO admin ; GRANT UPDATE ON electors TO admin ; GRANT DELETE ON electors TO admin ; +------------------------------------------------------------------------ +-- primary table events for entity events +-- +-- +-- An event to which a team or teams are invited. Typically created +-- by the team organiser(s). +-- May be a training event, a social event or a canvassing +-- session. +-- +------------------------------------------------------------------------ +CREATE TABLE events +( + id SERIAL NOT NULL PRIMARY KEY, + name VARCHAR(64) NOT NULL, + date DATE, + time TIME, + decription TEXT, + cancelled BOOLEAN DEFAULT false +); +GRANT SELECT ON events TO admin, + analysts, + canvassers, + issueeditors, + issueexperts, + teamorganisers ; +GRANT INSERT ON events TO admin, + teamorganisers ; +GRANT UPDATE ON events TO admin, + teamorganisers ; +GRANT DELETE ON events TO admin ; + ------------------------------------------------------------------------ -- primary table followupactions for entity followupactions -- --- Actions taken on followup requests. +-- Actions taken on followup +-- requests. ------------------------------------------------------------------------ CREATE TABLE followupactions ( @@ -267,7 +299,8 @@ GRANT DELETE ON followupmethods TO admin ; ------------------------------------------------------------------------ -- primary table followuprequests for entity followuprequests -- --- Requests for a followup with an issue expert +-- Requests for a followup with an issue +-- expert ------------------------------------------------------------------------ CREATE TABLE followuprequests ( @@ -291,7 +324,8 @@ GRANT DELETE ON followuprequests TO admin ; ------------------------------------------------------------------------ -- primary table genders for entity genders -- --- All genders which may be assigned to electors. +-- All genders which may be assigned to +-- electors. ------------------------------------------------------------------------ CREATE TABLE genders ( @@ -310,11 +344,12 @@ GRANT DELETE ON genders TO admin ; ------------------------------------------------------------------------ -- primary table intentions for entity intentions -- --- Intentions of electors to vote for options elicited in visits. +-- Intentions of electors to vote for options +-- elicited in visits. ------------------------------------------------------------------------ CREATE TABLE intentions ( - Id SERIAL NOT NULL PRIMARY KEY, + id SERIAL NOT NULL PRIMARY KEY, visit_id INTEGER NOT NULL, elector_id INTEGER, option_id VARCHAR(32) NOT NULL, @@ -331,8 +366,8 @@ 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. +-- Issues believed to be of interest to electors, +-- about which they may have questions. ------------------------------------------------------------------------ CREATE TABLE issues ( @@ -356,7 +391,8 @@ GRANT DELETE ON issues TO admin ; ------------------------------------------------------------------------ -- primary table options for entity options -- --- Options in the election or referendum being canvassed on +-- Options in the election or referendum being +-- canvassed on ------------------------------------------------------------------------ CREATE TABLE options ( @@ -375,8 +411,9 @@ 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. +-- 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 ( @@ -419,8 +456,8 @@ GRANT DELETE ON teams TO admin ; ------------------------------------------------------------------------ -- primary table visits for entity visits -- --- All visits made by canvassers to dwellings in which opinions were --- recorded. +-- All visits made by canvassers to dwellings in +-- which opinions were recorded. ------------------------------------------------------------------------ CREATE TABLE visits ( @@ -491,6 +528,8 @@ GRANT SELECT ON lv_authorities TO admin, CREATE VIEW lv_canvassers AS SELECT canvassers.username, canvassers.fullname, + canvassers.avatar, + canvassers.bio, electors.name ||', '|| electors.phone ||', '|| electors.email ||', '|| genders.id AS elector_id_expanded, canvassers.elector_id, addresses.address ||', '|| addresses.postcode AS address_id_expanded, @@ -570,6 +609,25 @@ GRANT SELECT ON lv_electors TO admin, issueexperts, teamorganisers ; +------------------------------------------------------------------------ +-- convenience view lv_events of entity events for lists, et cetera +------------------------------------------------------------------------ +CREATE VIEW lv_events AS +SELECT events.name, + events.date, + events.time, + events.decription, + events.cancelled, + events.id +FROM events +; +GRANT SELECT ON lv_events TO admin, + analysts, + canvassers, + issueeditors, + issueexperts, + teamorganisers ; + ------------------------------------------------------------------------ -- convenience view lv_followupactions of entity followupactions for -- lists, et cetera @@ -661,7 +719,7 @@ SELECT addresses.address ||', '|| addresses.postcode ||', '|| visits.date AS vis options.id AS option_id_expanded, intentions.option_id, intentions.locality, - intentions.Id + intentions.id FROM visits, intentions, addresses, genders, electors, options WHERE intentions.visit_id = visits.id AND intentions.elector_id = electors.id @@ -860,64 +918,149 @@ ALTER TABLE visits ADD CONSTRAINT ri_visits_canvassers_canvasser_id ------------------------------------------------------------------------ -- link table joining canvassers with roles ------------------------------------------------------------------------ -CREATE TABLE ln_canvassers_roles +CREATE TABLE ln_roles_canvassers_roles ( canvasser_id INTEGER, role_id INTEGER ); -GRANT SELECT ON ln_canvassers_roles TO admin, +GRANT SELECT ON ln_roles_canvassers_roles TO admin, analysts, canvassers, issueeditors, issueexperts, teamorganisers ; -GRANT INSERT ON ln_canvassers_roles TO admin, +GRANT INSERT ON ln_roles_canvassers_roles TO admin, canvassers, teamorganisers ; -GRANT UPDATE ON ln_canvassers_roles TO admin, +GRANT UPDATE ON ln_roles_canvassers_roles TO admin, canvassers, teamorganisers ; -GRANT DELETE ON ln_canvassers_roles TO admin ; +GRANT DELETE ON ln_roles_canvassers_roles TO admin ; -ALTER TABLE ln_canvassers_roles ADD CONSTRAINT ri_ln_canvassers_roles_canvassers_canvasser_id +ALTER TABLE ln_roles_canvassers_roles ADD CONSTRAINT ri_ln_roles_canvassers_roles_canvassers_canvasser_id FOREIGN KEY( canvasser_id ) REFERENCES canvassers(id) ON DELETE NO ACTION ; -ALTER TABLE ln_canvassers_roles ADD CONSTRAINT ri_ln_canvassers_roles_roles_role_id +ALTER TABLE ln_roles_canvassers_roles ADD CONSTRAINT ri_ln_roles_canvassers_roles_roles_role_id FOREIGN KEY( role_id ) REFERENCES roles(id) ON DELETE NO ACTION ; - - ------------------------------------------------------------------------ --- link table joining teams with canvassers +-- link table joining events with teams ------------------------------------------------------------------------ -CREATE TABLE ln_canvassers_teams +CREATE TABLE ln_teams_events_teams ( - team_id INTEGER, - canvasser_id INTEGER + event_id INTEGER, + team_id INTEGER ); -GRANT SELECT ON ln_canvassers_teams TO admin, +GRANT SELECT ON ln_teams_events_teams TO admin, analysts, canvassers, issueeditors, issueexperts, teamorganisers ; -GRANT INSERT ON ln_canvassers_teams TO admin, +GRANT INSERT ON ln_teams_events_teams TO admin, teamorganisers ; -GRANT UPDATE ON ln_canvassers_teams TO admin, +GRANT UPDATE ON ln_teams_events_teams TO admin, teamorganisers ; -GRANT DELETE ON ln_canvassers_teams TO admin ; +GRANT DELETE ON ln_teams_events_teams TO admin ; -ALTER TABLE ln_canvassers_teams ADD CONSTRAINT ri_ln_canvassers_teams_canvassers_canvasser_id - FOREIGN KEY( canvasser_id ) - REFERENCES canvassers(id) +ALTER TABLE ln_teams_events_teams ADD CONSTRAINT ri_ln_teams_events_teams_events_event_id + FOREIGN KEY( event_id ) + REFERENCES events(id) ON DELETE NO ACTION ; -ALTER TABLE ln_canvassers_teams ADD CONSTRAINT ri_ln_canvassers_teams_teams_team_id +ALTER TABLE ln_teams_events_teams ADD CONSTRAINT ri_ln_teams_events_teams_teams_team_id FOREIGN KEY( team_id ) REFERENCES teams(id) ON DELETE NO ACTION ; +------------------------------------------------------------------------ +-- link table joining roles with canvassers +------------------------------------------------------------------------ +CREATE TABLE ln_members_roles_canvassers +( + role_id INTEGER, + canvasser_id INTEGER +); +GRANT SELECT ON ln_members_roles_canvassers TO admin, + analysts, + canvassers, + issueeditors, + issueexperts, + teamorganisers ; +GRANT INSERT ON ln_members_roles_canvassers TO admin ; +GRANT UPDATE ON ln_members_roles_canvassers TO admin ; +GRANT DELETE ON ln_members_roles_canvassers TO admin ; + +ALTER TABLE ln_members_roles_canvassers ADD CONSTRAINT ri_ln_members_roles_canvassers_canvassers_canvasser_id + FOREIGN KEY( canvasser_id ) + REFERENCES canvassers(id) + ON DELETE NO ACTION ; + +ALTER TABLE ln_members_roles_canvassers ADD CONSTRAINT ri_ln_members_roles_canvassers_roles_role_id + FOREIGN KEY( role_id ) + REFERENCES roles(id) + ON DELETE NO ACTION ; + +------------------------------------------------------------------------ +-- link table joining teams with canvassers +------------------------------------------------------------------------ +CREATE TABLE ln_members_teams_canvassers +( + team_id INTEGER, + canvasser_id INTEGER +); +GRANT SELECT ON ln_members_teams_canvassers TO admin, + analysts, + canvassers, + issueeditors, + issueexperts, + teamorganisers ; +GRANT INSERT ON ln_members_teams_canvassers TO admin, + teamorganisers ; +GRANT UPDATE ON ln_members_teams_canvassers TO admin, + teamorganisers ; +GRANT DELETE ON ln_members_teams_canvassers TO admin ; + +ALTER TABLE ln_members_teams_canvassers ADD CONSTRAINT ri_ln_members_teams_canvassers_canvassers_canvasser_id + FOREIGN KEY( canvasser_id ) + REFERENCES canvassers(id) + ON DELETE NO ACTION ; + +ALTER TABLE ln_members_teams_canvassers ADD CONSTRAINT ri_ln_members_teams_canvassers_teams_team_id + FOREIGN KEY( team_id ) + REFERENCES teams(id) + ON DELETE NO ACTION ; + +------------------------------------------------------------------------ +-- link table joining teams with canvassers +------------------------------------------------------------------------ +CREATE TABLE ln_organisers_teams_canvassers +( + team_id INTEGER, + canvasser_id INTEGER +); +GRANT SELECT ON ln_organisers_teams_canvassers TO admin, + analysts, + canvassers, + issueeditors, + issueexperts, + teamorganisers ; +GRANT INSERT ON ln_organisers_teams_canvassers TO admin, + teamorganisers ; +GRANT UPDATE ON ln_organisers_teams_canvassers TO admin, + teamorganisers ; +GRANT DELETE ON ln_organisers_teams_canvassers TO admin ; + +ALTER TABLE ln_organisers_teams_canvassers ADD CONSTRAINT ri_ln_organisers_teams_canvassers_canvassers_canvasser_id + FOREIGN KEY( canvasser_id ) + REFERENCES canvassers(id) + ON DELETE NO ACTION ; + +ALTER TABLE ln_organisers_teams_canvassers ADD CONSTRAINT ri_ln_organisers_teams_canvassers_teams_team_id + FOREIGN KEY( team_id ) + REFERENCES teams(id) + ON DELETE NO ACTION ; \ No newline at end of file diff --git a/resources/templates/about.html b/resources/templates/about.html index 97ccd2d..0812752 100644 --- a/resources/templates/about.html +++ b/resources/templates/about.html @@ -2,12 +2,6 @@ {% block big-links %} {% endblock %} {% block content %} -

- Alpha test code -

-

- Although addresses in the database mostly are real, all personal data in the database - is randomly generated and does not represent real people. -

+{{motd|safe}} {% endblock %} diff --git a/resources/templates/auto/application-index.html b/resources/templates/auto/application-index.html index d821ad8..2c5e2ca 100644 --- a/resources/templates/auto/application-index.html +++ b/resources/templates/auto/application-index.html @@ -1,5 +1,5 @@ {% extends "base.html" %} - @@ -15,7 +15,8 @@ Address {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}

-Addresses of all buildings which contain dwellings. +Addresses of all buildings which contain + dwellings.

{% endifmemberof %} @@ -29,7 +30,8 @@ Authority {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}

-Authorities which may authenticate canvassers to the system. +Authorities which may authenticate canvassers to + the system.

{% endifmemberof %} @@ -43,7 +45,8 @@ Canvasser {% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}

-Primary users of the system: those actually interviewing electors. +Primary users of the system: those actually + interviewing electors.

{% endifmemberof %} @@ -57,7 +60,9 @@ District {% ifmemberof public admin canvassers teamorganisers issueexperts analysts issueeditors %}

-Electoral districts: TODO: Shape (polygon) information will need to be added, for use in maps. +Electoral districts: TODO: Shape (polygon) + information will need to be added, for use in + maps.

{% endifmemberof %} @@ -71,12 +76,12 @@ Dwelling {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}

-All dwellings within addresses in the system; a dwelling is a - house, flat or appartment in which electors live. Every address should have - at least one dwelling; essentially, an address maps onto a street door and - dwellings map onto what's behind that door. So a tenement or a block of flats - would be one address with many dwellings. - +All dwellings within addresses in the system; a + dwelling is a house, flat or appartment in which electors live. + Every address should have at least one dwelling; essentially, + an address maps onto a street door and dwellings map onto + what's behind that door. So a tenement or a block of flats + would be one address with many dwellings.

{% endifmemberof %} @@ -90,7 +95,26 @@ Elector {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}

-All electors known to the system; electors are people believed to be entitled to vote in the current campaign. +All electors known to the system; electors are + people believed to be entitled to vote in the current + campaign. +

+
+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} +
+ +Event + +
+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} +
+

+ + An event to which a team or teams are invited. Typically created by the team organiser(s). + May be a training event, a social event or a canvassing session. +

{% endifmemberof %} @@ -104,7 +128,8 @@ Followupaction {% ifmemberof issueexperts canvassers analysts issueeditors admin %}

-Actions taken on followup requests. +Actions taken on followup + requests.

{% endifmemberof %} @@ -129,7 +154,8 @@ Followuprequest {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}

-Requests for a followup with an issue expert +Requests for a followup with an issue + expert

{% endifmemberof %} @@ -143,7 +169,8 @@ Gender {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}

-All genders which may be assigned to electors. +All genders which may be assigned to + electors.

{% endifmemberof %} @@ -157,7 +184,8 @@ Intention {% ifmemberof canvassers analysts admin %}

-Intentions of electors to vote for options elicited in visits. +Intentions of electors to vote for options + elicited in visits.

{% endifmemberof %} @@ -171,7 +199,8 @@ Issue {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}

-Issues believed to be of interest to electors, about which they may have questions. +Issues believed to be of interest to electors, + about which they may have questions.

{% endifmemberof %} @@ -185,7 +214,8 @@ Option {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}

-Options in the election or referendum being canvassed on +Options in the election or referendum being + canvassed on

{% endifmemberof %} @@ -199,7 +229,9 @@ Role {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}

-A role (essentially, the same as a group, but application layer rather than database layer) of which a user may be a member. +A role (essentially, the same as a group, but + application layer rather than database layer) of which a user + may be a member.

{% endifmemberof %} @@ -224,7 +256,8 @@ Visit {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers %}

-All visits made by canvassers to dwellings in which opinions were recorded. +All visits made by canvassers to dwellings in + which opinions were recorded.

{% endifmemberof %} diff --git a/resources/templates/auto/form-addresses-Address.html b/resources/templates/auto/form-addresses-Address.html index a9ce785..7a5b0f6 100644 --- a/resources/templates/auto/form-addresses-Address.html +++ b/resources/templates/auto/form-addresses-Address.html @@ -1,5 +1,5 @@ {% extends "base.html" %} - @@ -12,7 +12,7 @@ See [Application Description Language](https://github.com/simon-brooke/adl).--> {% csrf-field %}

{% ifmemberof admin %} @@ -30,7 +30,7 @@ You are not permitted to view id of addresses

{% ifmemberof admin %} @@ -48,7 +48,7 @@ You are not permitted to view address of addresses

{% ifmemberof admin %} @@ -66,7 +66,7 @@ You are not permitted to view postcode of addresses

{% ifmemberof admin %} @@ -84,7 +84,7 @@ You are not permitted to view phone of addresses

{% ifmemberof admin %} @@ -108,7 +108,7 @@ You are not permitted to view district_id of addresses

{% ifmemberof admin %} @@ -126,7 +126,7 @@ You are not permitted to view latitude of addresses

{% ifmemberof admin %} diff --git a/resources/templates/auto/form-authorities-Authority.html b/resources/templates/auto/form-authorities-Authority.html index 3dfce8f..23f5b30 100644 --- a/resources/templates/auto/form-authorities-Authority.html +++ b/resources/templates/auto/form-authorities-Authority.html @@ -1,5 +1,5 @@ {% extends "base.html" %} - @@ -12,7 +12,7 @@ See [Application Description Language](https://github.com/simon-brooke/adl).--> {% csrf-field %}

{% ifmemberof admin %} @@ -30,7 +30,7 @@ You are not permitted to view id of authorities

{% ifmemberof admin %} @@ -48,7 +48,7 @@ You are not permitted to view request_token_uri of authorities

{% ifmemberof admin %} @@ -66,7 +66,7 @@ You are not permitted to view access_token_uri of authorities

{% ifmemberof admin %} @@ -84,7 +84,7 @@ You are not permitted to view authorize_uri of authorities

{% ifmemberof admin %} @@ -102,7 +102,7 @@ You are not permitted to view consumer_key of authorities

{% ifmemberof admin %} diff --git a/resources/templates/auto/form-canvassers-Canvasser.html b/resources/templates/auto/form-canvassers-Canvasser.html index e2f68e9..f439443 100644 --- a/resources/templates/auto/form-canvassers-Canvasser.html +++ b/resources/templates/auto/form-canvassers-Canvasser.html @@ -1,10 +1,11 @@ {% extends "base.html" %} - {% block extra-head %} - +{% script "js/lib/node_modules/simplemde/dist/simplemde.min.js" %} + {% style "js/lib/node_modules/simplemde/dist/simplemde.min.css" %} {% endblock %} {% block content %}

@@ -12,7 +13,7 @@ See [Application Description Language](https://github.com/simon-brooke/adl).--> {% csrf-field %}

{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} @@ -30,7 +31,7 @@ You are not permitted to view id of canvassers

{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} @@ -48,7 +49,7 @@ You are not permitted to view username of canvassers

{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} @@ -66,7 +67,7 @@ You are not permitted to view fullname of canvassers

{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} @@ -90,7 +91,7 @@ You are not permitted to view elector_id of canvassers

{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} @@ -114,7 +115,7 @@ You are not permitted to view address_id of canvassers

{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} @@ -132,7 +133,7 @@ You are not permitted to view phone of canvassers

{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} @@ -150,7 +151,7 @@ You are not permitted to view email of canvassers

{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} @@ -174,7 +175,7 @@ You are not permitted to view authority_id of canvassers

{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} @@ -192,7 +193,7 @@ You are not permitted to view authorised of canvassers

{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} @@ -249,6 +250,24 @@ To delete this canvassers record }); } + var simplemde = new SimpleMDE({ + autosave: { + enabled: true, + uniqueId: "Smeagol-{{page}}", + delay: 1000, + }, + indentWithTabs: true, + insertTexts: { + horizontalRule: ["", "\n\n-----\n\n"], + image: ["![](http://", ")"], + link: ["[", "](http://)"], + table: ["", "\n\n| Column 1 | Column 2 | Column 3 |\n| -------- | -------- | -------- |\n| Text | Text | Text |\n\n"], + }, + showIcons: ["code"], //, "table"], - sadly, markdown-clj does not support tables + spellChecker: true, + status: ["autosave", "lines", "words", "cursor"] + }); + {% endblock %} diff --git a/resources/templates/auto/form-districts-District.html b/resources/templates/auto/form-districts-District.html index 3ad3790..ba48163 100644 --- a/resources/templates/auto/form-districts-District.html +++ b/resources/templates/auto/form-districts-District.html @@ -1,5 +1,5 @@ {% extends "base.html" %} - @@ -12,7 +12,7 @@ See [Application Description Language](https://github.com/simon-brooke/adl).--> {% csrf-field %}

{% ifmemberof admin %} @@ -30,7 +30,7 @@ You are not permitted to view id of districts

{% ifmemberof admin %} diff --git a/resources/templates/auto/form-dwellings-Dwelling.html b/resources/templates/auto/form-dwellings-Dwelling.html index c254954..68b7d2d 100644 --- a/resources/templates/auto/form-dwellings-Dwelling.html +++ b/resources/templates/auto/form-dwellings-Dwelling.html @@ -1,5 +1,5 @@ {% extends "base.html" %} - @@ -12,7 +12,7 @@ See [Application Description Language](https://github.com/simon-brooke/adl).--> {% csrf-field %}

{% ifmemberof admin %} @@ -30,7 +30,7 @@ You are not permitted to view id of dwellings

{% ifmemberof admin %} @@ -54,7 +54,7 @@ You are not permitted to view address_id of dwellings

{% ifmemberof admin %} diff --git a/resources/templates/auto/form-electors-Elector.html b/resources/templates/auto/form-electors-Elector.html index 0814a6c..bcf433d 100644 --- a/resources/templates/auto/form-electors-Elector.html +++ b/resources/templates/auto/form-electors-Elector.html @@ -1,5 +1,5 @@ {% extends "base.html" %} - @@ -12,7 +12,7 @@ See [Application Description Language](https://github.com/simon-brooke/adl).--> {% csrf-field %}

{% ifmemberof admin %} @@ -30,7 +30,7 @@ You are not permitted to view id of electors

{% ifmemberof admin %} @@ -48,7 +48,7 @@ You are not permitted to view name of electors

{% ifmemberof admin %} @@ -72,7 +72,7 @@ You are not permitted to view dwelling_id of electors

{% ifmemberof admin %} @@ -90,7 +90,7 @@ You are not permitted to view phone of electors

{% ifmemberof admin %} @@ -108,7 +108,7 @@ You are not permitted to view email of electors

{% ifmemberof admin %} diff --git a/resources/templates/auto/form-events-Events.html b/resources/templates/auto/form-events-Events.html new file mode 100644 index 0000000..d4162a8 --- /dev/null +++ b/resources/templates/auto/form-events-Events.html @@ -0,0 +1,205 @@ +{% extends "base.html" %} + + + +{% block extra-head %} +{% script "js/lib/node_modules/simplemde/dist/simplemde.min.js" %} + {% style "js/lib/node_modules/simplemde/dist/simplemde.min.css" %} +{% endblock %} +{% block content %} +

+
+{% csrf-field %} +

+ +{% ifmemberof teamorganisers admin %} + +{% else %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} + +{{record.id}} + +{% else %} + +You are not permitted to view id of events + +{% endifmemberof %} +{% endifmemberof %} +

+

+ +{% ifmemberof teamorganisers admin %} + +{% else %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} + +{{record.name}} + +{% else %} + +You are not permitted to view name of events + +{% endifmemberof %} +{% endifmemberof %} +

+

+ +{% ifmemberof teamorganisers admin %} + + +
+ +
+{% else %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} + +{{record.teams}} + +{% else %} + +You are not permitted to view teams of events + +{% endifmemberof %} +{% endifmemberof %} +

+

+ +{% ifmemberof teamorganisers admin %} + +{% else %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} + +{{record.date}} + +{% else %} + +You are not permitted to view date of events + +{% endifmemberof %} +{% endifmemberof %} +

+

+ +{% ifmemberof teamorganisers admin %} + +{% else %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} + +{{record.time}} + +{% else %} + +You are not permitted to view time of events + +{% endifmemberof %} +{% endifmemberof %} +

+

+ +{% ifmemberof teamorganisers admin %} + +{% else %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} + +{{record.decription}} + +{% else %} + +You are not permitted to view decription of events + +{% endifmemberof %} +{% endifmemberof %} +

+

+ +{% ifmemberof teamorganisers admin %} + +{% else %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} + +{{record.cancelled}} + +{% else %} + +You are not permitted to view cancelled of events + +{% endifmemberof %} +{% endifmemberof %} +

+{% ifmemberof teamorganisers admin %} +

+ + +

+{% endifmemberof %} +{% ifmemberof teamorganisers admin %} +

+ + +

+{% endifmemberof %} +
+
+ +{% endblock %} +{% block extra-tail %} + + +{% endblock %} diff --git a/resources/templates/auto/form-followupactions-Followupaction.html b/resources/templates/auto/form-followupactions-Followupaction.html index 005a321..c118a99 100644 --- a/resources/templates/auto/form-followupactions-Followupaction.html +++ b/resources/templates/auto/form-followupactions-Followupaction.html @@ -1,5 +1,5 @@ {% extends "base.html" %} - @@ -13,7 +13,7 @@ See [Application Description Language](https://github.com/simon-brooke/adl).--> {% csrf-field %}

{% ifmemberof admin %} @@ -31,7 +31,7 @@ You are not permitted to view id of followupactions

{% ifmemberof admin %} @@ -55,7 +55,7 @@ You are not permitted to view request_id of followupactions

{% ifmemberof admin %} @@ -79,7 +79,7 @@ You are not permitted to view actor of followupactions

{% ifmemberof admin %} @@ -97,7 +97,7 @@ You are not permitted to view date of followupactions

{% ifmemberof admin %}