Mainly, added the dwellings table, implied by the revised ERD.

Some other tidy up.
This commit is contained in:
Simon Brooke 2018-05-26 19:23:21 +01:00
parent 162274c23f
commit f86c5cffe6
8 changed files with 1258 additions and 274 deletions

View file

@ -14,7 +14,7 @@
viewBox="0 0 1052.3622 744.09448"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="entity-relationship-diagram.svg">
<defs
id="defs4" />
@ -32,7 +32,7 @@
inkscape:current-layer="layer1"
showgrid="true"
inkscape:window-width="1920"
inkscape:window-height="1058"
inkscape:window-height="1043"
inkscape:window-x="1920"
inkscape:window-y="0"
inkscape:window-maximized="1">
@ -66,27 +66,26 @@
y="312.36218" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="36.365494"
y="335.1539"
id="text4136"
sodipodi:linespacing="125%"><tspan
id="text4136"><tspan
sodipodi:role="line"
id="tspan4138"
x="36.365494"
y="335.1539" /></text>
y="335.1539"
style="font-size:20px;line-height:1.25"> </tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="117.1777"
y="360.40771"
id="text4140"
sodipodi:linespacing="125%"><tspan
id="text4140"><tspan
sodipodi:role="line"
id="tspan4142"
x="117.1777"
y="360.40771"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:Arial;-inkscape-font-specification:'Arial Bold'">YouYesYet: Entity Relationship Diagram</tspan></text>
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial Bold'">YouYesYet: Entity Relationship Diagram</tspan></text>
<rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.4000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4146"
@ -96,16 +95,15 @@
y="411.65665" />
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="230.18532"
y="441.65665"
id="text4148"
sodipodi:linespacing="125%"><tspan
id="text4148"><tspan
sodipodi:role="line"
id="tspan4150"
x="230.18532"
y="441.65665"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:Arial;-inkscape-font-specification:Arial">District</tspan></text>
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial">District</tspan></text>
<rect
y="533.88507"
x="220.18532"
@ -114,17 +112,16 @@
id="rect4152"
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.4000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
sodipodi:linespacing="125%"
id="text4154"
y="563.88513"
x="230.18532"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:Arial;-inkscape-font-specification:Arial"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial"
y="563.88513"
x="230.18532"
id="tspan4156"
sodipodi:role="line">Addresss</tspan></text>
sodipodi:role="line">Address</tspan></text>
<rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.4000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4158"
@ -134,16 +131,15 @@
y="653.08313" />
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="230.18532"
y="683.08313"
id="text4160"
sodipodi:linespacing="125%"><tspan
id="text4160"><tspan
sodipodi:role="line"
id="tspan4162"
x="230.18532"
y="683.08313"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:Arial;-inkscape-font-specification:Arial">Elector</tspan></text>
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial">Elector</tspan></text>
<rect
y="653.08313"
x="732.33264"
@ -152,13 +148,12 @@
id="rect4164"
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.4000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
sodipodi:linespacing="125%"
id="text4166"
y="683.08313"
x="742.33264"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:Arial;-inkscape-font-specification:Arial"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial"
y="683.08313"
x="742.33264"
id="tspan4168"
@ -166,14 +161,15 @@
<flowRoot
xml:space="preserve"
id="flowRoot4170"
style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:URW Chancery L;font-style:italic;font-weight:bold;font-size:20px;line-height:125%;letter-spacing:0px;word-spacing:0px;-inkscape-font-specification:URW Chancery L Bold Italic;font-stretch:normal;font-variant:normal"><flowRegion
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0.01%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"><flowRegion
id="flowRegion4172"><rect
id="rect4174"
width="150"
height="100"
x="20"
y="174.09448" /></flowRegion><flowPara
id="flowPara4176" /></flowRoot> <rect
id="flowPara4176"
style="font-size:20px;line-height:1.25"> </flowPara></flowRoot> <rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.4000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4178"
width="100"
@ -182,16 +178,15 @@
y="533.88507" />
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="742.33264"
y="563.88513"
id="text4180"
sodipodi:linespacing="125%"><tspan
id="text4180"><tspan
sodipodi:role="line"
id="tspan4182"
x="742.33264"
y="563.88513"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:Arial;-inkscape-font-specification:Arial">Authority</tspan></text>
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial">Authority</tspan></text>
<rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.4000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4184"
@ -201,16 +196,15 @@
y="533.88507" />
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="400.90109"
y="563.88513"
id="text4186"
sodipodi:linespacing="125%"><tspan
id="text4186"><tspan
sodipodi:role="line"
id="tspan4188"
x="400.90109"
y="563.88513"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:Arial;-inkscape-font-specification:Arial">Visit</tspan></text>
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial">Visit</tspan></text>
<rect
y="653.08313"
x="390.90109"
@ -219,13 +213,12 @@
id="rect4190"
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.4000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
sodipodi:linespacing="125%"
id="text4192"
y="683.08313"
x="400.90109"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:Arial;-inkscape-font-specification:Arial"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial"
y="683.08313"
x="400.90109"
id="tspan4194"
@ -239,20 +232,19 @@
y="775.31158" />
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="742.33264"
y="805.31158"
id="text4198"
sodipodi:linespacing="125%"><tspan
id="text4198"><tspan
sodipodi:role="line"
id="tspan4200"
x="742.33264"
y="805.31158"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:Arial;-inkscape-font-specification:Arial">Issue</tspan><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial">Issue</tspan><tspan
sodipodi:role="line"
x="742.33264"
y="824.06158"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:Arial;-inkscape-font-specification:Arial"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial"
id="tspan4208">Expertise</tspan></text>
<rect
y="898.55017"
@ -262,13 +254,12 @@
id="rect4202"
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.4000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
sodipodi:linespacing="125%"
id="text4204"
y="928.55017"
x="742.33264"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:Arial;-inkscape-font-specification:Arial"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial"
y="928.55017"
x="742.33264"
id="tspan4206"
@ -281,18 +272,17 @@
id="rect4221"
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.4000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
sodipodi:linespacing="125%"
id="text4223"
y="803.29126"
x="230.18532"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:Arial;-inkscape-font-specification:Arial"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial"
y="803.29126"
x="230.18532"
id="tspan4225"
sodipodi:role="line">Followup</tspan><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:Arial;-inkscape-font-specification:Arial"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial"
y="822.04126"
x="230.18532"
sodipodi:role="line"
@ -306,21 +296,20 @@
y="896.52985" />
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="230.18532"
y="926.52985"
id="text4231"
sodipodi:linespacing="125%"><tspan
id="text4231"><tspan
sodipodi:role="line"
id="tspan4233"
x="230.18532"
y="926.52985"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:Arial;-inkscape-font-specification:Arial">Followup</tspan><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial">Followup</tspan><tspan
id="tspan4235"
sodipodi:role="line"
x="230.18532"
y="945.27985"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:Arial;-inkscape-font-specification:Arial">Action</tspan></text>
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial">Action</tspan></text>
<g
id="g4243"
transform="translate(170.18532,29.294424)">
@ -528,13 +517,12 @@
id="rect4323"
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.4000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
sodipodi:linespacing="125%"
id="text4325"
y="683.08313"
x="570.60675"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:Arial;-inkscape-font-specification:Arial"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial"
y="683.08313"
x="570.60675"
id="tspan4327"
@ -602,37 +590,36 @@
sodipodi:nodetypes="ccc" />
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="472.0152"
y="394.48404"
id="text4361"
sodipodi:linespacing="125%"><tspan
id="text4361"><tspan
sodipodi:role="line"
id="tspan4363"
x="472.0152"
y="394.48404"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:Arial;-inkscape-font-specification:Arial"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial"><tspan
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:Arial;-inkscape-font-specification:'Arial Bold'"
id="tspan4371">Version: </tspan>0.2</tspan><tspan
sodipodi:role="line"
x="472.0152"
y="413.23404"
y="419.48404"
id="tspan4365"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:Arial;-inkscape-font-specification:Arial"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial"><tspan
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:Arial;-inkscape-font-specification:'Arial Bold'"
id="tspan4373">Date: </tspan>20170315</tspan><tspan
sodipodi:role="line"
x="472.0152"
y="431.98404"
y="444.48404"
id="tspan4367"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:Arial;-inkscape-font-specification:Arial"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial"><tspan
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:Arial;-inkscape-font-specification:'Arial Bold'"
id="tspan4375">Author: </tspan>Simon Brooke</tspan><tspan
sodipodi:role="line"
x="472.0152"
y="450.73404"
y="469.48404"
id="tspan4369"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;font-family:Arial;-inkscape-font-specification:Arial"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial"><tspan
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:Arial;-inkscape-font-specification:'Arial Bold'"
id="tspan4377">Copyright:</tspan> (c) 2016 Simon Brooke for Radical Independence Campaign</tspan></text>
<path
@ -653,11 +640,10 @@
inkscape:connector-curvature="0" />
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="670"
y="762.36218"
id="text4385"
sodipodi:linespacing="125%"><tspan
id="text4385"><tspan
sodipodi:role="line"
id="tspan4387"
x="670"
@ -665,11 +651,10 @@
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">Introduced</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="530"
y="498.31903"
id="text4389"
sodipodi:linespacing="125%"><tspan
id="text4389"><tspan
sodipodi:role="line"
id="tspan4391"
x="530"
@ -677,70 +662,64 @@
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">Visited</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;text-anchor:start;text-align:start;writing-mode:lr;"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="450"
y="632.36218"
id="text4393"
sodipodi:linespacing="125%"><tspan
id="text4393"><tspan
sodipodi:role="line"
id="tspan4395"
x="450"
y="632.36218"
style="-inkscape-font-specification:'Arial, Normal';font-family:Arial;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:10px;text-anchor:start;text-align:start;writing-mode:lr;line-height:125%;">Recorded</tspan></text>
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">Recorded</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="130"
y="392.36221"
id="text4397"
sodipodi:linespacing="125%"><tspan
id="text4397"><tspan
sodipodi:role="line"
id="tspan4399"
x="130"
y="392.36221"
style="-inkscape-font-specification:'Arial, Bold Italic';font-family:Arial;font-weight:bold;font-style:italic;font-stretch:normal;font-variant:normal;font-size:10px;text-anchor:start;text-align:start;writing-mode:lr;line-height:125%">Raised</tspan></text>
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Bold Italic';text-align:start;writing-mode:lr-tb;text-anchor:start">Raised</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="790"
y="622.36218"
id="text4401"
sodipodi:linespacing="125%"><tspan
id="text4401"><tspan
sodipodi:role="line"
id="tspan4403"
x="790"
y="622.36218"
style="-inkscape-font-specification:'Arial, Normal';font-family:Arial;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:10px;text-anchor:start;text-align:start;writing-mode:lr;line-height:125%">Authenticates</tspan></text>
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">Authenticates</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="790"
y="742.36218"
id="text4405"
sodipodi:linespacing="125%"><tspan
id="text4405"><tspan
sodipodi:role="line"
id="tspan4407"
x="790"
y="742.36218"
style="-inkscape-font-specification:'Arial, Normal';font-family:Arial;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:10px;text-anchor:start;text-align:start;writing-mode:lr;line-height:125%">Has</tspan></text>
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">Has</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="790"
y="862.36218"
id="text4409"
sodipodi:linespacing="125%"><tspan
id="text4409"><tspan
sodipodi:role="line"
id="tspan4411"
x="790"
y="862.36218"
style="-inkscape-font-specification:'Arial, Normal';font-family:Arial;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:10px;text-anchor:start;text-align:start;writing-mode:lr;line-height:125%">About</tspan></text>
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">About</tspan></text>
<text
sodipodi:linespacing="125%"
id="text4413"
y="780.53986"
x="337.45166"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
y="780.53986"
@ -749,88 +728,81 @@
sodipodi:role="line">About</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="280"
y="872.36218"
id="text4417"
sodipodi:linespacing="125%"><tspan
id="text4417"><tspan
sodipodi:role="line"
id="tspan4419"
x="280"
y="872.36218"
style="-inkscape-font-specification:'Arial, Normal';font-family:Arial;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:10px;text-anchor:start;text-align:start;writing-mode:lr;line-height:125%">Responded to</tspan></text>
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">Responded to</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="330"
y="702.36218"
id="text4421"
sodipodi:linespacing="125%"><tspan
id="text4421"><tspan
sodipodi:role="line"
id="tspan4423"
x="330"
y="702.36218"
style="-inkscape-font-specification:'Arial, Normal';font-family:Arial;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:10px;text-anchor:start;text-align:start;writing-mode:lr;line-height:125%">Expressed</tspan></text>
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">Expressed</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="280"
y="512.36218"
id="text4425"
sodipodi:linespacing="125%"><tspan
id="text4425"><tspan
sodipodi:role="line"
id="tspan4427"
x="280"
y="512.36218"
style="-inkscape-font-specification:'Arial, Normal';font-family:Arial;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:10px;text-anchor:start;text-align:start;writing-mode:lr;line-height:125%">Contains</tspan></text>
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">Contains</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="280"
y="632.36218"
id="text4429"
sodipodi:linespacing="125%"><tspan
id="text4429"><tspan
sodipodi:role="line"
id="tspan4431"
x="280"
y="632.36218"
style="-inkscape-font-specification:'Arial, Normal';font-family:Arial;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:10px;text-anchor:start;text-align:start;writing-mode:lr;line-height:125%">Resides at</tspan></text>
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">Resides at</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="280"
y="742.36218"
id="text4433"
sodipodi:linespacing="125%"><tspan
id="text4433"><tspan
sodipodi:role="line"
id="tspan4435"
x="280"
y="742.36218"
style="-inkscape-font-specification:'Arial, Normal';font-family:Arial;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:10px;text-anchor:start;text-align:start;writing-mode:lr;line-height:125%">Requested</tspan></text>
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">Requested</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="280"
y="1002.3622"
id="text4441"
sodipodi:linespacing="125%"><tspan
id="text4441"><tspan
sodipodi:role="line"
id="tspan4443"
x="280"
y="1002.3622"
style="-inkscape-font-specification:'Arial, Normal';font-family:Arial;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:10px;text-anchor:start;text-align:start;writing-mode:lr;line-height:125%">Performed</tspan></text>
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">Performed</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="340"
y="552.36218"
id="text4445"
sodipodi:linespacing="125%"><tspan
id="text4445"><tspan
sodipodi:role="line"
id="tspan4447"
x="340"
y="552.36218"
style="-inkscape-font-specification:'Arial, Normal';font-family:Arial;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:10px;text-anchor:start;text-align:start;writing-mode:lr;line-height:125%">To</tspan></text>
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">To</tspan></text>
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 810,722.36221 20,0"
@ -845,11 +817,10 @@
y="653.08313" />
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="908.88831"
y="682.36218"
id="text4285"
sodipodi:linespacing="125%"><tspan
id="text4285"><tspan
sodipodi:role="line"
id="tspan4287"
x="908.88831"
@ -871,47 +842,47 @@
y="773.29126" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:Arial;-inkscape-font-specification:Arial;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:Arial;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="920"
y="562.36218"
id="text4302"
sodipodi:linespacing="125%"><tspan
id="text4302"><tspan
sodipodi:role="line"
id="tspan4304"
x="920"
y="562.36218" /></text>
y="562.36218"
style="font-size:20px;line-height:1.25"> </tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="908.88831"
y="802.36218"
id="text4306"
sodipodi:linespacing="125%"><tspan
id="text4306"><tspan
sodipodi:role="line"
id="tspan4308"
x="908.88831"
y="802.36218"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Arial;-inkscape-font-specification:Arial">Organiser-</tspan><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial">Organiser-</tspan><tspan
sodipodi:role="line"
x="908.88831"
y="821.11218"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Arial;-inkscape-font-specification:Arial"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial"
id="tspan4310">ship</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="908.88831"
y="562.36218"
id="text4312"
sodipodi:linespacing="125%"><tspan
id="text4312"><tspan
sodipodi:role="line"
id="tspan4314"
x="908.88831"
y="562.36218">Team</tspan><tspan
y="562.36218"
style="font-size:15px;line-height:1.25">Team</tspan><tspan
sodipodi:role="line"
x="908.88831"
y="581.11218"
id="tspan4385">Membership</tspan></text>
id="tspan4385"
style="font-size:15px;line-height:1.25">Membership</tspan></text>
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 830,672.36221 40,0 0,-110 30,0"
@ -963,11 +934,10 @@
id="path4338"
inkscape:connector-curvature="0" />
<text
sodipodi:linespacing="125%"
id="text4340"
y="743.37231"
x="879.90356"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
y="743.37231"
@ -976,11 +946,10 @@
sodipodi:role="line">Has</tspan></text>
<text
xml:space="preserve"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'URW Chancery L';-inkscape-font-specification:'URW Chancery L Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="879.90356"
y="621.14386"
id="text4344"
sodipodi:linespacing="125%"><tspan
id="text4344"><tspan
sodipodi:role="line"
id="tspan4346"
x="879.90356"
@ -988,28 +957,26 @@
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">Has</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="960"
y="622.36218"
id="text4348"
sodipodi:linespacing="125%"><tspan
id="text4348"><tspan
sodipodi:role="line"
id="tspan4350"
x="960"
y="622.36218"
style="font-size:10px">of</tspan></text>
style="font-size:10px;line-height:1.25">of</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="960"
y="742.36218"
id="text4352"
sodipodi:linespacing="125%"><tspan
id="text4352"><tspan
sodipodi:role="line"
id="tspan4354"
x="960"
y="742.36218"
style="font-size:10px">of</tspan></text>
style="font-size:10px;line-height:1.25">of</tspan></text>
<g
id="g4375"
transform="matrix(1,0,0,-1,171.72593,1606.7279)">
@ -1035,16 +1002,15 @@
</g>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="450"
y="742.36218"
id="text4386"
sodipodi:linespacing="125%"><tspan
id="text4386"><tspan
sodipodi:role="line"
id="tspan4388"
x="450"
y="742.36218"
style="font-size:10px">For</tspan></text>
style="font-size:10px;line-height:1.25">For</tspan></text>
<rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.4000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4390"
@ -1054,19 +1020,20 @@
y="653.08313" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="570"
y="682.36218"
id="text4394"
sodipodi:linespacing="125%"><tspan
id="text4394"><tspan
sodipodi:role="line"
id="tspan4396"
x="570"
y="682.36218">Role</tspan><tspan
y="682.36218"
style="font-size:15px;line-height:1.25">Role</tspan><tspan
sodipodi:role="line"
x="570"
y="701.11218"
id="tspan4383">Membership</tspan></text>
id="tspan4383"
style="font-size:15px;line-height:1.25">Membership</tspan></text>
<g
id="g4354"
transform="translate(0,-241.93154)">
@ -1078,16 +1045,16 @@
x="561.61688"
y="774.30139" />
<text
sodipodi:linespacing="125%"
id="text4398"
y="802.36218"
x="570"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
y="802.36218"
x="570"
id="tspan4400"
sodipodi:role="line">Role</tspan></text>
sodipodi:role="line"
style="font-size:15px;line-height:1.25">Role</tspan></text>
</g>
<g
id="g4338">
@ -1114,28 +1081,26 @@
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="690"
y="677.36218"
id="text4346"
sodipodi:linespacing="125%"><tspan
id="text4346"><tspan
sodipodi:role="line"
id="tspan4348"
x="690"
y="677.36218"
style="font-size:10px">Is</tspan></text>
style="font-size:10px;line-height:1.25">Is</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="619.09393"
y="631.24536"
id="text4350"
sodipodi:linespacing="125%"><tspan
id="text4350"><tspan
sodipodi:role="line"
id="tspan4352"
x="619.09393"
y="631.24536"
style="font-size:10px">Includes</tspan></text>
style="font-size:10px;line-height:1.25">Includes</tspan></text>
<g
id="g4359"
transform="translate(341.43156,-241.93151)">

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 60 KiB

