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.
-
-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.
-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.
-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.
+
+
+ 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.
+
-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.
-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.
-All visits made by canvassers to dwellings in which opinions were recorded.
+All visits made by canvassers to dwellings in
+ which opinions were recorded.
{% 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