From d3f7ab8fbb59ecddb88045d9caad23c07c1718fe Mon Sep 17 00:00:00 2001 From: David Taylor Date: Mon, 29 Jun 2015 02:25:53 +0100 Subject: [PATCH 01/12] Rewrote UI for person and organisation detail pages - now matches design of event_detail and is generally much prettier. Also happens to fix issue #6 --- RIGS/models.py | 17 ++- RIGS/templates/RIGS/organisation_detail.html | 131 +++++++++++-------- RIGS/templates/RIGS/person_detail.html | 122 ++++++++++------- 3 files changed, 169 insertions(+), 101 deletions(-) diff --git a/RIGS/models.py b/RIGS/models.py index 6c4c9c9c..9e04022d 100644 --- a/RIGS/models.py +++ b/RIGS/models.py @@ -9,6 +9,7 @@ from django.utils.encoding import python_2_unicode_compatible import reversion import string import random +from collections import Counter from django.core.urlresolvers import reverse_lazy from decimal import Decimal @@ -91,9 +92,13 @@ class Person(models.Model, RevisionMixin): def organisations(self): o = [] for e in Event.objects.filter(person=self).select_related('organisation'): - if e.organisation and e.organisation not in o: + if e.organisation: o.append(e.organisation) - return o + + #Count up occurances and put them in descending order + c = Counter(o) + stats = c.most_common() + return stats @property def latest_events(self): @@ -131,9 +136,13 @@ class Organisation(models.Model, RevisionMixin): def persons(self): p = [] for e in Event.objects.filter(organisation=self).select_related('person'): - if e.person and e.person not in p: + if e.person: p.append(e.person) - return p + + #Count up occurances and put them in descending order + c = Counter(p) + stats = c.most_common() + return stats @property def latest_events(self): diff --git a/RIGS/templates/RIGS/organisation_detail.html b/RIGS/templates/RIGS/organisation_detail.html index 098d4a42..51e88b7d 100644 --- a/RIGS/templates/RIGS/organisation_detail.html +++ b/RIGS/templates/RIGS/organisation_detail.html @@ -1,82 +1,109 @@ {% extends request.is_ajax|yesno:"base_ajax.html,base.html" %} {% load widget_tweaks %} -{% block title %}{{ object.name }}{% endblock %} +{% block title %}Organisation {{ object.pk|stringformat:"05d" }} |{{ object.name }}{% endblock %} {% block content %} - {% if not request.is_ajax %} -
- -
- Edit -
-
-
-
- {% endif %}
+ {% if not request.is_ajax %} +
+

Organisation {{ object.pk|stringformat:"05d" }} | {{ object.name }}

+
+ +
+
+ Edit +
+
+ {% endif %}
-

Details

-
-
Name
-
{{ object.name }}
+
+
Organisation Details
+
+
+
Name
+
{{ object.name }}
-
Phone
-
{{ object.phone }}
+
Phone
+
{{ object.phone }}
-
Email
-
{{ object.email }}
+
Email
+
{{ object.email }}
-
Address
-
{{ object.address|linebreaksbr }}
+
Address
+
{{ object.address|linebreaksbr }}
-
Notes
-
{{ object.notes|linebreaksbr }}
+
Notes
+
{{ object.notes|linebreaksbr }}
-
Union Account
-
{{ object.union_account|yesno|capfirst }}
-
+
Union Account
+
{{ object.union_account|yesno|capfirst }}
+
+
+
-

People

- +
+
Associated People
+
+
+ {% for person,count in object.persons %} + {{ person.pk|stringformat:"05d" }} | {{ person.name }} {{count}} + {% endfor %} +
+
+
-

Events

- {% with object.latest_events as events %} - {% include 'RIGS/event_table.html' %} - {% endwith %} +
+
Associated Events
+
+ {% with object.latest_events as events %} + {% include 'RIGS/event_table.html' %} + {% endwith %} +
+
+ + + {% if not request.is_ajax %} +
+ +
+ {% endif %} + {% endblock %} {% if request.is_ajax %} {% block footer %}
- -
- diff --git a/RIGS/templates/RIGS/person_detail.html b/RIGS/templates/RIGS/person_detail.html index cd666a7f..ff7346cf 100644 --- a/RIGS/templates/RIGS/person_detail.html +++ b/RIGS/templates/RIGS/person_detail.html @@ -1,74 +1,106 @@ {% extends request.is_ajax|yesno:"base_ajax.html,base.html" %} {% load widget_tweaks %} -{% block title %}{{ object.name }}{% endblock %} +{% block title %}Person {{ object.pk|stringformat:"05d" }} | {{ object.name }}{% endblock %} {% block content %}
-
-

Details

- {% if not request.is_ajax %} -

{{ object.name }}
- - Last edited at {{ object.last_edited_at|date:"d/m/Y H:i" }} by {{ object.last_edited_by.name }} - -

-
- Edit + {% if not request.is_ajax %} +
+

Person {{ object.pk|stringformat:"05d" }} | {{ object.name }}

+
+ +
+ - {% endif %} -
-
-
Name
-
{{ object.name }}
+
+ {% endif %} +
+
+
Person Details
+
+
+
Name
+
{{ object.name }}
-
Phone
-
{{ object.phone }}
+
Phone
+
{{ object.phone }}
-
Email
-
{{ object.email }}
+
Email
+
{{ object.email }}
-
Address
-
{{ object.address|linebreaksbr }}
+
Address
+
{{ object.address|linebreaksbr }}
-
Notes
-
{{ object.notes|linebreaksbr }}
-
+
Notes
+
{{ object.notes|linebreaksbr }}
+ +
+
-

Organisations

- +
+
Associated Organisations
+
+
+ {% for organisation,count in object.organisations %} + {{ organisation.pk|stringformat:"05d" }} | {{ organisation.name }} {{count}} + {% endfor %} +
+
+
-

Events

- {% with object.latest_events as events %} - {% include 'RIGS/event_table.html' %} - {% endwith %} +
+
Associated Events
+
+ {% with object.latest_events as events %} + {% include 'RIGS/event_table.html' %} + {% endwith %} +
+
+ + + {% if not request.is_ajax %} + + {% endif %} + {% endblock %} {% if request.is_ajax %} {% block footer %}
- -
- From 2ab27daaab5131dea37cc266c6bb60148a9e0b11 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Mon, 29 Jun 2015 02:52:39 +0100 Subject: [PATCH 02/12] Rewrote venue detail UI, and added 3-phase to detail & forms --- RIGS/templates/RIGS/venue_detail.html | 106 +++++++++++++++++--------- RIGS/templates/RIGS/venue_form.html | 14 ++++ RIGS/views.py | 4 +- 3 files changed, 85 insertions(+), 39 deletions(-) diff --git a/RIGS/templates/RIGS/venue_detail.html b/RIGS/templates/RIGS/venue_detail.html index a2fd4c7f..83233f35 100644 --- a/RIGS/templates/RIGS/venue_detail.html +++ b/RIGS/templates/RIGS/venue_detail.html @@ -1,64 +1,96 @@ {% extends request.is_ajax|yesno:"base_ajax.html,base.html" %} {% load widget_tweaks %} -{% block title %}{{ object.name }}{% endblock %} +{% block title %}Venue {{ object.pk|stringformat:"05d" }} | {{ object.name }}{% endblock %} {% block content %}
-
- {% if not request.is_ajax %} -

{{ object.name }}
- - Last edited at {{ object.last_edited_at|date:"d/m/Y H:i" }} by {{ object.last_edited_by.name }} - -

-
- Edit + {% if not request.is_ajax %} +
+

Venue {{ object.pk|stringformat:"05d" }} | {{ object.name }}

