From 128fb94a15e3699d5d6d13dab9276d18c1ba8d76 Mon Sep 17 00:00:00 2001 From: Valeria Vitti Date: Wed, 23 Oct 2024 16:49:53 +0200 Subject: [PATCH] anteprima poi modifica label file multimediali inserimento coordinate in lista percorsi --- api/urls.py | 3 +- api/views.py | 24 +++++++++++++- sistema/datatables.py | 6 ++-- sistema/forms.py | 15 ++++----- sistema/models.py | 12 ++++--- sistema/templates/add_mod_poi.html | 13 +++++++- sistema/templates/poi_list.html | 4 ++- sistema/views.py | 51 ++++++++++++++++++++++++------ 8 files changed, 98 insertions(+), 30 deletions(-) diff --git a/api/urls.py b/api/urls.py index 09f4b95..5b531aa 100644 --- a/api/urls.py +++ b/api/urls.py @@ -2,8 +2,7 @@ from django.contrib import admin from django.urls import path, include from django.contrib.auth import views as auth_views -from api.views import Login_v2, RegistrationAPI, ListaPercorsiAPI, DetailPercorsoAPI, DetailPoiAPI, SendFeedbackAPI, \ - ShowQRCode +from api.views import Login_v2, RegistrationAPI, ListaPercorsiAPI, DetailPercorsoAPI, DetailPoiAPI, SendFeedbackAPI, ShowQRCode urlpatterns = [ path('api-login/', Login_v2.as_view(), name='api_login'), diff --git a/api/views.py b/api/views.py index 03bc0e2..d33e8ba 100644 --- a/api/views.py +++ b/api/views.py @@ -135,11 +135,32 @@ class ListaPercorsiAPI(APIView): filter = Percorso.objects.filter(is_active=True) percorsi_serialize = PercorsoSerializer(filter, many=True) + percorsi = [] + + for p in percorsi_serialize.data: + tappa_is_partenza = Tappa.objects.filter(percorso=p['id'], is_partenza=True) + if tappa_is_partenza: + lat = tappa_is_partenza.first().poi.lat + long = tappa_is_partenza.first().poi.long + else: + lat = None + long = None + + percorsi.append({ + 'id': p['id'], + 'nome': p['nome'], + 'descrizione': p['descrizione'], + 'testo': p['testo'], + 'icona': p['icona'], + 'url': p['url'], + 'lat': lat, + 'long': long + }) if error: return Response({'errors': errors, 'error': error, 'data': '', 'messages': ['KO']}) else: - return Response({'errors': errors, 'error': error, 'data': percorsi_serialize.data, 'messages': ['OK']}) + return Response({'errors': errors, 'error': error, 'data': percorsi, 'messages': ['OK']}) class DetailPercorsoAPI(APIView): @@ -160,6 +181,7 @@ class DetailPercorsoAPI(APIView): tappe = Tappa.objects.filter(percorso=filter.first(), is_active=True) tappe_list = TappaSerializer(tappe, many=True) + feedback = Feedback.objects.filter(percorso=filter.first(), is_active=True) feedback_list = FeedbackSerializer(feedback, many=True) diff --git a/sistema/datatables.py b/sistema/datatables.py index 3716636..9087b03 100644 --- a/sistema/datatables.py +++ b/sistema/datatables.py @@ -144,8 +144,8 @@ class PercorsoDatatables(BaseDatatableView): class PoiDatatables(BaseDatatableView): model = PointOfInterest - columns = ['id', 'icona', 'nome', 'lat', 'long', 'is_danger', 'mod', 'del'] - order_columns = ['id', 'icona', 'nome', 'lat', 'long', 'is_danger', 'mod', 'del'] + columns = ['id', 'icona', 'anteprima_poi', 'nome', 'lat', 'long', 'is_danger', 'mod', 'del'] + order_columns = ['id', 'icona', 'anteprima_poi', 'nome', 'lat', 'long', 'is_danger', 'mod', 'del'] def get_initial_queryset(self): return self.model.objects.filter(is_active=True) @@ -161,6 +161,8 @@ class PoiDatatables(BaseDatatableView): return escape('{0}'.format(row.long)) if column == 'icona': return f'' + if column == 'anteprima_poi': + return f'' if column == 'is_danger': if row.is_danger: return 'SI' diff --git a/sistema/forms.py b/sistema/forms.py index 4fd8433..c46dc52 100644 --- a/sistema/forms.py +++ b/sistema/forms.py @@ -51,25 +51,26 @@ class TipoMultimediaForm(forms.ModelForm): class PoiForm(forms.ModelForm): - + anteprima_poi = forms.FileField(label='Anteprima POI', widget=forms.FileInput( + attrs={'class': 'form-control', 'form': 'poi_form'}), ) icona = forms.FileField(label='Icona', widget=forms.FileInput( attrs={'class': 'form-control', 'form': 'poi_form'}), ) is_danger = forms.BooleanField(required=False,widget=forms.CheckboxInput(attrs={'class': 'form-check-input'}), label='Punto di pericolo') class Meta: model = PointOfInterest - exclude = ('is_active','url') + exclude = ('is_active','url', 'url_anteprima_poi') def __init__(self, *args, **kwargs): super(PoiForm, self).__init__(*args, **kwargs) self.fields['icona'].required = False self.fields['descrizione'].required = False + self.fields['anteprima_poi'].required = False for f in self.fields: - if self.fields[f].label == 'Descrizione': - self.fields[f].max_length = 3000 - elif self.fields[f].widget.input_type != 'checkbox': - self.fields[f].widget.attrs.update({'class': ' form-control'}) + if self.fields[f].label != 'Descrizione': + if self.fields[f].widget.input_type != 'checkbox': + self.fields[f].widget.attrs.update({'class': ' form-control'}) # def save(self, commit=True): @@ -92,8 +93,6 @@ class PercorsoForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(PercorsoForm, self).__init__(*args, **kwargs) for f in self.fields: - if self.fields[f].label == 'Testo': - self.fields[f].max_length = 3000 self.fields[f].widget.attrs.update({'class': 'form-control'}) class IconaPercorsoForm(forms.ModelForm): diff --git a/sistema/models.py b/sistema/models.py index dfcfa91..0990557 100644 --- a/sistema/models.py +++ b/sistema/models.py @@ -31,9 +31,11 @@ class PointOfInterest(models.Model): nome = models.CharField(max_length=255, null=False) lat = models.FloatField() long = models.FloatField() + anteprima_poi = models.FileField(upload_to='anteprima_poi/', null=True) + url_anteprima_poi = models.URLField(null=True) icona = models.FileField(upload_to='icon/', null=True) url = models.URLField(null=True) - descrizione = models.TextField() + descrizione = models.TextField(max_length=3000) is_danger = models.BooleanField(default=False) is_active = models.BooleanField(default=True) @@ -41,7 +43,7 @@ class PointOfInterest(models.Model): class Percorso(models.Model): nome = models.CharField(max_length=255, null=False) descrizione = models.CharField(max_length=255, null=False) - testo = models.TextField() + testo = models.TextField(max_length=3000) icona = models.FileField(upload_to='icon_percorso/', null=True) url = models.URLField(null=True) prezzo = models.FloatField() @@ -99,8 +101,8 @@ class Multimedia(models.Model): poi = models.ForeignKey(PointOfInterest, on_delete=models.DO_NOTHING, null=True) media = models.FileField(upload_to='poi_media/', null=True) nome = models.CharField(max_length=255, null=False) - descrizione = models.CharField(max_length=255, null=False) - testo = models.TextField(max_length=255, null=False) + descrizione = models.TextField(max_length=512, null=False) + testo = models.TextField(max_length=3000, null=False) qr_code = models.FileField(upload_to='poi_media_qr_code/', null=True) chiave_qr_code = models.CharField(max_length=255, null=True) is_active = models.BooleanField(default=True) @@ -129,7 +131,7 @@ class FeedbackSerializer(serializers.ModelSerializer): class PoiSerializer(serializers.ModelSerializer): class Meta: model = PointOfInterest - fields = ('id', 'nome', 'lat', 'long', 'icona','is_danger', 'url', 'descrizione') + fields = ('id', 'nome', 'lat', 'long', 'anteprima_poi', 'url_anteprima_poi','icona', 'url', 'is_danger', 'descrizione') class MultimediaSerializer(serializers.ModelSerializer): diff --git a/sistema/templates/add_mod_poi.html b/sistema/templates/add_mod_poi.html index 2920493..3d3fd74 100644 --- a/sistema/templates/add_mod_poi.html +++ b/sistema/templates/add_mod_poi.html @@ -38,6 +38,7 @@ + {% endif %} {{ form | crispy }} @@ -114,13 +115,23 @@ $(document).ready(function () { var pk = '{{ form.instance.pk }}'; var icona = '{{ icona }}'; + var anteprima_poi = '{{ anteprima_poi }}'; if (pk != '' && icona != '') $("#div_id_icona").after('

Icona presente: {{ icona }}

'); + if (pk != '' && anteprima_poi != '') + $("#div_id_anteprima_poi").after('

Anteprima POI presente: {{ anteprima_poi }}

'); + + $("#id_icona").change(function () { $("#id_icona_presente").empty(); }); + + $("#id_anteprima_poi").change(function () { + $("#id_anteprima_poi_presente").empty(); + }); + $('#punti_dropdown').addClass('active'); $('#punti_toggle').addClass('toggled'); $('#add_lista').addClass('active'); @@ -155,7 +166,7 @@ headers: {'X-CSRFToken': '{{ csrf_token }}'}, url: '{% url 'sistema:crea_qr_code' %}', success: function(data) { - location.reload(); + // location.reload(); var url = window.location.origin; window.open(url+'/'+data.qr_code, '_blank'); }, diff --git a/sistema/templates/poi_list.html b/sistema/templates/poi_list.html index 6348a6a..8840cf1 100644 --- a/sistema/templates/poi_list.html +++ b/sistema/templates/poi_list.html @@ -25,6 +25,7 @@ # Icona + Anteprima POI Nome Latitudine Longitudine @@ -63,9 +64,10 @@ columnDefs: [ {"targets": 0, "orderable": false, "width": "3%"}, {"targets": 1, "orderable": false, "width": "5%"}, - {"targets": 5, "orderable": false, "width": "5%"}, + {"targets": 2, "orderable": false, "width": "8%"}, {"targets": 6, "orderable": false, "width": "5%"}, {"targets": 7, "orderable": false, "width": "5%"}, + {"targets": 8, "orderable": false, "width": "5%"}, ], "order": [] }); diff --git a/sistema/views.py b/sistema/views.py index a99afd4..5732b1b 100644 --- a/sistema/views.py +++ b/sistema/views.py @@ -234,21 +234,31 @@ class PoiView(View):#PermissionRequiredMixin bisogna controllare il salvataggio dei media nel form multimedia ''' form = PoiForm(request.POST, request.FILES) - files = request.FILES.getlist('icona') + files_icona = request.FILES.getlist('icona') + files_anteprima_poi = request.FILES.getlist('anteprima_poi') is_danger = request.POST.get('is_danger') == 'on' if form.is_valid(): form_save = form.save(commit=False) form_save.is_danger = is_danger - if files: - for f in files: + if files_icona: + for f in files_icona: form_save.icona = f form_save.save() - form_save.url = 'http://atlas.dyrecta.com/' + str(form_save.icona) + form_save.url = 'https://atlas.dyrecta.com/' + str(form_save.icona) else: form_save.icona = os.path.join(MEDIA_ROOT, 'icon/default.png') form_save.save() - form_save.url = 'http://atlas.dyrecta.com/' + str(form_save.icona) + form_save.url = 'https://atlas.dyrecta.com/' + str(form_save.icona) + + if files_anteprima_poi: + for f in files_anteprima_poi: + form_save.anteprima_poi = f + form_save.save() + form_save.url_anteprima_poi = 'https://atlas.dyrecta.com/' + str(form_save.anteprima_poi) + else: + form_save.anteprima_poi = None + form_save.url_anteprima_poi = None form_save.save() messages.add_message(request, messages.INFO, 'Nuova punto di interesse inserito con successo.') @@ -274,8 +284,10 @@ class PoiView(View):#PermissionRequiredMixin def mod_poi(self, request): form = PoiForm(request.POST, instance=PointOfInterest.objects.get(pk=int(self.request.POST.get('pk')))) files = request.FILES.getlist('icona') + files_anteprima_poi = request.FILES.getlist('anteprima_poi') is_danger = request.POST.get('is_danger') == 'on' icona = request.POST.get('link_icona') + anteprima_poi = request.POST.get('link_anteprima_poi') if form.is_valid(): form_save = form.save(commit=False) form_save.is_danger = is_danger @@ -283,11 +295,21 @@ class PoiView(View):#PermissionRequiredMixin for f in files: form_save.icona = f form_save.save() - form_save.url = 'http://atlas.dyrecta.com/' + str(form_save.icona) + form_save.url = 'https://atlas.dyrecta.com/' + str(form_save.icona) else: if not icona: form_save.icona = os.path.join(MEDIA_ROOT, 'icon/default.png') - form_save.url = 'http://atlas.dyrecta.com/' + str(form_save.icona) + form_save.url = 'https://atlas.dyrecta.com/' + str(form_save.icona) + + if files_anteprima_poi: + for f in files_anteprima_poi: + form_save.anteprima_poi = f + form_save.save() + form_save.url_anteprima_poi = 'https://atlas.dyrecta.com/' + str(form_save.anteprima_poi) + else: + if not anteprima_poi: + form_save.anteprima_poi = None + form_save.url_anteprima_poi = None form_save.save() messages.add_message(request, messages.INFO, 'Punto di interesse aggiornata con successo.') @@ -318,12 +340,21 @@ class PoiView(View):#PermissionRequiredMixin poi = PointOfInterest.objects.get(pk=int(self.kwargs['pk'])) form = PoiForm(instance=poi) icona = poi.icona + anteprima_poi = poi.anteprima_poi if icona: if 'media' in str(icona): icona = str(icona).split('media')[1] else: icona = str(icona) - return render(request, 'add_mod_poi.html', {'form': form, 'icona': icona, + + if anteprima_poi: + if 'media' in str(anteprima_poi): + anteprima_poi = str(anteprima_poi).split('media')[1] + else: + anteprima_poi = str(anteprima_poi) + return render(request, 'add_mod_poi.html', {'form': form, + 'icona': icona, + 'anteprima_poi':anteprima_poi, 'form_multimedia': MultimediaForm()}) else: return render(request, 'add_mod_poi.html', {'form': PoiForm(), 'form_multimedia': MultimediaForm()}) @@ -348,7 +379,7 @@ class PercorsoView(View):#PermissionRequiredMixin form_save = form.save(commit=False) if os.path.isfile(os.path.join(os.path.join(MEDIA_ROOT, "icon_percorso/"), str(form_save.icona))): os.remove(os.path.join(os.path.join(MEDIA_ROOT, "icon_percorso/"), str(form_save.icona))) - form_save.url = 'http://atlas.dyrecta.com/media/icon_percorso/' + str(form_save.icona) + form_save.url = 'https://atlas.dyrecta.com/media/icon_percorso/' + str(form_save.icona) form_save.save() return redirect('sistema:percorsi_list') @@ -457,7 +488,7 @@ class QRCodeView(View): try: id = str(self.POST.get('pk')) id_criptato = hashlib.sha256(id.encode()).hexdigest() - base_url = 'http://atlas.dyrecta.com/api/show_qr_code/?id_criptato=' + base_url = 'https://atlas.dyrecta.com/api/show_qr_code/?id_criptato=' url_completo = f"{base_url}{id_criptato}" qr = qrcode.QRCode( version=1, -- 2.43.0