From 13ce96809b09515fd19e842a84eadac1c18766d3 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Mon, 26 Jan 2015 11:11:11 +0000 Subject: [PATCH 1/4] Corrected permissions to duplicate a rig --- RIGS/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RIGS/urls.py b/RIGS/urls.py index 7d03ec1b..41cc147a 100644 --- a/RIGS/urls.py +++ b/RIGS/urls.py @@ -69,7 +69,7 @@ urlpatterns = patterns('', permission_required_with_403('RIGS.change_event')(rigboard.EventUpdate.as_view()), name='event_update'), url(r'^event/(?P\d+)/duplicate/$', - permission_required_with_403('RIGS.change_event')(rigboard.EventDuplicate.as_view()), + permission_required_with_403('RIGS.add_event')(rigboard.EventDuplicate.as_view()), name='event_duplicate'), # API From 9c9dc079298dccd5468ea92c4540ccce958eb8af Mon Sep 17 00:00:00 2001 From: Tom Price Date: Mon, 26 Jan 2015 15:06:39 +0000 Subject: [PATCH 2/4] Everyone's favourite, past events, now working and loading in ~800ms --- RIGS/rigboard.py | 28 ++++++++++++++- RIGS/templates/RIGS/event_archive.html | 45 +++++++++++++++++++++++++ RIGS/urls.py | 1 + db.sqlite3 | Bin 19218432 -> 19219456 bytes 4 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 RIGS/templates/RIGS/event_archive.html diff --git a/RIGS/rigboard.py b/RIGS/rigboard.py index 8b4ca10f..9285f7a3 100644 --- a/RIGS/rigboard.py +++ b/RIGS/rigboard.py @@ -10,10 +10,12 @@ from django.template import Context, RequestContext from django.template.loader import get_template from django.conf import settings from django.http import HttpResponse +from django.db.models import Q from z3c.rml import rml2pdf from PyPDF2 import PdfFileMerger, PdfFileReader from RIGS import models, forms +import datetime __author__ = 'ghost' @@ -113,4 +115,28 @@ class EventDuplicate(generic.RedirectView): item.event = new item.save() - return reverse_lazy('event_update', kwargs={'pk': new.pk}) \ No newline at end of file + return reverse_lazy('event_update', kwargs={'pk': new.pk}) + +class EventArchive(generic.ArchiveIndexView): + model = models.Event + date_field = "start_date" + paginate_by = 25 + + def get_queryset(self): + start = self.request.GET.get('start', None) + end = self.request.GET.get('end', datetime.date.today()) + filter = False + if end != "": + filter = Q(start_date__lte=end) + if start: + if filter: + filter = filter & Q(start_date__gte=start) + else: + filter = Q(start_date__gte=start) + + if filter: + qs = self.model.objects.filter(filter) + else: + qs = self.model.objects.all() + + return qs.select_related('person','organisation','venue','mic') \ No newline at end of file diff --git a/RIGS/templates/RIGS/event_archive.html b/RIGS/templates/RIGS/event_archive.html new file mode 100644 index 00000000..00baaad6 --- /dev/null +++ b/RIGS/templates/RIGS/event_archive.html @@ -0,0 +1,45 @@ +{% extends 'base.html' %} +{% load paginator from filters %} + +{% block title %}Event Archive{% endblock %} + +{% block content %} +
+

Event Archive