View file

@ -53,6 +53,7 @@
[migratus-lein "0.4.2"]
[org.clojars.punkisdead/lein-cucumber "1.0.5"]
[lein-cljsbuild "1.1.4"]
[lein-codox "0.10.3"]
[lein-uberwar "0.2.0"]
[lein-bower "0.5.1"]
[lein-less "1.7.5"]]

View file

@ -0,0 +1,8 @@
alter table electors
add column address_id references addresses on delete no action;
update electors
set address_id =
(select address_id
from dwellings
where dwellings.id electors.dwelling_id);

View file

@ -0,0 +1,11 @@
CREATE TABLE dwellings
(
id INT NOT NULL PRIMARY KEY,
address_id INT NOT NULL references addresses on delete no action,
sub_address VARCHAR( 32)
);
alter table electors
add column dwelling_id int references dwellings on delete no action;
alter table electors drop column address_id;

View file

@ -1,6 +1,6 @@
-- File queries.sql
-- autogenerated by adl.to-hugsql-queries at
-- 2018-05-13T16:47:04.188Z
-- 2018-05-26T15:03:25.295Z
-- See [Application Description Language](https://github.com/simon-brooke/adl).
@ -19,11 +19,13 @@ VALUES (:address,
:district_id,
:latitude,
:longitude)
returning id
-- :name create-authority! :! :n
-- :doc creates a new authority record
INSERT INTO authorities (id)
VALUES (:id)
returning id
-- :name create-canvasser! :! :n
-- :doc creates a new canvasser record
@ -43,24 +45,35 @@ VALUES (:username,
:email,
:authority_id,
:authorised)
returning id
-- :name create-district! :! :n
-- :doc creates a new district record
INSERT INTO districts (name)
VALUES (:name)
returning id
-- :name create-dwelling! :! :n
-- :doc creates a new dwelling record
INSERT INTO dwellings (address_id,
sub-address)
VALUES (:address_id,
:sub-address)
returning id
-- :name create-elector! :! :n
-- :doc creates a new elector record
INSERT INTO electors (name,
address_id,
dwelling_id,
phone,
email,
gender)
VALUES (:name,
:address_id,
:dwelling_id,
:phone,
:email,
:gender)
returning id
-- :name create-followupaction! :! :n
-- :doc creates a new followupaction record
@ -68,37 +81,37 @@ INSERT INTO followupactions (request_id,
actor,
date,
notes,
closed,
id)
closed)
VALUES (:request_id,
:actor,
:date,
:notes,
:closed,
:id)
:closed)
returning id
-- :name create-followupmethod! :! :n
-- :doc creates a new followupmethod record
INSERT INTO followupmethods (id)
VALUES (:id)
returning id
-- :name create-followuprequest! :! :n
-- :doc creates a new followuprequest record
INSERT INTO followuprequests (elector_id,
visit_id,
issue_id,
method_id,
id)
method_id)
VALUES (:elector_id,
:visit_id,
:issue_id,
:method_id,
:id)
:method_id)
returning id
-- :name create-gender! :! :n
-- :doc creates a new gender record
INSERT INTO genders (id)
VALUES (:id)
returning id
-- :name create-intention! :! :n
-- :doc creates a new intention record
@ -108,6 +121,7 @@ INSERT INTO intentions (visit_id,
VALUES (:visit_id,
:elector_id,
:option_id)
returning Id
-- :name create-issue! :! :n
-- :doc creates a new issue record
@ -117,6 +131,7 @@ INSERT INTO issues (url,
VALUES (:url,
:current,
:id)
returning id
-- :name create-issueexpertis! :! :n
-- :doc creates a new issueexpertis record
@ -126,16 +141,19 @@ INSERT INTO issueexpertise (canvasser_id,
VALUES (:canvasser_id,
:issue_id,
:method_id)
returning Id
-- :name create-option! :! :n
-- :doc creates a new option record
INSERT INTO options (id)
VALUES (:id)
returning id
-- :name create-role! :! :n
-- :doc creates a new role record
INSERT INTO roles (name)
VALUES (:name)
returning id
-- :name create-rolemembership! :! :n
-- :doc creates a new rolemembership record
@ -143,6 +161,7 @@ INSERT INTO rolememberships (role_id,
canvasser_id)
VALUES (:role_id,
:canvasser_id)
returning Id
-- :name create-team! :! :n
-- :doc creates a new team record
@ -154,6 +173,7 @@ VALUES (:name,
:district_id,
:latitude,
:longitude)
returning id
-- :name create-teammembership! :! :n
-- :doc creates a new teammembership record
@ -161,6 +181,7 @@ INSERT INTO teammemberships (team_id,
canvasser_id)
VALUES (:team_id,
:canvasser_id)
returning Id
-- :name create-teamorganisership! :! :n
-- :doc creates a new teamorganisership record
@ -168,6 +189,7 @@ INSERT INTO teamorganiserships (team_id,
canvasser_id)
VALUES (:team_id,
:canvasser_id)
returning Id
-- :name create-visit! :! :n
-- :doc creates a new visit record
@ -177,12 +199,231 @@ INSERT INTO visits (address_id,
VALUES (:address_id,
:canvasser_id,
:date)
returning id
-- :name delete-address! :! :n
-- :doc updates an existing address record
DELETE FROM addresses
WHERE addresses.id = :id
-- :name delete-authority! :! :n
-- :doc updates an existing authority record
DELETE FROM authorities
WHERE authorities.id = :id
-- :name delete-canvasser! :! :n
-- :doc updates an existing canvasser record
DELETE FROM canvassers
WHERE canvassers.id = :id
-- :name delete-district! :! :n
-- :doc updates an existing district record
DELETE FROM districts
WHERE districts.id = :id
-- :name delete-dwelling! :! :n
-- :doc updates an existing dwelling record
DELETE FROM dwellings
WHERE dwellings.id = :id
-- :name delete-elector! :! :n
-- :doc updates an existing elector record
DELETE FROM electors
WHERE electors.id = :id
-- :name delete-followupaction! :! :n
-- :doc updates an existing followupaction record
DELETE FROM followupactions
WHERE followupactions.id = :id
-- :name delete-followupmethod! :! :n
-- :doc updates an existing followupmethod record
DELETE FROM followupmethods
WHERE followupmethods.id = :id
-- :name delete-followuprequest! :! :n
-- :doc updates an existing followuprequest record
DELETE FROM followuprequests
WHERE followuprequests.id = :id
-- :name delete-gender! :! :n
-- :doc updates an existing gender record
DELETE FROM genders
WHERE genders.id = :id
-- :name delete-intention! :! :n
-- :doc updates an existing intention record
DELETE FROM intentions
WHERE intentions.Id = :Id
-- :name delete-issue! :! :n
-- :doc updates an existing issue record
DELETE FROM issues
WHERE issues.id = :id
-- :name delete-issueexpertis! :! :n
-- :doc updates an existing issueexpertis record
DELETE FROM issueexpertise
WHERE issueexpertise.Id = :Id
-- :name delete-option! :! :n
-- :doc updates an existing option record
DELETE FROM options
WHERE options.id = :id
-- :name delete-role! :! :n
-- :doc updates an existing role record
DELETE FROM roles
WHERE roles.id = :id
-- :name delete-rolemembership! :! :n
-- :doc updates an existing rolemembership record
DELETE FROM rolememberships
WHERE rolememberships.Id = :Id
-- :name delete-team! :! :n
-- :doc updates an existing team record
DELETE FROM teams
WHERE teams.id = :id
-- :name delete-teammembership! :! :n
-- :doc updates an existing teammembership record
DELETE FROM teammemberships
WHERE teammemberships.Id = :Id
-- :name delete-teamorganisership! :! :n
-- :doc updates an existing teamorganisership record
DELETE FROM teamorganiserships
WHERE teamorganiserships.Id = :Id
-- :name delete-visit! :! :n
-- :doc updates an existing visit record
DELETE FROM visits
WHERE visits.id = :id
-- :name get-address :? :1
-- :doc selects an existing address record
SELECT * FROM addresses
WHERE addresses.id = :id
ORDER BY addresses.address,
addresses.postcode,
addresses.id
-- :name get-authority :? :1
-- :doc selects an existing authority record
SELECT * FROM authorities
WHERE authorities.id = :id
-- :name get-canvasser :? :1
-- :doc selects an existing canvasser record
SELECT * FROM canvassers
WHERE canvassers.id = :id
ORDER BY canvassers.username,
canvassers.fullname,
canvassers.email,
canvassers.id
-- :name get-district :? :1
-- :doc selects an existing district record
SELECT * FROM districts
WHERE districts.id = :id
ORDER BY districts.name,
districts.id
-- :name get-dwelling :? :1
-- :doc selects an existing dwelling record
SELECT * FROM dwellings
WHERE dwellings.id = :id
-- :name get-elector :? :1
-- :doc selects an existing elector record
SELECT * FROM electors
WHERE electors.id = :id
ORDER BY electors.name,
electors.phone,
electors.email,
electors.id
-- :name get-followupaction :? :1
-- :doc selects an existing followupaction record
SELECT * FROM followupactions
WHERE followupactions.id = :id
-- :name get-followupmethod :? :1
-- :doc selects an existing followupmethod record
SELECT * FROM followupmethods
WHERE followupmethods.id = :id
-- :name get-followuprequest :? :1
-- :doc selects an existing followuprequest record
SELECT * FROM followuprequests
WHERE followuprequests.id = :id
-- :name get-gender :? :1
-- :doc selects an existing gender record
SELECT * FROM genders
WHERE genders.id = :id
-- :name get-intention :? :1
-- :doc selects an existing intention record
SELECT * FROM intentions
WHERE intentions.Id = :Id
-- :name get-issue :? :1
-- :doc selects an existing issue record
SELECT * FROM issues
WHERE issues.id = :id
-- :name get-issueexpertis :? :1
-- :doc selects an existing issueexpertis record
SELECT * FROM issueexpertise
WHERE issueexpertise.Id = :Id
-- :name get-option :? :1
-- :doc selects an existing option record
SELECT * FROM options
WHERE options.id = :id
-- :name get-role :? :1
-- :doc selects an existing role record
SELECT * FROM roles
WHERE roles.id = :id
ORDER BY roles.name,
roles.id
-- :name get-rolemembership :? :1
-- :doc selects an existing rolemembership record
SELECT * FROM rolememberships
WHERE rolememberships.Id = :Id
-- :name get-team :? :1
-- :doc selects an existing team record
SELECT * FROM teams
WHERE teams.id = :id
ORDER BY teams.name,
teams.id
-- :name get-teammembership :? :1
-- :doc selects an existing teammembership record
SELECT * FROM teammemberships
WHERE teammemberships.Id = :Id
-- :name get-teamorganisership :? :1
-- :doc selects an existing teamorganisership record
SELECT * FROM teamorganiserships
WHERE teamorganiserships.Id = :Id
-- :name get-visit :? :1
-- :doc selects an existing visit record
SELECT * FROM visits
WHERE visits.id = :id
-- :name list-addresses :? :*
-- :doc lists all existing address records
SELECT * FROM addresses
ORDER BY addresses.address,
addresses.postcode
addresses.postcode,
addresses.id
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
@ -192,14 +433,22 @@ SELECT *
FROM addresses
WHERE addresses.district_id = :id
ORDER BY addresses.address,
addresses.postcode
addresses.postcode,
addresses.id
-- :name list-authorities :? :*
-- :doc lists all existing authority records
SELECT * FROM authorities
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
-- :name list-canvassers :? :*
-- :doc lists all existing canvasser records
SELECT * FROM canvassers
ORDER BY canvassers.username,
canvassers.fullname,
canvassers.email
canvassers.email,
canvassers.id
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
@ -210,7 +459,8 @@ FROM canvassers
WHERE canvassers.address_id = :id
ORDER BY canvassers.username,
canvassers.fullname,
canvassers.email
canvassers.email,
canvassers.id
-- :name list-canvassers-by-authority :? :*
-- :doc lists all existing canvasser records related to a given authority
@ -219,7 +469,8 @@ FROM canvassers
WHERE canvassers.authority_id = :id
ORDER BY canvassers.username,
canvassers.fullname,
canvassers.email
canvassers.email,
canvassers.id
-- :name list-canvassers-by-elector :? :*
-- :doc lists all existing canvasser records related to a given elector
@ -228,32 +479,48 @@ FROM canvassers
WHERE canvassers.elector_id = :id
ORDER BY canvassers.username,
canvassers.fullname,
canvassers.email
canvassers.email,
canvassers.id
-- :name list-districts :? :*
-- :doc lists all existing district records
SELECT * FROM districts
ORDER BY districts.name
ORDER BY districts.name,
districts.id
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
-- :name list-dwellings :? :*
-- :doc lists all existing dwelling records
SELECT * FROM dwellings
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
-- :name list-dwellings-by-addres :? :*
-- :doc lists all existing dwelling records related to a given addres
SELECT *
FROM dwellings
WHERE dwellings.address_id = :id
-- :name list-electors :? :*
-- :doc lists all existing elector records
SELECT * FROM electors
ORDER BY electors.name,
electors.phone,
electors.email
electors.email,
electors.id
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
-- :name list-electors-by-address :? :*
-- :doc lists all existing elector records related to a given address
-- :name list-electors-by-dwelling :? :*
-- :doc lists all existing elector records related to a given dwelling
SELECT *
FROM electors
WHERE electors.address_id = :id
WHERE electors.dwelling_id = :id
ORDER BY electors.name,
electors.phone,
electors.email
electors.email,
electors.id
-- :name list-electors-by-gender :? :*
-- :doc lists all existing elector records related to a given gender
@ -262,7 +529,8 @@ FROM electors
WHERE electors.gender = :id
ORDER BY electors.name,
electors.phone,
electors.email
electors.email,
electors.id
-- :name list-followupactions :? :*
-- :doc lists all existing followupaction records
@ -282,23 +550,175 @@ SELECT *
FROM followupactions
WHERE followupactions.request_id = :id
-- :name list-followupmethods :? :*
-- :doc lists all existing followupmethod records
SELECT * FROM followupmethods
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
-- :name list-followuprequests :? :*
-- :doc lists all existing followuprequest records
SELECT * FROM followuprequests
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
-- :name list-followuprequests-by-elector :? :*
-- :doc lists all existing followuprequest records related to a given elector
SELECT *
FROM followuprequests
WHERE followuprequests.elector_id = :id
-- :name list-followuprequests-by-followupmethod :? :*
-- :doc lists all existing followuprequest records related to a given followupmethod
SELECT *
FROM followuprequests
WHERE followuprequests.method_id = :id
-- :name list-followuprequests-by-issue :? :*
-- :doc lists all existing followuprequest records related to a given issue
SELECT *
FROM followuprequests
WHERE followuprequests.issue_id = :id
-- :name list-followuprequests-by-visit :? :*
-- :doc lists all existing followuprequest records related to a given visit
SELECT *
FROM followuprequests
WHERE followuprequests.visit_id = :id
-- :name list-genders :? :*
-- :doc lists all existing gender records
SELECT * FROM genders
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
-- :name list-intentions :? :*
-- :doc lists all existing intention records
SELECT * FROM intentions
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
-- :name list-intentions-by-elector :? :*
-- :doc lists all existing intention records related to a given elector
SELECT *
FROM intentions
WHERE intentions.elector_id = :id
-- :name list-intentions-by-option :? :*
-- :doc lists all existing intention records related to a given option
SELECT *
FROM intentions
WHERE intentions.option_id = :id
-- :name list-intentions-by-visit :? :*
-- :doc lists all existing intention records related to a given visit
SELECT *
FROM intentions
WHERE intentions.visit_id = :id
-- :name list-issueexpertise :? :*
-- :doc lists all existing issueexpertis records
SELECT * FROM issueexpertise
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
-- :name list-issueexpertise-by-canvasser :? :*
-- :doc lists all existing issueexpertis records related to a given canvasser
SELECT *
FROM issueexpertise
WHERE issueexpertise.canvasser_id = :id
-- :name list-issueexpertise-by-followupmethod :? :*
-- :doc lists all existing issueexpertis records related to a given followupmethod
SELECT *
FROM issueexpertise
WHERE issueexpertise.method_id = :id
-- :name list-issueexpertise-by-issue :? :*
-- :doc lists all existing issueexpertis records related to a given issue
SELECT *
FROM issueexpertise
WHERE issueexpertise.issue_id = :id
-- :name list-issues :? :*
-- :doc lists all existing issue records
SELECT * FROM issues
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
-- :name list-options :? :*
-- :doc lists all existing option records
SELECT * FROM options
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
-- :name list-rolememberships :? :*
-- :doc lists all existing rolemembership records
SELECT * FROM rolememberships
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
-- :name list-rolememberships-by-canvasser :? :*
-- :doc lists all existing rolemembership records related to a given canvasser
SELECT *
FROM rolememberships
WHERE rolememberships.canvasser_id = :id
-- :name list-rolememberships-by-role :? :*
-- :doc lists all existing rolemembership records related to a given role
SELECT *
FROM rolememberships
WHERE rolememberships.role_id = :id
-- :name list-roles :? :*
-- :doc lists all existing role records
SELECT * FROM roles
ORDER BY roles.name
ORDER BY roles.name,
roles.id
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
-- :name list-teammemberships :? :*
-- :doc lists all existing teammembership records
SELECT * FROM teammemberships
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
-- :name list-teammemberships-by-canvasser :? :*
-- :doc lists all existing teammembership records related to a given canvasser
SELECT *
FROM teammemberships
WHERE teammemberships.canvasser_id = :id
-- :name list-teammemberships-by-team :? :*
-- :doc lists all existing teammembership records related to a given team
SELECT *
FROM teammemberships
WHERE teammemberships.team_id = :id
-- :name list-teamorganiserships :? :*
-- :doc lists all existing teamorganisership records
SELECT * FROM teamorganiserships
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
-- :name list-teamorganiserships-by-canvasser :? :*
-- :doc lists all existing teamorganisership records related to a given canvasser
SELECT *
FROM teamorganiserships
WHERE teamorganiserships.canvasser_id = :id
-- :name list-teamorganiserships-by-team :? :*
-- :doc lists all existing teamorganisership records related to a given team
SELECT *
FROM teamorganiserships
WHERE teamorganiserships.team_id = :id
-- :name list-teams :? :*
-- :doc lists all existing team records
SELECT * FROM teams
ORDER BY teams.name
ORDER BY teams.name,
teams.id
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
@ -307,7 +727,8 @@ ORDER BY teams.name
SELECT *
FROM teams
WHERE teams.district_id = :id
ORDER BY teams.name
ORDER BY teams.name,
teams.id
-- :name list-visits :? :*
-- :doc lists all existing visit records
@ -334,7 +755,8 @@ WHERE
address LIKE '%:pattern%'
OR phone LIKE '%:pattern%'
ORDER BY addresses.address,
addresses.postcode
addresses.postcode,
addresses.id
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
@ -348,7 +770,8 @@ username LIKE '%:pattern%'
OR email LIKE '%:pattern%'
ORDER BY canvassers.username,
canvassers.fullname,
canvassers.email
canvassers.email,
canvassers.id
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
@ -357,7 +780,16 @@ ORDER BY canvassers.username,
SELECT * FROM districts
WHERE
name LIKE '%:pattern%'
ORDER BY districts.name
ORDER BY districts.name,
districts.id
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
-- :name search-strings-dwelling :? :1
-- :doc selects existing dwelling records having any string field matching `:pattern` by substring match
SELECT * FROM dwellings
WHERE
sub-address LIKE '%:pattern%'
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
@ -370,7 +802,8 @@ name LIKE '%:pattern%'
OR email LIKE '%:pattern%'
ORDER BY electors.name,
electors.phone,
electors.email
electors.email,
electors.id
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
@ -387,7 +820,8 @@ url LIKE '%:pattern%'
SELECT * FROM roles
WHERE
name LIKE '%:pattern%'
ORDER BY roles.name
ORDER BY roles.name,
roles.id
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")
@ -396,6 +830,7 @@ ORDER BY roles.name
SELECT * FROM teams
WHERE
name LIKE '%:pattern%'
ORDER BY teams.name
ORDER BY teams.name,
teams.id
--~ (if (:offset params) "OFFSET :offset ")
--~ (if (:limit params) "LIMIT :limit" "LIMIT 100")

View file

@ -11,7 +11,7 @@
(declare
create-addresse
create-address
create-authority
create-canvasser
create-district
@ -30,7 +30,7 @@
create-teammembership
create-teamorganisership
create-visit
delete-addresse
delete-address
delete-authority
delete-canvasser
delete-district
@ -41,7 +41,7 @@
delete-issue
delete-option
delete-visit
get-addresse
get-address
get-authority
get-canvasser
get-district
@ -61,7 +61,7 @@
list-canvassers-by-elector
list-districts
list-electors
list-electors-by-addresse
list-electors-by-address
list-followupactions
list-followupactions-by-canvasser
list-followupactions-by-followuprequest
@ -96,9 +96,9 @@
list-teams
list-teams-by-district
list-visits
list-visits-by-addresse
list-visits-by-address
list-visits-by-canvasser
update-addresse
update-address
update-canvasser
update-district
update-elector
@ -110,7 +110,7 @@
(defroutes
auto-rest-routes
(POST "/json/auto/create-addresse" request (create-addresse request))
(POST "/json/auto/create-addresse" request (create-address request))
(POST
"/json/auto/create-authority"
request
@ -162,7 +162,7 @@
request
(create-teamorganisership request))
(POST "/json/auto/create-visit" request (create-visit request))
(POST "/json/auto/delete-addresse" request (delete-addresse request))
(POST "/json/auto/delete-addresse" request (delete-address request))
(POST
"/json/auto/delete-authority"
request
@ -382,10 +382,10 @@
(defn
create-addresse
create-address
"Auto-generated method to insert one record to the addresses table. Expects the following key(s) to be present in `params`: (:id :address :postcode :phone :district_id :latitude :longitude). Returns a map containing the keys (:id) identifying the record created."
[{:keys [params]}]
(do (db/create-addresse! params)))
(do (db/create-address! params)))
(defn
@ -515,10 +515,10 @@
(defn
delete-addresse
delete-address
"Auto-generated method to delete one record from the addresses table. Expects the following key(s) to be present in `params`: (:id)."
[{:keys [params]}]
(do (db/delete-addresse! params))
(do (db/delete-address! params))
(response/found "/"))
@ -970,10 +970,10 @@
(defn
update-addresse
update-address
"Auto-generated method to update one record in the addresses table. Expects the following key(s) to be present in `params`: (:address :district_id :id :latitude :longitude :phone :postcode)."
[{:keys [params]}]
(do (db/update-addresse! params))
(do (db/update-address! params))
(response/found "/"))

392
youyesyet.adl.xml Normal file
View file

@ -0,0 +1,392 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- DOCTYPE application PUBLIC "-//JOURNEYMAN//DTD ADL 1.4//EN"
"http://www.journeyman.cc/adl/stable/adl/schemas/adl-1.4.dtd" -->
<application name="youyesyet" version="0.1.1"
xmlns="http://bowyer.journeyman.cc/adl/1.4/"
xmlns:adl="http://bowyer.journeyman.cc/adl/1.4/">
<documentation>
A web-app intended to be used by canvassers campaigning for a 'Yes' vote in the second independence referendum.
The web-app will be delivered to canvassers out knocking doors primarily through an HTML5/React single-page app designed to work on a mobile phone; it's possible that someone else may do an Android of iPhone native app to address the same back end but at present I have no plans for this.
There must also be an administrative interface through which privileged users can set the system up and authorise canvassers, and a 'followup' interface through which issue-expert specialist canvassers can address particular electors' queries.
</documentation>
<content>
<head> </head>
<top> </top>
<foot> </foot>
</content>
<typedef name="postcode" type="string"
pattern="^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$" size="16">
<documentation>See
https://assets.publishing.service.gov.uk/government/uploads/system/uploads/attachment_data/file/488478/Bulk_Data_Transfer_-_additional_validation_valid_from_12_November_2015.pdf,
section 3</documentation>
<help locale="en-GB">A valid postcode.</help>
</typedef>
<group name="public">
<documentation>All users</documentation>
</group>
<group name="canvassers" parent="public">
<documentation>All users of the canvasser app Able to read and add canvassing data in a limited
radius around their current position. </documentation>
</group>
<group name="teamorganiser" parent="canvassers">
<documentation>Organisers of canvassing teams Able to see and modify data on the canvassers in
the team(s) they organise; able to add canvassers to their team; able to update canvassers in
their team, including resetting passwords and locking accounts; able to see canvass data over
the whole area in which their team operates. </documentation>
</group>
<group name="issueexperts" parent="public">
<documentation>People expert on particular issues. Able to read followup requests, and the electors to which they
relate; able to access (read/write) the issues wiki; able to write followuop action records.
</documentation>
</group>
<group name="analysts" parent="public">
<documentation>Users entitled to see an overview of the canvassing data collected. Able to read canvassing data over the whole map, including historical
data.</documentation>
</group>
<group name="issueeditors" parent="analysts">
<documentation>Users responsible for determining what issues should be current at any time.
Able to set current issues; able to add issues.</documentation>
</group>
<group name="admin" parent="public">
<documentation>Able to read and update canvasser records, team membership records, team
organisership records, issue expertise records; able to add and update reference data
generally.</documentation>
</group>
<entity name="electors">
<key>
<property required="true" type="integer" name="id" column="id" immutable="true" distinct="system">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>
<property size="64" required="true" type="string" name="name" column="name" distinct="user">
<prompt prompt="name" locale="en-GB"/>
</property>
<property required="true" type="entity" name="address_id" column="address_id" entity="addresses"
farkey="id">
<prompt prompt="address_id" locale="en-GB"/>
</property>
<property size="16" type="string" name="phone" column="phone" distinct="user">
<prompt prompt="phone" locale="en-GB"/>
</property>
<property size="128" type="string" name="email" column="email" distinct="user">
<prompt prompt="email" locale="en-GB"/>
</property>
<property name="gender" type="entity" column="gender" entity="genders" farkey="id"
default="Unknown">
<prompt prompt="gender" locale="en-GB"/>
</property>
<list name="Electors" properties="all"/>
<form name="Elector" properties="all"/>
</entity>
<entity name="genders" natural-key="id">
<key>
<property name="id" type="string" size="32" distinct="all">
<prompt prompt="gender" locale="en-GB"/>
</property>
</key>
<list name="Genders" properties="all"/>
<form name="Gender" properties="all"/>
</entity>
<entity name="addresses">
<key>
<property required="true" type="integer" name="id" column="id" immutable="true" distinct="system">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>
<property required="true" type="string" name="address" column="address" size="256" distinct="user">
<prompt prompt="address" locale="en-GB"/>
</property>
<property type="defined" typedef="postcode" name="postcode" column="postcode" size="16" distinct="user">
<prompt prompt="postcode" locale="en-GB"/>
</property>
<property type="string" name="phone" column="phone" size="16">
<prompt prompt="phone" locale="en-GB"/>
</property>
<property type="entity" name="district_id" column="district_id" entity="districts" farkey="id">
<prompt prompt="district_id" locale="en-GB"/>
</property>
<property type="real" name="latitude" column="latitude">
<prompt prompt="latitude" locale="en-GB"/>
</property>
<property type="real" name="longitude" column="longitude">
<prompt prompt="longitude" locale="en-GB"/>
</property>
<permission group="admin" permission="all"/>
<permission group="canvassers" permission="read"/>
<permission group="analysts" permission="read"/>
<list name="Addresses" properties="all"/>
<form name="Address" properties="all"/>
</entity>
<entity name="visits">
<key>
<property required="true" type="integer" name="id" column="id" distinct="system">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>
<property required="true" type="integer" name="address_id" column="address_id"
entity="addresses" farkey="id">
<prompt prompt="address_id" locale="en-GB"/>
</property>
<property required="true" type="entity" name="canvasser_id" column="canvasser_id"
entity="canvassers" farkey="id">
<prompt prompt="canvasser_id" locale="en-GB"/>
</property>
<property required="true" default="" type="timestamp" name="date" column="date">
<prompt prompt="date" locale="en-GB"/>
</property>
<permission group="public" permission="read"/>
<permission group="canvassers" permission="insert"/>
</entity>
<entity name="authorities">
<key>
<property required="true" type="string" name="id" column="id" size="32" distinct="all">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>
</entity>
<entity name="issues">
<documentation>Issues believed to be of interest to electors, about which they may have questions.</documentation>
<key>
<property required="true" type="string" name="id" column="id" size="32" immutable="true" distinct="all">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>
<property type="string" name="url" column="url" size="256">
<prompt prompt="url" locale="en-GB"/>
</property>
<property name="current" type="boolean" default="true">
<prompt prompt="Is current?" locale="en-GB"/>
</property>
<list name="Issues" properties="all"/>
<form name="Issue" properties="all"/>
</entity>
<entity name="intentions">
<documentation>Link table.</documentation>
<property required="true" type="entity" entity="visits" farkey="id" name="visit_id"
column="visit_id">
<prompt prompt="visit_id" locale="en-GB"/>
</property>
<property required="true" type="entity" entity="electors" farkey="id" name="elector_id"
column="elector_id">
<prompt prompt="elector_id" locale="en-GB"/>
</property>
<property required="true" type="entity" entity="options" farkey="id" name="option_id"
column="option_id">
<prompt prompt="option_id" locale="en-GB"/>
</property>
</entity>
<entity name="canvassers">
<documentation>Primary users of the system: those actually interviewing electors.</documentation>
<key>
<property type="integer" name="id" column="id" distinct="system" immutable="true">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>
<property required="true" type="string" name="username" column="username" size="32" distinct="all">
<prompt prompt="username" locale="en-GB"/>
</property>
<property required="true" type="string" name="fullname" column="fullname" size="64" distinct="user">
<prompt prompt="fullname" locale="en-GB"/>
</property>
<property type="entity" name="elector_id" column="elector_id" entity="electors" farkey="id">
<prompt prompt="elector_id" locale="en-GB"/>
</property>
<property required="true" type="integer" name="address_id" column="address_id"
entity="addresses" farkey="id">
<prompt prompt="address_id" locale="en-GB"/>
</property>
<property type="string" name="phone" column="phone" size="16">
<prompt prompt="phone" locale="en-GB"/>
</property>
<property type="string" name="email" column="email" size="128" distinct="user">
<prompt prompt="email" locale="en-GB"/>
</property>
<property required="true" type="entity" name="authority_id"
entity="authorities" farkey="id">
<prompt prompt="authority_id" locale="en-GB"/>
</property>
<property type="boolean" name="authorised" column="authorised">
<prompt prompt="authorised" locale="en-GB"/>
</property>
<permission group="canvassers" permission="edit">
<documentation>But only their own record</documentation>
</permission>
<permission group="teamleaders" permission="edit">
<documentation>But only canvassers in their own team.</documentation>
</permission>
<permission group="admin" permission="all">
<documentation>All canvassers</documentation>
</permission>
</entity>
<entity name="followuprequests">
<documentation>Requests for a followup with an issue expert</documentation>
<key>
<property required="true" type="integer" name="id" column="id" distinct="system">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>
<property required="true" type="entity" name="elector_id" column="elector_id" entity="electors"
farkey="id">
<prompt prompt="elector_id" locale="en-GB"/>
</property>
<property required="true" type="entity" name="visit_id" column="visit_id" entity="visits"
farkey="id">
<prompt prompt="visit_id" locale="en-GB"/>
</property>
<property required="true" type="entity" name="issue_id" column="issue_id" entity="issues"
farkey="id">
<prompt prompt="issue_id" locale="en-GB"/>
</property>
<property required="true" type="entity" name="method_id" column="method_id"
entity="followupmethods" farkey="id">
<prompt prompt="method_id" locale="en-GB"/>
</property>
</entity>
<entity name="rolememberships">
<documentation>Link table</documentation>
<property required="true" type="entity" entity="roles" farkey="id" name="role_id"
column="role_id">
<prompt prompt="role_id" locale="en-GB"/>
</property>
<property required="true" type="entity" entity="canvassers" farkey="id" name="canvasser_id"
column="canvasser_id">
<prompt prompt="canvasser_id" locale="en-GB"/>
</property>
</entity>
<entity name="roles">
<documentation>A role (essentially, the same as a group, but application layer rather than database layer) of which a user may be a member.</documentation>
<key>
<property type="integer" name="id" column="id" immutable="true" distinct="system">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>
<property required="true" type="string" name="name" column="name" size="64" distinct="user" immutable="true">
<prompt prompt="name" locale="en-GB"/>
</property>
</entity>
<entity name="teams">
<key>
<property type="integer" name="id" column="id" distinct="system" immutable="true">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>
<property required="true" type="string" name="name" column="name" size="64" distinct="user">
<prompt prompt="name" locale="en-GB"/>
</property>
<property required="true" type="entity" entity="districts" farkey="id" name="district_id"
column="district_id">
<prompt prompt="district_id" locale="en-GB"/>
</property>
<property type="real" name="latitude" column="latitude">
<prompt prompt="latitude" locale="en-GB"/>
</property>
<property type="real" name="longitude" column="longitude">
<prompt prompt="longitude" locale="en-GB"/>
</property>
<permission group="canvassers" permission="read"/>
<permission group="groupleaders" permission="edit">
<documentation>But only their own group(s)</documentation>
</permission>
<permission group="admin" permission="all">
<documentation>All groups</documentation>
</permission>
</entity>
<entity name="districts">
<documentation>Electoral districts</documentation>
<key>
<property required="true" type="integer" name="id" column="id" immutable="true" distinct="system">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>
<property required="true" type="string" name="name" column="name" size="64" distinct="user">
<prompt prompt="name" locale="en-GB"/>
</property>
<permission group="public" permission="read"></permission>
<permission group="admin" permission="all"></permission>
</entity>
<entity name="teamorganiserships">
<documentation>Link table</documentation>
<property required="true" type="entity" entity="teams" farkey="id" name="team_id"
column="team_id">
<prompt prompt="team_id" locale="en-GB"/>
</property>
<property required="true" type="entity" entity="canvassers" farkey="id" name="canvasser_id"
column="canvasser_id">
<prompt prompt="canvasser_id" locale="en-GB"/>
</property>
</entity>
<entity name="followupactions">
<documentation>Actions taken on followup requests.</documentation>
<key>
<property required="true" type="integer" name="id" column="id" distinct="system">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>
<property required="true" type="entity" name="request_id" column="request_id"
entity="followuprequests" farkey="id">
<prompt prompt="request_id" locale="en-GB"/>
</property>
<property required="true" type="integer" name="actor" column="actor" entity="canvassers"
farkey="id">
<prompt prompt="actor" locale="en-GB"/>
</property>
<property required="true" default="" type="timestamp" name="date" column="date">
<prompt prompt="date" locale="en-GB"/>
</property>
<property type="text" name="notes" column="notes">
<prompt prompt="notes" locale="en-GB"/>
</property>
<property type="boolean" name="closed" column="closed" default="false">
<prompt prompt="closed" locale="en-GB"/>
</property>
<permission group="issueexperts" permission="insert"/>
<permission group="canvassers" permission="read">
<documentation>But only for electors in their immediate vicinity</documentation>
</permission>
<permission group="analysts" permission="read"/>
</entity>
<entity name="issueexpertise">
<documentation>Link table</documentation>
<property required="true" type="integer" name="canvasser_id" column="canvasser_id"
entity="canvassers" farkey="id">
<prompt prompt="canvasser_id" locale="en-GB"/>
</property>
<property required="true" type="entity" name="issue_id" column="issue_id" entity="issues"
farkey="id">
<prompt prompt="issue_id" locale="en-GB"/>
</property>
<property required="true" type="entity" name="method_id" column="method_id"
entity="followupmethods" farkey="id">
<prompt prompt="method_id" locale="en-GB"/>
</property>
</entity>
<entity name="options">
<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">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>
</entity>
<entity name="teammemberships">
<documentation>Link table</documentation>
<property required="true" type="entity" entity="teams" farkey="id" name="team_id"
column="team_id">
<prompt prompt="team_id" locale="en-GB"/>
</property>
<property required="true" type="entity" entity="canvassers" farkey="id" name="canvasser_id"
column="canvasser_id">
<prompt prompt="canvasser_id" locale="en-GB"/>
</property>
</entity>
<entity name="followupmethods">
<key>
<property required="true" type="string" size="32" name="id" column="id" immutable="true" distinct="all">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>
</entity>
</application>

View file

@ -1,11 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<application name="youyesyet" version="0.1.1" xmlns="http://bowyer.journeyman.cc/adl/1.4/">
<!-- DOCTYPE application PUBLIC "-//JOURNEYMAN//DTD ADL 1.4//EN"
"http://www.journeyman.cc/adl/stable/adl/schemas/adl-1.4.dtd" -->
<application xmlns="http://bowyer.journeyman.cc/adl/1.4/" xmlns:adl="http://bowyer.journeyman.cc/adl/1.4/" name="youyesyet" version="0.1.1">
<!--
***************************************************************************
*
* Application Description Language Framework
* ©2007 Cygnet Solutions Ltd
*
* THIS FILE IS AUTOMATICALLY GENERATED AND SHOULD NOT
* BE MANUALLY EDITED.
*
* Generated using adl2canonical.xslt 1.10 $
*
***************************************************************************
-->
<documentation>
A web-app intended to be used by canvassers campaigning for a 'Yes' vote in the second independence referendum.
The web-app will be delivered to canvassers out knocking doors primarily through an HTML5/React single-page app designed to work on a mobile phone; it's possible that someone else may do an Android of iPhone native app to address the same back end but at present I have no plans for this.
There must also be an administrative interface through which privileged users can set the system up and authorise canvassers, and a 'followup' interface through which issue-expert specialist canvassers can address particular electors' queries.
</documentation>
<content>
<head> </head>
<top> </top>
<foot> </foot>
</content>
<typedef name="postcode" type="string" pattern="^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$">
<typedef name="postcode" type="string" pattern="^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$" size="16">
<documentation>See
https://assets.publishing.service.gov.uk/government/uploads/system/uploads/attachment_data/file/488478/Bulk_Data_Transfer_-_additional_validation_valid_from_12_November_2015.pdf,
section 3</documentation>
@ -18,7 +40,7 @@
<documentation>All users of the canvasser app Able to read and add canvassing data in a limited
radius around their current position. </documentation>
</group>
<group name="teamorganiser" parent="canvasser">
<group name="teamorganiser" parent="canvassers">
<documentation>Organisers of canvassing teams Able to see and modify data on the canvassers in
the team(s) they organise; able to add canvassers to their team; able to update canvassers in
their team, including resetting passwords and locking accounts; able to see canvass data over
@ -42,30 +64,32 @@
organisership records, issue expertise records; able to add and update reference data
generally.</documentation>
</group>
<!--
entity electors already has a key - not generating one
-->
<entity name="electors">
<key>
<property required="true" type="integer" name="id" column="id" immutable="true" distinct="system">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>
<property size='64' required="true" type="string" name="name" column="name" distinct="user">
<property size="64" required="true" type="string" name="name" column="name" distinct="user">
<prompt prompt="name" locale="en-GB"/>
</property>
<property required="true" type="entity" name="address_id" column="address_id" entity="addresses" farkey="id">
<prompt prompt="address_id" locale="en-GB"/>
<property required="true" type="entity" name="dwelling_id" column="dwelling_id" entity="dwelling" farkey="id">
<prompt prompt="Flat" locale="en-GB"/>
</property>
<property size='16' type="string" name="phone" column="phone" distinct="user">
<property size="16" type="string" name="phone" column="phone" distinct="user">
<prompt prompt="phone" locale="en-GB"/>
</property>
<property size='128' type="string" name="email" column="email" distinct="user">
<property size="128" type="string" name="email" column="email" distinct="user">
<prompt prompt="email" locale="en-GB"/>
</property>
<property name="gender" type="entity" column="gender" entity="genders" farkey="id" default="Unknown">
<prompt prompt="gender" locale="en-GB"/>
</property>
<list name="Electors" properties="all"/>
<form name="Elector" properties="all"/>
<list properties="listed" name="Electors"><field property="id"/><field property="name"/><field property="address_id"/><field property="phone"/><field property="email"/><field property="gender"/></list>
<form properties="listed" name="Elector"><field property="id"/><field property="name"/><field property="address_id"/><field property="phone"/><field property="email"/><field property="gender"/></form>
</entity>
<entity name="genders" natural-key="id">
<key>
@ -73,9 +97,35 @@
<prompt prompt="gender" locale="en-GB"/>
</property>
</key>
<list name="Genders" properties="all"/>
<form name="Gender" properties="all"/>
<permission permission="none" group="public"/>
<permission permission="none" group="canvassers"/>
<permission permission="none" group="teamorganiser"/>
<permission permission="none" group="issueexperts"/>
<permission permission="none" group="analysts"/>
<permission permission="none" group="issueeditors"/>
<permission permission="none" group="admin"/>
<list properties="listed" name="Genders">
<field property="id"/>
</list>
<form properties="listed" name="Gender">
<field property="id"/>
</form>
</entity>
<entity name="dwellings">
<key>
<property required="true" type="integer" name="id" column="id" immutable="true" distinct="system">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>
<property required="true" type="entity" name="address_id" column="address_id" entity="address" farkey="id">
<prompt prompt="Building Address" locale="en-GB"/>
</property>
<property required="false" type="string" size="32" name="sub-address"/>
</entity>
<!--
entity addresses already has a key - not generating one
-->
<entity name="addresses">
<key>
<property required="true" type="integer" name="id" column="id" immutable="true" distinct="system">
@ -96,16 +146,19 @@
</property>
<property type="real" name="latitude" column="latitude">
<prompt prompt="latitude" locale="en-GB"/>
</property>
</property>dwe
<property type="real" name="longitude" column="longitude">
<prompt prompt="longitude" locale="en-GB"/>
</property>
<permission group="admin" permission="all"/>
<permission group="canvassers" permission="read"/>
<permission group="analysts" permission="read"/>
<list name="Addresses" properties="all"/>
<form name="Address" properties="all"/>
<list properties="listed" name="Addresses"><field property="id"/><field property="address"/><field property="postcode"/><field property="phone"/><field property="district_id"/><field property="latitude"/><field property="longitude"/></list>
<form properties="listed" name="Address"><field property="id"/><field property="address"/><field property="postcode"/><field property="phone"/><field property="district_id"/><field property="latitude"/><field property="longitude"/></form>
</entity>
<!--
entity visits already has a key - not generating one
-->
<entity name="visits">
<key>
<property required="true" type="integer" name="id" column="id" distinct="system">
@ -124,6 +177,9 @@
<permission group="public" permission="read"/>
<permission group="canvassers" permission="insert"/>
</entity>
<!--
entity authorities already has a key - not generating one
-->
<entity name="authorities">
<key>
<property required="true" type="string" name="id" column="id" size="32" distinct="all">
@ -131,6 +187,9 @@
</property>
</key>
</entity>
<!--
entity issues already has a key - not generating one
-->
<entity name="issues">
<documentation>Issues believed to be of interest to electors, about which they may have questions.</documentation>
<key>
@ -144,21 +203,42 @@
<property name="current" type="boolean" default="true">
<prompt prompt="Is current?" locale="en-GB"/>
</property>
<list name="Issues" properties="all"/>
<form name="Issue" properties="all"/>
<list properties="listed" name="Issues"><field property="id"/><field property="url"/><field property="current"/></list>
<form properties="listed" name="Issue"><field property="id"/><field property="url"/><field property="current"/></form>
</entity>
<entity name="intentions">
<!--
entity intentions has no key - generating one
-->
<entity name="intentions" table="intentions">
<documentation>Link table.</documentation>
<key>
<property type="integer" distinct="system" required="true" name="Id">
<generator action="native"/>
<documentation>
Auto-generated abstract primary key
</documentation>
</property>
</key>
<property required="true" type="entity" entity="visits" farkey="id" name="visit_id" column="visit_id">
<prompt prompt="visit_id" locale="en-GB"/>
</property>
<property required="true" type="entity" entity="electors" farkey="id" name="elector_id" column="elector_id">
<prompt prompt="elector_id" locale="en-GB"/>
</property>
<property size='32' required="true" type="entity" entity="options" farkey="id" name="option_id" column="option_id">
<property required="true" type="entity" entity="options" farkey="id" name="option_id" column="option_id">
<prompt prompt="option_id" locale="en-GB"/>
</property>
<permission permission="none" group="public"/>
<permission permission="none" group="canvassers"/>
<permission permission="none" group="teamorganiser"/>
<permission permission="none" group="issueexperts"/>
<permission permission="none" group="analysts"/>
<permission permission="none" group="issueeditors"/>
<permission permission="none" group="admin"/>
</entity>
<!--
entity canvassers already has a key - not generating one
-->
<entity name="canvassers">
<documentation>Primary users of the system: those actually interviewing electors.</documentation>
<key>
@ -184,7 +264,7 @@
<property type="string" name="email" column="email" size="128" distinct="user">
<prompt prompt="email" locale="en-GB"/>
</property>
<property required="true" type="entity" name="authority_id" column="authority_id" entity="authorities" farkey="id">
<property required="true" type="entity" name="authority_id" entity="authorities" farkey="id">
<prompt prompt="authority_id" locale="en-GB"/>
</property>
<property type="boolean" name="authorised" column="authorised">
@ -200,35 +280,59 @@
<documentation>All canvassers</documentation>
</permission>
</entity>
<!--
entity followuprequests already has a key - not generating one
-->
<entity name="followuprequests">
<documentation>Requests for a followup with an issue expert</documentation>
<key>
<property required="true" type="integer" name="id" column="id">
<property required="true" type="integer" name="id" column="id" distinct="system">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>
<property required="true" type="integer" name="elector_id" column="elector_id" entity="electors" farkey="id">
<property required="true" type="entity" name="elector_id" column="elector_id" entity="electors" farkey="id">
<prompt prompt="elector_id" locale="en-GB"/>
</property>
<property required="true" type="entity" name="visit_id" column="visit_id" entity="visits" farkey="id">
<prompt prompt="visit_id" locale="en-GB"/>
</property>
<property required="true" type="string" name="issue_id" column="issue_id" entity="issues" farkey="id">
<property required="true" type="entity" name="issue_id" column="issue_id" entity="issues" farkey="id">
<prompt prompt="issue_id" locale="en-GB"/>
</property>
<property required="true" type="string" name="method_id" column="method_id" entity="followupmethods" farkey="id">
<property required="true" type="entity" name="method_id" column="method_id" entity="followupmethods" farkey="id">
<prompt prompt="method_id" locale="en-GB"/>
</property>
</entity>
<entity name="rolememberships">
<!--
entity rolememberships has no key - generating one
-->
<entity name="rolememberships" table="rolememberships">
<documentation>Link table</documentation>
<key>
<property type="integer" distinct="system" required="true" name="Id">
<generator action="native"/>
<documentation>
Auto-generated abstract primary key
</documentation>
</property>
</key>
<property required="true" type="entity" entity="roles" farkey="id" name="role_id" column="role_id">
<prompt prompt="role_id" locale="en-GB"/>
</property>
<property required="true" type="entity" entity="canvassers" farkey="id" name="canvasser_id" column="canvasser_id">
<prompt prompt="canvasser_id" locale="en-GB"/>
</property>
<permission permission="none" group="public"/>
<permission permission="none" group="canvassers"/>
<permission permission="none" group="teamorganiser"/>
<permission permission="none" group="issueexperts"/>
<permission permission="none" group="analysts"/>
<permission permission="none" group="issueeditors"/>
<permission permission="none" group="admin"/>
</entity>
<!--
entity roles already has a key - not generating one
-->
<entity name="roles">
<documentation>A role (essentially, the same as a group, but application layer rather than database layer) of which a user may be a member.</documentation>
<key>
@ -240,8 +344,10 @@
<prompt prompt="name" locale="en-GB"/>
</property>
</entity>
<!--
entity teams already has a key - not generating one
-->
<entity name="teams">
<documentation>Teams of canvassers who work together under common leadership.</documentation>
<key>
<property type="integer" name="id" column="id" distinct="system" immutable="true">
<prompt prompt="id" locale="en-GB"/>
@ -267,6 +373,9 @@
<documentation>All groups</documentation>
</permission>
</entity>
<!--
entity districts already has a key - not generating one
-->
<entity name="districts">
<documentation>Electoral districts</documentation>
<key>
@ -280,19 +389,40 @@
<permission group="public" permission="read"/>
<permission group="admin" permission="all"/>
</entity>
<entity name="teamorganiserships">
<!--
entity teamorganiserships has no key - generating one
-->
<entity name="teamorganiserships" table="teamorganiserships">
<documentation>Link table</documentation>
<key>
<property type="integer" distinct="system" required="true" name="Id">
<generator action="native"/>
<documentation>
Auto-generated abstract primary key
</documentation>
</property>
</key>
<property required="true" type="entity" entity="teams" farkey="id" name="team_id" column="team_id">
<prompt prompt="team_id" locale="en-GB"/>
</property>
<property required="true" type="entity" entity="canvassers" farkey="id" name="canvasser_id" column="canvasser_id">
<prompt prompt="canvasser_id" locale="en-GB"/>
</property>
<permission permission="none" group="public"/>
<permission permission="none" group="canvassers"/>
<permission permission="none" group="teamorganiser"/>
<permission permission="none" group="issueexperts"/>
<permission permission="none" group="analysts"/>
<permission permission="none" group="issueeditors"/>
<permission permission="none" group="admin"/>
</entity>
<!--
entity followupactions already has a key - not generating one
-->
<entity name="followupactions">
<documentation>Actions taken on followup requests.</documentation>
<key>
<property required="true" type="integer" name="id" column="id">
<property required="true" type="integer" name="id" column="id" distinct="system">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>
@ -317,18 +447,39 @@
</permission>
<permission group="analysts" permission="read"/>
</entity>
<entity name="issueexpertise">
<!--
entity issueexpertise has no key - generating one
-->
<entity name="issueexpertise" table="issueexpertise">
<documentation>Link table</documentation>
<key>
<property type="integer" distinct="system" required="true" name="Id">
<generator action="native"/>
<documentation>
Auto-generated abstract primary key
</documentation>
</property>
</key>
<property required="true" type="integer" name="canvasser_id" column="canvasser_id" entity="canvassers" farkey="id">
<prompt prompt="canvasser_id" locale="en-GB"/>
</property>
<property required="true" type="string" name="issue_id" column="issue_id" entity="issues" farkey="id">
<property required="true" type="entity" name="issue_id" column="issue_id" entity="issues" farkey="id">
<prompt prompt="issue_id" locale="en-GB"/>
</property>
<property required="true" type="entity" name="method_id" column="method_id" entity="followupmethods" farkey="id">
<prompt prompt="method_id" locale="en-GB"/>
</property>
<permission permission="none" group="public"/>
<permission permission="none" group="canvassers"/>
<permission permission="none" group="teamorganiser"/>
<permission permission="none" group="issueexperts"/>
<permission permission="none" group="analysts"/>
<permission permission="none" group="issueeditors"/>
<permission permission="none" group="admin"/>
</entity>
<!--
entity options already has a key - not generating one
-->
<entity name="options">
<documentation>Options in the election or referendum being canvassed on</documentation>
<key>
@ -337,18 +488,39 @@
</property>
</key>
</entity>
<entity name="teammemberships">
<!--
entity teammemberships has no key - generating one
-->
<entity name="teammemberships" table="teammemberships">
<documentation>Link table</documentation>
<key>
<property type="integer" distinct="system" required="true" name="Id">
<generator action="native"/>
<documentation>
Auto-generated abstract primary key
</documentation>
</property>
</key>
<property required="true" type="entity" entity="teams" farkey="id" name="team_id" column="team_id">
<prompt prompt="team_id" locale="en-GB"/>
</property>
<property required="true" type="entity" entity="canvassers" farkey="id" name="canvasser_id" column="canvasser_id">
<prompt prompt="canvasser_id" locale="en-GB"/>
</property>
<permission permission="none" group="public"/>
<permission permission="none" group="canvassers"/>
<permission permission="none" group="teamorganiser"/>
<permission permission="none" group="issueexperts"/>
<permission permission="none" group="analysts"/>
<permission permission="none" group="issueeditors"/>
<permission permission="none" group="admin"/>
</entity>
<!--
entity followupmethods already has a key - not generating one
-->
<entity name="followupmethods">
<key>
<property required="true" type="string" name="id" column="id" immutable="true" distinct="all">
<property required="true" type="string" size="32" name="id" column="id" immutable="true" distinct="all">
<prompt prompt="id" locale="en-GB"/>
</property>
</key>