mirror of
https://github.com/nottinghamtec/PyRIGS.git
synced 2026-01-26 09:52:16 +00:00
Event Items now saved using JSON rather than an AJAX request
This commit is contained in:
@@ -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',
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -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">
|
||||||
|
|||||||
@@ -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'
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user