def add_booking(request): if request.user.is_superuser: if request.method == 'POST': form = BookingForm(data=request.POST) if form.is_valid(): booking = form.save() return redirect('/bookings_sys/confirmation/%s/' % booking.id) else: return render(request, 'addform.html', {'form': form}) else: form = BookingForm() return render(request, 'addform.html', {'form': form}) else: return redirect('/login/?next=/bookings_sys/add_booking/')
def process_booking(request, num): b = Booking.objects.get(id=num) num_pax = b.passenger_set.count() totalslots = b.house.sleeps extraslots = totalslots - num_pax PassengerFormSet = inlineformset_factory( Booking, Passenger, exclude=('dob', 'delete',), extra=extraslots) SupplementFormSet = formset_factory(SupplementForm, can_delete=True) CostFormSet = formset_factory(CostForm) existing_supplements = Supplement.objects.filter(booking=b) supplement_data = [{'item': s.item, 'charge': s.charge, 'cost': s.cost} for s in existing_supplements] existing_costs = Cost.objects.filter(booking=b) cost_data = [{'item': s.item, 'cost': s.cost} for s in existing_costs] if request.method == 'POST': passenger_formset = PassengerFormSet(request.POST, instance=b) supplement_formset = SupplementFormSet(request.POST, prefix='supplement') cost_formset = CostFormSet(request.POST, prefix='cost') booking_form = BookingForm(request.POST, instance=b) if booking_form.is_valid(): booking_form.save() submitted_sups = [] for supplement_form in supplement_formset: if supplement_form.is_valid(): item = supplement_form.cleaned_data.get('item') charge = supplement_form.cleaned_data.get('charge') cost = supplement_form.cleaned_data.get('cost') accom_res = supplement_form.cleaned_data.get('to_accom_res') if item and charge and cost: submitted_sups.append(Supplement(item=item, cost=cost, charge=charge, booking=b, to_accom_res = accom_res)) else: print("not valid") try: Supplement.objects.filter(booking=b).delete() Supplement.objects.bulk_create(submitted_sups) except: # transaction failed halfway print("transaction failed") return redirect('/bookings_sys/process_booking/%d' % (b.id)) submitted_costs = [] for cost_form in cost_formset: if cost_form.is_valid(): item = cost_form.cleaned_data.get('item') cost = cost_form.cleaned_data.get('cost') accom_res = cost_form.cleaned_data.get('to_accom_res') if item and charge and cost: submitted_costs.append(Cost(item=item, cost=cost, booking=b, to_accom_res = accom_res )) else: print("not valid") try: Cost.objects.filter(booking=b).delete() Cost.objects.bulk_create(submitted_costs) except IntegrityError as ie: # transaction failed halfway print("%s" % (ie)) return redirect('/bookings_sys/process_booking/%d' % (b.id)) #invoiced=xero(b, b.supplement_set.all()) tasks = b.task_set.all() if not tasks: print ("no tasks set up") tasks=[ Task(name="send out stuff", done=False, booking=b, due=(b.startdate-datetime.timedelta(days=15))), Task(name="send out more stuff", done=False, booking=b, due=(b.startdate-datetime.timedelta(days=14))) ] Task.objects.bulk_create(tasks) if not b.goo_cal_entered: result = calendar_update(request, b) if result: b.goo_cal_entered = True b.save() else: supplement_formset = SupplementFormSet(initial=supplement_data, prefix='supplement') cost_formset = CostFormSet(initial=cost_data, prefix='cost') passenger_formset = PassengerFormSet(instance=b) booking_form = BookingForm(instance=b) # print(passenger_formset.management_form) context = {'supplement_formset': supplement_formset, 'cost_formset': cost_formset, 'booking_form': booking_form, 'passenger_formset': passenger_formset, 'summary': b} return render(request, 'process_booking.html', context)