Enabled event create button

Added MIC field to the event form

Added the ability to specify the fields you want to query in an api request

Changes to the user profile to enable queries via the API
This commit is contained in:
Tom Price
2014-12-02 01:24:38 +00:00
parent 201d4c5292
commit 3aec6c212d
4 changed files with 202 additions and 171 deletions

View File

@@ -1,9 +1,11 @@
import hashlib
import datetime
from django.db import models from django.db import models
from django.contrib.auth.models import AbstractUser from django.contrib.auth.models import AbstractUser
from django.conf import settings from django.conf import settings
import hashlib
import reversion import reversion
import datetime
# Create your models here. # Create your models here.
@@ -18,6 +20,9 @@ class Profile(AbstractUser):
url = "https://www.gravatar.com/avatar/" + hashlib.md5(self.email).hexdigest() + "?d=identicon&s=500" url = "https://www.gravatar.com/avatar/" + hashlib.md5(self.email).hexdigest() + "?d=identicon&s=500"
return url return url
@property
def name(self):
return self.get_full_name() + ' "' + self.initials + '"'
class RevisionMixin(object): class RevisionMixin(object):
@property @property
@@ -163,7 +168,7 @@ class Event(models.Model, RevisionMixin):
) )
name = models.CharField(max_length=255) name = models.CharField(max_length=255)
person = models.ForeignKey('Person') person = models.ForeignKey('Person', null=True, blank=True)
organisation = models.ForeignKey('Organisation', blank=True, null=True) organisation = models.ForeignKey('Organisation', blank=True, null=True)
venue = models.ForeignKey('Venue') venue = models.ForeignKey('Venue')
description = models.TextField(blank=True, null=True) description = models.TextField(blank=True, null=True)

View File