+
+ +
+ - {% endif %} -
-
-
Name
-
{{ object.name }}
+
+ {% endif %} +
+
+
Venue Details
+
+
+
Name
+
{{ object.name }}
-
Phone
-
{{ object.phone }}
+
Phone
+
{{ object.phone }}
-
Email
-
{{ object.email }}
+
Email
+
{{ object.email }}
-
Address
-
{{ object.address|linebreaksbr }}
+
Address
+
{{ object.address|linebreaksbr }}
-
Notes
-
{{ object.notes|linebreaksbr }}
-
+
Notes
+
{{ object.notes|linebreaksbr }}
+ +
Three Phase Available
+
{{ object.three_phase_available|yesno|capfirst }}
+ +
- {% with object.latest_events as events %} - {% include 'RIGS/event_table.html' %} - {% endwith %} +
+
Associated Events
+
+ {% with object.latest_events as events %} + {% include 'RIGS/event_table.html' %} + {% endwith %} +
+
+ + {% if not request.is_ajax %} + + {% endif %} + {% endblock %} + {% if request.is_ajax %} {% block footer %}
- -
- diff --git a/RIGS/templates/RIGS/venue_form.html b/RIGS/templates/RIGS/venue_form.html index 8d058502..4d99af7e 100644 --- a/RIGS/templates/RIGS/venue_form.html +++ b/RIGS/templates/RIGS/venue_form.html @@ -58,7 +58,21 @@ {% render_field form.notes class+="form-control" placeholder=form.notes.label %}
+ + +
+
+
+ +
+
+
+
+ +
diff --git a/RIGS/views.py b/RIGS/views.py index 0894d800..772d92a7 100644 --- a/RIGS/views.py +++ b/RIGS/views.py @@ -176,7 +176,7 @@ class VenueDetail(generic.DetailView): class VenueCreate(generic.CreateView): model = models.Venue - fields = ['name','phone','email','address','notes'] + fields = ['name','phone','email','address','notes','three_phase_available'] def get_success_url(self): if self.request.is_ajax(): @@ -193,7 +193,7 @@ class VenueCreate(generic.CreateView): class VenueUpdate(generic.UpdateView): model = models.Venue - fields = ['name','phone','email','address','notes'] + fields = ['name','phone','email','address','notes','three_phase_available'] def get_success_url(self): if self.request.is_ajax(): From 42bbf513903e5b7c23d7ac64a7b6c3e9d0d4409f Mon Sep 17 00:00:00 2001 From: David Taylor Date: Mon, 29 Jun 2015 12:57:12 +0100 Subject: [PATCH 03/12] Changed Terms of hire wording - Issue #111 --- RIGS/templates/RIGS/event_print_page.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RIGS/templates/RIGS/event_print_page.xml b/RIGS/templates/RIGS/event_print_page.xml index 96087e71..f8ef3a58 100644 --- a/RIGS/templates/RIGS/event_print_page.xml +++ b/RIGS/templates/RIGS/event_print_page.xml @@ -268,7 +268,7 @@ - Conditions of hire available on request or on the TEC PA & Lighting website. E&OE + Conditions of hire attached and available on the TEC PA & Lighting website. E&OE @@ -295,7 +295,7 @@ - Conditions of hire available on request or on the TEC PA & Lighting website. E&OE + Conditions of hire attached and available on the TEC PA & Lighting website. E&OE From 167549e5844045bb8f8115f5fc1df230fa6b2430 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Mon, 29 Jun 2015 13:09:35 +0100 Subject: [PATCH 04/12] Added bottom swoosh & swoosh to subsequent pages --- RIGS/static/imgs/paperwork/corner-bl.jpg | Bin 0 -> 29688 bytes .../paperwork/{corner.jpg => corner-tr-su.jpg} | Bin RIGS/static/imgs/paperwork/corner-tr.jpg | Bin 0 -> 29009 bytes RIGS/templates/RIGS/event_print.xml | 6 +++++- 4 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 RIGS/static/imgs/paperwork/corner-bl.jpg rename RIGS/static/imgs/paperwork/{corner.jpg => corner-tr-su.jpg} (100%) create mode 100644 RIGS/static/imgs/paperwork/corner-tr.jpg diff --git a/RIGS/static/imgs/paperwork/corner-bl.jpg b/RIGS/static/imgs/paperwork/corner-bl.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d31070f3a7d124bd2f926bd18b3ebf4f5d915d0b GIT binary patch literal 29688 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 literal 0 HcmV?d00001 diff --git a/RIGS/static/imgs/paperwork/corner.jpg b/RIGS/static/imgs/paperwork/corner-tr-su.jpg similarity index 100% rename from RIGS/static/imgs/paperwork/corner.jpg rename to RIGS/static/imgs/paperwork/corner-tr-su.jpg diff --git a/RIGS/static/imgs/paperwork/corner-tr.jpg b/RIGS/static/imgs/paperwork/corner-tr.jpg new file mode 100644 index 0000000000000000000000000000000000000000..02a6fdddd7387936d20377a2a1a321b958077cbc GIT binary patch literal 29009 zcmeFa2|Scv`#5}$8T-Cv*Vv=M7&914*|(5vA(g?{*Re#BiIilIvQ(B9qJ$`<>|0WZ zEU9cs+Gr7N-ZP{1dHO#2{r>O!c|Y&xeU8t4?(1CVx~_Ab>s)8K&pB8bUKxitObty8 zAs7vek&BTFf>tIN>I}lY+#$%^9Fl_|hykL9aY1kZ!N3m$6NG4~Fa){4gnq!@unpg6 zXaJ281Y$@AJR}%~3iALs`>+>;_{Lif-eWKqt$9Gk@%^pi7T`ieT6zYA1O$5q1R@Q5 ziGD=?kYFTU0gW^#xO(|hG9V0E38#)$QODqsO3LbJ8~}hc2!iLsR&`iefuMYv?`6T$ z^Wi^XDkTKb!QkKYrTeu`Fu9*~f?gqV`Jl?L~J~(ESzf*u+j)|GC=uIJ{%?v(Qv}x zoUoOLpxR6;t+35NOIjE;0EH<54x9!-OGnSZ$ixg>NzuJC( zW>M8>yT_ixCyK6h3_bn83DM91Z4p$R=;>&2R29UOxDY^tAaQP5%z-o>iUv(qee=qa zE)%4fbUkZc*I?{|6dgqYdTCs9KTzTfpPPZLN(gcChYJ6!fy_@8Rz@KfIJHbpXfyQQ zCf!6z*2r}q{n*)bQx_k?=iWlEi;F2a;wG|;g`1AXuRyyc8!YZVVQ*N0Foq^l;(W=% z$n&B6i*pctTOE(p{p-3?i~~L>w3QW~>$KG#o5_iB{0fBq`0N;tsB*WRvkLFKt&T7Hu#4y9*uL9QWi+F{>z{wwjtgE^8;O#Tx@I-$ zBP~D}PkE<$UJ=ZH2+Vf0j*hQne4Arkm-on^Y+CqpsH@Evcp3 ziCLH5z2Lgj_h8v<1?rSMUyK(~S=ux=w%_9I`daUP`t{1fF|?WXVm+JRD_B+5Rmu&o zK*1u#67#{P-E?1bkFlMwd*%9;{CQ#pVrtFk@9OA!Cg4|hg4;o9$6W-;^ZM71*UI0_ z-Ok@>ck1N5ZYR9!u^U;-Sx?H2%2q{Re(y9$eq8m=cL_81u9SwuW&laup z{n-k#6tkECQ{)$!NFn7zje7O z3?AOOdG5gq6zzQ_3OC(v|59hLOeAHd_JYF>#mfs`ubAkx%FfLk#d5$fJ^i{7xYuDZ8%c{ZyFNL)R8$Rp=2AIC*;lh$|uHnuVyY=hWt$&UT zsV_7d@$Ku$vxqqGuJmiQm+VUaf2aYaVUKYz#1_l;n;65eH`)7S-FoHSXO4tV-QGX9 zaaeTtQ%a7ABJ!jEbkLVB*<`7&XTsDzJsA7IlxNj}vmdLg8t_lP^Lc0m@|nfkce$2S z?cN=Hxnl)Vw%cr!X2yvs*ICb#u>!5!`->7(@7kCX57V$|@l|EWV#UGdi*NP_zManJubDm4c1Ze;4fG67&%j%z?@F={Y~YQrslCxV`{XS z{7oV&HAyK;lu9Y^dm8?hnr5WNAc9f#kl~=FnW$?A3P?lM;5`*<3@N(1gB)KFgH;L$ zuy2@x?3^DM3>EJP;_oy#Dn|Y%hAMLjq#-B}tVI48;IowMKW44`pX5<(K@m+cKDBlT zN+UoJ6E&trR2noDTwO)1wh^TUlv+{NRrFLE1}cVPGk~MfUVXmVUld>=>Kbj8Tac23 z>wsw0E|eq$PhWii&J_xPNRU571Tj?}mEhNiQtr3#gYP?n`u>IB2mYIKl(c`SuP=B} zs!Qh*5bEz1yw%0q6{NoLS-FNNffUs}ZNPHZH^AQmq^ZG-=pOQGS~n!XZ#7L(1%j+R zJip~r({#bUUarJoJ72S4kO}*(99n7~Ky!hIo|-Vx|3x;v2Pq&l@HZ4)0Ljb4%b(~U z>IZmO46G^Aw^DH+%}NLj2{0o16G?;+q8mU!HW7iuZ^TTi#1srA$HdPA310tC*B>5A z^0hIrw*f_cGcLvWzhlgUJ&3l*#Y04$J2fIr37j3EJmTSG&FiN87ylP_?jf5Wo41cU&G`Zqi?XkyQQC8zeh z4U~c)7Vyw)o~OdAy^Qi*x9Y--R5~$gIs(Knirx4j9moxIG#Aj#kdP(h3E&X$1XH0v zfHQ!6L7pFY{6P-IdxihUJV*!+DL|9~WOYt2E~H~<{j2pLLz0RAA3N2rotr{M?NEGgtJNq{3`s`d<1W-idlMzK8i3$GchB#V zsKbC^@NfMP=tKI}?Y~J0HY9!5hth?=muRNv|BK#~maqz-4nC_RCSa!E*bAsqg#Fw} zUI3yDOuyJ+wdYV%A5>u6uo4@owUq zHz75{)x-S){fHq1WVoNNf3SMEmN-?oI)Eu?MR6pRB*aHcocgtlv^Tdz>IIO9NSp#% z-W9EaMye<&C@EuARaH?)urGjCL}L^&Sa~H?b*!>FP7V1jh=bBdZtm(<`i9@i0x2!= zZ`ov&Yl2>4eSAai~B9Q<_ z_7E*`py_HA`~rW7{iChE6S}$npbG?p7qxIVS4HBtEe~Kc|gD2I?vQiZ{{Ivm^z$ zd-;M4>fG$*inKD)MSeq4H8wX_H}MY+A^5uzP4uh16@yk$ zQ&LjXQ^Kn0;&m`+eFLlx8vC7BKfpDVvLE-I*X<9yI;y%ly2{FEjINrJnm%sTQlQ+` z#RI|jPcpC=jGCUFo<3S_wfujVLGc5M2v9hI((|;$mBf)$q&>wSeM47~7-ftSP6drt zR6>LBjl$ut6h8@U{k?$UG2b{XKv`i#eJ>AUFa?WKL1A#J;86n)9)(fCpfIXf@Bo|| z7KKwrgGUL#0I#Nu!r)a<%4j8&vXUBj@F*MxJjxh=19DW+-~qI%lr#?HgGU*wjM2cO z^;8TD^mWh}Ree>o0Zt8TXsE2CuY*%lGEmjUs)-{hj;?O$6;AZE*Y^U=5lpoQUI{eQ z&n$;OW>I~|8jRGyM^tb)W!yKG-z%!DqNajHVbORMG&KfQP*uXL#uzGQHC6_AoYE={ z7DeGwrN*GTpeg_ZVt~P_;n36=R29IWq96vQQB?+pqr`w7#CS@q1}H&HDN7lckrGo% zQ3mFv#DEvXR9;|QEbvlgY7Ddm@G3@?3ae3KJkS%wR2n=Ez^WJuUKKP1h(U87sS;IE;!uRu!kOg3~di%tO?nUESC#7>sZc-)1&zV$e6p*9%D<&D9C6tKGtt zG8Piu#J{1v{xAgmy$i02+~Y|Eo$o)4i>qY80q!At2qdD82k5bD9)A`8sRF@-u>Y(+ z7`Fa0g8jSte;lj-Pt^ZrURO_ozXuU4eH6w2u|lo^{*-TlpOp$EkO*MKLnH-jiMx{m z{E&peK=92)9qbgt{N27Sx_(Rp$dCZ!FZ07c7UV`Gfg$Wi)Bjq`4;_&IcNX~fruyq- z^Z!~?DN@#RtNlpvU%S|9T7T7?hLjefE_u}d)S1@ejbQzw?)JZ$Pgl!b{XqX;&ZiW2 zp;q>n#q4(!SRqruA4~I1-E%09p{MQ2iwZQ+6Ebw!4kLVAUwR^zU z-O40=4cKtlZE3aD(8SDuy4OozOj)ziAR)-lKZHctda!qJMADCdZAJlz84`q;39i9` zI+m7ZlubwqE#>`tSiHZw33*Tc&-uSo|4WM54Q$PUtzOEOXMkI%ADRq4e)AvLIMFyFAQKF5>ODplzn3!k5yQo0=ulj_EZ`hD?LC%(UlFX?7?XV{XPJr zTzpFls~P*7)Tpd5g)1p8QT0dKHf4-5As8H25F zDxB|1Ft7%&B*1qDhUil8(g1!D>SL<|U~tikhRdB~XuC>Jqq*19W;=k_0lb@6h>6WN z{9b<-i>&|#yflSA0b3|?C^Vg}!FrSgb|1y7Z;*Hg~|z(5Y1We@(#930P6-757 zAJI!785jW=$U(dz`rA_M24Gr#H-bLJwh92=1lhp|;LKw6WWyDlU3>v&8CH-Hqzm4G z;7Bn5a)-RY*@hAIWP@_Z=mleid;spxbe4dQ^o{2yg$I>;mck7VEdNZiTEeq$Gyw=c z1R9|X9u0&ULJOgWz(YvHW`s6k6G9(g@d%9{8dw6J?|LF359k@F$EutlC=`@T(ZdeX zO%)8?@Ph{#L)z`-dN*YrX!Dah;AcLNLpjT#)|h(8`ilj?`Hs&IO8H;y)UmIg|3?mT z5K-fFkELTDw3T{t^dIa?J54)FI|$+t+OePfv=3;YvFb9+Yl1o2ycQnz}w-M;n#o2{Bzr{O8L?D)cSs}Eu|H{m-nl! ziI6XwE}IaW1e-qFdNwIGvmaDQHa<2bHe)s!kR$ZNbA5m2|5g_-$N|{uyH)>O7NrMx zLAF2>FK7?dCxWRK_J<;X)L*Rny$pmXLJ48=FJ7xg@#XInbOv<#bUF}{PL2*wr$lE; zfxq`WIvJ3M2eH8q?N@uw4~pMvK>URYSmlQtd8*e@e3il-2K4p?-T<~|!ol1DL3#m! z5!8cHaN>kkMe2a5jEFSxcU3?k3BJBaYF03kL<}a9z}|}jM41OEd=T{3iaNi+*4_Py z3o(Zvtyf^o>ivmx427VJ;HZ)h`xCbTjETH?5LBb$8cGUVl?Nu?9ta9{SH@7&Fcw`f zHa%Kdc?-rX`g92TlD4w)sc>cG%NZbl41yYc!NpTC>QNfxrVV(&Em#gX4V>af z7Zm}g1P~+Wz@IKx*_}}iLB4}wD=o#3VnArc9 zcTtb+BN^Ate?E~ip3 z2tY?m2XP>s={dQ$(UwX)V!XZD<>Kr3BtRK37=j)_PluqTp$F7}loJwDLU15;wsDEm zIunAp(Ff8BFjf*3O?|q`JeKnlk_#>*J!}k}c6oZgbu6zw*S~7eyL#;t25!4@g5p1| zUcsS9gsZ8GSRB?Xn29*04N97I%QoDWN&*xv90xh$A;b|^X|_g?jK|gPg18OufYyXx zxR`_uCvVMNIt6BVYeQa$&AiTc91wjE@Y`=RQ@9)FH7)WX*jP8_cFO>80)!W&Cj!wq zxX2`rgCwoZ5FGz2MxQ*dY+=i&p=OqB+)gi9p4BE zXVVc*Mv@_D9+|M50AZK~oHam-zx}4Hhb7|~kMwZ}M)r(34x9DY^E^q0)CEI^AmLo& z2lU9F;wTWkHBXxoOE4M2uuN&b2dk>HvO6Uj>2!!PcN!@zbg?s^-P(oEH5H=Qv&gwP z4)@5-2fbr_K)MnVGJAle$oMrxWVs8(hXDQb59EMe!H`~M2(eW5nhTR5=nd|fu{znI z=OmE~(bZzp#$kI^YeBadADFoaO+TQ!_p2Z(%ywQZh9II%Pts1)B11H&i=1Q{<7zH# z(5=GnBf{w-s=CG@=z<`k5vtD9&TfR*Sk1h9+05&Gd;d)q{K7$J{=-1CgV`An#3^Op z2u+`qmj<#}TpcpC*=AZ5fpHj=pZ2rRG)FO*0v*rcf*SFt!@Z!4e+{D2FwqEzCEXHq z_)sy^ibU88hi+IWxY1?J8W;iXNXpquh9pw*5^4~A@9-E(B@HW}^>+U%2c%(52Mx3G z;mAy7Hf`wbMq=PBOmau!IJgYZUMc}eCzW}SAtiGLE3#BdL02zCPnV7Br5_~!K@y~7 z+`<64rMKHdaE=RUkVv;I5l`{Y?Y#LcQ@-5V5IeU%50cS(Ha!r6_4YmC|D!^{y@ijW zlObis;4!d%w`B=r|~SyMcGH272Bj z+q2F(kpGb%3~~gnK$d3TSCD4HwsmYSFY8R#NSCCh4EdGUeZu{-PEnH+cf4(U4+B&dlbEt&=KXF%%=)_)Z0u0jc2xoYtZ##6rU%+7|x;l9g1GW-f;~4GUDW{-Pu$n?Voa z(r<*?am&-p7l7j`fi>4(1H53TX0plK4bb+4RE&Ad-oG+X3DBJ!k;l2q>1i2KXfvwF zYhpskiZbfjLq-d0b))vSEPCPFSvq2Wk|9Wo-p}a=T7@NWEB# z4S-mtP5eeHZhfGsEj9e2B zJLYPr7PG(@{KDl#?VVkLYhr?qh&Q23AqJX!My|!MwXuY3^w6ty(;$c9CK4Gji)&-z zbTgJZq7B<6r!AzmHV*a7E4N=cSTu^d*K5MAkk`g!kcK=V*+^@D3I5}*{$Chp?UIWw zxZ$A=+{nO4<6nrsWrGQhu|*BCX3$$}DWXz=iFc-&gO%AD18myv4of9vGk$FW0gER&P(FLt7*fP^ z(3Gv>wFP?J%0MC*lh+zJqy@T&f1gdii=)wuL-ZlPr~djDC3=qE`H!pE-$iUsbgl3J zA8u<5422uk!8fdt7y=9Bc_~KcHIt8D6frAoTr)Whq6Lqld{wV8fDYV=S~EE;UK?^G zuTeDkrn6V0EnX`%L>oB&KcGg4k(t*x@c<1Nnvv`B*Q^P@8-u*|nyEDtdjAL1v`%wt zw;;qcG5$ZGW{_a0UbET|$F!IC+NmWNV*b+y?Y{_e=7?K+!-Frl|3Op2lDBVJd&9$K zbifDUf5U$*@Lvo3f64;U;Ix1NMg#tm2DAdnSW{ErZ*2UMqWqN&kf*(PX0)2)`N#O` zFPeKDqvSQ-RdYY{zGW^SVN%4T7gBMf!Tg{_52p9{oJN?!88t6#LPDN?PNS*rf{l$_ zRqs%YT;bucaPM`-0)jrHi(fYG^Dmn?k(HFRS{f-EBLQ({F&p ze`v=%FmtQ-*m$w4<*BQaNPg{U4m&l&7m-t8^wZKDkIVN;pJK7NN9G(2wY+oh**%L3 zV%T|8_fx`2A6bqY-`CJ}D1JE^c19X(1Ivle)^RZRWpxF58x!Nk5EUpH_^}r8HmtSk zY>7nrTL!ugJ6rm}E%jDiELmUo-Ymb%$oaM#ol{@Pa#*0Mz57vR?+L&_ zW`{3*_WIPM*|H@z0(Z!ZmlwZ%?Q+>ik8ylNXTh6%loA&L#ASZGG zCM_=~7xdX%g5j{`gY$*b0>^TPI|^!gkIjw->rBd?Jv5IACk~J>c3*^ESTdgH>hj6^So5p68J{~WRz{%UZxHq-Wrx}0li1SsFHy7a)UQWDV zK!^YEwj8EFn%Q!@o3nafGrvmncFTJu7v=4}9$O-le~ae2hh{e&Tt;*<>!Y%2%az~- zlDFT1I`(5ZL#mq>KDJ*kEZyFb{eaP zoTB2LlzfgJAq&rqb#m1{Bz(sc;lr@W6UjJ9M7!p z9i+Rn>2T#CKhUTG`SFMBr?TZ#G?_g_tL&kW21#a>f>6~)u#OvLsETFfZ2_qBzg@v#1_ZrXG z>upx{(Z^r4k&JDYb&Go+A*YbDc%%OAWwu)^DV%cIdoEs8IlnJjf@_h@AYQ5E>FLdR z>rd=uiRlp5;OlDYdcI8Y{X7C@8|R0v7IG4&1J=>5bbHW6_gK9XjErsD`0VWGpLpgU zVf=J|jC)tU!%^ouB*QL;V+3Z=lS8;Lj@srt{%+@M9X-!Jn&a~z-Bnub)+FbgA86_y6> zmwED{k^IKGI$8TU%_SAq^`t-Jk7o9rqQd z84d2+RS5|v-ICI;bZ*j$()iF$vaZM#WFE)JeN8M*IC$Scp-9kPq^9H6ro(dLLahZz zjE1Q|^UlT!@tdX(2rnG&yo%STcqMCgPG;X$rNFt4>X%cJzB!x4oVl%fZc1ck9~~Ze zKp(((SO@k;8?K5|mPTIlFw4F;QE1QX4$o(;4Lyr=;+swnu#BziRFj z5Sq-6CEICLswU3s+HBHpe9}?$nBjI;+Z~psyFzC7W*nE-`NZp!-l zJH@sM$Jr@;Ojm7vc_wo~O+&i7^MJFQ#$H*SopWVHuqkfFAQDRH&iV~)Gv{*mZB@u% z(cRh%6ECfG$G-XbWow#IT-RYykg%*;l#{(UQVki(XB>clp9=B z9=c5%zsN~C&2Z%KhBo)}$MzY?2eSL*EG}F>$Mms5w%xoP6=q+VbVE~7Cr&_DL(_o3z}Rh(#-;Dq`?PzuIt4O$u*>tj*ec}THXvbzOx|(-Krp0 zdOt{rm1P@coDmFI?;hkv4yn|Q&p(R^FRm?pesd?V?+ux0U0~;ENpGENg;R!E&XsdrLQ-C#cVk0#o71~p z>X*Z-39`_)5w~lF~x@|J!@(&r{S)? z&ZWE~ZWUwfZQFP?PsMJi40yfA0>$5H;<8V1*lJp!cdG!)1Zvyu?i>?X7~uAN%@y** z!x2|}0y}+ApghiklmE$QzL=mK{?4PDT8Ql_bCRqAERtSy`+GT&uX&2QJm@RZRpyeK z$~vET_wD@Jp>a#6EVkmZc=?SIKgMFr`QFIDrLlX5BX*}-W+som7jSXwLCYk*EXqhYz4 z-rB}M@A(&1pOYOl-W-p(z~B^WF)umF_(agLRP7=Gbj-|bf0d6eS7Ra!bNL#QUno>X z?QalLy5kyyJF9xIw_SfbFJ`-WxuGe~xCrBXPz4RMn8KXQc@6JKE7_jQnvr6A``&-O zUhyiaiND{WF|ANRNd1{l(P&w_=_I{4#$_sfn?V@MyeakpVT8M63vlrFrI40tvQg^- zlb6!GCVz@>lN3|b1^JVR9umGjI5CL%@IE1N-Gb-4Puas?JQB!*cZeNSj;nSHL!0xY znq1Wiytqp)e){&p;KhxE&J2f&PsL^A=U`TIW@^69w52^=UtXQ$FTt4`^%%iu|M?!|oBQ@g&Z@$d z2d-(~NKX3XoXsU3S}Wmp5w)FFda(VX|L6HgA&CIFlZXd)_T9VmxzX`8Pwk%@?e7Jw zQ+u{O+#XsxPT;)DJbujkUevS3f-?%-%^6%O9hagV^>^=*V&#l|e6QP_a8)_%;|}&0 zjn5Ay^t(oi2vrT?lNqX{H}UaaEEhCXSAE87ZU3d{WlM)#A+aZNct#`Oh57TVVxKSV zp7N9q;nGo-NjYR>{n|WET1N)zyd#vnN9W_cMP}qzRbQB?W-*vWa+0^ybwCyacHWE| ziZ3+wiK*>K7?HcE{%Lqb(D{zw&Qg~5li@)pl_csN7TaHL3SXLeXX3&>RnDbhoNWA% z``yq+8}Zbv8aG={v&~6|PfeNc@?jH-DU@^P@v(LtM(LY4l%G|Luz#19TOxk$i^nt0 zYTEQeR*EHoopKVjWnYUQH7yUO9_3!Vs5rHYKEB03GJ-aDcarO(vHe)IwnYodFY{RQ ztW>{TVT>s!A4__LREjf8DwlKiL4%Qtv?f!ZeNl6ow0``xJ(QJ-{fBgwZjtz8hMtPIE0FJ|yWXmAtGBK1V98?7in?I&g*)oyi#P4*9atZh zx&(s+Q%!4 zP4m+d^nqs=O9@}By|cgcOk^BP+BJyvLXnhQ_a8bjajMKnHTaO1OJ|3XjQ7>p(J!Sk z%Y=#a!}9{832`z9wmH_(gp!l_4(uP_baeE^_)^i(lupmvrn;h%Xx&FcuI#rq4Jt>v zy_`E;?6ev2@yK)Gv>TEh0ap(Xs+8nDW)BeGe4G#G_;S1X0{0loW$6fLz!dQ<>;ct> zAF~0*GcVs%NGA2zUAKMnS^op`hMO4d;9?!)Ci}>!s$H{TB`1Igu_KZS20qo>72Ayh zHz~%SGJNfpWD^`2RUh3x_y!fT_;zyHaP;)nr`KvZd(uj}aJyyNw+B|H3|r)s4DIiZ zjBAZvc(AAucT{WggRIc2q@Km=wfuJpTDJyI_iJRfXgQ2s9C^)G%k_AlNSF1Xbt&8_!%U)}$y;Zj*@qLKd`d?|+emTaX*Fifgt z8JBWwMfY3UEElsj?t5^fu0$g3T=&j4c+Mrdx%;O};mq^yo3SV(-iL$lXeBK>n-ed} zF=#NT94n4~FjwwgCZ7o%^mZ}Ws5g#U_8su!SxCPu#KfUfaDAK9ty?`A@(z`)Z_tfn z-muq|cQXQO$@zCrNCp+)M7wXmr{DIW%4-T(U`63q+%a?g@24a(W*(C;i3gzuf zs7tlY=#4=mkII-lC-nz~;E#(ZMK#_(u>#S|So-aA9rX($j7OiVmE3fll=|rP)v>-$ zP1OR%@AopD;qdD*5}BH>mbALDbktUO{hkN2o(2X-d6YV%)rG#iuLx(zq9O899KPIYH+K-)<%}LXFQ|oT7!``e>9jh$71;dpt*>`LNrgt!r9_8L zQ){}mtru;)Q58xK>*kxgGoNFJOS3HZ;mMarh{x&Kg_sWQ)^-Gcc608mUY3==+9O4T zL*>Y9yy+Kw98>uMVorLGm~29Lk4{aZPxz*FPUi#5c9$gF*J!R0(!q&>9gAh(W=648 z-VhC)nvuH0X4`YmSF2_8Wiwt1EGR0qIwNGzS2qxIP1=zp8^{B@FyY)dAk-w(5F5N< zllaw}XiaF{v{cmMbl^V!>RIDQ`MKK;&^I{d_l`c5^!IsbVtt?eA)$GkyF8V>;OxT2 z52+hpR`{MgDKot{FDm}Dv?VLNcRmkpzH5Ud@liE)Qz^sSBaQ8^(Ly)Et(uLU)I~~k zK520i-v*&7%8Ss5465Qe?R z!``H}G~uFl;G92iORvh-;^xZM;dM~usX61C;Th84?RV`Lxa4v=qM9m%uFgp=@9~_` zvk8^t*k@4qOe-SBJ;Dn001dk%JZ95y-^W>}SdFu+&$M7F$k2`#A!I)IQGH>0D|gQc zTU?5tHk7>niX|qUUob`ic~r0O;{#iWkFB2~F zy4rQ`hxPN-4hoMLsu|8#bG{l2DCd^{)Uh;LQ62S&TuN?yp`v)=BF6uMTvTn zr&6X1HL-R5@At=Nc00LuFYGF!*?!ccY(Q#>sc84HrrC&5}K|pi&mdZGJ4wk+{HB&5*d&wBKn~;u-rAoV~L%I3o(X;EaUWtbOL3BI+7Cc zRr#OGSak$r_MJVruWQ-(l2?>3$9hGzjctr$DzUT7?WOcqj#*FnY|>(_8-1_1?LD~5 zse3;%hOO5y-_AX^NUOgw;M~%sXd&rHF_~=mf$|tes5f@1%$6)?z@Qq#diJ@Npwg4i z4v96`b3^52`9v%sTtaX}UB)i;>ugX2H@Y^1X+FoVW9bBQF`;I(I9%wV_ks579TVPY zRIA0P%v^t2Z74XPq7Zv4>v3yU!NNMJDS1&%Z#mh=ruVG!dlOj? zMqDoCZHXU>XOD_~GR=C!CwxKl;FGsON5oZo6M9pGR6HavZL)adDc8BNiY4lJK~17z zX3jcUalumNconk~cFxC~F5t1Ol^?&Vu$<2yHxzuGc}GeLK6?k6)K%n>?m2Nszny05 zu`GDnfKXC^XvrLEBup{GonGmLV^Ge9A+!H zMP6rj=kp2PFQHXv26#f=}0?h06Hs9MTp&s%@AVW~(R{`kNL$8yy# z^4`X0_srS2`s5zjZ|%H3?M_Qv2`-`TkafIxVcVOk1na2Hveyu^+k=Kf5vj)8t|xW0 z+8dmjP8}0=-sdY|Zu5veUv3!7 z!yw1^)VR`(`!}8np_ccsbCYckO>Qh(-gJhkGm*hgBHM&NHoihZ^U>*PhF~~T>Q=_) zPsxQdButus#GQkWlJoB$bO_Ftnc>?aP@7rI%BJ!DmKsaqhFbv$kwbUy*J;`uII7~! z`}x}Tc-A4o6-e+5Q*34Hxoy|WtHZY_-j>%(KF2e--#V^%1v39MU#(O8>b}zLg49XY z#9A&3nOoQoLYJE4cnB47IGPJnhkgAHm$Y;TN<9!z{q$_sI5i?7b<@f2_=Q(j46>8z zOVWe~o)E4u&9S2vp4i7q%D^k1qm~_bj|e~8MbsMaecqLRr(Lr9)`nZY!FYpx9j1HB zk7p`9jwb1uqKUJgGdCXHiJt?E+a%kk4YGHPy6B*IV;Tz zjED=kC)oLipChxi1F~FQy6&86{$x2-bi@SV$0tO4GKf9bFSflg_M*!vxNO~7rW9s@ z%FN>%=g3?wFE14b^-IRxQfrLeg2LaDye^tAyVyU-znAV#$b9+Cs}h)jcevjbJ$3#k zx_TRF7{p(&WgeH770)S^EfB46>kJj=!^M~y!^)b!)V*fuluXdJ?IR;&%VWLNJB)Rg z8TqTq<#O6WP3m3=@3FShTr|JSAkmX>c4M)ckV2&70B)nCezFvy9)4MRiw1u>->^1i zA^?9|TPpg=o)xHV1$y{-Xz7dbL{uWmToKIxc zd0iRusAL!_ziaVv+l3{^`~i`=9^u#{{M!zUvgVbB9F)Ijf8V~;F7eow(g=QU={*|; z^}4b8whrbS7ai0O>C7bs7w{0hX>=ABMGq~w^u5_Mu28{tK39k^FrnF1^W}bt&|=v` zSDrb3Vb(#>br@Zi@&KBJDRT?89T}gEef0eGS~e`5kzRqegAH}~A)SvTvf6=)Sj=Ja zPAN;e$jHtd z6u*&D*k6ucPXTa2?Zqe_}~1vvv{3uf5?crbo_49wAw!Qm9m+I^YjZ#O> z`WnFaA3EA~X)1`y@?g|+Vpt~+hDj&NsS5GMW?n68@n@vv_hJ>|l?Xi;OuE@V9GV!M zAF8ov-^0GiDbK#_i*~YEcCfb11?=I|h~2W88?w;08PbQvm6!`f2QQs7LdMXJ<~ zq|UMJmY$Zw*LQ@fylB2P>zxSJv7zU>JPNs*073gUOlD}SP}LD<(peW6=;_w!K?{b)mmU~ifAW?=@<^M2y^Z}0X8fkEu4yW} z)Y5wY!jPMVPYOxv1niS{6vJein=%H?$CE}u6EmE_@O*tl!l%6wUx<>U^;6JOkCRI5 z_< zzs%FzB&CV*9Se;ow4jBPRfMqC@*5&{5CrY)bK{2K1mUyNZkE=rJL8A;)j#jxA(zUI zvffwLzPL;;5w{>`-1rGQ;Gn+U3j9_P=}nq>)dY5-+OQ(LgWj5K$G91g)3FL?gsKsvscL;J7XvsBoNkjHvAl;jWOUL~6+ zsL9#eoJ4P|`pB&KsEOV${dp&&T z*7ymtF#i`p#3v^RkEdMHX&62{E54yp)*V!^AXIHeDt062vMws?G84@eM~fOjeF@=O zi%#eL$Qeu$#}*<(AIs)gb`Hf>iA?q!KPf77n`AZPn6^7C{sKov-}y`;Z|Rj zlCi1DomS}^h-$I!w~2A2_BR{%4m@Kyf6&?BkTrJyRfd7qJay7&2&b}le>6QZG>!W3)NIo7jn>7k;Y0pt&-&~ZqONJO?E|{%l8?E&40okvNoj4 zr@AIg+IC*+comG%KBI?}ZgY)! z=LWu{kLR3diZ}w+;ZK&AIX!B5g8PI$tP3W#qw(e4cf7J4dq21AtUF{*^HhR2P+`h4 z^6F!kiyN9Jv6r{r!Q*8&HnxAI!+vl)1Hbq%`h4r=(De+r4X*`VGM-$h53@MT98peV z?fnXP6~D7Vjp)%0BMmlZ5=xmk$9#hY0xfnXjql&NQPLxBU_glBiCC~4Br)@PX#eFj zU2r1V>Pj4({1kG(<($V!#`IW)j<-yNx$_lvyjB|wZoy?jg# zx_(DoCs(537rR5-Y=U%A4mx-bnFBXpZq$@M=%T_&z#4w48S=!oIGUX%_z1@i8;p;< zsf=y1a*0a3jy+F;hu02_-!k`lRTWWxoz4ha;@YV9^2JCF=YG@~<4`Q&Ks9SWi(#n_ zW>DxM=ys7)s%QGAc5XyUwi>_X4*zO?+%sugoPUGEnS7@K=d4}1d-gu_h#|_#31ZUp zUia6U^pGMBK?9#z3}6j6kF%XGY2=llVRyehf3yMfjO|b&ilMfn73U~GJM-SJ)geD) z*ZHaPq>uY*SxK*hgpxneS=*|{Uff%@ExI;2#&&&n0PjMJWyr|~QJ&jpD?WESY1xY8 zo=cohc5=|}7hz?%Cb+kKs>F_LmY?;YAv8zUrnC&1;3a_SCJ7a~1YTzktDu|rSNZbF zc5`LU*PStq-)tPtJZa&~9YMN=bnLQNIN#opbK2ur;c5siLT z*_p*z63n6aLDuxeB+Y{4U;AQD#*|D6YBaH!Ggw9$IA+ggiV_disTP>@qZn;s~Gg~tZ~t^ z+*4tkZaK;}fei1TM}Mrvo|XSNhi2KaerL$p-U<_rLw5WztOn_O`$I}hug8Bq7#4Wu zWAbyJphNWG{m4{uBk9z~ONhdf`<`xevEzP|Rb_dj76Wl#X~J;PmrBrs$K=r$Nf+!y z#rvORZ%wz)avHardR3O0_4q`fo$V`)sQex8hu+nHjvigE*TB~qESV>u&oC#GZ+RNh z4LwA*Mt!`b^S+l`DDs&*_y96zcr7TWbnWHL<}srkcLu*&T%m>B3rbrD>c=AdAG;)P zxaFyH?_n*^_pTSb@`DFROt~R8%q;Al;bZ)+u z{!X=bj~8d{M=lP2?m&%~+YSt#*rs7S;w#Ee& z>r+qb6)nCIdOfi@th5Q)F`*HEr3pEsYnV53+egl(;88=@{Vy+=zudQ17RfZV`4Thm z5@y&z81voM#_tIReu8)I*&SI?9~qN?LKA(}JY@}!Dd+eN?Kf$s0)gUq< zHvWnU*F706K@2SMto!{E99E5!pk{AWXl#5axBNuxDK0FPg3_>_G`!@|@!=vN;Nd53j_sj9H3 z)F{HL!i0Al6abi-^kd(o@U(M-%tah`i;vmbc8#!MOEhhW`!ohyh`bvI7~sQk)fu?g>B(L` z=C9vfK1_${O-1l(-P(^e2RdWkH1M~;_a7ZuGVVSwXNHXcqY4mg@IU1zgzpulbXLM9KUxqKyf3G?cB9Tg%GmhnFfry^*TYn2 zBOLKu{os+M7@9=nES?05>6n8h{q`=1u*Hv>-kEsznU+Ja)0A`hTKTWExJb$gR*~RMZ zJ0oC4nlt%LG%SM^HL!Ix2T`MORbfIrZ6pj06!Md_Z_!&~e?#{8pZ#7vs9DrsgZ}_N zttT$W3YGjdS2%;3IxGJGrnh^~YS|kG6gFtiBSOfyiz}_+g>@b$6;}jWSQt}*h#ng| zRx=B-fwZ(NZx^qJ@-<`5p!kmrgm0jy+1j>4fgbxZ98}XnNw6FI4mJ!hBD#`5!uC=Z zxRF6-MigZiT?(JKq+Fj#f4kJK6mAOu<1r?PD zWc&Tytl|Te#dNEFVRLxu5O6m5fBv2%3nVMDgen=4iD(5?+Q zNH$j(FbB2^Fxhi`+I+K$edPAR(`grY*r~)CXj+?}l={zXO+FU9Xar&`k`1G_0zrx! z{4}&g-ln6&whV^`6tPo?xaeB^EphgC#GQ}L@6a1@t&#VEUmn;AHmBb~q{eYizP+$? zJ5!;3&8VYmMPUzzIdf=Ranr~d$}%k6{H5kftqwrr

