Event Items now saved using JSON rather than an AJAX request

This commit is contained in:
Tom Price
2014-12-04 22:18:53 +00:00
parent 2390429775
commit 697bbb9479
6 changed files with 94 additions and 9 deletions

View File

@@ -1,8 +1,12 @@
__author__ = 'Ghost' __author__ = 'Ghost'
from django import forms from django import forms
from django.utils import formats from django.utils import formats
from RIGS import models
from django.conf import settings from django.conf import settings
from django.core import serializers
import simplejson
from RIGS import models
# Events Shit # Events Shit
class EventForm(forms.ModelForm): class EventForm(forms.ModelForm):
@@ -11,6 +15,71 @@ class EventForm(forms.ModelForm):
access_at = forms.DateTimeField(input_formats=datetime_input_formats, required=False) access_at = forms.DateTimeField(input_formats=datetime_input_formats, required=False)
name = forms.CharField(min_length=3) name = forms.CharField(min_length=3)
items_json = forms.CharField()
items = {}
@property
def _get_items_json(self):
items = {}
for item in self.instance.items.all():
data = serializers.serialize('json', [item])
struct = simplejson.loads(data)
items[item.pk] = simplejson.dumps(struct[0])
return simplejson.dumps(items)
def __init__(self, *args, **kwargs):
super(EventForm, self).__init__(*args, **kwargs)
self.fields['items_json'].initial = self._get_items_json
def process_items_json(self, event=None):
data = simplejson.loads(self.cleaned_data['items_json'])
items = {}
for key in data:
pk = int(key)
items[pk] = self._get_or_initialise_item(pk, data[key]['fields'], event)
return items
def _get_or_initialise_item(self, pk, data, event):
if (pk < 0):
item = models.EventItem()
else:
item = models.EventItem.objects.get(pk=pk)
item.name = data['name']
item.description = data['description']
item.quantity = data['quantity']
item.cost = data['cost']
item.order = data['order']
if (event):
item.event = event
item.full_clean()
else:
item.full_clean('event')
return item
def save(self, commit=True):
m = super(EventForm, self).save(commit=False)
if (commit):
m.save()
cur_items = m.items.all()
items = self.process_items_json(m)
# Delete any unneeded items
for item in cur_items:
if item.pk not in items:
item.delete()
for key in items:
items[key].save()
return m
class Meta: class Meta:
model = models.Event model = models.Event
fields = ['is_rig', 'name', 'venue', 'start_date', 'start_time', 'end_date', fields = ['is_rig', 'name', 'venue', 'start_date', 'start_time', 'end_date',

View File

@@ -232,7 +232,7 @@ class Event(models.Model, RevisionMixin):
class EventItem(models.Model): class EventItem(models.Model):
event = models.ForeignKey('Event', related_name='items') event = models.ForeignKey('Event', related_name='items', blank=True)
name = models.CharField(max_length=255) name = models.CharField(max_length=255)
description = models.TextField(blank=True, null=True) description = models.TextField(blank=True, null=True)
quantity = models.IntegerField() quantity = models.IntegerField()

View File

@@ -35,7 +35,6 @@ class EventCreate(generic.CreateView):
def get_success_url(self): def get_success_url(self):
return reverse_lazy('event_detail', kwargs={'pk': self.object.pk}) return reverse_lazy('event_detail', kwargs={'pk': self.object.pk})
class EventUpdate(generic.UpdateView): class EventUpdate(generic.UpdateView):
model = models.Event model = models.Event
form_class = forms.EventForm form_class = forms.EventForm

View File

@@ -1,3 +1,10 @@
function setupItemTable(items_json) {
objectitems = JSON.parse(items_json)
$.each(objectitems, function(key, val) {
objectitems[key] = JSON.parse(val);
})
}
function updatePrices() { function updatePrices() {
var sum = 0; var sum = 0;
$('.sub-total').each(function() { $('.sub-total').each(function() {
@@ -122,7 +129,6 @@ $("#item-table tbody").sortable({
pk = $('#'+value).data('pk'); pk = $('#'+value).data('pk');
itemorder[key] = pk; itemorder[key] = pk;
}); });
data = JSON.stringify(itemorder);
$.post($('#item-table').data('orderurl'), data);
} }
}); });

View File

@@ -61,6 +61,10 @@
}) })
{% endif %} {% endif %}
}) })
$(document).ready(function() {
setupItemTable($("#{{ form.items_json.id_for_label }}").val());
});
</script> </script>
{% endblock %} {% endblock %}
@@ -75,6 +79,9 @@
{% 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" %}
<input type="hidden" name="{{ form.items_json.name }}" id="{{ form.items_json.id_for_label }}" value="{{ form.items_json.value }}" />
{# New rig buttons #}
{% 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">
@@ -89,6 +96,8 @@
</div> </div>
</div> </div>
{% endif %} {% endif %}
{# Contact details #}
<div class="col-md-6"> <div class="col-md-6">
<div class="panel panel-default form-hws form-is_rig {% if object.pk and not object.is_rig %}hidden{% endif %}"> <div class="panel panel-default form-hws form-is_rig {% if object.pk and not object.is_rig %}hidden{% endif %}">
<div class="panel-heading">Contact Details</div> <div class="panel-heading">Contact Details</div>
@@ -162,6 +171,7 @@
</div> </div>
<!-- /.col-md-6 --> <!-- /.col-md-6 -->
{# Event details #}
<div class="col-md-6"> <div class="col-md-6">
<div class="panel panel-default form-hws form-non_rig"> <div class="panel panel-default form-hws form-non_rig">
<div class="panel-heading">Event Details</div> <div class="panel-heading">Event Details</div>
@@ -307,8 +317,10 @@
</div> </div>
</div> </div>
<!-- /.col-md-6 --> <!-- /.col-md-6 -->
{# Notes and item shit #}
<div class="col-sm-12"> <div class="col-sm-12">
<div class="panel panel-default form-hws form-is_rig {% if object.pk and not object.is_rig %}hidden{% endif %}"> <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-body">
<div class="form-group"> <div class="form-group">
<label for="{{ form.notes.id_for_label }}">{{ form.notes.label }}</label> <label for="{{ form.notes.id_for_label }}">{{ form.notes.label }}</label>
@@ -316,9 +328,10 @@
</div> </div>
{% include "RIGS/item_table.html" %} {% include "RIGS/item_table.html" %}
</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">
<div class="modal-content"> <div class="modal-content">

View File

@@ -36,8 +36,6 @@ Called from a modal window (e.g. when an item is submitted to an event/invoice).
May optionally also include some javascript in a success message to cause a load of May optionally also include some javascript in a success message to cause a load of
the new information onto the page. the new information onto the page.
""" """
class CloseModal(generic.TemplateView): class CloseModal(generic.TemplateView):
template_name = 'closemodal.html' template_name = 'closemodal.html'