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/RIGS/finance.py b/RIGS/finance.py
index e0f7ec7a..2ae0fc47 100644
--- a/RIGS/finance.py
+++ b/RIGS/finance.py
@@ -14,6 +14,7 @@ from z3c.rml import rml2pdf
from RIGS import models
+import re
class InvoiceIndex(generic.ListView):
model = models.Invoice
@@ -63,8 +64,10 @@ class InvoicePrint(generic.View):
pdfData = buffer.read()
+ escapedEventName = re.sub('[^a-zA-Z0-9 \n\.]', '', object.name)
+
response = HttpResponse(content_type='application/pdf')
- response['Content-Disposition'] = "filename=Invoice %05d | %s.pdf" % (invoice.pk, object.name)
+ response['Content-Disposition'] = "filename=Invoice %05d | %s.pdf" % (invoice.pk, escapedEventName)
response.write(pdfData)
return response
diff --git a/RIGS/models.py b/RIGS/models.py
index 31ab3e86..268f8eeb 100644
--- a/RIGS/models.py
+++ b/RIGS/models.py
@@ -234,6 +234,15 @@ class EventManager(models.Manager):
).order_by('start_date', 'end_date', 'start_time', 'end_time', 'meet_at').select_related('person', 'organisation', 'venue', 'mic')
return events
+ def events_in_bounds(self, start, end):
+ events = self.filter(
+ (models.Q(start_date__gte=start.date(), start_date__lte=end.date())) | # Start date in bounds
+ (models.Q(end_date__gte=start.date(), end_date__lte=end.date())) | # End date in bounds
+ (models.Q(access_at__gte=start, access_at__lte=end)) | # Access at in bounds
+ (models.Q(meet_at__gte=start, meet_at__lte=end)) # Meet at in bounds
+ ).order_by('start_date', 'end_date', 'start_time', 'end_time', 'meet_at').select_related('person', 'organisation', 'venue', 'mic')
+ return events
+
def rig_count(self):
event_count = self.filter(
(models.Q(start_date__gte=datetime.date.today(), end_date__isnull=True, dry_hire=False,
@@ -356,7 +365,7 @@ class Event(models.Model, RevisionMixin):
return reverse_lazy('event_detail', kwargs={'pk': self.pk})
def __str__(self):
- return str(self.pk) + ": " + self.name
+ return unicode(self.pk) + ": " + self.name
def clean(self):
if self.end_date and self.start_date > self.end_date:
diff --git a/RIGS/rigboard.py b/RIGS/rigboard.py
index cdbd2865..27f00307 100644
--- a/RIGS/rigboard.py
+++ b/RIGS/rigboard.py
@@ -125,7 +125,10 @@ class EventPrint(generic.View):
merger.write(merged)
response = HttpResponse(content_type='application/pdf')
- response['Content-Disposition'] = "filename=N%05d | %s.pdf" % (object.pk, object.name)
+
+ escapedEventName = re.sub('[^a-zA-Z0-9 \n\.]', '', object.name)
+
+ response['Content-Disposition'] = "filename=N%05d | %s.pdf" % (object.pk, escapedEventName)
response.write(merged.getvalue())
return response
@@ -172,9 +175,9 @@ class EventArchive(generic.ArchiveIndexView):
filter = Q(start_date__gte=start)
if filter:
- qs = self.model.objects.filter(filter)
+ qs = self.model.objects.filter(filter).order_by('-start_date')
else:
- qs = self.model.objects.all()
+ qs = self.model.objects.all().order_by('-start_date')
# Preselect related for efficiency
qs.select_related('person', 'organisation', 'venue', 'mic')
diff --git a/RIGS/templates/RIGS/activity_feed.html b/RIGS/templates/RIGS/activity_feed.html
index 5b2c9f0a..78d5f9b0 100644
--- a/RIGS/templates/RIGS/activity_feed.html
+++ b/RIGS/templates/RIGS/activity_feed.html
@@ -38,7 +38,7 @@
$('.date').each(function (index, dateElem) {
var $dateElem = $(dateElem);
- var formatted = moment($dateElem.attr('data-date'),"DD/MM/YYYY HH:mm").twitterLong();
+ var formatted = moment($dateElem.attr('data-date')).twitterLong();
$dateElem.text(formatted);
});
diff --git a/RIGS/templates/RIGS/activity_feed_data.html b/RIGS/templates/RIGS/activity_feed_data.html
index e0e454bf..fc9af87e 100644
--- a/RIGS/templates/RIGS/activity_feed_data.html
+++ b/RIGS/templates/RIGS/activity_feed_data.html
@@ -27,7 +27,7 @@
{{ version.revision.user.name }}
-
+
{% endif %}
diff --git a/RIGS/templates/RIGS/event_detail.html b/RIGS/templates/RIGS/event_detail.html
index c1e21c25..358eaf10 100644
--- a/RIGS/templates/RIGS/event_detail.html
+++ b/RIGS/templates/RIGS/event_detail.html
@@ -5,12 +5,10 @@
{% if not request.is_ajax %}
-
{% if object.is_rig %}N{{ object.pk|stringformat:"05d" }}{% else %}{{ object.pk }}{% endif %}
- | {{ object.name }}
+ | {{ object.name }} {% if event.dry_hire %}Dry Hire{% endif %}
-
diff --git a/RIGS/templates/RIGS/event_print_page.xml b/RIGS/templates/RIGS/event_print_page.xml
index 41fb4b41..72f11535 100644
--- a/RIGS/templates/RIGS/event_print_page.xml
+++ b/RIGS/templates/RIGS/event_print_page.xml
@@ -241,7 +241,7 @@
- | 24 Hour Emergency Contacts: 07825 065681 or 07825 065678 |
+ 24 Hour Emergency Contacts: 07825 065681 and 07825 065678 |
diff --git a/RIGS/templates/RIGS/version_changes.html b/RIGS/templates/RIGS/version_changes.html
index bbd15695..98abaf15 100644
--- a/RIGS/templates/RIGS/version_changes.html
+++ b/RIGS/templates/RIGS/version_changes.html
@@ -2,8 +2,25 @@
diff --git a/RIGS/urls.py b/RIGS/urls.py
index c39a571c..93028bb2 100644
--- a/RIGS/urls.py
+++ b/RIGS/urls.py
@@ -145,8 +145,8 @@ urlpatterns = patterns('',
url(r'^ical/(?P
\d+)/(?P\w+)/rigs.ics$', api_key_required(ical.CalendarICS()), name="ics_calendar"),
# 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"),
+ url(r'^api/(?P\w+)/$', login_required(views.SecureAPIRequest.as_view()), name="api_secure"),
+ url(r'^api/(?P\w+)/(?P\d+)/$', login_required(views.SecureAPIRequest.as_view()), name="api_secure"),
# Legacy URL's
url(r'^rig/show/(?P\d+)/$', RedirectView.as_view(permanent=True,pattern_name='event_detail')),
diff --git a/RIGS/versioning.py b/RIGS/versioning.py
index 9fd815b4..fa54e9ff 100644
--- a/RIGS/versioning.py
+++ b/RIGS/versioning.py
@@ -16,7 +16,7 @@ import simplejson
from reversion.models import Version
from django.contrib.contenttypes.models import ContentType # Used to lookup the content_type
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
-from django.db.models import ForeignKey, IntegerField, EmailField
+from django.db.models import ForeignKey, IntegerField, EmailField, TextField
from RIGS import models, forms
import datetime
@@ -56,7 +56,13 @@ def model_compare(oldObj, newObj, excluded_keys=[]):
def long(self):
if isinstance(self.field, EmailField):
return True
- return False
+ return False
+
+ @property
+ def linebreaks(self):
+ if isinstance(self.field, TextField):
+ return True
+ return False
changes = []
diff --git a/RIGS/views.py b/RIGS/views.py
index 772d92a7..aeb77a08 100644
--- a/RIGS/views.py
+++ b/RIGS/views.py
@@ -221,8 +221,8 @@ class SecureAPIRequest(generic.View):
'venue': 'RIGS.view_venue',
'person': 'RIGS.view_person',
'organisation': 'RIGS.view_organisation',
- 'profile': None,
- 'event': 'RIGS.view_event',
+ 'profile': 'RIGS.view_profile',
+ 'event': None,
}
'''
@@ -300,10 +300,9 @@ class SecureAPIRequest(generic.View):
# Probably a calendar request
start_datetime = datetime.datetime.strptime( start, "%Y-%m-%dT%H:%M:%SZ" )
end_datetime = datetime.datetime.strptime( end, "%Y-%m-%dT%H:%M:%SZ" )
- all_objects = self.models[model].objects
+ objects = self.models[model].objects.events_in_bounds(start_datetime,end_datetime)
+
results = []
- filter = Q(start_date__lte=end_datetime) & Q(start_date__gte=start_datetime)
- objects = all_objects.filter(filter).select_related('person', 'organisation', 'venue', 'mic').order_by('-start_date')
for item in objects:
data = {
'pk': item.pk,
@@ -331,27 +330,6 @@ class SecureAPIRequest(generic.View):
if item.access_at:
data['access_at'] = item.access_at.strftime('%Y-%m-%dT%H:%M:%SZ')
- if item.venue:
- data['venue'] = item.venue.name
-
- if item.person:
- data['person'] = item.person.name
-
- if item.organisation:
- data['organisation'] = item.organisation.name
-
- if item.mic:
- data['mic'] = {
- 'name':item.mic.get_full_name(),
- 'initials':item.mic.initials
- }
-
- if item.description:
- data['description'] = item.description
-
- if item.notes:
- data['notes'] = item.notes
-
data['url'] = str(reverse_lazy('event_detail',kwargs={'pk':item.pk}))
results.append(data)
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 = <