mirror of
https://github.com/nottinghamtec/PyRIGS.git
synced 2026-01-17 05:22:16 +00:00
started work on the event form
This commit is contained in:
295
RIGS/templates/RIGS/event_form.html
Normal file
295
RIGS/templates/RIGS/event_form.html
Normal file
@@ -0,0 +1,295 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load widget_tweaks %}
|
||||
{% load static %}
|
||||
{% load multiply from filters %}
|
||||
{% block title %}{% if object.pk %}Event {{ object.pk }}{% else %}New Event{% endif %}{% endblock %}
|
||||
|
||||
{% block css %}
|
||||
<link href="//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css"/>
|
||||
{% endblock %}
|
||||
|
||||
{% block js %}
|
||||
<script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
|
||||
<script src="{% static "js/interaction.js" %}"></script>
|
||||
<script src="{% static "js/modal.js" %}"></script>
|
||||
|
||||
<script src="{% static "js/autocompleter.js" %}"></script>
|
||||
|
||||
<script>
|
||||
function setTime23Hours() {
|
||||
$('.endTime').val('23:00');
|
||||
}
|
||||
|
||||
function setTime02Hours() {
|
||||
|
||||
|
||||
if ($('.startDate').val() == $('.endDate').val()) {
|
||||
var endDate = new Date($('.endDate').val());
|
||||
endDate.setDate(endDate.getDate() + 1);
|
||||
$('.endDate').val(endDate.getISOString());
|
||||
}
|
||||
$('.endTime').val('02:00');
|
||||
}
|
||||
|
||||
$(document).ready(function () {
|
||||
{% if not object.pk and not form.errors%}
|
||||
|
||||
|
||||
$('.form-hws').slideUp(function () {
|
||||
$('.form-isRig').slideUp();
|
||||
});
|
||||
|
||||
{% elif not object.pk and form.errors %}
|
||||
if ($('#{{form.isRig.auto_id}}').attr('checked') != 'checked') {
|
||||
$('.form-isRig').hide();
|
||||
}
|
||||
{% endif %}
|
||||
|
||||
{% if not object.pk %}
|
||||
$('#isRig-selector button').on('click', function () {
|
||||
$('.form-nonRig').slideDown();
|
||||
if ($(this).data('isrig') == 1) {
|
||||
$('#{{form.isRig.auto_id}}').attr('checked', true);
|
||||
if ($('.form-nonRig').is(':hidden')) {
|
||||
$('.form-isRig').show();
|
||||
} else {
|
||||
$('.form-isRig').slideDown();
|
||||
}
|
||||
} else {
|
||||
$('#{{form.isRig.auto_id}}').attr('checked', false);
|
||||
$('.form-isRig').slideUp();
|
||||
}
|
||||
})
|
||||
{% endif %}
|
||||
})
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<h2>
|
||||
{% if object.pk %}
|
||||
Event {{ object.pk }}
|
||||
{% else %}
|
||||
New Event
|
||||
{% endif %}
|
||||
</h2>
|
||||
{% include 'form_errors.html' %}
|
||||
<form class="form-horizontal" role="form" method="POST">{% csrf_token %}
|
||||
{% render_field form.isRig style="display: none" %}
|
||||
{% if not object.pk %}
|
||||
<div class="col-md-12 well">
|
||||
<div class="form-group" id="isRig-selector">
|
||||
<div class="col-sm-12">
|
||||
<span class="col-sm-6">
|
||||
<button type="button" class="btn btn-primary col-xs-12" data-isrig="1">Rig</button>
|
||||
</span>
|
||||
<span class="col-sm-6">
|
||||
<button type="button" class="btn btn-info col-xs-12" data-isrig="0">Non-Rig</button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="col-md-6">
|
||||
<div class="panel panel-default form-hws form-isRig">
|
||||
<div class="panel-heading">Contact Details</div>
|
||||
<div class="panel-body">
|
||||
<div class="form-group">
|
||||
<label for="{{ form.person.id_for_label }}"
|
||||
class="col-sm-4 control-label">{{ form.person.label }}</label>
|
||||
|
||||
<div class="col-sm-8">
|
||||
<div class="row">
|
||||
<input type="hidden" id="{{ form.person.id_for_label }}" name="{{ form.person.name }}"
|
||||
value="{{ form.person.value }}"/>
|
||||
|
||||
<div class="col-xs-9">
|
||||
<input type="text" id="{{ form.person.id_for_label }}-input"
|
||||
class="form-control autocomplete-json"
|
||||
data-valueurl="{% if form.person.value %}
|
||||
{% url 'api_secure' model='person' pk=form.person.value %}
|
||||
{% else %}
|
||||
{% url 'api_secure' model='person' %}
|
||||
{% endif %}?fields=name"
|
||||
data-sourceurl="{% url 'api_secure' model='person' %}"
|
||||
data-target="{{ form.person.id_for_label }}"/>
|
||||
</div>
|
||||
<div class="col-xs-3 align-right">
|
||||
<button type="button" class="btn btn-default"
|
||||
data-url="{#% url invoiceitem_add object.pk %#}"
|
||||
data-toggle="modal" data-target="#itemModal">
|
||||
<span class="glyphicon glyphicon-plus"></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="{{ form.organisation.id_for_label }}"
|
||||
class="col-sm-4 control-label">{{ form.organisation.label }}</label>
|
||||
|
||||
<div class="col-sm-8">
|
||||
<div class="row">
|
||||
<input type="hidden" id="{{ form.organisation.id_for_label }}"
|
||||
name="{{ form.organisation.name }}" value="{{ form.organisation.value }}"/>
|
||||
|
||||
<div class="col-xs-9">
|
||||
<input type="text" id="{{ form.organisation.id_for_label }}-input"
|
||||
class="form-control autocomplete-json"
|
||||
data-valueurl="{% if form.organisation.value %}
|
||||
{% url 'api_secure' model='organisation' pk=form.organisation.value %}
|
||||
{% else %}
|
||||
{% url 'api_secure' model='organisation' %}
|
||||
{% endif %}?fields=name"
|
||||
data-sourceurl="{% url 'api_secure' model='organisation' %}"
|
||||
data-target="{{ form.organisation.id_for_label }}"/>
|
||||
</div>
|
||||
<div class="col-xs-3 align-right">
|
||||
<button type="button" class="btn btn-default"
|
||||
data-url="{#% url invoiceitem_add object.pk %#}"
|
||||
data-toggle="modal" data-target="#itemModal">
|
||||
<span class="glyphicon glyphicon-plus"></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel panel-default form-hws form-nonRig">
|
||||
<div class="panel-heading">Event Description</div>
|
||||
<div class="panel-body">
|
||||
<div class="form-group">
|
||||
<label for="{{ form.description.id_for_label }}"
|
||||
class="col-sm-4 control-label">{{ form.description.label }}</label>
|
||||
|
||||
<div class="col-sm-8">
|
||||
{% render_field form.description class+="form-control" %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.col-md-6 -->
|
||||
|
||||
<div class="col-md-6">
|
||||
<div class="panel panel-default form-hws form-nonRig">
|
||||
<div class="panel-heading">Event Details</div>
|
||||
<div class="panel-body">
|
||||
<div id="form-hws">
|
||||
<div class="form-group">
|
||||
<label for="{{ form.name.id_for_label }}"
|
||||
class="col-sm-4 control-label">{{ form.name.label }}</label>
|
||||
|
||||
<div class="col-sm-8">
|
||||
{% render_field form.name class+="form-control" %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="{{ form.venue.id_for_label }}"
|
||||
class="col-sm-4 control-label">{{ form.venue.label }}</label>
|
||||
|
||||
<div class="col-sm-8">
|
||||
<div class="row">
|
||||
<input type="hidden" id="{{ form.venue.id_for_label }}" name="{{ form.venue.name }}"
|
||||
value="{{ form.venue.value }}"/>
|
||||
|
||||
<div class="col-xs-9">
|
||||
<input type="text" id="{{ form.venue.id_for_label }}-input"
|
||||
class="form-control autocomplete-json"
|
||||
data-valueurl="{% if form.venue.value %}
|
||||
{% url 'api_secure' model='venue' pk=form.venue.value %}
|
||||
{% else %}
|
||||
{% url 'api_secure' model='venue' %}
|
||||
{% endif %}?fields=name"
|
||||
data-sourceurl="{% url 'api_secure' model='venue' %}"
|
||||
data-target="{{ form.venue.id_for_label }}"/>
|
||||
</div>
|
||||
<div class="col-xs-3 align-right">
|
||||
<button type="button" class="btn btn-default"
|
||||
data-url="{#% url invoiceitem_add object.pk %#}"
|
||||
data-toggle="modal" data-target="#itemModal">
|
||||
<span class="glyphicon glyphicon-plus"></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="{{ form.invoiceDate.id_for_label }}"
|
||||
class="col-sm-4 control-label">{{ form.startDate.label }}</label>
|
||||
|
||||
<div class="col-sm-4">
|
||||
{% render_field form.startDate type="date" class+="form-control startDate" required="" %}
|
||||
</div>
|
||||
<div class="col-sm-4">
|
||||
{% render_field form.startTime type="time" class+="form-control" %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="{{ form.invoiceDate.id_for_label }}"
|
||||
class="col-sm-4 control-label">{{ form.endDate.label }}</label>
|
||||
|
||||
<div class="col-sm-4">
|
||||
{% render_field form.endDate type="date" class+="form-control endDate" required="" %}
|
||||
</div>
|
||||
<div class="col-sm-4">
|
||||
{% render_field form.endTime type="time" class+="form-control endTime" %}
|
||||
</div>
|
||||
<div class="col-sm-offset-8 col-sm-4">
|
||||
<div class="btn-group btn-group-justified">
|
||||
<btn class="btn btn-default btn-xs" onclick="setTime23Hours()">23:00</btn>
|
||||
<btn class="btn btn-default btn-xs" onclick="setTime02Hours()">02:00</btn>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{# Rig only information #}
|
||||
<div class="form-isRig {% if object.pk and not object.isRig %}hidden{% endif %}">
|
||||
<div class="form-group">
|
||||
<label for="{{ form.accessAt.id_for_label }}"
|
||||
class="col-sm-4 control-label">{{ form.accessAt.label }}</label>
|
||||
|
||||
<div class="col-sm-8">
|
||||
{% render_field form.accessAt type="datetime-local" class+="form-control" %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="{{ form.meetAt.id_for_label }}"
|
||||
class="col-sm-4 control-label">{{ form.meetAt.label }}</label>
|
||||
|
||||
<div class="col-sm-8">
|
||||
{% render_field form.meetAt type="datetime-local" class+="form-control" %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-4 col-sm-8">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
{% render_field form.dryHire %}{{ form.dryHire.label }}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{#% include 'RIGS/eventitem_table.html' %#}
|
||||
</div>
|
||||
<div class="col-sm-12">
|
||||
<div class="pull-right">
|
||||
<div class="form-group">
|
||||
<input type="submit" value="Submit" class="btn btn-primary"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="modal fade" id="itemModal" role="dialog" aria-labelledby="itemModal" aria-hidded="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -64,5 +64,9 @@ urlpatterns = patterns('',
|
||||
url(r'^event/(?P<pk>\d+)/edit/$',
|
||||
permission_required_with_403('RIGS.change_event')(rigboard.EventUpdate.as_view()),
|
||||
name='event_update'),
|
||||
|
||||
# API
|
||||
url(r'^api/(?P<model>\w+)/$', (views.SecureAPIRequest.as_view()), name="api_secure"),
|
||||
url(r'^api/(?P<model>\w+)/(?P<pk>\d+)/$', (views.SecureAPIRequest.as_view()), name="api_secure"),
|
||||
)
|
||||
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
from django.http.response import HttpResponseRedirect
|
||||
from django.http import HttpResponse
|
||||
from django.core.urlresolvers import reverse_lazy
|
||||
from django.views import generic
|
||||
from django.views.decorators.csrf import csrf_exempt
|
||||
from django.db.models import Q
|
||||
from django.shortcuts import get_object_or_404
|
||||
from django.core import serializers
|
||||
from RIGS import models
|
||||
|
||||
# Create your views here.
|
||||
@@ -143,4 +146,60 @@ class VenueUpdate(generic.UpdateView):
|
||||
def get_success_url(self):
|
||||
return reverse_lazy('venue_detail', kwargs={
|
||||
'pk': self.object.pk,
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
class SecureAPIRequest(generic.View):
|
||||
models = {
|
||||
'venue': models.Venue,
|
||||
'person': models.Person,
|
||||
'organisation': models.Organisation,
|
||||
}
|
||||
|
||||
'''
|
||||
Validate the request is allowed based on user permissions.
|
||||
Raises 403 if denied.
|
||||
Potential to add API key validation at a later date.
|
||||
'''
|
||||
|
||||
def __validate__(self, request, key, perm):
|
||||
if request.user.is_active:
|
||||
if request.user.is_superuser or request.user.is_staff:
|
||||
return True
|
||||
elif request.user.has_perm(perm):
|
||||
return True
|
||||
raise PermissionDenied()
|
||||
|
||||
def get(self, request, model, pk=None, param=None):
|
||||
# Request permission validation things
|
||||
key = request.GET.get('apikey', None)
|
||||
perm = 'RIGS.view_' + model
|
||||
self.__validate__(request, key, perm)
|
||||
|
||||
# Response format where applicable
|
||||
format = request.GET.get('format', 'json')
|
||||
|
||||
# Supply data for one record
|
||||
if pk:
|
||||
object = get_object_or_404(self.models[model], pk=pk)
|
||||
fields = request.GET.get('fields', None)
|
||||
data = serializers.serialize(format, [object], fields=fields)
|
||||
return HttpResponse(data, content_type="application/" + format)
|
||||
|
||||
# Supply data for autocomplete ajax request in json form
|
||||
term = request.GET.get('term', None)
|
||||
if term:
|
||||
objects = self.models[model].objects.filter(name__icontains=term)[:20]
|
||||
results = []
|
||||
for o in objects:
|
||||
data = {
|
||||
'pk': o.pk,
|
||||
'value': o.pk,
|
||||
'label': o.name,
|
||||
}
|
||||
results.append(data)
|
||||
# todo: fix simplejson issues
|
||||
json = simplejson.dumps(results)
|
||||
return HttpResponse(json, content_type="application/json") # Always json
|
||||
|
||||
return HttpResponse(model)
|
||||
BIN
db.sqlite3
BIN
db.sqlite3
Binary file not shown.
Reference in New Issue
Block a user