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 = <