Q(wsJ4|iT3u-k7Ez84%x>0i5}nZ?V0}oDdP46+c_6{pR=}P9kyZL+c^h+-P {# Note: page is 595x842 points (1 point=1/72in) #} - + + {# logo positioned 42 from left, 33 from top #} @@ -108,6 +109,9 @@ + + + {% if not invoice %}[{{ copy }} Copy]{% endif %} [Page of ] From 91f364dccb2f58108e084b5f167969ebc22c6336 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Mon, 29 Jun 2015 13:10:55 +0100 Subject: [PATCH 05/12] Removed maxheight of event description (Stops text getting squished when the description is long) --- RIGS/templates/RIGS/event_print_page.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RIGS/templates/RIGS/event_print_page.xml b/RIGS/templates/RIGS/event_print_page.xml index f8ef3a58..41fb4b41 100644 --- a/RIGS/templates/RIGS/event_print_page.xml +++ b/RIGS/templates/RIGS/event_print_page.xml @@ -14,7 +14,7 @@ {{object.start_date|date:"D jS N Y"}} - + {{ object.description|default_if_none:""|linebreaksbr }} From 6405e123ffbf1b16b05b04ba9b8d9d6a0174069f Mon Sep 17 00:00:00 2001 From: David Taylor Date: Mon, 29 Jun 2015 13:51:37 +0100 Subject: [PATCH 06/12] Added estimated VAT, as per issue #71 --- RIGS/rigboard.py | 2 ++ RIGS/templates/RIGS/item_table.html | 9 +++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/RIGS/rigboard.py b/RIGS/rigboard.py index 050e0eda..269cbdb5 100644 --- a/RIGS/rigboard.py +++ b/RIGS/rigboard.py @@ -47,6 +47,8 @@ class EventCreate(generic.CreateView): def get_context_data(self, **kwargs): context = super(EventCreate, self).get_context_data(**kwargs) context['edit'] = True + context['new'] = True + context['currentVAT'] = models.VatRate.objects.current_rate() form = context['form'] if re.search('"-\d+"', form['items_json'].value()): diff --git a/RIGS/templates/RIGS/item_table.html b/RIGS/templates/RIGS/item_table.html index 199f92c3..cac7e0ba 100644 --- a/RIGS/templates/RIGS/item_table.html +++ b/RIGS/templates/RIGS/item_table.html @@ -29,8 +29,13 @@ £ {{object.sum_total|default:0|floatformat:2}} - VAT @ - {{object.vat_rate.as_percent|floatformat|default:"TBD"}}% + {% if new %} + VAT @ + {{currentVAT.as_percent|floatformat}}% (TBC) + {% else %} + VAT @ + {{object.vat_rate.as_percent|floatformat|default:"TBD"}}% + {% endif %} £ {{object.vat|default:0|floatformat:2}} From d9704b9407aab6711e960e7c2cf8c1daa34e3619 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Mon, 29 Jun 2015 22:16:50 +0100 Subject: [PATCH 07/12] Added start/end date validation for events --- RIGS/models.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/RIGS/models.py b/RIGS/models.py index 6c4c9c9c..75e641ec 100644 --- a/RIGS/models.py +++ b/RIGS/models.py @@ -10,6 +10,7 @@ import reversion import string import random from django.core.urlresolvers import reverse_lazy +from django.core.exceptions import ValidationError from decimal import Decimal @@ -348,6 +349,20 @@ class Event(models.Model, RevisionMixin): def __str__(self): return str(self.pk) + ": " + self.name + def clean(self): + if self.end_date and self.start_date > self.end_date: + raise ValidationError('Unless you\'ve invented time travel, the event can\'t finish before it has started.') + + startEndSameDay = not self.end_date or self.end_date == self.start_date + hasStartAndEnd = self.has_start_time and self.has_end_time + if startEndSameDay and hasStartAndEnd and self.start_time > self.end_time: + raise ValidationError('Unless you\'ve invented time travel, the event can\'t finish before it has started.') + + def save(self, *args, **kwargs): + """Call :meth:`full_clean` before saving.""" + self.full_clean() + super(Event, self).save(*args, **kwargs) + class Meta: permissions = ( ('view_event', 'Can view Events'), From 0dd5a1d931d787f14c3984930710064eadaae525 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Sun, 19 Jul 2015 16:14:40 +0100 Subject: [PATCH 08/12] Removed unnecessary variable & updated test --- RIGS/rigboard.py | 1 - RIGS/templates/RIGS/item_table.html | 2 +- RIGS/test_functional.py | 8 +++++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/RIGS/rigboard.py b/RIGS/rigboard.py index 269cbdb5..cdbd2865 100644 --- a/RIGS/rigboard.py +++ b/RIGS/rigboard.py @@ -47,7 +47,6 @@ class EventCreate(generic.CreateView): def get_context_data(self, **kwargs): context = super(EventCreate, self).get_context_data(**kwargs) context['edit'] = True - context['new'] = True context['currentVAT'] = models.VatRate.objects.current_rate() form = context['form'] diff --git a/RIGS/templates/RIGS/item_table.html b/RIGS/templates/RIGS/item_table.html index cac7e0ba..0c652daf 100644 --- a/RIGS/templates/RIGS/item_table.html +++ b/RIGS/templates/RIGS/item_table.html @@ -29,7 +29,7 @@ £ {{object.sum_total|default:0|floatformat:2}} - {% if new %} + {% if not object.pk %} VAT @ {{currentVAT.as_percent|floatformat}}% (TBC) {% else %} diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py index c9b5c906..dfb5a5da 100644 --- a/RIGS/test_functional.py +++ b/RIGS/test_functional.py @@ -143,6 +143,8 @@ class EventTest(LiveServerTestCase): self.profile.set_password("EventTestPassword") self.profile.save() + self.vatrate = models.VatRate.objects.create(start_at='2014-03-05',rate=0.20,comment='test1') + self.browser = webdriver.Firefox() os.environ['RECAPTCHA_TESTING'] = 'True' @@ -375,9 +377,9 @@ class EventTest(LiveServerTestCase): # Check totals self.assertEqual("47.90", self.browser.find_element_by_id('sumtotal').text) - self.assertIn("TBD%", self.browser.find_element_by_id('vat-rate').text) - self.assertEqual("0.00", self.browser.find_element_by_id('vat').text) - self.assertEqual("47.90", self.browser.find_element_by_id('total').text) + self.assertIn("(TBC)", self.browser.find_element_by_id('vat-rate').text) + self.assertEqual("9.58", self.browser.find_element_by_id('vat').text) + self.assertEqual("57.48", self.browser.find_element_by_id('total').text) # Attempt to save - missing title save.click() From 796f4b29cbd53cbdff12cd0f2f7f4d8bf365ec99 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Sun, 19 Jul 2015 16:25:41 +0100 Subject: [PATCH 09/12] Removed id numbers from page titles for person, venue & organisation detail views --- RIGS/templates/RIGS/organisation_detail.html | 4 ++-- RIGS/templates/RIGS/organisation_form.html | 2 +- RIGS/templates/RIGS/person_detail.html | 4 ++-- RIGS/templates/RIGS/venue_detail.html | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/RIGS/templates/RIGS/organisation_detail.html b/RIGS/templates/RIGS/organisation_detail.html index 51e88b7d..7743086c 100644 --- a/RIGS/templates/RIGS/organisation_detail.html +++ b/RIGS/templates/RIGS/organisation_detail.html @@ -1,13 +1,13 @@ {% extends request.is_ajax|yesno:"base_ajax.html,base.html" %} {% load widget_tweaks %} -{% block title %}Organisation {{ object.pk|stringformat:"05d" }} |{{ object.name }}{% endblock %} +{% block title %}Organisation | {{ object.name }}{% endblock %} {% block content %}

{% if not request.is_ajax %}
-

Organisation {{ object.pk|stringformat:"05d" }} | {{ object.name }}

+

Organisation | {{ object.name }}

diff --git a/RIGS/templates/RIGS/organisation_form.html b/RIGS/templates/RIGS/organisation_form.html index f0298ffb..7ef77e0d 100644 --- a/RIGS/templates/RIGS/organisation_form.html +++ b/RIGS/templates/RIGS/organisation_form.html @@ -1,7 +1,7 @@ {% extends request.is_ajax|yesno:'base_ajax.html,base.html' %} {% load widget_tweaks %} -{% block title %}{% if object.pk %}Edit {{ object.name }}{% else %}Add Person{% endif %}{% endblock %} +{% block title %}{% if object.pk %}Edit {{ object.name }}{% else %}Add Organisation{% endif %}{% endblock %} {% block content %}
diff --git a/RIGS/templates/RIGS/person_detail.html b/RIGS/templates/RIGS/person_detail.html index ff7346cf..10c995ae 100644 --- a/RIGS/templates/RIGS/person_detail.html +++ b/RIGS/templates/RIGS/person_detail.html @@ -1,13 +1,13 @@ {% extends request.is_ajax|yesno:"base_ajax.html,base.html" %} {% load widget_tweaks %} -{% block title %}Person {{ object.pk|stringformat:"05d" }} | {{ object.name }}{% endblock %} +{% block title %}Person | {{ object.name }}{% endblock %} {% block content %}
{% if not request.is_ajax %}
-

Person {{ object.pk|stringformat:"05d" }} | {{ object.name }}

+

Person | {{ object.name }}

diff --git a/RIGS/templates/RIGS/venue_detail.html b/RIGS/templates/RIGS/venue_detail.html index 83233f35..ede9d4ec 100644 --- a/RIGS/templates/RIGS/venue_detail.html +++ b/RIGS/templates/RIGS/venue_detail.html @@ -1,13 +1,13 @@ {% extends request.is_ajax|yesno:"base_ajax.html,base.html" %} {% load widget_tweaks %} -{% block title %}Venue {{ object.pk|stringformat:"05d" }} | {{ object.name }}{% endblock %} +{% block title %}Venue | {{ object.name }}{% endblock %} {% block content %}
{% if not request.is_ajax %}
-

Venue {{ object.pk|stringformat:"05d" }} | {{ object.name }}

+

Venue | {{ object.name }}

From a22e10a4f2869421dd1b46d5bc1a8faade181c2d Mon Sep 17 00:00:00 2001 From: David Taylor Date: Mon, 20 Jul 2015 22:52:08 +0100 Subject: [PATCH 10/12] Added functional test for date validation --- RIGS/test_functional.py | 115 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py index c9b5c906..6ccb743f 100644 --- a/RIGS/test_functional.py +++ b/RIGS/test_functional.py @@ -412,6 +412,121 @@ class EventTest(LiveServerTestCase): event = models.Event.objects.get(name='Test Event Name') self.assertIn("N0000%d | Test Event Name"%event.pk, self.browser.find_element_by_xpath('//h1').text) + def testDateValidation(self): + self.browser.get(self.live_server_url + '/event/create/') + # Gets redirected to login and back + self.authenticate('/event/create/') + + wait = WebDriverWait(self.browser, 10) #setup WebDriverWait to use later (to wait for animations) + self.browser.implicitly_wait(3) #Set session-long wait (only works for non-existant DOM objects) + + wait.until(animation_is_finished()) + + # Click Rig button + self.browser.find_element_by_xpath('//button[.="Rig"]').click() + + form = self.browser.find_element_by_tag_name('form') + save = self.browser.find_element_by_xpath('(//button[@type="submit"])[3]') + + # Set title + e = self.browser.find_element_by_id('id_name') + e.send_keys('Test Event Name') + + # Both dates, no times, end before start + form.find_element_by_id('id_start_date').clear() + form.find_element_by_id('id_start_date').send_keys('3015-04-24') + + form.find_element_by_id('id_end_date').clear() + form.find_element_by_id('id_end_date').send_keys('3015-04-23') + + # Attempt to save - should fail + save.click() + error = self.browser.find_element_by_xpath('//div[contains(@class, "alert-danger")]') + self.assertTrue(error.is_displayed()) + self.assertIn("can't finish before it has started", error.find_element_by_xpath('//dd[1]/ul/li').text) + + + # Same date, end time before start time + form = self.browser.find_element_by_tag_name('form') + save = self.browser.find_element_by_xpath('(//button[@type="submit"])[3]') + form.find_element_by_id('id_start_date').clear() + form.find_element_by_id('id_start_date').send_keys('3015-04-24') + + form.find_element_by_id('id_end_date').clear() + form.find_element_by_id('id_end_date').send_keys('3015-04-23') + + form.find_element_by_id('id_start_time').clear() + form.find_element_by_id('id_start_time').send_keys('06:59') + + form.find_element_by_id('id_end_time').clear() + form.find_element_by_id('id_end_time').send_keys('06:00') + + # Attempt to save - should fail + save.click() + error = self.browser.find_element_by_xpath('//div[contains(@class, "alert-danger")]') + self.assertTrue(error.is_displayed()) + self.assertIn("can't finish before it has started", error.find_element_by_xpath('//dd[1]/ul/li').text) + + + # Same date, end time before start time + form = self.browser.find_element_by_tag_name('form') + save = self.browser.find_element_by_xpath('(//button[@type="submit"])[3]') + form.find_element_by_id('id_start_date').clear() + form.find_element_by_id('id_start_date').send_keys('3015-04-24') + + form.find_element_by_id('id_end_date').clear() + form.find_element_by_id('id_end_date').send_keys('3015-04-23') + + form.find_element_by_id('id_start_time').clear() + form.find_element_by_id('id_start_time').send_keys('06:59') + + form.find_element_by_id('id_end_time').clear() + form.find_element_by_id('id_end_time').send_keys('06:00') + + + # No end date, end time before start time + form = self.browser.find_element_by_tag_name('form') + save = self.browser.find_element_by_xpath('(//button[@type="submit"])[3]') + form.find_element_by_id('id_start_date').clear() + form.find_element_by_id('id_start_date').send_keys('3015-04-24') + + form.find_element_by_id('id_end_date').clear() + + form.find_element_by_id('id_start_time').clear() + form.find_element_by_id('id_start_time').send_keys('06:59') + + form.find_element_by_id('id_end_time').clear() + form.find_element_by_id('id_end_time').send_keys('06:00') + + # Attempt to save - should fail + save.click() + error = self.browser.find_element_by_xpath('//div[contains(@class, "alert-danger")]') + self.assertTrue(error.is_displayed()) + self.assertIn("can't finish before it has started", error.find_element_by_xpath('//dd[1]/ul/li').text) + + + # 2 dates, end after start + form = self.browser.find_element_by_tag_name('form') + save = self.browser.find_element_by_xpath('(//button[@type="submit"])[3]') + form.find_element_by_id('id_start_date').clear() + form.find_element_by_id('id_start_date').send_keys('3015-04-24') + + form.find_element_by_id('id_end_date').clear() + form.find_element_by_id('id_end_date').send_keys('3015-04-26') + + form.find_element_by_id('id_start_time').clear() + + form.find_element_by_id('id_end_time').clear() + + # Attempt to save - should succeed + save.click() + + # See redirected to success page + event = models.Event.objects.get(name='Test Event Name') + self.assertIn("N0000%d | Test Event Name"%event.pk, self.browser.find_element_by_xpath('//h1').text) + + + def testEventDetail(self): with transaction.atomic(), reversion.create_revision(): person = models.Person(name="Event Detail Person", email="eventdetail@person.tests.rigs", phone="123 123") From 2302cb14178583270065e0611121d63e3d9f2549 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Tue, 21 Jul 2015 00:17:56 +0100 Subject: [PATCH 11/12] Updated tests to reflect model changes --- RIGS/test_models.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/RIGS/test_models.py b/RIGS/test_models.py index 5f94f9e3..91923ca1 100644 --- a/RIGS/test_models.py +++ b/RIGS/test_models.py @@ -144,16 +144,16 @@ class EventTestCase(TestCase): events = models.Event.objects.all() # Check person's organisations - self.assertIn(o1, p1.organisations) - self.assertIn(o2, p1.organisations) - self.assertIn(o1, p2.organisations) - self.assertNotIn(o2, p2.organisations) + self.assertIn((o1,2), p1.organisations) + self.assertIn((o2,1), p1.organisations) + self.assertIn((o1,2), p2.organisations) + self.assertEqual(len(p2.organisations), 1) # Check organisation's persons - self.assertIn(p1, o1.persons) - self.assertIn(p2, o1.persons) - self.assertIn(p1, o2.persons) - self.assertNotIn(p2, o2.persons) + self.assertIn((p1,2), o1.persons) + self.assertIn((p2,2), o1.persons) + self.assertIn((p1,1), o2.persons) + self.assertEqual(len(o2.persons),1) def test_cancelled_property(self): event = models.Event.objects.all()[0] From fa63328c4271ed31e5ea28a9627a16bbdb07b764 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Tue, 21 Jul 2015 21:24:58 +0100 Subject: [PATCH 12/12] Enable vagrant env for development. --- .gitignore | 3 +- Vagrantfile | 133 +++++++++++++++++++++++ config/vagrant.yml | 11 ++ config/vagrant/build_dependency_setup.sh | 16 +++ config/vagrant/foreman_setup.sh | 36 ++++++ config/vagrant/git_setup.sh | 14 +++ config/vagrant/postgresql_setup.sh | 112 +++++++++++++++++++ config/vagrant/python_setup.sh | 23 ++++ config/vagrant/virtualenv_setup.sh | 66 +++++++++++ 9 files changed, 413 insertions(+), 1 deletion(-) create mode 100644 Vagrantfile create mode 100644 config/vagrant.yml create mode 100644 config/vagrant/build_dependency_setup.sh create mode 100644 config/vagrant/foreman_setup.sh create mode 100644 config/vagrant/git_setup.sh create mode 100644 config/vagrant/postgresql_setup.sh create mode 100644 config/vagrant/python_setup.sh create mode 100644 config/vagrant/virtualenv_setup.sh diff --git a/.gitignore b/.gitignore index 064616b6..9a6f7595 100644 --- a/.gitignore +++ b/.gitignore @@ -99,4 +99,5 @@ atlassian-ide-plugin.xml # Crashlytics plugin (for Android Studio and IntelliJ) com_crashlytics_export_strings.xml crashlytics.properties -crashlytics-build.properties \ No newline at end of file +crashlytics-build.properties +.vagrant diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 00000000..73406a80 --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,133 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : +require 'yaml' + +unless File.exist?('config/vagrant.yml') + raise "There is no config/vagrant.yml file.\nCopy config/vagrant.template.yml, make any changes you need, then try again." +end + +settings = YAML.load_file 'config/vagrant.yml' + +$script = <