From ae025e4b0317fc93c9cbce2df7985036987d8ed9 Mon Sep 17 00:00:00 2001 From: Costantino Vitale Date: Tue, 4 Oct 2022 17:57:11 +0200 Subject: [PATCH] - Salvataggio tappa e percorso --- sistema/forms.py | 13 ++++- sistema/models.py | 11 ++++ sistema/templates/add_mod_percorso.html | 70 +++++++++++++++++++++++-- sistema/views.py | 30 +++++++++-- 4 files changed, 116 insertions(+), 8 deletions(-) diff --git a/sistema/forms.py b/sistema/forms.py index 845def0..1efb005 100644 --- a/sistema/forms.py +++ b/sistema/forms.py @@ -2,7 +2,7 @@ from datetime import datetime from django.contrib.auth.forms import * -from sistema.models import Localita, TipologiaMultimedia, Gestisce, PointOfInterest +from sistema.models import Localita, TipologiaMultimedia, Gestisce, PointOfInterest, Percorso class LocalitaForm(forms.ModelForm): @@ -61,6 +61,17 @@ class PoiForm(forms.ModelForm): self.fields[f].widget.attrs.update({'class': 'form-control'}) +class PercorsoForm(forms.ModelForm): + class Meta: + model = Percorso + exclude = ('is_active',) + + def __init__(self, *args, **kwargs): + super(PercorsoForm, self).__init__(*args, **kwargs) + for f in self.fields: + self.fields[f].widget.attrs.update({'class': 'form-control'}) + + class GestisceForm(forms.ModelForm): data_inizio = forms.DateField( label='Data inizio', diff --git a/sistema/models.py b/sistema/models.py index 4d456de..3c0bb0a 100644 --- a/sistema/models.py +++ b/sistema/models.py @@ -41,6 +41,17 @@ class Tappa(models.Model): ordine = models.IntegerField() is_active = models.BooleanField(default=True) + @staticmethod + def insert_tappe_percorso(list_tappe, form_percorso): + i = 1 + for tappa in list_tappe: + Tappa.objects.create( + percorso=form_percorso.instance, + poi=PointOfInterest.objects.get(pk=int(tappa)), + ordine=i + ) + i += 1 + class TipologiaMultimedia(models.Model): nome = models.CharField(max_length=255, null=False) diff --git a/sistema/templates/add_mod_percorso.html b/sistema/templates/add_mod_percorso.html index afef76b..e2436c4 100644 --- a/sistema/templates/add_mod_percorso.html +++ b/sistema/templates/add_mod_percorso.html @@ -1,5 +1,6 @@ {% extends 'base.html' %} {% load static %} +{% load crispy_forms_tags %} {% block content %}
@@ -17,8 +18,18 @@
-
-

Seleziona i punti di interesse

+
+
Info percorso
+
{% csrf_token %} + {% if form.instance.pk %} + + + {% endif %} + {{form | crispy }} +
+ +
+
Seleziona i punti di interesse

@@ -66,6 +77,15 @@ updateSelect(); }); + function objectifyForm(formArray) { + var returnArray = {}; + for (var i = 0; i < formArray.length; i++) { + returnArray[formArray[i]['name']] = formArray[i]['value']; + } + return returnArray; + } + + function updateSelect(){ $('#select-start').append($("").attr("value", 0).text('')); $('#select-end').append($("").attr("value", 0).text('')); @@ -132,6 +152,7 @@ }); } + function drawRoutes(start, end, poi){ var directionsService = new google.maps.DirectionsService; var directionsDisplay = new google.maps.DirectionsRenderer; @@ -171,6 +192,49 @@ } + + function saveItinerary(){ + percorso_form = objectifyForm($('#percorso_form').serializeArray()); + + method = '' + pk_percorso_form = '' + {% if form.instance.pk %} + method = 'mod' + pk_percorso_form = {{ form.instance.pk }} + {% endif %} + + $.ajax({ + data: { + 'percorso_form': JSON.stringify(percorso_form), + 'pk_percorso_form': pk_percorso_form, + 'tappe': list_tappe.filter(value => selected_items.includes(value)), + 'method': method, + }, + type: "POST", + url: '{% url 'sistema:percorso' %}', + "headers": {'X-CSRFToken': '{{ csrf_token }}'}, + }) + .done(function (response) { + Swal.fire('', "Operazione effettuata con successo", "success").then((value) => { + location.href('{% url 'sistema:percorsi_list' %}'); + }); + }) + .fail(function (jqXHR, textStatus, errorThrown) { + errore = '' + if (typeof jqXHR.responseText.reason === 'string' || jqXHR.responseText.reason instanceof String) { + errore = jqXHR.responseText + } else { + for (var i = 0; i < jqXHR.responseJSON.reason.length; i++) { + errore += jqXHR.responseJSON.reason[i] + errore += '
' + } + } + Swal.fire("Attenzione!", errore, "error") + + }); + + + } diff --git a/sistema/views.py b/sistema/views.py index fa3dec1..9103908 100644 --- a/sistema/views.py +++ b/sistema/views.py @@ -1,3 +1,5 @@ +import json + from django.contrib import messages from django.http import JsonResponse from django.shortcuts import render, redirect @@ -6,8 +8,9 @@ from django.views import View from django.views.generic import TemplateView from rest_framework import status -from sistema.forms import LocalitaForm, TipoMultimediaForm, PoiForm -from sistema.models import Localita, TipologiaMultimedia, PointOfInterest, Percorso +from sistema.forms import LocalitaForm, TipoMultimediaForm, PoiForm, PercorsoForm +from sistema.models import Localita, TipologiaMultimedia, PointOfInterest, Percorso, Tappa +from socoin_atlas import settings from utenti.mixins import CustomLoginRequiredMixin @@ -135,6 +138,7 @@ class TipoMultimediaView(View): class PoiView(View): + def get_coordinates(self): start = int(self.GET.get('start')) end = int(self.GET.get('end')) @@ -215,14 +219,32 @@ class PercorsoView(View): percorso.is_active = False percorso.save() + def add_percorso(self, request): + form = PercorsoForm(data=json.loads(request.POST.get('percorso_form'))) + if form.is_valid(): + form.save() + + Tappa.insert_tappe_percorso(request.POST.getlist('tappe[]'), form) + + return JsonResponse({'response': 'Percorso inserito con successo'}, status=status.HTTP_200_OK) + else: + errors = '' + for err in form.errors.as_data(): + errors += '
  • ' + err + '
  • ' + + msg = 'Errore nell\'inserimento del tour operator. Controlla il form.' + errors + return JsonResponse({'response': msg}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + def get(self, request, *args, **kwargs): if request.GET.get('method') == 'del': self.del_poi(request) return JsonResponse({'response': 'Percorso eliminato con successo'}, status=status.HTTP_200_OK) elif 'pk' in kwargs: - return render(request, 'add_mod_percorso.html', {'poi_list': PointOfInterest.objects.filter(is_active=True).values('id', 'nome')}) + return render(request, 'add_mod_percorso.html', {'poi_list': PointOfInterest.objects.filter(is_active=True).values('id', 'nome'), + 'form': PercorsoForm(instance=Percorso.objects.get(pk=int(self.kwargs['pk'])))}) else: - return render(request, 'add_mod_percorso.html', {'poi_list': PointOfInterest.objects.filter(is_active=True).values('id', 'nome')}) + return render(request, 'add_mod_percorso.html', {'poi_list': PointOfInterest.objects.filter(is_active=True).values('id', 'nome'), + 'form': PercorsoForm()}) def post(self, request, *args, **kwargs): if 'mod' in request.POST: -- 2.43.0