@@ -76,74 +76,135 @@
{% include 'form_errors.html' %} {% include 'form_errors.html' %}
<form class="form-horizontal" role="form" method="POST">{% csrf_token %} <form class="form-horizontal" role="form" method="POST">{% csrf_token %}
{% render_field form.is_rig style="display: none" %} {% render_field form.is_rig style="display: none" %}
{% if not object.pk %} {% if not object.pk %}
<div class="col-md-12 well"> <div class="col-md-12 well">
<div class="form-group" id="is_rig-selector"> <div class="form-group" id="is_rig-selector">
<div class="col-sm-12"> <div class="col-sm-12">
<span class="col-sm-6"> <span class="col-sm-6">
<button type="button" class="btn btn-primary col-xs-12" data-is_rig="1">Rig</button> <button type="button" class="btn btn-primary col-xs-12" data-is_rig="1">Rig</button>
</span> </span>
<span class="col-sm-6"> <span class="col-sm-6">
<button type="button" class="btn btn-info col-xs-12" data-is_rig="0">Non-Rig</button> <button type="button" class="btn btn-info col-xs-12" data-is_rig="0">Non-Rig</button>
</span> </span>
</div>
</div> </div>
</div> </div>
{% endif %} </div>
<div class="col-md-6"> {% endif %}
<div class="panel panel-default form-hws form-is_rig"> <div class="col-md-6">
<div class="panel-heading">Contact Details</div> <div class="panel panel-default form-hws form-is_rig {% if object.pk and not object.is_rig %}hidden{% endif %}">
<div class="panel-body"> <div class="panel-heading">Contact Details</div>
<div class="form-group"> <div class="panel-body">
<label for="{{ form.person.id_for_label }}" <div class="form-group">
class="col-sm-4 control-label">{{ form.person.label }}</label> <label for="{{ form.person.id_for_label }}"
class="col-sm-4 control-label">{{ form.person.label }}</label>
<div class="col-sm-8"> <div class="col-sm-8">
<div class="row"> <div class="row">
<input type="hidden" id="{{ form.person.id_for_label }}" name="{{ form.person.name }}" <input type="hidden" id="{{ form.person.id_for_label }}" name="{{ form.person.name }}"
value="{{ form.person.value|default_if_none:"" }}"/> value="{{ form.person.value|default_if_none:"" }}"/>
<div class="col-xs-9"> <div class="col-xs-9">
<input type="text" id="{{ form.person.id_for_label }}-input" <input type="text" id="{{ form.person.id_for_label }}-input"
class="form-control autocomplete-json" class="form-control autocomplete-json"
data-valueurl="{% if form.person.value %} data-valueurl="{% if form.person.value %}
{% url 'api_secure' model='person' pk=form.person.value %} {% url 'api_secure' model='person' pk=form.person.value %}
{% else %} {% else %}
{% url 'api_secure' model='person' %} {% url 'api_secure' model='person' %}
{% endif %}?fields=name" {% endif %}?fields=name"
data-sourceurl="{% url 'api_secure' model='person' %}" data-sourceurl="{% url 'api_secure' model='person' %}"
data-target="{{ form.person.id_for_label }}"/> data-target="{{ form.person.id_for_label }}"/>
</div> </div>
<div class="col-xs-3 align-right"> <div class="col-xs-3 align-right">
<button type="button" class="btn btn-default" <button type="button" class="btn btn-default"
data-url="{#% url invoiceitem_add object.pk %#}" data-url="{#% url invoiceitem_add object.pk %#}"
data-toggle="modal" data-target="#itemModal"> data-toggle="modal" data-target="#itemModal">
<span class="glyphicon glyphicon-plus"></span> <span class="glyphicon glyphicon-plus"></span>
</button> </button>
</div>
</div> </div>
</div> </div>
</div> </div>
<div class="form-group"> </div>
<label for="{{ form.organisation.id_for_label }}" <div class="form-group">
class="col-sm-4 control-label">{{ form.organisation.label }}</label> <label for="{{ form.organisation.id_for_label }}"
class="col-sm-4 control-label">{{ form.organisation.label }}</label>
<div class="col-sm-8"> <div class="col-sm-8">
<div class="row"> <div class="row">
<input type="hidden" id="{{ form.organisation.id_for_label }}" <input type="hidden" id="{{ form.organisation.id_for_label }}"
name="{{ form.organisation.name }}" name="{{ form.organisation.name }}"
value="{{ form.organisation.value|default_if_none:"" }}"/> value="{{ form.organisation.value|default_if_none:"" }}"/>
<div class="col-xs-9"> <div class="col-xs-9">
<input type="text" id="{{ form.organisation.id_for_label }}-input" <input type="text" id="{{ form.organisation.id_for_label }}-input"
class="form-control autocomplete-json" class="form-control autocomplete-json"
data-valueurl="{% if form.organisation.value %} data-valueurl="{% if form.organisation.value %}
{% url 'api_secure' model='organisation' pk=form.organisation.value %} {% url 'api_secure' model='organisation' pk=form.organisation.value %}
{% else %} {% else %}
{% url 'api_secure' model='organisation' %} {% url 'api_secure' model='organisation' %}
{% endif %}?fields=name" {% endif %}?fields=name"
data-sourceurl="{% url 'api_secure' model='organisation' %}" data-sourceurl="{% url 'api_secure' model='organisation' %}"
data-target="{{ form.organisation.id_for_label }}"/> 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-non_rig">
<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-non_rig">
<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|default_if_none:"" }}"/>
<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>
<div class="col-xs-3 align-right"> <div class="col-xs-3 align-right">
<button type="button" class="btn btn-default" <button type="button" class="btn btn-default"
@@ -155,149 +216,108 @@
</div> </div>
</div> </div>
</div> </div>
</div>
</div>
<div class="panel panel-default form-hws form-non_rig">
<div class="panel-heading">Event Description</div>
<div class="panel-body">
<div class="form-group"> <div class="form-group">
<label for="{{ form.description.id_for_label }}" <label for="{{ form.start_date.id_for_label }}"
class="col-sm-4 control-label">{{ form.description.label }}</label> class="col-sm-4 control-label">{{ form.start_date.label }}</label>
<div class="col-sm-8"> <div class="col-sm-4">
{% render_field form.description class+="form-control" %} <input type="date" name="{{ form.start_date.name }}"
id="{{ form.start_date.id_for_label }}"
class="form-control start_date" required
value="{{ form.start_date.value|date:"Y-m-d" }}"/>
</div>
<div class="col-sm-4">
{% render_field form.start_time type="time" class+="form-control" %}
</div> </div>
</div> </div>
</div> <div class="form-group">
</div> <label for="{{ form.end_date.id_for_label }}"
</div> class="col-sm-4 control-label">{{ form.end_date.label }}</label>
<!-- /.col-md-6 -->
<div class="col-md-6"> <div class="col-sm-4">
<div class="panel panel-default form-hws form-non_rig"> <input type="date" name="{{ form.end_date.name }}" id="{{ form.end_date.id_for_label }}"
<div class="panel-heading">Event Details</div> class="form-control end_date" required
<div class="panel-body"> value="{{ form.end_date.value|date:"Y-m-d" }}"/>
<div id="form-hws"> </div>
<div class="col-sm-4">
{% render_field form.end_time type="time" class+="form-control end_time" %}
</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-is_rig {% if object.pk and not object.is_rig %}hidden{% endif %}">
<div class="form-group"> <div class="form-group">
<label for="{{ form.name.id_for_label }}" <label for="{{ form.access_at.id_for_label }}"
class="col-sm-4 control-label">{{ form.name.label }}</label> class="col-sm-4 control-label">{{ form.access_at.label }}</label>
<div class="col-sm-8"> <div class="col-sm-8">
{% render_field form.name class+="form-control" %} {% render_field form.access_at type="datetime-local" class+="form-control" %}
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="{{ form.venue.id_for_label }}" <label for="{{ form.meet_at.id_for_label }}"
class="col-sm-4 control-label">{{ form.venue.label }}</label> class="col-sm-4 control-label">{{ form.meet_at.label }}</label>
<div class="col-sm-8"> <div class="col-sm-8">
<div class="row"> {% render_field form.meet_at type="datetime-local" class+="form-control" %}
<input type="hidden" id="{{ form.venue.id_for_label }}" name="{{ form.venue.name }}" </div>
value="{{ form.venue.value|default_if_none:"" }}"/> </div>
<div class="form-group">
<div class="col-xs-9"> <div class="col-sm-offset-4 col-sm-8">
<input type="text" id="{{ form.venue.id_for_label }}-input" <div class="checkbox">
class="form-control autocomplete-json" <label>
data-valueurl="{% if form.venue.value %} {% render_field form.dry_hire %}{{ form.dry_hire.label }}
{% url 'api_secure' model='venue' pk=form.venue.value %} </label>
{% 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>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="{{ form.start_date.id_for_label }}" <label for="{{ form.status.id_for_label }}"
class="col-sm-4 control-label">{{ form.start_date.label }}</label> class="col-sm-4 control-label">{{ form.status.label }}</label>
<div class="col-sm-4"> <div class="col-sm-8">
<input type="date" name="{{ form.start_date.name }}" {% render_field form.status class+="form-control" %}
id="{{ form.start_date.id_for_label }}"
class="form-control start_date" required
value="{{ form.start_date.value|date:"Y-m-d" }}"/>
</div>
<div class="col-sm-4">
{% render_field form.start_time type="time" class+="form-control" %}
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="{{ form.end_date.id_for_label }}" <label for="{{ form.mic.id_for_label }}"
class="col-sm-4 control-label">{{ form.end_date.label }}</label> class="col-sm-4 control-label">{{ form.mic.label }}</label>
<div class="col-sm-4"> <div class="col-sm-8">
<input type="date" name="{{ form.end_date.name }}" id="{{ form.end_date.id_for_label }}" <input type="hidden" id="{{ form.mic.id_for_label }}" name="{{ form.mic.name }}"
class="form-control end_date" required value="{{ form.mic.value|default_if_none:"" }}"/>
value="{{ form.end_date.value|date:"Y-m-d" }}"/>
</div> <input type="text" id="{{ form.mic.id_for_label }}-input"
<div class="col-sm-4"> class="form-control autocomplete-json"
{% render_field form.end_time type="time" class+="form-control end_time" %} data-valueurl="
</div> {% if form.mic.value %}
<div class="col-sm-offset-8 col-sm-4"> {% url 'api_secure' model='mic' pk=form.mic.value %}
<div class="btn-group btn-group-justified"> {% else %}
<btn class="btn btn-default btn-xs" onclick="setTime23Hours()">23:00</btn> {% url 'api_secure' model='mic' %}
<btn class="btn btn-default btn-xs" onclick="setTime02Hours()">02:00</btn> {% endif %}?fields=name"
</div> data-sourceurl="{% url 'api_secure' model='mic' %}?fields=first_name,username,initials"
data-target="{{ form.mic.id_for_label }}"/>
</div> </div>
</div> </div>
{#% include 'RIGS/eventitem_table.html' %#}
{# Rig only information #} </div>
<div class="form-is_rig {% if object.pk and not object.is_rig %}hidden{% endif %}"> <div class="col-sm-12">
<div class="pull-right">
<div class="form-group"> <div class="form-group">
<label for="{{ form.access_at.id_for_label }}" <input type="submit" value="Submit" class="btn btn-primary"/>
class="col-sm-4 control-label">{{ form.access_at.label }}</label>
<div class="col-sm-8">
{% render_field form.access_at type="datetime-local" class+="form-control" %}
</div>
</div>
<div class="form-group">
<label for="{{ form.meet_at.id_for_label }}"
class="col-sm-4 control-label">{{ form.meet_at.label }}</label>
<div class="col-sm-8">
{% render_field form.meet_at 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.dry_hire %}{{ form.dry_hire.label }}
</label>
</div>
</div>
</div>
<div class="form-group">
<label for="{{ form.status.id_for_label }}"
class="col-sm-4 control-label">{{ form.status.label }}</label>
<div class="col-sm-8">
{% render_field form.status class+="form-control" %}
</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>
</div> </div>
</div> </div>
</div> </div>
</div>
</form> </form>
<div class="modal fade" id="itemModal" role="dialog" aria-labelledby="itemModal" aria-hidded="true"> <div class="modal fade" id="itemModal" role="dialog" aria-labelledby="itemModal" aria-hidded="true">
<div class="modal-dialog"> <div class="modal-dialog">

View File

@@ -10,7 +10,7 @@
<h3>Rigboard</h3> <h3>Rigboard</h3>
</div> </div>
<div class="col-sm-2"> <div class="col-sm-2">
<a href="{#% url 'person_create' %#}" class="btn btn-default pull-right">New <span <a href="{% url 'event_create' %}" class="btn btn-default pull-right">New <span
class="glyphicon glyphicon-plus"></span></a> class="glyphicon glyphicon-plus"></span></a>
</div> </div>
{% comment %} {% comment %}

View File

@@ -10,6 +10,7 @@ from RIGS import models
import simplejson import simplejson
# Create your views here. # Create your views here.
def login(request, **kwargs): def login(request, **kwargs):
if request.user.is_authenticated(): if request.user.is_authenticated():
@@ -156,6 +157,7 @@ class SecureAPIRequest(generic.View):
'venue': models.Venue, 'venue': models.Venue,
'person': models.Person, 'person': models.Person,
'organisation': models.Organisation, 'organisation': models.Organisation,
'mic': models.Profile,
} }
''' '''
@@ -180,27 +182,31 @@ class SecureAPIRequest(generic.View):
# Response format where applicable # Response format where applicable
format = request.GET.get('format', 'json') format = request.GET.get('format', 'json')
fields = request.GET.get('fields', None).split(',')
# Supply data for one record # Supply data for one record
if pk: if pk:
object = get_object_or_404(self.models[model], pk=pk) object = get_object_or_404(self.models[model], pk=pk)
fields = request.GET.get('fields', None)
data = serializers.serialize(format, [object], fields=fields) data = serializers.serialize(format, [object], fields=fields)
return HttpResponse(data, content_type="application/" + format) return HttpResponse(data, content_type="application/" + format)
# Supply data for autocomplete ajax request in json form # Supply data for autocomplete ajax request in json form
term = request.GET.get('term', None) term = request.GET.get('term', None)
if term: if term:
objects = self.models[model].objects.filter(name__icontains=term)[:20] if fields is None:
fields = ['name']
all_objects = self.models[model].objects
results = [] results = []
for o in objects: for field in fields:
data = { filter = field + "__icontains"
'pk': o.pk, objects = all_objects.filter(**{filter: term})
'value': o.pk, for o in objects:
'label': o.name, data = {
} 'pk': o.pk,
results.append(data) 'value': o.pk,
# todo: fix simplejson issues 'label': o.name,
}
results.append(data)
json = simplejson.dumps(results) json = simplejson.dumps(results)
return HttpResponse(json, content_type="application/json") # Always json return HttpResponse(json, content_type="application/json") # Always json