diff --git a/RIGS/forms.py b/RIGS/forms.py index e7541421..8a231da3 100644 --- a/RIGS/forms.py +++ b/RIGS/forms.py @@ -1,8 +1,12 @@ __author__ = 'Ghost' from django import forms from django.utils import formats -from RIGS import models from django.conf import settings +from django.core import serializers +import simplejson + +from RIGS import models + # Events Shit class EventForm(forms.ModelForm): @@ -11,6 +15,71 @@ class EventForm(forms.ModelForm): access_at = forms.DateTimeField(input_formats=datetime_input_formats, required=False) 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: model = models.Event fields = ['is_rig', 'name', 'venue', 'start_date', 'start_time', 'end_date', diff --git a/RIGS/models.py b/RIGS/models.py index b67377f2..682c3e2d 100644 --- a/RIGS/models.py +++ b/RIGS/models.py @@ -232,7 +232,7 @@ class Event(models.Model, RevisionMixin): 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) description = models.TextField(blank=True, null=True) quantity = models.IntegerField() diff --git a/RIGS/rigboard.py b/RIGS/rigboard.py index 7e0f3730..1b28aa54 100644 --- a/RIGS/rigboard.py +++ b/RIGS/rigboard.py @@ -35,7 +35,6 @@ class EventCreate(generic.CreateView): def get_success_url(self): return reverse_lazy('event_detail', kwargs={'pk': self.object.pk}) - class EventUpdate(generic.UpdateView): model = models.Event form_class = forms.EventForm diff --git a/RIGS/static/js/interaction.js b/RIGS/static/js/interaction.js index 0b586251..0e0fac88 100644 --- a/RIGS/static/js/interaction.js +++ b/RIGS/static/js/interaction.js @@ -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() { var sum = 0; $('.sub-total').each(function() { @@ -122,7 +129,6 @@ $("#item-table tbody").sortable({ pk = $('#'+value).data('pk'); itemorder[key] = pk; }); - data = JSON.stringify(itemorder); - $.post($('#item-table').data('orderurl'), data); + } }); \ No newline at end of file diff --git a/RIGS/templates/RIGS/event_form.html b/RIGS/templates/RIGS/event_form.html index 3b7de673..532ec8cc 100644 --- a/RIGS/templates/RIGS/event_form.html +++ b/RIGS/templates/RIGS/event_form.html @@ -61,6 +61,10 @@ }) {% endif %} }) + + $(document).ready(function() { + setupItemTable($("#{{ form.items_json.id_for_label }}").val()); + }); {% endblock %} @@ -75,6 +79,9 @@ {% include 'form_errors.html' %}