+ + + + {% if is_paginated %} +
+ {% paginator %} +
+ {% endif %} +
+
+ {% with latest as events %} + {% include 'RIGS/event_table.html' %} + {% endwith %} +
+ + {% if is_paginated %} +
+
+ {% paginator %} +
+
+ {% endif %} +{% endblock %} \ No newline at end of file diff --git a/RIGS/urls.py b/RIGS/urls.py index 41cc147a..12a7a723 100644 --- a/RIGS/urls.py +++ b/RIGS/urls.py @@ -71,6 +71,7 @@ urlpatterns = patterns('', url(r'^event/(?P\d+)/duplicate/$', permission_required_with_403('RIGS.add_event')(rigboard.EventDuplicate.as_view()), name='event_duplicate'), + url(r'^event/archive/$', login_required()(rigboard.EventArchive.as_view()), name='event_archive'), # API url(r'^api/(?P\w+)/$', (views.SecureAPIRequest.as_view()), name="api_secure"), diff --git a/db.sqlite3 b/db.sqlite3 index ea8e552c164aaa887ed8157f4095c72a4ad23c69..7ab8dcb25eca098d5e7c56f293fe33df81751250 100644 GIT binary patch delta 2878 zcmZ|R3tUsz9S899Kj%V%0pt~V27@5r2oQqEL+X40Lu@Iw;4I=A3n=(RMThTzNSsBX zMLkxXVb!^{b1m&Ev6K?EzFPN?DvHipt=8#gE4FK^u4;c5{j7fW`7Fuzckey-k#kP& zIk`65CJ)=%O&-mml>b)POkK#iKwpu>7nCn9U$C%p-rVQ0R;jL-sHIhBrlQr|I(xT{ zfP(-9+`!%0t<#vReT66UW64aM6|agKF;Wp5O)EFc5se7yQ5<0zeOgAP|Be z7(yTv!oUFGFc^#w0Ye}XqF^XQLyWVdGB$K7SH6~Kj>O(1z5VFXSQrLBaUMMy_e6pF zO7djnDLt)&zjt>NjO+ZJwhohxoHv$E2q0;jZnidrnHs|48^RLW!xEJ;WeUYI>9fy0 zUZ&U*<2c1i>lJ0HbnVLZmmk{_r-&9^k=$J=ksUTEd>Yvpb<#mPM(xx_uhTBtL0jl$YNQ6TNn=g+Yw~za_TGoRP_+5| zoIv^X*3KyVfhF0_150wojg6`yZ${n}Kp|wLXflz7(r6TAQ63f0Br2g7s6vLs>N90# zO?GhPOkTwo^X0sbujL!~M!uD|^4)w7f1B^)UHlOLh@X%Nro_OAA!3*?i&Qa6WQ!-o zv!Ym7#dI-SEWoY1Qq+revaOm&=)V$o+=TkZuQahg3*3bB+-XxZ$x&T77P;FyTu(*L zxm`K+)UZFNegDstcl?Sem(gsRPF5*U@pvqDwq!oU?Eh)B3KN+ zgc?`^OJNx-hZV3AR)Gy_p$=91qY z<&{n&sW)Bp)=qdIy1)hd;Q$06eyc>HAcDhR8NfjAfO^xohsf$!lS+=mA*8hfY-)Zl6eH54`6)NofrqlQ)u4>bm;p;N>{tX0S^R&501&#@Qv=wktZ>?~b^mQU5V@>|w4x>$;8uLYv$T z%*vS6p|yrmn#^omA1?PduGhOZVSAS7|I$II+3*x~u*V(VaXW}In=;En$(30aM#udB z-}!q{+X)ZP*UJ@OPV(S!pFM1XE;%Wozn$i|%U#RENQn|wcGaP24Wk*HU6obV!cxac zZ29-!F}fm#%HG6w$To)uYL)63ooS#%-~XASO!TOS9(*y$!*w5raN)3F5#yMFjO{=E zv5CvXx<(sF*{Dq9-j9u+V29(BfwW=}_m<7u-HKgGkAVh|k4A9L8cpM25bS^4y7i)L4wT%VvYW{8&a%S;UCmz}$uW)WUqL=<6&FrYF0FU~k)h2;yYjd(bmTg@0*%t) zv_24?a@ZP8j;#G$6B(71vSR9^hsV-#jfv_b>+H`BV0x}!>lRPkl5S4Y$?h>(QI5WQ zQIsx?5u@~*y`P#S2WE_Mmzz2w!&^=q_Ll|s#wd>76m*lEe_&ytY`ZYbU!Y~u{NCzh mS#mPZN6y)q;VY|Fr6tI=?*h^T%}Fb!s#ni2{@4LJ6Z-+Bqcm9n delta 2331 zcmZYBdstKV9mnzWJ-?Hi2{GK{mO#QC!yteZFO)J7YIQ2J%u%H^)+kadf(c6+iSX%ei@Di>NS%?Id72i{* zH;+yMOkjX9U<4C{ff>ev1;QZ$A|VQ*VI0IjEW|-PB!CrckO)a&2L~iW3Zz0Bq(g?X zr!F(=VNu(_Pan=4p{T&%U?yb2cx7uW&FQ!1N**p%cjfUyU#^qSpV<8<@AqX{_(@;x0=7Z#54hIlf(!B>9|~Xs z6v91F1QTHrOok~?4EI6_+y|xbeVD4a)|CzQurj*Hb@pkEvFtcI!_Kpd?5e021-eOB z=_0%NQJm6gpH@j-m3n^OF-;S=;+Upfag@i*v%1MI&;T8xBh*iQ^eXM99@S*oVV~l?_S?=Dsh;8mZtLdL0yQ4^~sj)HgA#*?;+Efp@wy5sS*gZJ%DFNnI% zZn0ZB9V2EG)(?HR4PL_Q2_2GE@Cou5cLGi1rOkc$eEiu>CO+K0F(%lAoy%Fz%~&e# zDE1^!u-IdzBa#1i#4+A%l85o;7(OS-V-TH(gX&jxv;9w7NlIl4g%MfTYo%K5&aU>z zCox9x#194x!4Zt{JLE7Ndk^{K(qbFs${*fmBfGp8jg@P09<#9^FDJhc>)>*J@!cY* zdkRN)IWPQoS?*q$X9)J-1R~pCY9nbAE`!AXxeVfDdB{fk(TgFd3E9X%7WHoD+%ej2 zwZX(wHu}<_UraOcZ16xOx1^@`%ZJX}s7(`5-x`<_ocWoJ-c6V0&?JG+E^V)oJ^DnN z$~#Nj6Xo|X*2+hh+9*oQ{CL~g%eeo9(5eM^F}& CaI<#+ From 6f27474a888db4d2a209d069958408f4712a98f6 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Mon, 26 Jan 2015 15:19:37 +0000 Subject: [PATCH 3/4] Performance optimisation of the related models by letting the DB deal with the relation straight off --- RIGS/models.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/RIGS/models.py b/RIGS/models.py index 5124a4a0..523452e0 100644 --- a/RIGS/models.py +++ b/RIGS/models.py @@ -63,7 +63,7 @@ class Person(models.Model, RevisionMixin): @property def latest_events(self): - return self.event_set.order_by('-start_date') + return self.event_set.order_by('-start_date').select_related('person','organisation','venue','mic') class Meta: permissions = ( @@ -98,7 +98,7 @@ class Organisation(models.Model, RevisionMixin): @property def latest_events(self): - return self.event_set.order_by('-start_date') + return self.event_set.order_by('-start_date').select_related('person','organisation','venue','mic') class Meta: permissions = ( @@ -158,7 +158,7 @@ class Venue(models.Model, RevisionMixin): @property def latest_events(self): - return self.event_set.order_by('-start_date') + return self.event_set.order_by('-start_date').select_related('person','organisation','venue','mic') class Meta: permissions = ( @@ -181,11 +181,11 @@ class EventManager(models.Manager): models.Q(dry_hire=True, checked_in_by__isnull=False, status__gt=Event.CANCELLED) | # Active dry hire GT models.Q(dry_hire=True, status=Event.CANCELLED, start_date__gte=datetime.date.today()) # Canceled but not started - ).order_by('meet_at', 'start_date') + ).order_by('meet_at', 'start_date').select_related('person','organisation','venue','mic') return events def rig_count(self): - events = self.filter( + event_count = self.filter( models.Q(start_date__gte=datetime.date.today(), end_date__isnull=True, is_rig=True) | # Starts after with no end models.Q(end_date__gte=datetime.date.today(), is_rig=True) | # Ends after @@ -193,8 +193,8 @@ class EventManager(models.Manager): is_rig=True) | # Active dry hire LT models.Q(dry_hire=True, checked_in_by__isnull=False, status__gt=Event.CANCELLED, is_rig=True) # Active dry hire GT - ).order_by('meet_at', 'start_date') - return len(events) + ).order_by('meet_at', 'start_date').count() + return event_count @reversion.register(follow=['items']) From 343e34662ba2bf35a401443fde1c8c735e053563 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Mon, 26 Jan 2015 16:09:22 +0000 Subject: [PATCH 4/4] Added archive link Added legacy redirect urls --- RIGS/rigboard.py | 4 ++-- RIGS/urls.py | 10 ++++++++++ templates/base.html | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/RIGS/rigboard.py b/RIGS/rigboard.py index 9285f7a3..2b8de1a0 100644 --- a/RIGS/rigboard.py +++ b/RIGS/rigboard.py @@ -103,7 +103,6 @@ class EventPrint(generic.View): class EventDuplicate(generic.RedirectView): - def get_redirect_url(self, *args, **kwargs): new = get_object_or_404(models.Event, pk=kwargs['pk']) new.pk = None @@ -117,6 +116,7 @@ class EventDuplicate(generic.RedirectView): return reverse_lazy('event_update', kwargs={'pk': new.pk}) + class EventArchive(generic.ArchiveIndexView): model = models.Event date_field = "start_date" @@ -139,4 +139,4 @@ class EventArchive(generic.ArchiveIndexView): else: qs = self.model.objects.all() - return qs.select_related('person','organisation','venue','mic') \ No newline at end of file + return qs.select_related('person', 'organisation', 'venue', 'mic') \ No newline at end of file diff --git a/RIGS/urls.py b/RIGS/urls.py index 12a7a723..2987c2de 100644 --- a/RIGS/urls.py +++ b/RIGS/urls.py @@ -1,6 +1,7 @@ from django.conf.urls import patterns, include, url from django.contrib.auth.decorators import login_required from RIGS import views, rigboard +from django.views.generic import RedirectView from PyRIGS.decorators import permission_required_with_403 @@ -56,6 +57,8 @@ urlpatterns = patterns('', # Rigboard url(r'^rigboard/$', rigboard.RigboardIndex.as_view(), name='rigboard'), + url(r'^rigboard/archive/$', RedirectView.as_view(pattern_name='event_archive')), + url(r'^event/(?P\d+)/$', permission_required_with_403('RIGS.view_event')(rigboard.EventDetail.as_view()), name='event_detail'), @@ -76,5 +79,12 @@ urlpatterns = patterns('', # API url(r'^api/(?P\w+)/$', (views.SecureAPIRequest.as_view()), name="api_secure"), url(r'^api/(?P\w+)/(?P\d+)/$', (views.SecureAPIRequest.as_view()), name="api_secure"), + + # Legacy URL's + url(r'^rig/show/(?P\d+)/$', RedirectView.as_view(pattern_name='event_detail')), + url(r'^bookings/$', RedirectView.as_view(pattern_name='rigboard')), + url(r'^bookings/past/$', RedirectView.as_view(pattern_name='event_archive')), + # Calendar may have gone away, redirect to the archive for now + url(r'^rigboard/calendar/$', RedirectView.as_view(pattern_name='event_archive', permanent=False)), ) diff --git a/templates/base.html b/templates/base.html index ddc0d5ca..e96375bd 100644 --- a/templates/base.html +++ b/templates/base.html @@ -40,7 +40,7 @@ Rigboard {% if perms.RIGS.view_invoice %}