#17: progress, not complete.

This commit is contained in:
Simon Brooke 2018-07-09 22:00:39 +01:00
parent 0026218993
commit 9c3af4c936
58 changed files with 1896 additions and 463 deletions

View file

@ -33,7 +33,7 @@
[org.webjars/bootstrap "4.0.0-alpha.6-1"]
[org.webjars/font-awesome "4.7.0"]
[org.webjars.bower/tether "1.4.0"]
[re-frame "0.9.2"]
[re-frame "0.10.5"]
[reagent "0.6.1"]
[reagent-utils "0.2.1"]
[ring-middleware-format "0.7.2"]
@ -136,10 +136,10 @@
[com.cemerick/piggieback "0.2.2-SNAPSHOT"]
[directory-naming/naming-java "0.8"]
[doo "0.1.7"]
[figwheel-sidecar "0.5.9"]]
[figwheel-sidecar "0.5.15"]]
:plugins [[com.jakemccrary/lein-test-refresh "0.18.1"]
[lein-doo "0.1.7"]
[lein-figwheel "0.5.9"]
[lein-figwheel "0.5.15"]
[org.clojure/clojurescript "1.9.495"]]
:cljsbuild
{:builds

View file

@ -1,7 +1,7 @@
------------------------------------------------------------------------
-- File queries.sql
--
-- autogenerated by adl.to-hugsql-queries at 2018-07-07T08:09:48.253Z
-- autogenerated by adl.to-hugsql-queries at 2018-07-09T20:55:32.719Z
--
-- See [Application Description
-- Language](https://github.com/simon-brooke/adl).
@ -504,6 +504,19 @@ ORDER BY lv_canvassers.username,
lv_canvassers.email,
lv_canvassers.id
-- :name list-canvassers-by-issue :? :*
-- :doc links all existing canvasser records related to a given issue
SELECT *
FROM canvassers, ln_expertise_canvassers_issues
WHERE canvassers.id = ln_expertise_canvassers_issues.canvasser_id
AND ln_expertise_canvassers_issues.issue_id = :id
ORDER BY canvassers.username,
canvassers.fullname,
canvassers.address_id,
canvassers.phone,
canvassers.email,
canvassers.id
-- :name list-canvassers-by-role :? :*
-- :doc links all existing canvasser records related to a given role
SELECT *
@ -728,6 +741,13 @@ SELECT DISTINCT * FROM lv_issues
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
-- :name list-issues-by-canvasser :? :*
-- :doc links all existing issue records related to a given canvasser
SELECT *
FROM issues, ln_experts_issues_canvassers
WHERE issues.id = ln_experts_issues_canvassers.issue_id
AND ln_experts_issues_canvassers.canvasser_id = :id
-- :name list-options :? :*
-- :doc lists all existing option records
SELECT DISTINCT * FROM lv_options

View file

@ -36,4 +36,27 @@ FROM addresses
WHERE locality = :locality
-- :name list-open-requests :? :*
-- :doc lists all existing followuprequest records which have not been closed and which the :expert has expertise to answer.
SELECT DISTINCT request.*,
electors.name ||', '|| electors.gender AS elector_id_expanded,
addresses.address ||', '|| addresses.postcode ||', '|| visits.date AS visit_id_expanded,
request.issue_id as issue_id_expanded,
request.method_id AS method_id_expanded,
visits.date
FROM followuprequests as request,
ln_experts_issues_canvassers as expertise,
canvassers as experts,
electors,
addresses,
visits
where not exists (select * from followupactions as action
where action.request_id = request.id
and action.closed = true)
and request.elector_id = electors.id
and request.visit_id = visits.id
and visits.address_id = addresses.id
and request.issue_id = expertise.issue_id
and expertise.canvasser_id = :expert
ORDER BY visits.date desc

View file

@ -5,7 +5,7 @@
--
-- auto-generated by [Application Description Language framework]
--
-- (https://github.com/simon-brooke/adl) at 20180707T080949.294Z
-- (https://github.com/simon-brooke/adl) at 20180709T205533.789Z
--
-- A web-app intended to be used by canvassers
-- campaigning for a 'Yes' vote in the second independence
@ -915,6 +915,38 @@ ALTER TABLE visits ADD CONSTRAINT ri_visits_canvassers_canvasser_id
REFERENCES canvassers(id)
ON DELETE NO ACTION ;
------------------------------------------------------------------------
-- link table joining canvassers with issues
------------------------------------------------------------------------
CREATE TABLE ln_expertise_canvassers_issues
(
canvasser_id INTEGER,
issue_id VARCHAR(32)
);
GRANT SELECT ON ln_expertise_canvassers_issues TO admin,
analysts,
canvassers,
issueeditors,
issueexperts,
teamorganisers ;
GRANT INSERT ON ln_expertise_canvassers_issues TO admin,
canvassers,
teamorganisers ;
GRANT UPDATE ON ln_expertise_canvassers_issues TO admin,
canvassers,
teamorganisers ;
GRANT DELETE ON ln_expertise_canvassers_issues TO admin ;
ALTER TABLE ln_expertise_canvassers_issues ADD CONSTRAINT ri_ln_expertise_canvassers_issues_canvassers_canvasser_id
FOREIGN KEY( canvasser_id )
REFERENCES canvassers(id)
ON DELETE NO ACTION ;
ALTER TABLE ln_expertise_canvassers_issues ADD CONSTRAINT ri_ln_expertise_canvassers_issues_issues_issue_id
FOREIGN KEY( issue_id )
REFERENCES issues(id)
ON DELETE NO ACTION ;
------------------------------------------------------------------------
-- link table joining canvassers with roles
------------------------------------------------------------------------
@ -977,6 +1009,36 @@ ALTER TABLE ln_teams_events_teams ADD CONSTRAINT ri_ln_teams_events_teams_teams_
REFERENCES teams(id)
ON DELETE NO ACTION ;
------------------------------------------------------------------------
-- link table joining issues with canvassers
------------------------------------------------------------------------
CREATE TABLE ln_experts_issues_canvassers
(
issue_id VARCHAR(32),
canvasser_id INTEGER
);
GRANT SELECT ON ln_experts_issues_canvassers TO admin,
analysts,
canvassers,
issueeditors,
issueexperts,
teamorganisers ;
GRANT INSERT ON ln_experts_issues_canvassers TO admin,
issueeditors ;
GRANT UPDATE ON ln_experts_issues_canvassers TO admin,
issueeditors ;
GRANT DELETE ON ln_experts_issues_canvassers TO admin ;
ALTER TABLE ln_experts_issues_canvassers ADD CONSTRAINT ri_ln_experts_issues_canvassers_canvassers_canvasser_id
FOREIGN KEY( canvasser_id )
REFERENCES canvassers(id)
ON DELETE NO ACTION ;
ALTER TABLE ln_experts_issues_canvassers ADD CONSTRAINT ri_ln_experts_issues_canvassers_issues_issue_id
FOREIGN KEY( issue_id )
REFERENCES issues(id)
ON DELETE NO ACTION ;
------------------------------------------------------------------------
-- link table joining roles with canvassers
------------------------------------------------------------------------

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File application-index.html generated 2018-07-07T08:09:49.942Z by adl.to-selmer-templates.
<!-- File application-index.html generated 2018-07-09T20:55:34.526Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -7,7 +7,7 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
<dl class='index'>
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<dt>
<a href='list-addresses-Addresses'>
<a href='{{servlet-context}}/list-addresses-Addresses'>
Address
</a>
</dt>
@ -22,7 +22,7 @@ Addresses of all buildings which contain
{% endifmemberof %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<dt>
<a href='list-authorities-Authorities'>
<a href='{{servlet-context}}/list-authorities-Authorities'>
Authority
</a>
</dt>
@ -37,7 +37,7 @@ Authorities which may authenticate canvassers to
{% endifmemberof %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
<dt>
<a href='list-canvassers-Canvassers'>
<a href='{{servlet-context}}/list-canvassers-Canvassers'>
Canvasser
</a>
</dt>
@ -52,7 +52,7 @@ Primary users of the system: those actually
{% endifmemberof %}
{% ifmemberof public admin canvassers teamorganisers issueexperts analysts issueeditors %}
<dt>
<a href='list-districts-Districts'>
<a href='{{servlet-context}}/list-districts-Districts'>
District
</a>
</dt>
@ -68,7 +68,7 @@ Electoral districts: TODO: Shape (polygon)
{% endifmemberof %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<dt>
<a href='list-dwellings-Dwellings'>
<a href='{{servlet-context}}/list-dwellings-Dwellings'>
Dwelling
</a>
</dt>
@ -87,7 +87,7 @@ All dwellings within addresses in the system; a
{% endifmemberof %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<dt>
<a href='list-electors-Electors'>
<a href='{{servlet-context}}/list-electors-Electors'>
Elector
</a>
</dt>
@ -103,7 +103,7 @@ All electors known to the system; electors are
{% endifmemberof %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<dt>
<a href='list-events-Events'>
<a href='{{servlet-context}}/list-events-Events'>
Event
</a>
</dt>
@ -120,7 +120,7 @@ Event
{% endifmemberof %}
{% ifmemberof issueexperts canvassers analysts issueeditors admin %}
<dt>
<a href='list-followupactions-Followupactions'>
<a href='{{servlet-context}}/list-followupactions-Followupactions'>
Followupaction
</a>
</dt>
@ -135,7 +135,7 @@ Actions taken on followup
{% endifmemberof %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<dt>
<a href='list-followupmethods-Followupmethods'>
<a href='{{servlet-context}}/list-followupmethods-Followupmethods'>
Followupmethod
</a>
</dt>
@ -146,7 +146,7 @@ Followupmethod
{% endifmemberof %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<dt>
<a href='list-followuprequests-Followuprequests'>
<a href='{{servlet-context}}/list-followuprequests-Followuprequests'>
Followuprequest
</a>
</dt>
@ -161,7 +161,7 @@ Requests for a followup with an issue
{% endifmemberof %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<dt>
<a href='list-genders-Genders'>
<a href='{{servlet-context}}/list-genders-Genders'>
Gender
</a>
</dt>
@ -176,7 +176,7 @@ All genders which may be assigned to
{% endifmemberof %}
{% ifmemberof canvassers analysts admin %}
<dt>
<a href='list-intentions-Intentions'>
<a href='{{servlet-context}}/list-intentions-Intentions'>
Intention
</a>
</dt>
@ -191,7 +191,7 @@ Intentions of electors to vote for options
{% endifmemberof %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<dt>
<a href='list-issues-Issues'>
<a href='{{servlet-context}}/list-issues-Issues'>
Issue
</a>
</dt>
@ -206,7 +206,7 @@ Issues believed to be of interest to electors,
{% endifmemberof %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<dt>
<a href='list-options-Options'>
<a href='{{servlet-context}}/list-options-Options'>
Option
</a>
</dt>
@ -221,7 +221,7 @@ Options in the election or referendum being
{% endifmemberof %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<dt>
<a href='list-roles-Roles'>
<a href='{{servlet-context}}/list-roles-Roles'>
Role
</a>
</dt>
@ -237,7 +237,7 @@ A role (essentially, the same as a group, but
{% endifmemberof %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin teamorganisers admin %}
<dt>
<a href='list-teams-Teams'>
<a href='{{servlet-context}}/list-teams-Teams'>
Team
</a>
</dt>
@ -248,7 +248,7 @@ Team
{% endifmemberof %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers %}
<dt>
<a href='list-visits-Visits'>
<a href='{{servlet-context}}/list-visits-Visits'>
Visit
</a>
</dt>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File form-addresses-Address.html generated 2018-07-07T08:09:49.931Z by adl.to-selmer-templates.
<!-- File form-addresses-Address.html generated 2018-07-09T20:55:34.515Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -10,28 +10,12 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
<div id='content' class='edit'>
<form action='{{servlet-context}}/form-addresses-Address' method='POST'>
{% csrf-field %}
<p class='widget'>
<label for='id'>
Id
</label>
{% ifmemberof admin %}
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='id' name='id' class='pseudo-widget disabled'>
{{record.id}}
</span>
{% else %}
<span id='id' name='id' class='pseudo-widget not-authorised'>
You are not permitted to view id of addresses
</span>
{% endifmemberof %}
{% endifmemberof %}
</p>
<input id='id' name='id' type='hidden' value='{{record.id}}'/>
<p class='widget'>
<label for='address'>
Address
</label>
{% if {{record.address}} %}
{% ifmemberof admin %}
<input id='address' name='address' type='string' value='{{record.address}}' maxlength='256' size='60'/>
{% else %}
@ -45,11 +29,27 @@ You are not permitted to view address of addresses
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='address' name='address' type='string' value='{{record.address}}' maxlength='256' size='60'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='address' name='address' class='pseudo-widget disabled'>
{{record.address}}
</span>
{% else %}
<span id='address' name='address' class='pseudo-widget not-authorised'>
You are not permitted to view address of addresses
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='postcode'>
Postcode
</label>
{% if {{record.postcode}} %}
{% ifmemberof admin %}
<input id='postcode' name='postcode' type='string' value='{{record.postcode}}' maxlength='16' size='16'/>
{% else %}
@ -63,11 +63,27 @@ You are not permitted to view postcode of addresses
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='postcode' name='postcode' type='string' value='{{record.postcode}}' maxlength='16' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='postcode' name='postcode' class='pseudo-widget disabled'>
{{record.postcode}}
</span>
{% else %}
<span id='postcode' name='postcode' class='pseudo-widget not-authorised'>
You are not permitted to view postcode of addresses
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='phone'>
Phone
</label>
{% if {{record.phone}} %}
{% ifmemberof admin %}
<input id='phone' name='phone' type='string' value='{{record.phone}}' maxlength='16' size='16'/>
{% else %}
@ -81,11 +97,27 @@ You are not permitted to view phone of addresses
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='phone' name='phone' type='string' value='{{record.phone}}' maxlength='16' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='phone' name='phone' class='pseudo-widget disabled'>
{{record.phone}}
</span>
{% else %}
<span id='phone' name='phone' class='pseudo-widget not-authorised'>
You are not permitted to view phone of addresses
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='district_id'>
District_id
</label>
{% if {{record.district_id}} %}
{% ifmemberof admin %}
<span class='select-box' farside='districts' found='true'>
<input name='district_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-districts?name=" + district_id_search_box.text, null, function (data) {updateMenuOptions("district_id", "id", ["name"], data);})'/>
@ -105,11 +137,33 @@ You are not permitted to view district_id of addresses
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<span class='select-box' farside='districts' found='true'>
<input name='district_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-districts?name=" + district_id_search_box.text, null, function (data) {updateMenuOptions("district_id", "id", ["name"], data);})'/>
<br/>
<select id='district_id' name='district_id'>
{% for r in districts %}<option value='{{r.id}}' {% ifequal record.district_id r.id%}selected{% endifequal %}>{{r.name}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='district_id' name='district_id' class='pseudo-widget disabled'>
{{record.district_id}}
</span>
{% else %}
<span id='district_id' name='district_id' class='pseudo-widget not-authorised'>
You are not permitted to view district_id of addresses
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='latitude'>
Latitude
</label>
{% if {{record.latitude}} %}
{% ifmemberof admin %}
<input id='latitude' name='latitude' type='number' value='{{record.latitude}}' maxlength='' size='16'/>
{% else %}
@ -123,11 +177,27 @@ You are not permitted to view latitude of addresses
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='latitude' name='latitude' type='number' value='{{record.latitude}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='latitude' name='latitude' class='pseudo-widget disabled'>
{{record.latitude}}
</span>
{% else %}
<span id='latitude' name='latitude' class='pseudo-widget not-authorised'>
You are not permitted to view latitude of addresses
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='longitude'>
Longitude
</label>
{% if {{record.longitude}} %}
{% ifmemberof admin %}
<input id='longitude' name='longitude' type='number' value='{{record.longitude}}' maxlength='' size='16'/>
{% else %}
@ -141,6 +211,21 @@ You are not permitted to view longitude of addresses
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='longitude' name='longitude' type='number' value='{{record.longitude}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='longitude' name='longitude' class='pseudo-widget disabled'>
{{record.longitude}}
</span>
{% else %}
<span id='longitude' name='longitude' class='pseudo-widget not-authorised'>
You are not permitted to view longitude of addresses
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
{% ifmemberof admin %}
<p class='widget action-safe'>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File form-authorities-Authority.html generated 2018-07-07T08:09:49.951Z by adl.to-selmer-templates.
<!-- File form-authorities-Authority.html generated 2018-07-09T20:55:34.531Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -14,8 +14,9 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
<label for='id'>
Id
</label>
{% if {{record.id}} %}
{% ifmemberof admin %}
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='' size='16'/>
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='32' size='32'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='id' name='id' class='pseudo-widget disabled'>
@ -27,11 +28,27 @@ You are not permitted to view id of authorities
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='32' size='32'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='id' name='id' class='pseudo-widget disabled'>
{{record.id}}
</span>
{% else %}
<span id='id' name='id' class='pseudo-widget not-authorised'>
You are not permitted to view id of authorities
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='request_token_uri'>
Request-token-uri
</label>
{% if {{record.request-token-uri}} %}
{% ifmemberof admin %}
<input id='request_token_uri' name='request_token_uri' type='string' value='{{record.request_token_uri}}' maxlength='256' size='60'/>
{% else %}
@ -45,11 +62,27 @@ You are not permitted to view request_token_uri of authorities
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='request_token_uri' name='request_token_uri' type='string' value='{{record.request_token_uri}}' maxlength='256' size='60'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='request_token_uri' name='request_token_uri' class='pseudo-widget disabled'>
{{record.request_token_uri}}
</span>
{% else %}
<span id='request_token_uri' name='request_token_uri' class='pseudo-widget not-authorised'>
You are not permitted to view request_token_uri of authorities
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='access_token_uri'>
Access-token-uri
</label>
{% if {{record.access-token-uri}} %}
{% ifmemberof admin %}
<input id='access_token_uri' name='access_token_uri' type='string' value='{{record.access_token_uri}}' maxlength='256' size='60'/>
{% else %}
@ -63,11 +96,27 @@ You are not permitted to view access_token_uri of authorities
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='access_token_uri' name='access_token_uri' type='string' value='{{record.access_token_uri}}' maxlength='256' size='60'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='access_token_uri' name='access_token_uri' class='pseudo-widget disabled'>
{{record.access_token_uri}}
</span>
{% else %}
<span id='access_token_uri' name='access_token_uri' class='pseudo-widget not-authorised'>
You are not permitted to view access_token_uri of authorities
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='authorize_uri'>
Authorize-uri
</label>
{% if {{record.authorize-uri}} %}
{% ifmemberof admin %}
<input id='authorize_uri' name='authorize_uri' type='string' value='{{record.authorize_uri}}' maxlength='256' size='60'/>
{% else %}
@ -81,11 +130,27 @@ You are not permitted to view authorize_uri of authorities
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='authorize_uri' name='authorize_uri' type='string' value='{{record.authorize_uri}}' maxlength='256' size='60'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='authorize_uri' name='authorize_uri' class='pseudo-widget disabled'>
{{record.authorize_uri}}
</span>
{% else %}
<span id='authorize_uri' name='authorize_uri' class='pseudo-widget not-authorised'>
You are not permitted to view authorize_uri of authorities
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='consumer_key'>
Consumer-key
</label>
{% if {{record.consumer-key}} %}
{% ifmemberof admin %}
<input id='consumer_key' name='consumer_key' type='string' value='{{record.consumer_key}}' maxlength='32' size='32'/>
{% else %}
@ -99,11 +164,27 @@ You are not permitted to view consumer_key of authorities
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='consumer_key' name='consumer_key' type='string' value='{{record.consumer_key}}' maxlength='32' size='32'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='consumer_key' name='consumer_key' class='pseudo-widget disabled'>
{{record.consumer_key}}
</span>
{% else %}
<span id='consumer_key' name='consumer_key' class='pseudo-widget not-authorised'>
You are not permitted to view consumer_key of authorities
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='consumer_secret'>
Consumer-secret
</label>
{% if {{record.consumer-secret}} %}
{% ifmemberof admin %}
<input id='consumer_secret' name='consumer_secret' type='string' value='{{record.consumer_secret}}' maxlength='256' size='60'/>
{% else %}
@ -117,6 +198,21 @@ You are not permitted to view consumer_secret of authorities
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='consumer_secret' name='consumer_secret' type='string' value='{{record.consumer_secret}}' maxlength='256' size='60'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='consumer_secret' name='consumer_secret' class='pseudo-widget disabled'>
{{record.consumer_secret}}
</span>
{% else %}
<span id='consumer_secret' name='consumer_secret' class='pseudo-widget not-authorised'>
You are not permitted to view consumer_secret of authorities
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
{% ifmemberof admin %}
<p class='widget action-safe'>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File form-canvassers-Canvasser.html generated 2018-07-07T08:09:49.958Z by adl.to-selmer-templates.
<!-- File form-canvassers-Canvasser.html generated 2018-07-09T20:55:34.536Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -11,28 +11,12 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
<div id='content' class='edit'>
<form action='{{servlet-context}}/form-canvassers-Canvasser' method='POST'>
{% csrf-field %}
<p class='widget'>
<label for='id'>
Id
</label>
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='id' name='id' class='pseudo-widget disabled'>
{{record.id}}
</span>
{% else %}
<span id='id' name='id' class='pseudo-widget not-authorised'>
You are not permitted to view id of canvassers
</span>
{% endifmemberof %}
{% endifmemberof %}
</p>
<input id='id' name='id' type='hidden' value='{{record.id}}'/>
<p class='widget'>
<label for='username'>
Username
</label>
{% if {{record.username}} %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
<input id='username' name='username' type='string' value='{{record.username}}' maxlength='32' size='32'/>
{% else %}
@ -46,11 +30,27 @@ You are not permitted to view username of canvassers
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
<input id='username' name='username' type='string' value='{{record.username}}' maxlength='32' size='32'/>
{% else %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='username' name='username' class='pseudo-widget disabled'>
{{record.username}}
</span>
{% else %}
<span id='username' name='username' class='pseudo-widget not-authorised'>
You are not permitted to view username of canvassers
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='fullname'>
Fullname
</label>
{% if {{record.fullname}} %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
<input id='fullname' name='fullname' type='string' value='{{record.fullname}}' maxlength='64' size='60'/>
{% else %}
@ -64,11 +64,27 @@ You are not permitted to view fullname of canvassers
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
<input id='fullname' name='fullname' type='string' value='{{record.fullname}}' maxlength='64' size='60'/>
{% else %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='fullname' name='fullname' class='pseudo-widget disabled'>
{{record.fullname}}
</span>
{% else %}
<span id='fullname' name='fullname' class='pseudo-widget not-authorised'>
You are not permitted to view fullname of canvassers
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='elector_id'>
Elector_id
</label>
{% if {{record.elector_id}} %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
<span class='select-box' farside='electors' found='true'>
<input name='elector_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-electors?gender=" + elector_id_search_box.text + "&amp;email=" + elector_id_search_box.text + "&amp;name=" + elector_id_search_box.text + "&amp;phone=" + elector_id_search_box.text, null, function (data) {updateMenuOptions("elector_id", "id", ["gender", "email", "name", "phone"], data);})'/>
@ -88,11 +104,33 @@ You are not permitted to view elector_id of canvassers
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
<span class='select-box' farside='electors' found='true'>
<input name='elector_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-electors?gender=" + elector_id_search_box.text + "&amp;email=" + elector_id_search_box.text + "&amp;name=" + elector_id_search_box.text + "&amp;phone=" + elector_id_search_box.text, null, function (data) {updateMenuOptions("elector_id", "id", ["gender", "email", "name", "phone"], data);})'/>
<br/>
<select id='elector_id' name='elector_id'>
{% for r in electors %}<option value='{{r.id}}' {% ifequal record.elector_id r.id%}selected{% endifequal %}>{{r.name}} {{r.phone}} {{r.email}} {{r.gender}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='elector_id' name='elector_id' class='pseudo-widget disabled'>
{{record.elector_id}}
</span>
{% else %}
<span id='elector_id' name='elector_id' class='pseudo-widget not-authorised'>
You are not permitted to view elector_id of canvassers
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='address_id'>
Address_id
</label>
{% if {{record.address_id}} %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
<span class='select-box' farside='addresses' found='true'>
<input name='address_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-addresses?postcode=" + address_id_search_box.text + "&amp;address=" + address_id_search_box.text, null, function (data) {updateMenuOptions("address_id", "id", ["postcode", "address"], data);})'/>
@ -112,11 +150,33 @@ You are not permitted to view address_id of canvassers
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
<span class='select-box' farside='addresses' found='true'>
<input name='address_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-addresses?postcode=" + address_id_search_box.text + "&amp;address=" + address_id_search_box.text, null, function (data) {updateMenuOptions("address_id", "id", ["postcode", "address"], data);})'/>
<br/>
<select id='address_id' name='address_id'>
{% for r in addresses %}<option value='{{r.id}}' {% ifequal record.address_id r.id%}selected{% endifequal %}>{{r.address}} {{r.postcode}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='address_id' name='address_id' class='pseudo-widget disabled'>
{{record.address_id}}
</span>
{% else %}
<span id='address_id' name='address_id' class='pseudo-widget not-authorised'>
You are not permitted to view address_id of canvassers
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='phone'>
Phone
</label>
{% if {{record.phone}} %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
<input id='phone' name='phone' type='string' value='{{record.phone}}' maxlength='16' size='16'/>
{% else %}
@ -130,11 +190,27 @@ You are not permitted to view phone of canvassers
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
<input id='phone' name='phone' type='string' value='{{record.phone}}' maxlength='16' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='phone' name='phone' class='pseudo-widget disabled'>
{{record.phone}}
</span>
{% else %}
<span id='phone' name='phone' class='pseudo-widget not-authorised'>
You are not permitted to view phone of canvassers
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='email'>
Email
</label>
{% if {{record.email}} %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
<input id='email' name='email' type='string' value='{{record.email}}' maxlength='128' size='60'/>
{% else %}
@ -148,11 +224,27 @@ You are not permitted to view email of canvassers
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
<input id='email' name='email' type='string' value='{{record.email}}' maxlength='128' size='60'/>
{% else %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='email' name='email' class='pseudo-widget disabled'>
{{record.email}}
</span>
{% else %}
<span id='email' name='email' class='pseudo-widget not-authorised'>
You are not permitted to view email of canvassers
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='authority_id'>
Authority_id
</label>
{% if {{record.authority_id}} %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
<span class='select-box' farside='authorities' found='true'>
<input name='authority_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-authorities?id=" + authority_id_search_box.text, null, function (data) {updateMenuOptions("authority_id", "id", ["id"], data);})'/>
@ -172,11 +264,33 @@ You are not permitted to view authority_id of canvassers
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
<span class='select-box' farside='authorities' found='true'>
<input name='authority_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-authorities?id=" + authority_id_search_box.text, null, function (data) {updateMenuOptions("authority_id", "id", ["id"], data);})'/>
<br/>
<select id='authority_id' name='authority_id'>
{% for r in authorities %}<option value='{{r.id}}' {% ifequal record.authority_id r.id%}selected{% endifequal %}>{{r.id}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='authority_id' name='authority_id' class='pseudo-widget disabled'>
{{record.authority_id}}
</span>
{% else %}
<span id='authority_id' name='authority_id' class='pseudo-widget not-authorised'>
You are not permitted to view authority_id of canvassers
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='authorised'>
Authorised
</label>
{% if {{record.authorised}} %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
<input id='authorised' name='authorised' type='checkbox' value='{{record.authorised}}' maxlength='' size='16'/>
{% else %}
@ -190,11 +304,27 @@ You are not permitted to view authorised of canvassers
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
<input id='authorised' name='authorised' type='checkbox' value='{{record.authorised}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='authorised' name='authorised' class='pseudo-widget disabled'>
{{record.authorised}}
</span>
{% else %}
<span id='authorised' name='authorised' class='pseudo-widget not-authorised'>
You are not permitted to view authorised of canvassers
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='roles'>
Roles
</label>
{% if {{record.roles}} %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
<span class='select-box' farside='roles' found='true'>
<select id='roles' name='roles' multiple='multiple'>
@ -212,6 +342,25 @@ You are not permitted to view roles of canvassers
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
<span class='select-box' farside='roles' found='true'>
<select id='roles' name='roles' multiple='multiple'>
{% for r in roles %}<option value='{{r.role_id}}' {% ifequal record.roles r.role_id%}selected{% endifequal %}>{{r.name}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='roles' name='roles' class='pseudo-widget disabled'>
{{record.roles}}
</span>
{% else %}
<span id='roles' name='roles' class='pseudo-widget not-authorised'>
You are not permitted to view roles of canvassers
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
<p class='widget action-safe'>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File form-districts-District.html generated 2018-07-07T08:09:49.922Z by adl.to-selmer-templates.
<!-- File form-districts-District.html generated 2018-07-09T20:55:34.509Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -10,28 +10,12 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
<div id='content' class='edit'>
<form action='{{servlet-context}}/form-districts-District' method='POST'>
{% csrf-field %}
<p class='widget'>
<label for='id'>
Id
</label>
{% ifmemberof admin %}
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof public admin canvassers teamorganisers issueexperts analysts issueeditors %}
<span id='id' name='id' class='pseudo-widget disabled'>
{{record.id}}
</span>
{% else %}
<span id='id' name='id' class='pseudo-widget not-authorised'>
You are not permitted to view id of districts
</span>
{% endifmemberof %}
{% endifmemberof %}
</p>
<input id='id' name='id' type='hidden' value='{{record.id}}'/>
<p class='widget'>
<label for='name'>
Name
</label>
{% if {{record.name}} %}
{% ifmemberof admin %}
<input id='name' name='name' type='string' value='{{record.name}}' maxlength='64' size='60'/>
{% else %}
@ -45,6 +29,21 @@ You are not permitted to view name of districts
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='name' name='name' type='string' value='{{record.name}}' maxlength='64' size='60'/>
{% else %}
{% ifmemberof public admin canvassers teamorganisers issueexperts analysts issueeditors %}
<span id='name' name='name' class='pseudo-widget disabled'>
{{record.name}}
</span>
{% else %}
<span id='name' name='name' class='pseudo-widget not-authorised'>
You are not permitted to view name of districts
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
{% ifmemberof admin %}
<p class='widget action-safe'>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File form-dwellings-Dwelling.html generated 2018-07-07T08:09:49.973Z by adl.to-selmer-templates.
<!-- File form-dwellings-Dwelling.html generated 2018-07-09T20:55:34.547Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -10,28 +10,12 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
<div id='content' class='edit'>
<form action='{{servlet-context}}/form-dwellings-Dwelling' method='POST'>
{% csrf-field %}
<p class='widget'>
<label for='id'>
Id
</label>
{% ifmemberof admin %}
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='id' name='id' class='pseudo-widget disabled'>
{{record.id}}
</span>
{% else %}
<span id='id' name='id' class='pseudo-widget not-authorised'>
You are not permitted to view id of dwellings
</span>
{% endifmemberof %}
{% endifmemberof %}
</p>
<input id='id' name='id' type='hidden' value='{{record.id}}'/>
<p class='widget'>
<label for='address_id'>
Address_id
</label>
{% if {{record.address_id}} %}
{% ifmemberof admin %}
<span class='select-box' farside='addresses' found='true'>
<input name='address_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-addresses?postcode=" + address_id_search_box.text + "&amp;address=" + address_id_search_box.text, null, function (data) {updateMenuOptions("address_id", "id", ["postcode", "address"], data);})'/>
@ -51,11 +35,33 @@ You are not permitted to view address_id of dwellings
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<span class='select-box' farside='addresses' found='true'>
<input name='address_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-addresses?postcode=" + address_id_search_box.text + "&amp;address=" + address_id_search_box.text, null, function (data) {updateMenuOptions("address_id", "id", ["postcode", "address"], data);})'/>
<br/>
<select id='address_id' name='address_id'>
{% for r in addresses %}<option value='{{r.id}}' {% ifequal record.address_id r.id%}selected{% endifequal %}>{{r.address}} {{r.postcode}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='address_id' name='address_id' class='pseudo-widget disabled'>
{{record.address_id}}
</span>
{% else %}
<span id='address_id' name='address_id' class='pseudo-widget not-authorised'>
You are not permitted to view address_id of dwellings
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='sub_address'>
Sub-address
</label>
{% if {{record.sub-address}} %}
{% ifmemberof admin %}
<input id='sub_address' name='sub_address' type='string' value='{{record.sub_address}}' maxlength='32' size='32'/>
{% else %}
@ -69,6 +75,21 @@ You are not permitted to view sub_address of dwellings
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='sub_address' name='sub_address' type='string' value='{{record.sub_address}}' maxlength='32' size='32'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='sub_address' name='sub_address' class='pseudo-widget disabled'>
{{record.sub_address}}
</span>
{% else %}
<span id='sub_address' name='sub_address' class='pseudo-widget not-authorised'>
You are not permitted to view sub_address of dwellings
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
{% ifmemberof admin %}
<p class='widget action-safe'>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File form-electors-Elector.html generated 2018-07-07T08:09:49.947Z by adl.to-selmer-templates.
<!-- File form-electors-Elector.html generated 2018-07-09T20:55:34.529Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -10,28 +10,12 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
<div id='content' class='edit'>
<form action='{{servlet-context}}/form-electors-Elector' method='POST'>
{% csrf-field %}
<p class='widget'>
<label for='id'>
Id
</label>
{% ifmemberof admin %}
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='id' name='id' class='pseudo-widget disabled'>
{{record.id}}
</span>
{% else %}
<span id='id' name='id' class='pseudo-widget not-authorised'>
You are not permitted to view id of electors
</span>
{% endifmemberof %}
{% endifmemberof %}
</p>
<input id='id' name='id' type='hidden' value='{{record.id}}'/>
<p class='widget'>
<label for='name'>
Name
</label>
{% if {{record.name}} %}
{% ifmemberof admin %}
<input id='name' name='name' type='string' value='{{record.name}}' maxlength='64' size='60'/>
{% else %}
@ -45,11 +29,27 @@ You are not permitted to view name of electors
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='name' name='name' type='string' value='{{record.name}}' maxlength='64' size='60'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='name' name='name' class='pseudo-widget disabled'>
{{record.name}}
</span>
{% else %}
<span id='name' name='name' class='pseudo-widget not-authorised'>
You are not permitted to view name of electors
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='dwelling_id'>
Dwelling_id
</label>
{% if {{record.dwelling_id}} %}
{% ifmemberof admin %}
<span class='select-box' farside='dwellings' found='true'>
<input name='dwelling_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-dwellings?sub-address=" + dwelling_id_search_box.text + "&amp;address_id=" + dwelling_id_search_box.text, null, function (data) {updateMenuOptions("dwelling_id", "id", ["sub-address", "address_id"], data);})'/>
@ -69,11 +69,33 @@ You are not permitted to view dwelling_id of electors
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<span class='select-box' farside='dwellings' found='true'>
<input name='dwelling_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-dwellings?sub-address=" + dwelling_id_search_box.text + "&amp;address_id=" + dwelling_id_search_box.text, null, function (data) {updateMenuOptions("dwelling_id", "id", ["sub-address", "address_id"], data);})'/>
<br/>
<select id='dwelling_id' name='dwelling_id'>
{% for r in dwellings %}<option value='{{r.id}}' {% ifequal record.dwelling_id r.id%}selected{% endifequal %}>{{r.address_id}} {{r.sub-address}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='dwelling_id' name='dwelling_id' class='pseudo-widget disabled'>
{{record.dwelling_id}}
</span>
{% else %}
<span id='dwelling_id' name='dwelling_id' class='pseudo-widget not-authorised'>
You are not permitted to view dwelling_id of electors
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='phone'>
Phone
</label>
{% if {{record.phone}} %}
{% ifmemberof admin %}
<input id='phone' name='phone' type='string' value='{{record.phone}}' maxlength='16' size='16'/>
{% else %}
@ -87,11 +109,27 @@ You are not permitted to view phone of electors
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='phone' name='phone' type='string' value='{{record.phone}}' maxlength='16' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='phone' name='phone' class='pseudo-widget disabled'>
{{record.phone}}
</span>
{% else %}
<span id='phone' name='phone' class='pseudo-widget not-authorised'>
You are not permitted to view phone of electors
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='email'>
Email
</label>
{% if {{record.email}} %}
{% ifmemberof admin %}
<input id='email' name='email' type='string' value='{{record.email}}' maxlength='128' size='60'/>
{% else %}
@ -105,11 +143,27 @@ You are not permitted to view email of electors
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='email' name='email' type='string' value='{{record.email}}' maxlength='128' size='60'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='email' name='email' class='pseudo-widget disabled'>
{{record.email}}
</span>
{% else %}
<span id='email' name='email' class='pseudo-widget not-authorised'>
You are not permitted to view email of electors
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='gender'>
Gender
</label>
{% if {{record.gender}} %}
{% ifmemberof admin %}
<span class='select-box' farside='genders' found='true'>
<select id='gender' name='gender'>
@ -127,6 +181,25 @@ You are not permitted to view gender of electors
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<span class='select-box' farside='genders' found='true'>
<select id='gender' name='gender'>
{% for r in genders %}<option value='{{r.id}}' {% ifequal record.gender r.id%}selected{% endifequal %}>{{r.id}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='gender' name='gender' class='pseudo-widget disabled'>
{{record.gender}}
</span>
{% else %}
<span id='gender' name='gender' class='pseudo-widget not-authorised'>
You are not permitted to view gender of electors
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
{% ifmemberof admin %}
<p class='widget action-safe'>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File form-events-Events.html generated 2018-07-07T08:09:49.954Z by adl.to-selmer-templates.
<!-- File form-events-Events.html generated 2018-07-09T20:55:34.534Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -11,28 +11,12 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
<div id='content' class='edit'>
<form action='{{servlet-context}}/form-events-Events' method='POST'>
{% csrf-field %}
<p class='widget'>
<label for='id'>
Id
</label>
{% ifmemberof teamorganisers admin %}
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='id' name='id' class='pseudo-widget disabled'>
{{record.id}}
</span>
{% else %}
<span id='id' name='id' class='pseudo-widget not-authorised'>
You are not permitted to view id of events
</span>
{% endifmemberof %}
{% endifmemberof %}
</p>
<input id='id' name='id' type='hidden' value='{{record.id}}'/>
<p class='widget'>
<label for='name'>
Name
</label>
{% if {{record.name}} %}
{% ifmemberof teamorganisers admin %}
<input id='name' name='name' type='string' value='{{record.name}}' maxlength='64' size='60'/>
{% else %}
@ -46,11 +30,27 @@ You are not permitted to view name of events
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof teamorganisers admin %}
<input id='name' name='name' type='string' value='{{record.name}}' maxlength='64' size='60'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='name' name='name' class='pseudo-widget disabled'>
{{record.name}}
</span>
{% else %}
<span id='name' name='name' class='pseudo-widget not-authorised'>
You are not permitted to view name of events
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='teams'>
Teams
</label>
{% if {{record.teams}} %}
{% ifmemberof teamorganisers admin %}
<span class='select-box' farside='teams' found='true'>
<input name='teams_search_box' onchange='$.getJSON("/auto/json/seach-strings-teams?name=" + teams_search_box.text, null, function (data) {updateMenuOptions("teams", "id", ["name"], data);})'/>
@ -70,11 +70,33 @@ You are not permitted to view teams of events
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof teamorganisers admin %}
<span class='select-box' farside='teams' found='true'>
<input name='teams_search_box' onchange='$.getJSON("/auto/json/seach-strings-teams?name=" + teams_search_box.text, null, function (data) {updateMenuOptions("teams", "id", ["name"], data);})'/>
<br/>
<select id='teams' name='teams' multiple='multiple'>
{% for r in teams %}<option value='{{r.id}}' {% ifequal record.teams r.id%}selected{% endifequal %}>{{r.name}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='teams' name='teams' class='pseudo-widget disabled'>
{{record.teams}}
</span>
{% else %}
<span id='teams' name='teams' class='pseudo-widget not-authorised'>
You are not permitted to view teams of events
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='date'>
Date
</label>
{% if {{record.date}} %}
{% ifmemberof teamorganisers admin %}
<input id='date' name='date' type='date' value='{{record.date}}' maxlength='' size='16'/>
{% else %}
@ -88,11 +110,27 @@ You are not permitted to view date of events
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof teamorganisers admin %}
<input id='date' name='date' type='date' value='{{record.date}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='date' name='date' class='pseudo-widget disabled'>
{{record.date}}
</span>
{% else %}
<span id='date' name='date' class='pseudo-widget not-authorised'>
You are not permitted to view date of events
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='time'>
Time
</label>
{% if {{record.time}} %}
{% ifmemberof teamorganisers admin %}
<input id='time' name='time' type='time' value='{{record.time}}' maxlength='' size='16'/>
{% else %}
@ -106,11 +144,27 @@ You are not permitted to view time of events
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof teamorganisers admin %}
<input id='time' name='time' type='time' value='{{record.time}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='time' name='time' class='pseudo-widget disabled'>
{{record.time}}
</span>
{% else %}
<span id='time' name='time' class='pseudo-widget not-authorised'>
You are not permitted to view time of events
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='decription'>
Decription
</label>
{% if {{record.decription}} %}
{% ifmemberof teamorganisers admin %}
<textarea rows='8' cols='60' id='decription' name='decription'>
{{record.decription}}
@ -126,11 +180,29 @@ You are not permitted to view decription of events
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof teamorganisers admin %}
<textarea rows='8' cols='60' id='decription' name='decription'>
{{record.decription}}
</textarea>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='decription' name='decription' class='pseudo-widget disabled'>
{{record.decription}}
</span>
{% else %}
<span id='decription' name='decription' class='pseudo-widget not-authorised'>
You are not permitted to view decription of events
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='cancelled'>
Cancelled
</label>
{% if {{record.cancelled}} %}
{% ifmemberof teamorganisers admin %}
<input id='cancelled' name='cancelled' type='checkbox' value='{{record.cancelled}}' maxlength='' size='16'/>
{% else %}
@ -144,6 +216,21 @@ You are not permitted to view cancelled of events
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof teamorganisers admin %}
<input id='cancelled' name='cancelled' type='checkbox' value='{{record.cancelled}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='cancelled' name='cancelled' class='pseudo-widget disabled'>
{{record.cancelled}}
</span>
{% else %}
<span id='cancelled' name='cancelled' class='pseudo-widget not-authorised'>
You are not permitted to view cancelled of events
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
{% ifmemberof teamorganisers admin %}
<p class='widget action-safe'>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File form-followupactions-Followupaction.html generated 2018-07-07T08:09:49.976Z by adl.to-selmer-templates.
<!-- File form-followupactions-Followupaction.html generated 2018-07-09T20:55:34.549Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -11,28 +11,12 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
<div id='content' class='edit'>
<form action='{{servlet-context}}/form-followupactions-Followupaction' method='POST'>
{% csrf-field %}
<p class='widget'>
<label for='id'>
Id
</label>
{% ifmemberof admin %}
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof issueexperts canvassers analysts issueeditors admin %}
<span id='id' name='id' class='pseudo-widget disabled'>
{{record.id}}
</span>
{% else %}
<span id='id' name='id' class='pseudo-widget not-authorised'>
You are not permitted to view id of followupactions
</span>
{% endifmemberof %}
{% endifmemberof %}
</p>
<input id='id' name='id' type='hidden' value='{{record.id}}'/>
<p class='widget'>
<label for='request_id'>
Request_id
</label>
{% if {{record.request_id}} %}
{% ifmemberof admin %}
<span class='select-box' farside='followuprequests' found='true'>
<input name='request_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-followuprequests?elector_id=" + request_id_search_box.text + "&amp;issue_id=" + request_id_search_box.text + "&amp;visit_id=" + request_id_search_box.text, null, function (data) {updateMenuOptions("request_id", "id", ["elector_id", "issue_id", "visit_id"], data);})'/>
@ -52,11 +36,33 @@ You are not permitted to view request_id of followupactions
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<span class='select-box' farside='followuprequests' found='true'>
<input name='request_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-followuprequests?elector_id=" + request_id_search_box.text + "&amp;issue_id=" + request_id_search_box.text + "&amp;visit_id=" + request_id_search_box.text, null, function (data) {updateMenuOptions("request_id", "id", ["elector_id", "issue_id", "visit_id"], data);})'/>
<br/>
<select id='request_id' name='request_id'>
{% for r in followuprequests %}<option value='{{r.id}}' {% ifequal record.request_id r.id%}selected{% endifequal %}>{{r.elector_id}} {{r.visit_id}} {{r.issue_id}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof issueexperts canvassers analysts issueeditors admin %}
<span id='request_id' name='request_id' class='pseudo-widget disabled'>
{{record.request_id}}
</span>
{% else %}
<span id='request_id' name='request_id' class='pseudo-widget not-authorised'>
You are not permitted to view request_id of followupactions
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='actor'>
Actor
</label>
{% if {{record.actor}} %}
{% ifmemberof admin %}
<span class='select-box' farside='canvassers' found='true'>
<input name='actor_search_box' onchange='$.getJSON("/auto/json/seach-strings-canvassers?=" + actor_search_box.text, null, function (data) {updateMenuOptions("actor", "", [""], data);})'/>
@ -76,11 +82,33 @@ You are not permitted to view actor of followupactions
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<span class='select-box' farside='canvassers' found='true'>
<input name='actor_search_box' onchange='$.getJSON("/auto/json/seach-strings-canvassers?=" + actor_search_box.text, null, function (data) {updateMenuOptions("actor", "", [""], data);})'/>
<br/>
<select id='actor' name='actor'>
{% for r in canvassers %}<option value='{{r.id}}' {% ifequal record.actor r.id%}selected{% endifequal %}>{{r.username}} {{r.fullname}} {{r.address_id}} {{r.phone}} {{r.email}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof issueexperts canvassers analysts issueeditors admin %}
<span id='actor' name='actor' class='pseudo-widget disabled'>
{{record.actor}}
</span>
{% else %}
<span id='actor' name='actor' class='pseudo-widget not-authorised'>
You are not permitted to view actor of followupactions
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='date'>
Date
</label>
{% if {{record.date}} %}
{% ifmemberof admin %}
<input id='date' name='date' type='string' value='{{record.date}}' maxlength='' size='16'/>
{% else %}
@ -94,11 +122,27 @@ You are not permitted to view date of followupactions
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='date' name='date' type='string' value='{{record.date}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof issueexperts canvassers analysts issueeditors admin %}
<span id='date' name='date' class='pseudo-widget disabled'>
{{record.date}}
</span>
{% else %}
<span id='date' name='date' class='pseudo-widget not-authorised'>
You are not permitted to view date of followupactions
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='notes'>
Notes
</label>
{% if {{record.notes}} %}
{% ifmemberof admin %}
<textarea rows='8' cols='60' id='notes' name='notes'>
{{record.notes}}
@ -114,11 +158,29 @@ You are not permitted to view notes of followupactions
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<textarea rows='8' cols='60' id='notes' name='notes'>
{{record.notes}}
</textarea>
{% else %}
{% ifmemberof issueexperts canvassers analysts issueeditors admin %}
<span id='notes' name='notes' class='pseudo-widget disabled'>
{{record.notes}}
</span>
{% else %}
<span id='notes' name='notes' class='pseudo-widget not-authorised'>
You are not permitted to view notes of followupactions
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='closed'>
Closed
</label>
{% if {{record.closed}} %}
{% ifmemberof admin %}
<input id='closed' name='closed' type='checkbox' value='{{record.closed}}' maxlength='' size='16'/>
{% else %}
@ -132,6 +194,21 @@ You are not permitted to view closed of followupactions
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='closed' name='closed' type='checkbox' value='{{record.closed}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof issueexperts canvassers analysts issueeditors admin %}
<span id='closed' name='closed' class='pseudo-widget disabled'>
{{record.closed}}
</span>
{% else %}
<span id='closed' name='closed' class='pseudo-widget not-authorised'>
You are not permitted to view closed of followupactions
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
{% ifmemberof admin %}
<p class='widget action-safe'>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File form-followupmethods-Followupmethod.html generated 2018-07-07T08:09:49.979Z by adl.to-selmer-templates.
<!-- File form-followupmethods-Followupmethod.html generated 2018-07-09T20:55:34.550Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -14,8 +14,9 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
<label for='id'>
Id
</label>
{% if {{record.id}} %}
{% ifmemberof admin %}
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='' size='16'/>
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='32' size='32'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='id' name='id' class='pseudo-widget disabled'>
@ -27,6 +28,21 @@ You are not permitted to view id of followupmethods
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='32' size='32'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='id' name='id' class='pseudo-widget disabled'>
{{record.id}}
</span>
{% else %}
<span id='id' name='id' class='pseudo-widget not-authorised'>
You are not permitted to view id of followupmethods
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
{% ifmemberof admin %}
<p class='widget action-safe'>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File form-followuprequests-Followuprequest.html generated 2018-07-07T08:09:49.925Z by adl.to-selmer-templates.
<!-- File form-followuprequests-Followuprequest.html generated 2018-07-09T20:55:34.512Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -10,28 +10,12 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
<div id='content' class='edit'>
<form action='{{servlet-context}}/form-followuprequests-Followuprequest' method='POST'>
{% csrf-field %}
<p class='widget'>
<label for='id'>
Id
</label>
{% ifmemberof admin %}
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='id' name='id' class='pseudo-widget disabled'>
{{record.id}}
</span>
{% else %}
<span id='id' name='id' class='pseudo-widget not-authorised'>
You are not permitted to view id of followuprequests
</span>
{% endifmemberof %}
{% endifmemberof %}
</p>
<input id='id' name='id' type='hidden' value='{{record.id}}'/>
<p class='widget'>
<label for='elector_id'>
Elector_id
</label>
{% if {{record.elector_id}} %}
{% ifmemberof admin %}
<span class='select-box' farside='electors' found='true'>
<input name='elector_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-electors?gender=" + elector_id_search_box.text + "&amp;email=" + elector_id_search_box.text + "&amp;name=" + elector_id_search_box.text + "&amp;phone=" + elector_id_search_box.text, null, function (data) {updateMenuOptions("elector_id", "id", ["gender", "email", "name", "phone"], data);})'/>
@ -51,11 +35,33 @@ You are not permitted to view elector_id of followuprequests
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<span class='select-box' farside='electors' found='true'>
<input name='elector_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-electors?gender=" + elector_id_search_box.text + "&amp;email=" + elector_id_search_box.text + "&amp;name=" + elector_id_search_box.text + "&amp;phone=" + elector_id_search_box.text, null, function (data) {updateMenuOptions("elector_id", "id", ["gender", "email", "name", "phone"], data);})'/>
<br/>
<select id='elector_id' name='elector_id'>
{% for r in electors %}<option value='{{r.id}}' {% ifequal record.elector_id r.id%}selected{% endifequal %}>{{r.name}} {{r.phone}} {{r.email}} {{r.gender}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='elector_id' name='elector_id' class='pseudo-widget disabled'>
{{record.elector_id}}
</span>
{% else %}
<span id='elector_id' name='elector_id' class='pseudo-widget not-authorised'>
You are not permitted to view elector_id of followuprequests
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='visit_id'>
Visit_id
</label>
{% if {{record.visit_id}} %}
{% ifmemberof admin %}
<span class='select-box' farside='visits' found='true'>
<input name='visit_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-visits?address_id=" + visit_id_search_box.text + "&amp;date=" + visit_id_search_box.text, null, function (data) {updateMenuOptions("visit_id", "id", ["address_id", "date"], data);})'/>
@ -75,11 +81,33 @@ You are not permitted to view visit_id of followuprequests
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<span class='select-box' farside='visits' found='true'>
<input name='visit_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-visits?address_id=" + visit_id_search_box.text + "&amp;date=" + visit_id_search_box.text, null, function (data) {updateMenuOptions("visit_id", "id", ["address_id", "date"], data);})'/>
<br/>
<select id='visit_id' name='visit_id'>
{% for r in visits %}<option value='{{r.id}}' {% ifequal record.visit_id r.id%}selected{% endifequal %}>{{r.address_id}} {{r.date}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='visit_id' name='visit_id' class='pseudo-widget disabled'>
{{record.visit_id}}
</span>
{% else %}
<span id='visit_id' name='visit_id' class='pseudo-widget not-authorised'>
You are not permitted to view visit_id of followuprequests
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='issue_id'>
Issue_id
</label>
{% if {{record.issue_id}} %}
{% ifmemberof admin %}
<span class='select-box' farside='issues' found='true'>
<select id='issue_id' name='issue_id'>
@ -97,11 +125,31 @@ You are not permitted to view issue_id of followuprequests
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<span class='select-box' farside='issues' found='true'>
<select id='issue_id' name='issue_id'>
{% for r in issues %}<option value='{{r.id}}' {% ifequal record.issue_id r.id%}selected{% endifequal %}>{{r.id}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='issue_id' name='issue_id' class='pseudo-widget disabled'>
{{record.issue_id}}
</span>
{% else %}
<span id='issue_id' name='issue_id' class='pseudo-widget not-authorised'>
You are not permitted to view issue_id of followuprequests
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='method_id'>
Method_id
</label>
{% if {{record.method_id}} %}
{% ifmemberof admin %}
<span class='select-box' farside='followupmethods' found='true'>
<select id='method_id' name='method_id'>
@ -119,6 +167,25 @@ You are not permitted to view method_id of followuprequests
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<span class='select-box' farside='followupmethods' found='true'>
<select id='method_id' name='method_id'>
{% for r in followupmethods %}<option value='{{r.id}}' {% ifequal record.method_id r.id%}selected{% endifequal %}>{{r.id}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='method_id' name='method_id' class='pseudo-widget disabled'>
{{record.method_id}}
</span>
{% else %}
<span id='method_id' name='method_id' class='pseudo-widget not-authorised'>
You are not permitted to view method_id of followuprequests
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
{% ifmemberof admin %}
<p class='widget action-safe'>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File form-genders-Gender.html generated 2018-07-07T08:09:49.918Z by adl.to-selmer-templates.
<!-- File form-genders-Gender.html generated 2018-07-09T20:55:34.505Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -14,8 +14,9 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
<label for='id'>
Id
</label>
{% if {{record.id}} %}
{% ifmemberof admin %}
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='' size='16'/>
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='32' size='32'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='id' name='id' class='pseudo-widget disabled'>
@ -27,6 +28,21 @@ You are not permitted to view id of genders
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='32' size='32'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='id' name='id' class='pseudo-widget disabled'>
{{record.id}}
</span>
{% else %}
<span id='id' name='id' class='pseudo-widget not-authorised'>
You are not permitted to view id of genders
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
{% ifmemberof admin %}
<p class='widget action-safe'>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File form-intentions-Intention.html generated 2018-07-07T08:09:49.968Z by adl.to-selmer-templates.
<!-- File form-intentions-Intention.html generated 2018-07-09T20:55:34.543Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -14,6 +14,7 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
<label for='visit_id'>
Visit_id
</label>
{% if {{record.visit_id}} %}
{% ifmemberof admin %}
<span class='select-box' farside='visits' found='true'>
<input name='visit_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-visits?address_id=" + visit_id_search_box.text + "&amp;date=" + visit_id_search_box.text, null, function (data) {updateMenuOptions("visit_id", "id", ["address_id", "date"], data);})'/>
@ -33,11 +34,33 @@ You are not permitted to view visit_id of intentions
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<span class='select-box' farside='visits' found='true'>
<input name='visit_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-visits?address_id=" + visit_id_search_box.text + "&amp;date=" + visit_id_search_box.text, null, function (data) {updateMenuOptions("visit_id", "id", ["address_id", "date"], data);})'/>
<br/>
<select id='visit_id' name='visit_id'>
{% for r in visits %}<option value='{{r.id}}' {% ifequal record.visit_id r.id%}selected{% endifequal %}>{{r.address_id}} {{r.date}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof canvassers analysts admin %}
<span id='visit_id' name='visit_id' class='pseudo-widget disabled'>
{{record.visit_id}}
</span>
{% else %}
<span id='visit_id' name='visit_id' class='pseudo-widget not-authorised'>
You are not permitted to view visit_id of intentions
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='elector_id'>
Elector_id
</label>
{% if {{record.elector_id}} %}
{% ifmemberof admin %}
<span class='select-box' farside='electors' found='true'>
<input name='elector_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-electors?gender=" + elector_id_search_box.text + "&amp;email=" + elector_id_search_box.text + "&amp;name=" + elector_id_search_box.text + "&amp;phone=" + elector_id_search_box.text, null, function (data) {updateMenuOptions("elector_id", "id", ["gender", "email", "name", "phone"], data);})'/>
@ -57,11 +80,33 @@ You are not permitted to view elector_id of intentions
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<span class='select-box' farside='electors' found='true'>
<input name='elector_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-electors?gender=" + elector_id_search_box.text + "&amp;email=" + elector_id_search_box.text + "&amp;name=" + elector_id_search_box.text + "&amp;phone=" + elector_id_search_box.text, null, function (data) {updateMenuOptions("elector_id", "id", ["gender", "email", "name", "phone"], data);})'/>
<br/>
<select id='elector_id' name='elector_id'>
{% for r in electors %}<option value='{{r.id}}' {% ifequal record.elector_id r.id%}selected{% endifequal %}>{{r.name}} {{r.phone}} {{r.email}} {{r.gender}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof canvassers analysts admin %}
<span id='elector_id' name='elector_id' class='pseudo-widget disabled'>
{{record.elector_id}}
</span>
{% else %}
<span id='elector_id' name='elector_id' class='pseudo-widget not-authorised'>
You are not permitted to view elector_id of intentions
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='option_id'>
Option_id
</label>
{% if {{record.option_id}} %}
{% ifmemberof admin %}
<span class='select-box' farside='options' found='true'>
<select id='option_id' name='option_id'>
@ -79,11 +124,31 @@ You are not permitted to view option_id of intentions
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<span class='select-box' farside='options' found='true'>
<select id='option_id' name='option_id'>
{% for r in options %}<option value='{{r.id}}' {% ifequal record.option_id r.id%}selected{% endifequal %}>{{r.id}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof canvassers analysts admin %}
<span id='option_id' name='option_id' class='pseudo-widget disabled'>
{{record.option_id}}
</span>
{% else %}
<span id='option_id' name='option_id' class='pseudo-widget not-authorised'>
You are not permitted to view option_id of intentions
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='locality'>
Locality
</label>
{% if {{record.locality}} %}
{% ifmemberof admin %}
<input id='locality' name='locality' type='number' value='{{record.locality}}' maxlength='' size='16'/>
{% else %}
@ -97,6 +162,21 @@ You are not permitted to view locality of intentions
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='locality' name='locality' type='number' value='{{record.locality}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof canvassers analysts admin %}
<span id='locality' name='locality' class='pseudo-widget disabled'>
{{record.locality}}
</span>
{% else %}
<span id='locality' name='locality' class='pseudo-widget not-authorised'>
You are not permitted to view locality of intentions
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
{% ifmemberof admin %}
<p class='widget action-safe'>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File form-issues-Issue.html generated 2018-07-07T08:09:49.935Z by adl.to-selmer-templates.
<!-- File form-issues-Issue.html generated 2018-07-09T20:55:34.521Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -15,8 +15,9 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
<label for='id'>
Id
</label>
{% if {{record.id}} %}
{% ifmemberof issueeditors admin %}
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='' size='16'/>
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='32' size='32'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='id' name='id' class='pseudo-widget disabled'>
@ -28,11 +29,27 @@ You are not permitted to view id of issues
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof issueeditors admin %}
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='32' size='32'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='id' name='id' class='pseudo-widget disabled'>
{{record.id}}
</span>
{% else %}
<span id='id' name='id' class='pseudo-widget not-authorised'>
You are not permitted to view id of issues
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='url'>
Url
</label>
{% if {{record.url}} %}
{% ifmemberof issueeditors admin %}
<input id='url' name='url' type='string' value='{{record.url}}' maxlength='256' size='60'/>
{% else %}
@ -46,11 +63,27 @@ You are not permitted to view url of issues
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof issueeditors admin %}
<input id='url' name='url' type='string' value='{{record.url}}' maxlength='256' size='60'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='url' name='url' class='pseudo-widget disabled'>
{{record.url}}
</span>
{% else %}
<span id='url' name='url' class='pseudo-widget not-authorised'>
You are not permitted to view url of issues
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='current'>
Current
</label>
{% if {{record.current}} %}
{% ifmemberof issueeditors admin %}
<input id='current' name='current' type='checkbox' value='{{record.current}}' maxlength='' size='16'/>
{% else %}
@ -64,11 +97,27 @@ You are not permitted to view current of issues
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof issueeditors admin %}
<input id='current' name='current' type='checkbox' value='{{record.current}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='current' name='current' class='pseudo-widget disabled'>
{{record.current}}
</span>
{% else %}
<span id='current' name='current' class='pseudo-widget not-authorised'>
You are not permitted to view current of issues
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='brief'>
Brief
</label>
{% if {{record.brief}} %}
{% ifmemberof issueeditors admin %}
<textarea rows='8' cols='60' id='brief' name='brief'>
{{record.brief}}
@ -84,6 +133,23 @@ You are not permitted to view brief of issues
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof issueeditors admin %}
<textarea rows='8' cols='60' id='brief' name='brief'>
{{record.brief}}
</textarea>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='brief' name='brief' class='pseudo-widget disabled'>
{{record.brief}}
</span>
{% else %}
<span id='brief' name='brief' class='pseudo-widget not-authorised'>
You are not permitted to view brief of issues
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
{% ifmemberof issueeditors admin %}
<p class='widget action-safe'>
@ -107,6 +173,21 @@ To delete this issues record
{% endblock %}
{% block extra-tail %}
<script type='text/javascript'>
/**
* update the select menu with id `wid` from this `data` whose fields include
* this `entity_key` and these `fields`
*/
function updateMenuOptions(wid, entity_key, fields, data){
$('#' + wid).children().filter(function(){
return $(this).attr('selected') === undefined;
}).remove().end();
$.each(data, function(key, entry){
$('#' + wid).append(
$('<option></option>').attr('value', key).text(entry));
});
}
var simplemde = new SimpleMDE({
autosave: {
enabled: true,

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File form-options-Option.html generated 2018-07-07T08:09:49.967Z by adl.to-selmer-templates.
<!-- File form-options-Option.html generated 2018-07-09T20:55:34.542Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -14,8 +14,9 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
<label for='id'>
Id
</label>
{% if {{record.id}} %}
{% ifmemberof admin %}
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='' size='16'/>
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='32' size='32'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='id' name='id' class='pseudo-widget disabled'>
@ -27,6 +28,21 @@ You are not permitted to view id of options
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='32' size='32'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='id' name='id' class='pseudo-widget disabled'>
{{record.id}}
</span>
{% else %}
<span id='id' name='id' class='pseudo-widget not-authorised'>
You are not permitted to view id of options
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
{% ifmemberof admin %}
<p class='widget action-safe'>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File form-roles-Role.html generated 2018-07-07T08:09:49.937Z by adl.to-selmer-templates.
<!-- File form-roles-Role.html generated 2018-07-09T20:55:34.522Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -10,28 +10,12 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
<div id='content' class='edit'>
<form action='{{servlet-context}}/form-roles-Role' method='POST'>
{% csrf-field %}
<p class='widget'>
<label for='id'>
Id
</label>
{% ifmemberof admin %}
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='id' name='id' class='pseudo-widget disabled'>
{{record.id}}
</span>
{% else %}
<span id='id' name='id' class='pseudo-widget not-authorised'>
You are not permitted to view id of roles
</span>
{% endifmemberof %}
{% endifmemberof %}
</p>
<input id='id' name='id' type='hidden' value='{{record.id}}'/>
<p class='widget'>
<label for='name'>
Name
</label>
{% if {{record.name}} %}
{% ifmemberof admin %}
<input id='name' name='name' type='string' value='{{record.name}}' maxlength='64' size='60'/>
{% else %}
@ -45,11 +29,27 @@ You are not permitted to view name of roles
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='name' name='name' type='string' value='{{record.name}}' maxlength='64' size='60'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='name' name='name' class='pseudo-widget disabled'>
{{record.name}}
</span>
{% else %}
<span id='name' name='name' class='pseudo-widget not-authorised'>
You are not permitted to view name of roles
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='members'>
Members
</label>
{% if {{record.members}} %}
{% ifmemberof admin %}
<span class='select-box' farside='canvassers' found='true'>
<input name='members_search_box' onchange='$.getJSON("/auto/json/seach-strings-canvassers?=" + members_search_box.text, null, function (data) {updateMenuOptions("members", "", [""], data);})'/>
@ -69,6 +69,27 @@ You are not permitted to view members of roles
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<span class='select-box' farside='canvassers' found='true'>
<input name='members_search_box' onchange='$.getJSON("/auto/json/seach-strings-canvassers?=" + members_search_box.text, null, function (data) {updateMenuOptions("members", "", [""], data);})'/>
<br/>
<select id='members' name='members' multiple='multiple'>
{% for r in canvassers %}<option value='{{r.id}}' {% ifequal record.members r.id%}selected{% endifequal %}>{{r.username}} {{r.fullname}} {{r.address_id}} {{r.phone}} {{r.email}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='members' name='members' class='pseudo-widget disabled'>
{{record.members}}
</span>
{% else %}
<span id='members' name='members' class='pseudo-widget not-authorised'>
You are not permitted to view members of roles
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
{% ifmemberof admin %}
<p class='widget action-safe'>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File form-teams-Team.html generated 2018-07-07T08:09:49.943Z by adl.to-selmer-templates.
<!-- File form-teams-Team.html generated 2018-07-09T20:55:34.527Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -10,28 +10,12 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
<div id='content' class='edit'>
<form action='{{servlet-context}}/form-teams-Team' method='POST'>
{% csrf-field %}
<p class='widget'>
<label for='id'>
Id
</label>
{% ifmemberof teamorganisers admin teamorganisers admin %}
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin teamorganisers admin %}
<span id='id' name='id' class='pseudo-widget disabled'>
{{record.id}}
</span>
{% else %}
<span id='id' name='id' class='pseudo-widget not-authorised'>
You are not permitted to view id of teams
</span>
{% endifmemberof %}
{% endifmemberof %}
</p>
<input id='id' name='id' type='hidden' value='{{record.id}}'/>
<p class='widget'>
<label for='name'>
Name
</label>
{% if {{record.name}} %}
{% ifmemberof teamorganisers admin teamorganisers admin %}
<input id='name' name='name' type='string' value='{{record.name}}' maxlength='64' size='60'/>
{% else %}
@ -45,11 +29,27 @@ You are not permitted to view name of teams
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof teamorganisers admin teamorganisers admin %}
<input id='name' name='name' type='string' value='{{record.name}}' maxlength='64' size='60'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin teamorganisers admin %}
<span id='name' name='name' class='pseudo-widget disabled'>
{{record.name}}
</span>
{% else %}
<span id='name' name='name' class='pseudo-widget not-authorised'>
You are not permitted to view name of teams
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='district_id'>
District_id
</label>
{% if {{record.district_id}} %}
{% ifmemberof teamorganisers admin teamorganisers admin %}
<span class='select-box' farside='districts' found='true'>
<input name='district_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-districts?name=" + district_id_search_box.text, null, function (data) {updateMenuOptions("district_id", "id", ["name"], data);})'/>
@ -69,11 +69,33 @@ You are not permitted to view district_id of teams
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof teamorganisers admin teamorganisers admin %}
<span class='select-box' farside='districts' found='true'>
<input name='district_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-districts?name=" + district_id_search_box.text, null, function (data) {updateMenuOptions("district_id", "id", ["name"], data);})'/>
<br/>
<select id='district_id' name='district_id'>
{% for r in districts %}<option value='{{r.id}}' {% ifequal record.district_id r.id%}selected{% endifequal %}>{{r.name}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin teamorganisers admin %}
<span id='district_id' name='district_id' class='pseudo-widget disabled'>
{{record.district_id}}
</span>
{% else %}
<span id='district_id' name='district_id' class='pseudo-widget not-authorised'>
You are not permitted to view district_id of teams
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='latitude'>
Latitude
</label>
{% if {{record.latitude}} %}
{% ifmemberof teamorganisers admin teamorganisers admin %}
<input id='latitude' name='latitude' type='number' value='{{record.latitude}}' maxlength='' size='16'/>
{% else %}
@ -87,11 +109,27 @@ You are not permitted to view latitude of teams
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof teamorganisers admin teamorganisers admin %}
<input id='latitude' name='latitude' type='number' value='{{record.latitude}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin teamorganisers admin %}
<span id='latitude' name='latitude' class='pseudo-widget disabled'>
{{record.latitude}}
</span>
{% else %}
<span id='latitude' name='latitude' class='pseudo-widget not-authorised'>
You are not permitted to view latitude of teams
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='members'>
Members
</label>
{% if {{record.members}} %}
{% ifmemberof teamorganisers admin teamorganisers admin %}
<span class='select-box' farside='canvassers' found='true'>
<input name='members_search_box' onchange='$.getJSON("/auto/json/seach-strings-canvassers?=" + members_search_box.text, null, function (data) {updateMenuOptions("members", "", [""], data);})'/>
@ -111,11 +149,33 @@ You are not permitted to view members of teams
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof teamorganisers admin teamorganisers admin %}
<span class='select-box' farside='canvassers' found='true'>
<input name='members_search_box' onchange='$.getJSON("/auto/json/seach-strings-canvassers?=" + members_search_box.text, null, function (data) {updateMenuOptions("members", "", [""], data);})'/>
<br/>
<select id='members' name='members' multiple='multiple'>
{% for r in canvassers %}<option value='{{r.id}}' {% ifequal record.members r.id%}selected{% endifequal %}>{{r.username}} {{r.fullname}} {{r.address_id}} {{r.phone}} {{r.email}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin teamorganisers admin %}
<span id='members' name='members' class='pseudo-widget disabled'>
{{record.members}}
</span>
{% else %}
<span id='members' name='members' class='pseudo-widget not-authorised'>
You are not permitted to view members of teams
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='organisers'>
Organisers
</label>
{% if {{record.organisers}} %}
{% ifmemberof teamorganisers admin teamorganisers admin %}
<span class='select-box' farside='canvassers' found='true'>
<input name='organisers_search_box' onchange='$.getJSON("/auto/json/seach-strings-canvassers?=" + organisers_search_box.text, null, function (data) {updateMenuOptions("organisers", "", [""], data);})'/>
@ -135,11 +195,33 @@ You are not permitted to view organisers of teams
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof teamorganisers admin teamorganisers admin %}
<span class='select-box' farside='canvassers' found='true'>
<input name='organisers_search_box' onchange='$.getJSON("/auto/json/seach-strings-canvassers?=" + organisers_search_box.text, null, function (data) {updateMenuOptions("organisers", "", [""], data);})'/>
<br/>
<select id='organisers' name='organisers' multiple='multiple'>
{% for r in canvassers %}<option value='{{r.id}}' {% ifequal record.organisers r.id%}selected{% endifequal %}>{{r.username}} {{r.fullname}} {{r.address_id}} {{r.phone}} {{r.email}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin teamorganisers admin %}
<span id='organisers' name='organisers' class='pseudo-widget disabled'>
{{record.organisers}}
</span>
{% else %}
<span id='organisers' name='organisers' class='pseudo-widget not-authorised'>
You are not permitted to view organisers of teams
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='longitude'>
Longitude
</label>
{% if {{record.longitude}} %}
{% ifmemberof teamorganisers admin teamorganisers admin %}
<input id='longitude' name='longitude' type='number' value='{{record.longitude}}' maxlength='' size='16'/>
{% else %}
@ -153,6 +235,21 @@ You are not permitted to view longitude of teams
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof teamorganisers admin teamorganisers admin %}
<input id='longitude' name='longitude' type='number' value='{{record.longitude}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin teamorganisers admin %}
<span id='longitude' name='longitude' class='pseudo-widget disabled'>
{{record.longitude}}
</span>
{% else %}
<span id='longitude' name='longitude' class='pseudo-widget not-authorised'>
You are not permitted to view longitude of teams
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
{% ifmemberof teamorganisers admin teamorganisers admin %}
<p class='widget action-safe'>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File form-visits-Visit.html generated 2018-07-07T08:09:49.940Z by adl.to-selmer-templates.
<!-- File form-visits-Visit.html generated 2018-07-09T20:55:34.524Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -14,8 +14,9 @@ See [Application Description Language](https://github.com/simon-brooke/adl).-->
<label for='id'>
Id
</label>
{% if {{record.id}} %}
{% ifmemberof admin %}
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='' size='16'/>
<input id='id' name='id' type='number' value='{{record.id}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers %}
<span id='id' name='id' class='pseudo-widget disabled'>
@ -27,11 +28,27 @@ You are not permitted to view id of visits
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='id' name='id' type='number' value='{{record.id}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers %}
<span id='id' name='id' class='pseudo-widget disabled'>
{{record.id}}
</span>
{% else %}
<span id='id' name='id' class='pseudo-widget not-authorised'>
You are not permitted to view id of visits
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='address_id'>
Address_id
</label>
{% if {{record.address_id}} %}
{% ifmemberof admin %}
<span class='select-box' farside='addresses' found='true'>
<input name='address_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-addresses?postcode=" + address_id_search_box.text + "&amp;address=" + address_id_search_box.text, null, function (data) {updateMenuOptions("address_id", "id", ["postcode", "address"], data);})'/>
@ -51,11 +68,33 @@ You are not permitted to view address_id of visits
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<span class='select-box' farside='addresses' found='true'>
<input name='address_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-addresses?postcode=" + address_id_search_box.text + "&amp;address=" + address_id_search_box.text, null, function (data) {updateMenuOptions("address_id", "id", ["postcode", "address"], data);})'/>
<br/>
<select id='address_id' name='address_id'>
{% for r in addresses %}<option value='{{r.id}}' {% ifequal record.address_id r.id%}selected{% endifequal %}>{{r.address}} {{r.postcode}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers %}
<span id='address_id' name='address_id' class='pseudo-widget disabled'>
{{record.address_id}}
</span>
{% else %}
<span id='address_id' name='address_id' class='pseudo-widget not-authorised'>
You are not permitted to view address_id of visits
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='canvasser_id'>
Canvasser_id
</label>
{% if {{record.canvasser_id}} %}
{% ifmemberof admin %}
<span class='select-box' farside='canvassers' found='true'>
<input name='canvasser_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-canvassers?=" + canvasser_id_search_box.text, null, function (data) {updateMenuOptions("canvasser_id", "", [""], data);})'/>
@ -75,11 +114,33 @@ You are not permitted to view canvasser_id of visits
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<span class='select-box' farside='canvassers' found='true'>
<input name='canvasser_id_search_box' onchange='$.getJSON("/auto/json/seach-strings-canvassers?=" + canvasser_id_search_box.text, null, function (data) {updateMenuOptions("canvasser_id", "", [""], data);})'/>
<br/>
<select id='canvasser_id' name='canvasser_id'>
{% for r in canvassers %}<option value='{{r.id}}' {% ifequal record.canvasser_id r.id%}selected{% endifequal %}>{{r.username}} {{r.fullname}} {{r.address_id}} {{r.phone}} {{r.email}}</option>{% endfor %}
</select>
</span>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers %}
<span id='canvasser_id' name='canvasser_id' class='pseudo-widget disabled'>
{{record.canvasser_id}}
</span>
{% else %}
<span id='canvasser_id' name='canvasser_id' class='pseudo-widget not-authorised'>
You are not permitted to view canvasser_id of visits
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
<p class='widget'>
<label for='date'>
Date
</label>
{% if {{record.date}} %}
{% ifmemberof admin %}
<input id='date' name='date' type='string' value='{{record.date}}' maxlength='' size='16'/>
{% else %}
@ -93,6 +154,21 @@ You are not permitted to view date of visits
</span>
{% endifmemberof %}
{% endifmemberof %}
{% else %}
{% ifmemberof admin %}
<input id='date' name='date' type='string' value='{{record.date}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers %}
<span id='date' name='date' class='pseudo-widget disabled'>
{{record.date}}
</span>
{% else %}
<span id='date' name='date' class='pseudo-widget not-authorised'>
You are not permitted to view date of visits
</span>
{% endifmemberof %}
{% endifmemberof %}
{% endif %}
</p>
{% ifmemberof admin %}
<p class='widget action-safe'>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File list-addresses-Addresses.html generated 2018-07-07T08:09:49.953Z by adl.to-selmer-templates.
<!-- File list-addresses-Addresses.html generated 2018-07-09T20:55:34.533Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -28,7 +28,7 @@ Next
</div>
{% ifmemberof admin %}
<div class='big-link-container'>
<a href='form-addresses-Address' class='big-link'>
<a href='{{servlet-context}}/form-addresses-Address' class='big-link'>
Add a new Address
</a>
</div>
@ -112,7 +112,7 @@ Longitude
{{ record.phone }}
</td>
<td>
<a href='form-districts-District?id={{ record.district_id }}'>
<a href='{{servlet-context}}/form-districts-District?id={{ record.district_id }}'>
{{ record.district_id_expanded }}
</a>
</td>
@ -123,7 +123,7 @@ Longitude
{{ record.longitude }}
</td>
<td>
<a href='form-addresses-Address?id={{ record.id }}'>
<a href='{{servlet-context}}/form-addresses-Address?id={{ record.id }}'>
View
</a>
</td>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File list-authorities-Authorities.html generated 2018-07-07T08:09:49.924Z by adl.to-selmer-templates.
<!-- File list-authorities-Authorities.html generated 2018-07-09T20:55:34.510Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -28,7 +28,7 @@ Next
</div>
{% ifmemberof admin %}
<div class='big-link-container'>
<a href='form-authorities-Authority' class='big-link'>
<a href='{{servlet-context}}/form-authorities-Authority' class='big-link'>
Add a new Authority
</a>
</div>
@ -94,7 +94,7 @@ Authorize-uri
{{ record.authorize_uri }}
</td>
<td>
<a href='form-authorities-Authority?id={{ record.id }}'>
<a href='{{servlet-context}}/form-authorities-Authority?id={{ record.id }}'>
View
</a>
</td>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File list-canvassers-Canvassers.html generated 2018-07-07T08:09:49.972Z by adl.to-selmer-templates.
<!-- File list-canvassers-Canvassers.html generated 2018-07-09T20:55:34.545Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -28,7 +28,7 @@ Next
</div>
{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}
<div class='big-link-container'>
<a href='form-canvassers-Canvasser' class='big-link'>
<a href='{{servlet-context}}/form-canvassers-Canvasser' class='big-link'>
Add a new Canvasser
</a>
</div>
@ -121,12 +121,12 @@ Authorised
{{ record.fullname }}
</td>
<td>
<a href='form-electors-Elector?id={{ record.elector_id }}'>
<a href='{{servlet-context}}/form-electors-Elector?id={{ record.elector_id }}'>
{{ record.elector_id_expanded }}
</a>
</td>
<td>
<a href='form-addresses-Address?id={{ record.address_id }}'>
<a href='{{servlet-context}}/form-addresses-Address?id={{ record.address_id }}'>
{{ record.address_id_expanded }}
</a>
</td>
@ -137,7 +137,7 @@ Authorised
{{ record.email }}
</td>
<td>
<a href='form-authorities-Authority?id={{ record.authority_id }}'>
<a href='{{servlet-context}}/form-authorities-Authority?id={{ record.authority_id }}'>
{{ record.authority_id_expanded }}
</a>
</td>
@ -145,7 +145,7 @@ Authorised
{{ record.authorised }}
</td>
<td>
<a href='form-canvassers-Canvasser?id={{ record.id }}'>
<a href='{{servlet-context}}/form-canvassers-Canvasser?id={{ record.id }}'>
View
</a>
</td>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File list-districts-Districts.html generated 2018-07-07T08:09:49.965Z by adl.to-selmer-templates.
<!-- File list-districts-Districts.html generated 2018-07-09T20:55:34.538Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -28,7 +28,7 @@ Next
</div>
{% ifmemberof admin %}
<div class='big-link-container'>
<a href='form-districts-District' class='big-link'>
<a href='{{servlet-context}}/form-districts-District' class='big-link'>
Add a new District
</a>
</div>
@ -76,7 +76,7 @@ Name
{{ record.name }}
</td>
<td>
<a href='form-districts-District?id={{ record.id }}'>
<a href='{{servlet-context}}/form-districts-District?id={{ record.id }}'>
View
</a>
</td>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File list-dwellings-Dwellings.html generated 2018-07-07T08:09:49.950Z by adl.to-selmer-templates.
<!-- File list-dwellings-Dwellings.html generated 2018-07-09T20:55:34.531Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -28,7 +28,7 @@ Next
</div>
{% ifmemberof admin %}
<div class='big-link-container'>
<a href='form-dwellings-Dwelling' class='big-link'>
<a href='{{servlet-context}}/form-dwellings-Dwelling' class='big-link'>
Add a new Dwelling
</a>
</div>
@ -79,7 +79,7 @@ Sub-address
{{ record.id }}
</td>
<td>
<a href='form-addresses-Address?id={{ record.address_id }}'>
<a href='{{servlet-context}}/form-addresses-Address?id={{ record.address_id }}'>
{{ record.address_id_expanded }}
</a>
</td>
@ -87,7 +87,7 @@ Sub-address
{{ record.sub_address }}
</td>
<td>
<a href='form-dwellings-Dwelling?id={{ record.id }}'>
<a href='{{servlet-context}}/form-dwellings-Dwelling?id={{ record.id }}'>
View
</a>
</td>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File list-electors-Electors.html generated 2018-07-07T08:09:49.934Z by adl.to-selmer-templates.
<!-- File list-electors-Electors.html generated 2018-07-09T20:55:34.519Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -28,7 +28,7 @@ Next
</div>
{% ifmemberof admin %}
<div class='big-link-container'>
<a href='form-electors-Elector' class='big-link'>
<a href='{{servlet-context}}/form-electors-Elector' class='big-link'>
Add a new Elector
</a>
</div>
@ -100,7 +100,7 @@ Gender
{{ record.name }}
</td>
<td>
<a href='form-dwellings-Dwelling?id={{ record.dwelling_id }}'>
<a href='{{servlet-context}}/form-dwellings-Dwelling?id={{ record.dwelling_id }}'>
{{ record.dwelling_id_expanded }}
</a>
</td>
@ -111,12 +111,12 @@ Gender
{{ record.email }}
</td>
<td>
<a href='form-genders-Gender?id={{ record.gender }}'>
<a href='{{servlet-context}}/form-genders-Gender?id={{ record.gender }}'>
{{ record.gender_expanded }}
</a>
</td>
<td>
<a href='form-electors-Elector?id={{ record.id }}'>
<a href='{{servlet-context}}/form-electors-Elector?id={{ record.id }}'>
View
</a>
</td>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File list-events-Events.html generated 2018-07-07T08:09:49.965Z by adl.to-selmer-templates.
<!-- File list-events-Events.html generated 2018-07-09T20:55:34.539Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -28,7 +28,7 @@ Next
</div>
{% ifmemberof teamorganisers admin %}
<div class='big-link-container'>
<a href='form-events-Events' class='big-link'>
<a href='{{servlet-context}}/form-events-Events' class='big-link'>
Add a new Event
</a>
</div>
@ -112,7 +112,7 @@ Cancelled
{{ record.cancelled }}
</td>
<td>
<a href='form-events-Events?id={{ record.id }}'>
<a href='{{servlet-context}}/form-events-Events?id={{ record.id }}'>
View
</a>
</td>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File list-followupactions-Followupactions.html generated 2018-07-07T08:09:49.971Z by adl.to-selmer-templates.
<!-- File list-followupactions-Followupactions.html generated 2018-07-09T20:55:34.544Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -28,7 +28,7 @@ Next
</div>
{% ifmemberof admin %}
<div class='big-link-container'>
<a href='form-followupactions-Followupaction' class='big-link'>
<a href='{{servlet-context}}/form-followupactions-Followupaction' class='big-link'>
Add a new Followupaction
</a>
</div>
@ -97,12 +97,12 @@ Closed
{{ record.id }}
</td>
<td>
<a href='form-followuprequests-Followuprequest?id={{ record.request_id }}'>
<a href='{{servlet-context}}/form-followuprequests-Followuprequest?id={{ record.request_id }}'>
{{ record.request_id_expanded }}
</a>
</td>
<td>
<a href='form-canvassers-Canvasser?id={{ record.actor }}'>
<a href='{{servlet-context}}/form-canvassers-Canvasser?id={{ record.actor }}'>
{{ record.actor_expanded }}
</a>
</td>
@ -116,7 +116,7 @@ Closed
{{ record.closed }}
</td>
<td>
<a href='form-followupactions-Followupaction?id={{ record.id }}'>
<a href='{{servlet-context}}/form-followupactions-Followupaction?id={{ record.id }}'>
View
</a>
</td>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File list-followupmethods-Followupmethods.html generated 2018-07-07T08:09:49.939Z by adl.to-selmer-templates.
<!-- File list-followupmethods-Followupmethods.html generated 2018-07-09T20:55:34.524Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -28,7 +28,7 @@ Next
</div>
{% ifmemberof admin %}
<div class='big-link-container'>
<a href='form-followupmethods-Followupmethod' class='big-link'>
<a href='{{servlet-context}}/form-followupmethods-Followupmethod' class='big-link'>
Add a new Followupmethod
</a>
</div>
@ -67,7 +67,7 @@ Id
{{ record.id }}
</td>
<td>
<a href='form-followupmethods-Followupmethod?id={{ record.id }}'>
<a href='{{servlet-context}}/form-followupmethods-Followupmethod?id={{ record.id }}'>
View
</a>
</td>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File list-followuprequests-Followuprequests.html generated 2018-07-07T08:09:49.920Z by adl.to-selmer-templates.
<!-- File list-followuprequests-Followuprequests.html generated 2018-07-09T20:55:34.506Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -28,7 +28,7 @@ Next
</div>
{% ifmemberof admin %}
<div class='big-link-container'>
<a href='form-followuprequests-Followuprequest' class='big-link'>
<a href='{{servlet-context}}/form-followuprequests-Followuprequest' class='big-link'>
Add a new Followuprequest
</a>
</div>
@ -91,27 +91,27 @@ Method_id
{{ record.id }}
</td>
<td>
<a href='form-electors-Elector?id={{ record.elector_id }}'>
<a href='{{servlet-context}}/form-electors-Elector?id={{ record.elector_id }}'>
{{ record.elector_id_expanded }}
</a>
</td>
<td>
<a href='form-visits-Visit?id={{ record.visit_id }}'>
<a href='{{servlet-context}}/form-visits-Visit?id={{ record.visit_id }}'>
{{ record.visit_id_expanded }}
</a>
</td>
<td>
<a href='form-issues-Issue?id={{ record.issue_id }}'>
<a href='{{servlet-context}}/form-issues-Issue?id={{ record.issue_id }}'>
{{ record.issue_id_expanded }}
</a>
</td>
<td>
<a href='form-followupmethods-Followupmethod?id={{ record.method_id }}'>
<a href='{{servlet-context}}/form-followupmethods-Followupmethod?id={{ record.method_id }}'>
{{ record.method_id_expanded }}
</a>
</td>
<td>
<a href='form-followuprequests-Followuprequest?id={{ record.id }}'>
<a href='{{servlet-context}}/form-followuprequests-Followuprequest?id={{ record.id }}'>
View
</a>
</td>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File list-genders-Genders.html generated 2018-07-07T08:09:49.914Z by adl.to-selmer-templates.
<!-- File list-genders-Genders.html generated 2018-07-09T20:55:34.500Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -28,7 +28,7 @@ Next
</div>
{% ifmemberof admin %}
<div class='big-link-container'>
<a href='form-genders-Gender' class='big-link'>
<a href='{{servlet-context}}/form-genders-Gender' class='big-link'>
Add a new Gender
</a>
</div>
@ -67,7 +67,7 @@ Id
{{ record.id }}
</td>
<td>
<a href='form-genders-Gender?id={{ record.id }}'>
<a href='{{servlet-context}}/form-genders-Gender?id={{ record.id }}'>
View
</a>
</td>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File list-intentions-Intentions.html generated 2018-07-07T08:09:49.975Z by adl.to-selmer-templates.
<!-- File list-intentions-Intentions.html generated 2018-07-09T20:55:34.548Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -28,7 +28,7 @@ Next
</div>
{% ifmemberof admin %}
<div class='big-link-container'>
<a href='form-intentions-Intention' class='big-link'>
<a href='{{servlet-context}}/form-intentions-Intention' class='big-link'>
Add a new Intention
</a>
</div>
@ -82,17 +82,17 @@ Locality
{% for record in records %}
<tr>
<td>
<a href='form-visits-Visit?id={{ record.visit_id }}'>
<a href='{{servlet-context}}/form-visits-Visit?id={{ record.visit_id }}'>
{{ record.visit_id_expanded }}
</a>
</td>
<td>
<a href='form-electors-Elector?id={{ record.elector_id }}'>
<a href='{{servlet-context}}/form-electors-Elector?id={{ record.elector_id }}'>
{{ record.elector_id_expanded }}
</a>
</td>
<td>
<a href='form-options-Option?id={{ record.option_id }}'>
<a href='{{servlet-context}}/form-options-Option?id={{ record.option_id }}'>
{{ record.option_id_expanded }}
</a>
</td>
@ -100,7 +100,7 @@ Locality
{{ record.locality }}
</td>
<td>
<a href='form-intentions-Intention?id={{ record.id }}'>
<a href='{{servlet-context}}/form-intentions-Intention?id={{ record.id }}'>
View
</a>
</td>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File list-issues-Issues.html generated 2018-07-07T08:09:49.966Z by adl.to-selmer-templates.
<!-- File list-issues-Issues.html generated 2018-07-09T20:55:34.541Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -28,7 +28,7 @@ Next
</div>
{% ifmemberof issueeditors admin %}
<div class='big-link-container'>
<a href='form-issues-Issue' class='big-link'>
<a href='{{servlet-context}}/form-issues-Issue' class='big-link'>
Add a new Issue
</a>
</div>
@ -94,7 +94,7 @@ Brief
{{ record.brief }}
</td>
<td>
<a href='form-issues-Issue?id={{ record.id }}'>
<a href='{{servlet-context}}/form-issues-Issue?id={{ record.id }}'>
View
</a>
</td>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File list-options-Options.html generated 2018-07-07T08:09:49.921Z by adl.to-selmer-templates.
<!-- File list-options-Options.html generated 2018-07-09T20:55:34.507Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -28,7 +28,7 @@ Next
</div>
{% ifmemberof admin %}
<div class='big-link-container'>
<a href='form-options-Option' class='big-link'>
<a href='{{servlet-context}}/form-options-Option' class='big-link'>
Add a new Option
</a>
</div>
@ -67,7 +67,7 @@ Id
{{ record.id }}
</td>
<td>
<a href='form-options-Option?id={{ record.id }}'>
<a href='{{servlet-context}}/form-options-Option?id={{ record.id }}'>
View
</a>
</td>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File list-roles-Roles.html generated 2018-07-07T08:09:49.939Z by adl.to-selmer-templates.
<!-- File list-roles-Roles.html generated 2018-07-09T20:55:34.523Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -28,7 +28,7 @@ Next
</div>
{% ifmemberof admin %}
<div class='big-link-container'>
<a href='form-roles-Role' class='big-link'>
<a href='{{servlet-context}}/form-roles-Role' class='big-link'>
Add a new Role
</a>
</div>
@ -76,7 +76,7 @@ Name
{{ record.name }}
</td>
<td>
<a href='form-roles-Role?id={{ record.id }}'>
<a href='{{servlet-context}}/form-roles-Role?id={{ record.id }}'>
View
</a>
</td>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File list-teams-Teams.html generated 2018-07-07T08:09:49.917Z by adl.to-selmer-templates.
<!-- File list-teams-Teams.html generated 2018-07-09T20:55:34.504Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -28,7 +28,7 @@ Next
</div>
{% ifmemberof teamorganisers admin teamorganisers admin %}
<div class='big-link-container'>
<a href='form-teams-Team' class='big-link'>
<a href='{{servlet-context}}/form-teams-Team' class='big-link'>
Add a new Team
</a>
</div>
@ -94,7 +94,7 @@ Longitude
{{ record.name }}
</td>
<td>
<a href='form-districts-District?id={{ record.district_id }}'>
<a href='{{servlet-context}}/form-districts-District?id={{ record.district_id }}'>
{{ record.district_id_expanded }}
</a>
</td>
@ -105,7 +105,7 @@ Longitude
{{ record.longitude }}
</td>
<td>
<a href='form-teams-Team?id={{ record.id }}'>
<a href='{{servlet-context}}/form-teams-Team?id={{ record.id }}'>
View
</a>
</td>

View file

@ -1,5 +1,5 @@
{% extends "base.html" %}
<!-- File list-visits-Visits.html generated 2018-07-07T08:09:49.916Z by adl.to-selmer-templates.
<!-- File list-visits-Visits.html generated 2018-07-09T20:55:34.502Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
@ -28,7 +28,7 @@ Next
</div>
{% ifmemberof admin %}
<div class='big-link-container'>
<a href='form-visits-Visit' class='big-link'>
<a href='{{servlet-context}}/form-visits-Visit' class='big-link'>
Add a new Visit
</a>
</div>
@ -85,12 +85,12 @@ Date
{{ record.id }}
</td>
<td>
<a href='form-addresses-Address?id={{ record.address_id }}'>
<a href='{{servlet-context}}/form-addresses-Address?id={{ record.address_id }}'>
{{ record.address_id_expanded }}
</a>
</td>
<td>
<a href='form-canvassers-Canvasser?id={{ record.canvasser_id }}'>
<a href='{{servlet-context}}/form-canvassers-Canvasser?id={{ record.canvasser_id }}'>
{{ record.canvasser_id_expanded }}
</a>
</td>
@ -98,7 +98,7 @@ Date
{{ record.date }}
</td>
<td>
<a href='form-visits-Visit?id={{ record.id }}'>
<a href='{{servlet-context}}/form-visits-Visit?id={{ record.id }}'>
View
</a>
</td>

View file

@ -23,20 +23,19 @@
{% block top %}
<header>
<div id="nav">
<img id="nav-icon" src="img/threelines.png" alt="Menu"/>
<img id="nav-icon" src="{{servlet-context}}/img/threelines.png" alt="Menu"/>
<menu id="nav-menu" class="nav">
<li class=""><a href="home">Home</a></li>
<li class=""><a href="library">Library</a></li>
<li class=""><a href="register">Register</a></li>
<li class="">{% if user %}<a href="logout">Logout</a>
{% else %}<a href="login">Login</a>{% endif %}</li>
<li class=""><a href="about">About</a></li>
<li class=""><a href="{{servlet-context}}/home">Home</a></li>
<li class=""><a href="{{servlet-context}}/library">Library</a></li>
<li class=""><a href="{{servlet-context}}/register">Register</a></li>
<li class="">{% if user %}<a href="{{servlet-context}}/logout">Logout</a>
{% else %}<a href="{{servlet-context}}/login">Login</a>{% endif %}</li>
<li class=""><a href="{{servlet-context}}/about">About</a></li>
{% if user %}
<li id="user"><a href="profile">Logged in as {{user.username}}</a></li>
<li id="user"><a href="{{servlet-context}}/profile">Logged in as {{user.username}}</a></li>
{% endif %}
</menu>
</div>
<!-- img id="site-logo" src="{{site-logo}}" alt="{{site-title}}" width="64" height="64"/ -->
<h1>{{title}}</h1>
{% if message|not-empty %}
<div class="message">
@ -71,16 +70,16 @@
<footer>
<div id="credits">
<div>
<img src="img/credits/ric-logo.png" width="24" height="24"/>
<img src="{{servlet-context}}/img/credits/ric-logo.png" width="24" height="24"/>
A project of the
<a href="https://radical.scot/">Radical Independence Campaign</a> ||
Version {{version}}
</div>
<div>
<img height="16" width="16" alt="Clojure" src="img/credits/luminus-logo.png"/>Built with <a href="http://www.luminusweb.net/">LuminusWeb</a> ||
<img height="16" width="16" alt="Clojure" src="img/credits/clojure-icon.gif"/> Powered by <a href="http://clojure.org">Clojure</a> ||
<img height="16" width="16" alt="GitHub" src="img/credits/github-logo-transparent.png"/>Find me/fork me on <a href="https://github.com/simon-brooke/smeagol">Github</a> ||
<img height="16" width="16" alt="Free Software Foundation" src="img/credits/gnu.small.png"/>Licensed under the <a href="http://www.gnu.org/licenses/gpl-2.0.html">GNU General Public License version 2.0</a>
<img height="16" width="16" alt="Clojure" src="{{servlet-context}}/img/credits/luminus-logo.png"/>Built with <a href="http://www.luminusweb.net/">LuminusWeb</a> ||
<img height="16" width="16" alt="Clojure" src="{{servlet-context}}/img/credits/clojure-icon.gif"/> Powered by <a href="http://clojure.org">Clojure</a> ||
<img height="16" width="16" alt="GitHub" src="{{servlet-context}}/img/credits/github-logo-transparent.png"/>Find me/fork me on <a href="https://github.com/simon-brooke/smeagol">Github</a> ||
<img height="16" width="16" alt="Free Software Foundation" src="{{servlet-context}}/img/credits/gnu.small.png"/>Licensed under the <a href="http://www.gnu.org/licenses/gpl-2.0.html">GNU General Public License version 2.0</a>
</div>
</div>
</footer>

View file

@ -0,0 +1,55 @@
{% extends "base.html" %}
<!-- File form-followupmethods-Followupmethod.html generated 2018-07-09T16:38:56.477Z by adl.to-selmer-templates.
See [Application Description Language](https://github.com/simon-brooke/adl).-->
{% block extra-head %}
{% endblock %}
{% block content %}
<div id='content' class='edit'>
<form action='{{servlet-context}}/form-followupmethods-Followupmethod' method='POST'>
{% csrf-field %}
<p class='widget'>
<label for='id'>
Id
</label>
{% ifmemberof admin %}
<input id='id' name='id' type='string' value='{{record.id}}' maxlength='' size='16'/>
{% else %}
{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
<span id='id' name='id' class='pseudo-widget disabled'>
{{record.id}}
</span>
{% else %}
<span id='id' name='id' class='pseudo-widget not-authorised'>
You are not permitted to view id of followupmethods
</span>
{% endifmemberof %}
{% endifmemberof %}
</p>
{% ifmemberof admin %}
<p class='widget action-safe'>
<label for='save-button' class='action-safe'>
To save this followupmethods record
</label>
<input id='save-button' name='save-button' class='action-safe' type='submit' value='Save!'/>
</p>
{% endifmemberof %}
{% ifmemberof admin %}
<p class='widget action-dangerous'>
<label for='delete-button' class='action-dangerous'>
To delete this followupmethods record
</label>
<input id='delete-button' name='delete-button' class='action-dangerous' type='submit' value='Delete!'/>
</p>
{% endifmemberof %}
</form>
</div>
{% endblock %}
{% block extra-tail %}
<script type='text/javascript'>
</script>
{% endblock %}

View file

@ -0,0 +1,9 @@
{% extends "base.html" %}
{% block big-links %}
<div class="big-link-container">
<a href="{{servlet-context}}/profile" class="big-link" id="profile-link">Your&nbsp;profile</a>
</div>
<div class="big-link-container">
<a href="{{servlet-context}}/app" class="big-link" id="app-link">App</a>
</div>
{% endblock %}

View file

View file

@ -10,10 +10,11 @@
[youyesyet.layout :refer [error-page]]
[youyesyet.middleware :as middleware]
[youyesyet.routes.home :refer [home-routes]]
[youyesyet.routes.oauth :refer [oauth-routes]]
[youyesyet.routes.auto-json :refer [auto-rest-routes]]
[youyesyet.routes.auto :refer [auto-selmer-routes]]
[youyesyet.routes.auto-json :refer [auto-rest-routes]]
[youyesyet.routes.issue-experts :refer [issue-expert-routes]]
[youyesyet.routes.rest :refer [rest-routes]]
[youyesyet.routes.oauth :refer [oauth-routes]]
[youyesyet.routes.roles :refer [roles-routes]]
[youyesyet.routes.services :refer [service-routes]]
[youyesyet.env :refer [defaults]]))
@ -72,6 +73,9 @@
(-> #'roles-routes
(wrap-routes middleware/wrap-csrf)
(wrap-routes middleware/wrap-formats))
(-> #'issue-expert-routes
(wrap-routes middleware/wrap-csrf)
(wrap-routes middleware/wrap-formats))
(-> #'auto-rest-routes
(wrap-routes middleware/wrap-csrf)
(wrap-routes middleware/wrap-formats))

View file

@ -1,6 +1,6 @@
(ns
youyesyet.routes.auto
"User interface routes for Youyesyet auto-generated by [Application Description Language framework](https://github.com/simon-brooke/adl) at 20180707T080949.557Z"
"User interface routes for Youyesyet auto-generated by [Application Description Language framework](https://github.com/simon-brooke/adl) at 20180709T205534.030Z"
(:require
[adl-support.core :as support]
[clojure.java.io :as io]
@ -176,7 +176,8 @@
{:electors (db/list-electors db/*db*)}
{:addresses (db/list-addresses db/*db*)}
{:authorities (db/list-authorities db/*db*)}
{:roles (db/list-roles db/*db*)}))))))
{:roles (db/list-roles db/*db*)}
{:issues (db/list-issues db/*db*)}))))))
(defn
list-districts-Districts
@ -689,7 +690,7 @@
(empty? (remove nil? (vals p)))
[]
(db/get-issue db/*db* p))})
(list))))))
(list {:canvassers (db/list-canvassers db/*db*)}))))))
(defn
list-options-Options

View file

@ -1,6 +1,6 @@
(ns
youyesyet.routes.auto-json
"JSON routes for youyesyet auto-generated by [Application Description Language framework](https://github.com/simon-brooke/adl) at 20180707T080948.404Z"
"JSON routes for youyesyet auto-generated by [Application Description Language framework](https://github.com/simon-brooke/adl) at 20180709T205532.861Z"
(:require
[adl-support.core :as support]
[clojure.core.memoize :as memo]
@ -675,6 +675,11 @@
[{:keys [params]}]
(do (db/list-canvassers-by-elector params)))
(defn
list-canvassers-by-issue
[{:keys [params]}]
(do (db/list-canvassers-by-issue params)))
(defn
list-canvassers-by-role
[{:keys [params]}]
@ -879,6 +884,11 @@
:ttl/threshold
1000000))
(defn
list-issues-by-canvasser
[{:keys [params]}]
(do (db/list-issues-by-canvasser params)))
(def
list-options
(memo/ttl
@ -1587,6 +1597,10 @@
"/json/auto/list-canvassers-by-elector"
request
(route/restricted (list-canvassers-by-elector request)))
(GET
"/json/auto/list-canvassers-by-issue"
request
(route/restricted (list-canvassers-by-issue request)))
(GET
"/json/auto/list-canvassers-by-role"
request
@ -1683,6 +1697,10 @@
"/json/auto/list-issues"
request
(route/restricted (list-issues request)))
(GET
"/json/auto/list-issues-by-canvasser"
request
(route/restricted (list-issues-by-canvasser request)))
(GET
"/json/auto/list-options"
request

View file

@ -0,0 +1,68 @@
(ns ^{:doc "Routes/pages available to issue experts."
:author "Simon Brooke"} youyesyet.routes.issue-experts
(:require [adl-support.utils :refer [safe-name]]
[clojure.java.io :as io]
[clojure.string :as s]
[clojure.tools.logging :as log]
[clojure.walk :refer [keywordize-keys]]
[markdown.core :refer [md-to-html-string]]
[noir.util.route :as route]
[ring.util.http-response :as response]
[youyesyet.config :refer [env]]
[youyesyet.db.core :as db]
[youyesyet.layout :as layout]
[youyesyet.oauth :as oauth]
[compojure.core :refer [defroutes GET POST]]
))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;
;;;; youyesyet.routes.home: routes and pages for issue experts.
;;;;
;;;; This program is free software; you can redistribute it and/or
;;;; modify it under the terms of the GNU General Public License
;;;; as published by the Free Software Foundation; either version 2
;;;; of the License, or (at your option) any later version.
;;;;
;;;; This program is distributed in the hope that it will be useful,
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;;; GNU General Public License for more details.
;;;;
;;;; You should have received a copy of the GNU General Public License
;;;; along with this program; if not, write to the Free Software
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
;;;; USA.
;;;;
;;;; Copyright (C) 2016 Simon Brooke for Radical Independence Campaign
;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn list-page [request]
(layout/render
"auto/list-followuprequests-Followuprequests.html"
(:session request)
(let [user (:user (:session request))]
{:title "Open requests"
:user user
:records (db/list-open-requests db/*db* {:expert (:id user)})})))
(defn followup-request-page [request]
(layout/render
"issue-expert/request.html"
(:session request)
{:title "Open requests"
:user (:user (:session request))
:request (db/get-followuprequest
db/*db*
{:id (:id (keywordize-keys (:params request)))})}))
(defroutes issue-expert-routes
(GET "/issue-expert/list" request
(route/restricted (list-page request)))
(GET "/issue-expert/followup-request" request
(route/restricted (followup-request-page request)))
(POST "/issue-expert/followup-request" request
(route/restricted (followup-request-page request))))

View file

@ -1,6 +1,7 @@
(ns ^{:doc "Routes/pages available to authenticated users in specific roles."
:author "Simon Brooke"} youyesyet.routes.roles
(:require [adl-support.utils :refer [safe-name]]
(:require [adl-support.core :as support]
[adl-support.utils :refer [safe-name]]
[clojure.tools.logging :as log]
[clojure.walk :refer [keywordize-keys]]
[compojure.core :refer [defroutes GET POST]]
@ -8,6 +9,7 @@
[ring.util.http-response :as response]
[youyesyet.config :refer [env]]
[youyesyet.db.core :as db-core]
[youyesyet.routes.issue-experts :as expert]
[youyesyet.layout :as layout]
[youyesyet.oauth :as oauth]
[youyesyet.routes.auto :as auto]))
@ -34,7 +36,10 @@
(defn admins-page
[request]
(response/found "/admin"))
(layout/render
(support/resolve-template "application-index.html")
(:session request)
{:title "Administrative menu"}))
(defn analysts-page
@ -42,7 +47,10 @@
some other geographical information system; so there isn't a need to put
anything sophisticated here."
[request]
(response/found "/admin"))
(layout/render
(support/resolve-template "application-index.html")
(:session request)
{:title "Administrative menu"}))
(defn canvassers-page
@ -50,22 +58,17 @@
(layout/render "roles/canvasser.html" request {}))
(defn issue-experts-page
[request]
(layout/render "roles/issue-experts.html" request {}))
(defn team-organisers-page
[request]
(layout/render "roles/team-orgenisers.html" request {}))
(defroutes roles-routes
(GET "/roles/admins" [request] (route/restricted (admins-page request)))
(GET "/roles/analysts" [request] (route/restricted (analysts-page request)))
(GET "/roles/canvassers" [request] (route/restricted (canvassers-page request)))
(GET "/roles/issue_editors" [request] (route/restricted (auto/list-issues-Issues request)))
(GET "/roles/issue_experts" [request] (route/restricted (issue-experts-page request)))
(GET "/roles/team_organisers" [request] (route/restricted (auto/list-teams-Teams request)))
(GET "/roles/admin" request (route/restricted (admins-page request)))
(GET "/roles/analysts" request (route/restricted (analysts-page request)))
(GET "/roles/canvassers" request (route/restricted (canvassers-page request)))
(GET "/roles/issue_editors" request (route/restricted (auto/list-issues-Issues request)))
(GET "/roles/issue_experts" request (route/restricted (expert/list-page request)))
(GET "/roles/team_organisers" request (route/restricted (auto/list-teams-Teams request)))
(GET "/roles" request (route/restricted (roles-page request))))

View file

@ -10,6 +10,7 @@
[re-frame.core :as rf]
[secretary.core :as secretary]
[youyesyet.canvasser-app.ajax :refer [load-interceptors!]]
[youyesyet.canvasser-app.gis :refer [get-current-location]]
[youyesyet.canvasser-app.handlers :as h]
[youyesyet.canvasser-app.subscriptions]
[youyesyet.canvasser-app.ui-utils :as ui]
@ -74,14 +75,18 @@
(defn issue-page []
(issue/panel))
(defn issue-experts-page []
(expert/panel))
(defn map-page []
(maps/panel))
(def pages
{:about #'about-page
:building #'building-page
:elector #'elector-page
:dwelling #'dwelling-page
:elector #'elector-page
:expert #'expert
:followup #'followup-page
:gdpr #'gdpr-page
:issues #'issues-page
@ -191,7 +196,7 @@
(defn init! []
(rf/dispatch-sync [:initialize-db])
(h/get-current-location)
(get-current-location)
(rf/dispatch [:fetch-locality])
(rf/dispatch [:fetch-options])
(rf/dispatch [:fetch-issues])

View file

@ -0,0 +1,139 @@
(ns ^{:doc "Canvasser app map stuff."
:author "Simon Brooke"}
youyesyet.canvasser-app.gis
(:require [cljs.reader :refer [read-string]]
[cemerick.url :refer (url url-encode)]
[day8.re-frame.http-fx]
[re-frame.core :refer [dispatch reg-event-db reg-event-fx subscribe]]
[ajax.core :refer [GET]]
[ajax.json :refer [json-request-format json-response-format]]
[youyesyet.canvasser-app.state :as db]
))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;
;;;; youyesyet.canvasser-app.gis: stuff to do with maps.
;;;;
;;;; This program is free software; you can redistribute it and/or
;;;; modify it under the terms of the GNU General Public License
;;;; as published by the Free Software Foundation; either version 2
;;;; of the License, or (at your option) any later version.
;;;;
;;;; This program is distributed in the hope that it will be useful,
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;;; GNU General Public License for more details.
;;;;
;;;; You should have received a copy of the GNU General Public License
;;;; along with this program; if not, write to the Free Software
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
;;;; USA.
;;;;
;;;; Copyright (C) 2016 Simon Brooke for Radical Independence Campaign
;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; map stuff. If we do this in canvasser-app.views.map we get circular
;; references, so do it here.
(defn get-current-location []
"Get the current location from the device."
(try
(if (.-geolocation js/navigator)
(.getCurrentPosition
(.-geolocation js/navigator)
(fn [position]
(js/console.log (str "Current location is: "
(.-latitude (.-coords position)) ", "
(.-longitude (.-coords position))))
(dispatch [:set-latitude (.-latitude (.-coords position))])
(dispatch [:set-longitude (.-longitude (.-coords position))])))
(js/console.log "Geolocation not available"))
(catch js/Object any
(js/console.log "Exception while trying to access location: " + any))))
(defn pin-image
"select the name of a suitable pin image for this address"
[address]
(let [intentions
(set
(remove
nil?
(map
:intention
(mapcat :electors
(:dwellings address)))))]
(case (count intentions)
0 "unknown-pin"
1 (str (name (first intentions)) "-pin")
"mixed-pin")))
(defn map-pin-click-handler
"On clicking on the pin, navigate to the electors at the address.
This way of doing it adds an antry in the browser location history,
so back links work."
[id]
(js/console.log (str "Click handler for address #" id))
(let [view @(subscribe [:view])
centre (.getCenter view)]
(dispatch [:set-zoom (.getZoom view)])
(dispatch [:set-latitude (.-lat centre)])
(dispatch [:set-longitude (.-lng centre)]))
(set! window.location.href (str "#building/" id)))
(defn add-map-pin
"Add a map-pin at this address in this map view"
[address view]
(let [lat (:latitude address)
lng (:longitude address)
pin (.icon js/L
(clj->js
{:iconAnchor [16 41]
:iconSize [32 42]
:iconUrl (str "img/map-pins/" (pin-image address) ".png")
:riseOnHover true
:shadowAnchor [16 23]
:shadowSize [57 24]
:shadowUrl "img/map-pins/shadow_pin.png"}))
marker (.marker js/L
(.latLng js/L lat lng)
(clj->js {:icon pin
:title (:address address)}))]
(.on (.addTo marker view) "click" (fn [_] (map-pin-click-handler (str (:id address)))))
marker))
(defn map-remove-pins
"Remove all pins from this map `view`. Side-effecty; liable to be problematic."
[view]
(if
view
(.eachLayer
view
(fn [layer]
(try
(if
(instance? js/L.Marker layer)
(.removeLayer view layer))
(catch js/Object any (js/console.log (str "Failed to remove pin '" layer "' from map: " any)))))))
view)
(defn refresh-map-pins
"Refresh the map pins on this map. Side-effecty; liable to be problematic."
[]
(let [view (map-remove-pins @(subscribe [:view]))
addresses @(subscribe [:addresses])]
(if
view
(do
(js/console.log (str "Adding " (count addresses) " pins"))
(doall (map #(add-map-pin % view) addresses)))
(js/console.log "View is not yet ready"))
view))

View file

@ -7,12 +7,13 @@
[re-frame.core :refer [dispatch reg-event-db reg-event-fx subscribe]]
[ajax.core :refer [GET]]
[ajax.json :refer [json-request-format json-response-format]]
[youyesyet.canvasser-app.gis :refer [refresh-map-pins get-current-location]]
[youyesyet.canvasser-app.state :as db]
))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;
;;;; youyesyet.handlers: handlers for events.
;;;; youyesyet.canvasser-app.handlers: event handlers.
;;;;
;;;; This program is free software; you can redistribute it and/or
;;;; modify it under the terms of the GNU General Public License
@ -101,113 +102,12 @@
(:electors state) "'")))))
;; map stuff. If we do this in canvasser-app.views.map we get circular
;; references, so do it here.
(defn pin-image
"select the name of a suitable pin image for this address"
[address]
(let [intentions
(set
(remove
nil?
(map
:intention
(mapcat :electors
(:dwellings address)))))]
(case (count intentions)
0 "unknown-pin"
1 (str (name (first intentions)) "-pin")
"mixed-pin")))
(defn map-pin-click-handler
"On clicking on the pin, navigate to the electors at the address.
This way of doing it adds an antry in the browser location history,
so back links work."
[id]
(js/console.log (str "Click handler for address #" id))
(let [view @(subscribe [:view])
centre (.getCenter view)]
(dispatch [:set-zoom (.getZoom view)])
(dispatch [:set-latitude (.-lat centre)])
(dispatch [:set-longitude (.-lng centre)]))
(set! window.location.href (str "#building/" id)))
(defn add-map-pin
"Add a map-pin at this address in this map view"
[address view]
(let [lat (:latitude address)
lng (:longitude address)
pin (.icon js/L
(clj->js
{:iconAnchor [16 41]
:iconSize [32 42]
:iconUrl (str "img/map-pins/" (pin-image address) ".png")
:riseOnHover true
:shadowAnchor [16 23]
:shadowSize [57 24]
:shadowUrl "img/map-pins/shadow_pin.png"}))
marker (.marker js/L
(.latLng js/L lat lng)
(clj->js {:icon pin
:title (:address address)}))]
(.on (.addTo marker view) "click" (fn [_] (map-pin-click-handler (str (:id address)))))
marker))
(defn map-remove-pins
"Remove all pins from this map `view`. Side-effecty; liable to be problematic."
[view]
(if
view
(.eachLayer
view
(fn [layer]
(try
(if
(instance? js/L.Marker layer)
(.removeLayer view layer))
(catch js/Object any (js/console.log (str "Failed to remove pin '" layer "' from map: " any)))))))
view)
(defn refresh-map-pins
"Refresh the map pins on this map. Side-effecty; liable to be problematic."
[]
(let [view (map-remove-pins @(subscribe [:view]))
addresses @(subscribe [:addresses])]
(if
view
(do
(js/console.log (str "Adding " (count addresses) " pins"))
(doall (map #(add-map-pin % view) addresses)))
(js/console.log "View is not yet ready"))
view))
(reg-event-db
:initialize-db
(fn [_ _]
db/default-db))
(defn get-current-location []
"Get the current location from the device."
(try
(if (.-geolocation js/navigator)
(.getCurrentPosition
(.-geolocation js/navigator)
(fn [position]
(js/console.log "Current location is: " + position)
(dispatch [:set-latitude (.-latitude (.-coords position))])
(dispatch [:set-longitude (.-longitude (.-coords position))])))
(js/console.log "Geolocation not available"))
(catch js/Object any
(js/console.log "Exception while trying to access location: " + any))))
;; (reg-event-fx
;; :feedback
;; (fn [x y]
@ -254,11 +154,21 @@
:db (add-to-feedback db :fetch-locality)}))
(reg-event-db
:get-current-location
(fn [db _]
(js/console.log "Updating current location")
(assoc db :froboz (get-current-location))))
(reg-event-db
:process-locality
(fn
[db [_ response]]
(js/console.log "Updating locality data")
;; loop to do it again
(dispatch [:dispatch-later [{:ms 5000 :dispatch [:fetch-locality]}
{:ms 1000 :dispatch [:get-current-location]}]])
(assoc
(remove-from-feedback db :fetch-locality)
(refresh-map-pins)
@ -270,6 +180,9 @@
(fn [db _]
;; TODO: signal something has failed? It doesn't matter very much, unless it keeps failing.
(js/console.log "Failed to fetch locality data")
;; loop to do it again
(dispatch [:dispatch-later [{:ms 60000 :dispatch [:fetch-locality]}
{:ms 1000 :dispatch [:get-current-location]}]])
(assoc
(remove-from-feedback db :fetch-locality)
:error (cons :fetch-locality (:error db)))))

View file

@ -3,7 +3,7 @@
youyesyet.canvasser-app.views.map
(:require [re-frame.core :refer [reg-sub subscribe dispatch dispatch-sync]]
[reagent.core :as reagent]
[youyesyet.canvasser-app.handlers :refer [get-current-location refresh-map-pins]]))
[youyesyet.canvasser-app.gis :refer [refresh-map-pins get-current-location]]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;
@ -28,7 +28,6 @@
;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; The pattern from the re-com demo (https://github.com/Day8/re-com) is to have
;;; one source file/namespace per view. Each namespace contains a function 'panel'
;;; whose output is an enlive-style specification of the view to be redered.

View file

@ -0,0 +1,5 @@
# Issue Expert app
The Issue Expert app is essentially a whole different app. I think it needs to be an app because it needs a much more slick UI than an old CRUD web system, but it's designed for use on desktop systems with large screens.
It comprises two views: a list of open followup requests, and a view to handle an individual request. The work flow is, pick a request from the list, obtain an exclusive lock on it,

View file

@ -0,0 +1,52 @@
(ns ^{:doc "Issue Expert app list panel."
:author "Simon Brooke"}
youyesyet.canvasser-app.views.issues
(:require [re-frame.core :refer [reg-sub subscribe]]
[youyesyet.canvasser-app.ui-utils :as ui]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;
;;;; youyesyet.canvasser-app.views.issues: working view for issue experts for youyesyet.
;;;;
;;;; This program is free software; you can redistribute it and/or
;;;; modify it under the terms of the GNU General Public License
;;;; as published by the Free Software Foundation; either version 2
;;;; of the License, or (at your option) any later version.
;;;;
;;;; This program is distributed in the hope that it will be useful,
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;;; GNU General Public License for more details.
;;;;
;;;; You should have received a copy of the GNU General Public License
;;;; along with this program; if not, write to the Free Software
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
;;;; USA.
;;;;
;;;; Copyright (C) 2016 Simon Brooke for Radical Independence Campaign
;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; The pattern from the re-com demo (https://github.com/Day8/re-com) is to have
;;; one source file/namespace per view. Each namespace contains a function 'panel'
;;; whose output is an enlive-style specification of the view to be redered.
;;; I propose to follow this pattern. This file will provide the issues view.
;;; TODO: This is, in essence, an enturely different app. It really ought to be
;;; in a separate project. But to get it working quickly, it's here for now.
;;; Simple list of the issues of the day.
(defn panel
"Generate the list panel."
[]
(let [issues @(subscribe [:issues])]
(if issues
[:div
[:h1 "Issues"]
[:div.container {:id "main-container"}
(ui/back-link)
[:div {:id "issue-list"}
(map (fn [i] (ui/big-link (:id i) :target (str "#issue/" (:id i)))) issues)]]]
(ui/error-panel "No issues loaded"))))

View file

@ -408,7 +408,7 @@ version="0.1.1">
the system.</documentation>
<key>
<property required="true" type="string" name="id" column="id"
size="32" distinct="all">
size="32" distinct="all" immutable="true">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>
@ -471,6 +471,7 @@ version="0.1.1">
<property type="text" name="brief">
<prompt prompt="Brief response to issue" locale="en-GB"/>
</property>
<property type="link" name="experts" entity="canvassers"/>
<list properties="listed" name="Issues">
<field property="id">
<prompt prompt="id" locale="en-GB"/>
@ -512,7 +513,7 @@ version="0.1.1">
<documentation>Intentions of electors to vote for options
elicited in visits.</documentation>
<key>
<property type="integer" distinct="system" required="true"
<property type="integer" distinct="system" required="true" immutable="true"
name="id">
<generator action="native"/>
</property>
@ -577,9 +578,7 @@ version="0.1.1">
</field>
</form>
</entity>
<!--
entity canvassers already has a key - not generating one
-->
<entity table="canvassers" name="canvassers" magnitude="5"
volatility="4">
<documentation>Primary users of the system: those actually
@ -635,6 +634,10 @@ version="0.1.1">
farkey="role_id">
<prompt prompt="Roles" locale="en-GB"/>
</property>
<property type="link" name="expertise" entity="issues">
<documentation>Only relevant to issue experts.</documentation>
<prompt prompt="Expertise" locale="en-GB"/>
</property>
<permission group="canvassers" permission="edit">
<documentation>But only their own record</documentation>
</permission>
@ -716,16 +719,14 @@ version="0.1.1">
<permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/>
</entity>
<!--
entity followuprequests already has a key - not generating one
-->
<entity table="followuprequests" name="followuprequests"
magnitude="7" volatility="2">
<documentation>Requests for a followup with an issue
expert</documentation>
<key>
<property required="true" type="integer" name="id"
column="id" distinct="system">
column="id" distinct="system" immutable="true">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>
@ -787,9 +788,7 @@ version="0.1.1">
<permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/>
</entity>
<!--
entity roles already has a key - not generating one
-->
<entity table="roles" name="roles" magnitude="1" volatility="7">
<documentation>A role (essentially, the same as a group, but
application layer rather than database layer) of which a user
@ -833,9 +832,7 @@ version="0.1.1">
<permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/>
</entity>
<!--
entity teams already has a key - not generating one
-->
<entity table="teams" name="teams" magnitude="4" volatility="4">
<key>
<property type="integer" name="id" column="id"
@ -951,13 +948,14 @@ version="0.1.1">
<permission permission="read" group="issueeditors"/>
<permission permission="all" group="admin"/>
</entity>
<entity name="events" table="events" magnitude="5">
<documentation>
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.
</documentation>
<key>
<property type="integer" distinct="system" required="true" name="id">
<property type="integer" distinct="system" required="true" name="id" immutable="true">
<generator action="native"/>
</property>
</key>
@ -1020,16 +1018,14 @@ version="0.1.1">
<permission group="issueeditors" permission="read"/>
<permission group="admin" permission="all"/>
</entity>
<!--
entity followupactions already has a key - not generating one
-->
<entity table="followupactions" name="followupactions"
magnitude="7" volatility="0">
<documentation>Actions taken on followup
requests.</documentation>
<key>
<property required="true" type="integer" name="id"
column="id" distinct="system">
column="id" distinct="system" immutable="true">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>
@ -1112,7 +1108,7 @@ version="0.1.1">
canvassed on</documentation>
<key>
<property required="true" type="string" name="id" column="id"
size="32" immutable="true" distinct="all">
size="32" distinct="all" immutable="true">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>

View file

@ -391,7 +391,7 @@
<documentation>Authorities which may authenticate canvassers to
the system.</documentation>
<key>
<property required="true" type="string" name="id" column="id" size="32" distinct="all">
<property required="true" type="string" name="id" column="id" size="32" distinct="all" immutable="true">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>
@ -450,6 +450,7 @@
<property type="text" name="brief">
<prompt prompt="Brief response to issue" locale="en-GB"/>
</property>
<property type="link" name="experts" entity="canvassers"/>
<list properties="listed" name="Issues">
<field property="id">
<prompt prompt="id" locale="en-GB"/>
@ -492,7 +493,7 @@
<documentation>Intentions of electors to vote for options
elicited in visits.</documentation>
<key>
<property type="integer" distinct="system" required="true" name="id">
<property type="integer" distinct="system" required="true" immutable="true" name="id">
<generator action="native"/>
</property>
</key>
@ -600,6 +601,10 @@
<property type="link" name="roles" entity="roles" farkey="role_id">
<prompt prompt="Roles" locale="en-GB"/>
</property>
<property type="link" name="expertise" entity="issues">
<documentation>Only relevant to issue experts.</documentation>
<prompt prompt="Expertise" locale="en-GB"/>
</property>
<permission group="canvassers" permission="edit">
<documentation>But only their own record</documentation>
</permission>
@ -688,7 +693,7 @@
<documentation>Requests for a followup with an issue
expert</documentation>
<key>
<property required="true" type="integer" name="id" column="id" distinct="system">
<property required="true" type="integer" name="id" column="id" distinct="system" immutable="true">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>
@ -913,7 +918,7 @@
May be a training event, a social event or a canvassing session.
</documentation>
<key>
<property type="integer" distinct="system" required="true" name="id">
<property type="integer" distinct="system" required="true" name="id" immutable="true">
<generator action="native"/>
</property>
</key>
@ -982,7 +987,7 @@
<documentation>Actions taken on followup
requests.</documentation>
<key>
<property required="true" type="integer" name="id" column="id" distinct="system">
<property required="true" type="integer" name="id" column="id" distinct="system" immutable="true">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>
@ -1058,7 +1063,7 @@
<documentation>Options in the election or referendum being
canvassed on</documentation>
<key>
<property required="true" type="string" name="id" column="id" size="32" immutable="true" distinct="all">
<property required="true" type="string" name="id" column="id" size="32" distinct="all" immutable="true">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>