From 3f456634a7ab387ce89bafed8cb88ae78aadcf39 Mon Sep 17 00:00:00 2001 From: Valeria Vitti Date: Tue, 15 Oct 2024 17:18:44 +0200 Subject: [PATCH] generazione qrcode modifiche poi e percorso su icone e immagini --- api/urls.py | 6 +- api/views.py | 28 ++++++- media/icon/default.png | Bin 14842 -> 0 bytes requirements.txt | Bin 614 -> 303 bytes sistema/datatables.py | 19 +++-- sistema/forms.py | 25 +++++- sistema/models.py | 14 +++- sistema/templates/add_mod_percorso.html | 2 +- sistema/templates/add_mod_poi.html | 23 +++++- sistema/templates/base.html | 2 +- .../templates/modal_add_icona_percorso.html | 26 ++++++ sistema/templates/percorsi_cliente_home.html | 6 +- sistema/templates/percorsi_list.html | 12 ++- sistema/urls.py | 6 +- sistema/views.py | 76 ++++++++++++++++-- 15 files changed, 216 insertions(+), 29 deletions(-) delete mode 100644 media/icon/default.png create mode 100644 sistema/templates/modal_add_icona_percorso.html diff --git a/api/urls.py b/api/urls.py index 28a75d7..09f4b95 100644 --- a/api/urls.py +++ b/api/urls.py @@ -2,7 +2,8 @@ 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 +from api.views import Login_v2, RegistrationAPI, ListaPercorsiAPI, DetailPercorsoAPI, DetailPoiAPI, SendFeedbackAPI, \ + ShowQRCode urlpatterns = [ path('api-login/', Login_v2.as_view(), name='api_login'), @@ -12,4 +13,7 @@ urlpatterns = [ path('detail_poi/', DetailPoiAPI.as_view(), name='detail_poi'), path('send_feedback/', SendFeedbackAPI.as_view(), name='send_feedback'), + + path('show_qr_code/', ShowQRCode.as_view(), name='show_qr_code'), + ] diff --git a/api/views.py b/api/views.py index 4fdf28c..03bc0e2 100644 --- a/api/views.py +++ b/api/views.py @@ -1,7 +1,9 @@ +import os.path + from django.contrib.auth.models import User from django.http import JsonResponse from django.shortcuts import render -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from rest_framework import status from django.contrib.auth import authenticate from rest_framework import serializers @@ -189,7 +191,6 @@ class DetailPoiAPI(APIView): if filter: poi_serialize = PoiSerializer(filter, many=True) - multimedia = Multimedia.objects.filter(poi=filter.first(), is_active=True) multimedia_list = MultimediaSerializer(multimedia, many=True) @@ -245,3 +246,26 @@ class SendFeedbackAPI(APIView): else: return Response( {'errors': 'Assicurati che le informazioni relative all\'utente, percorso e valutazione siano state inviate', 'error': True, 'data': '', 'messages': ['KO']}) + + +class ShowQRCode(APIView): + def get(self, request): + id = request.query_params['id_criptato'] + + errors = [] + error = False + data = [] + if id: + multimedia = Multimedia.objects.get(chiave_qr_code=str(id)) + multimedia_list = MultimediaSerializer(multimedia) + + data.append({ + 'multimedia': multimedia_list.data, + }) + + return Response({'errors': errors, 'error': error, 'data': data, 'messages': ['OK']}) + + else: + return Response({'errors': 'Multimedia non presente', 'error': True, 'data': '', 'messages': ['']}) + + diff --git a/media/icon/default.png b/media/icon/default.png deleted file mode 100644 index d826176b11dce60c07d944f25831338f94480ee0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14842 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 M4TD={H>|_|KXK)REdT%j diff --git a/requirements.txt b/requirements.txt index a298f856ef1a1988da37ecaf7eb35003be3902c1..a28aaac79f8690a265596f0bfaa13fb49381f994 100644 GIT binary patch literal 303 zcmY*UJrBYl5Z(DNTv}`s9oU?l984Sy)@ws;DRRV$zuv=WqhaCQ`?z<8IvcRndIf7J z#kM!Do3yT>WOR8WX?pXJ7ZdrN2h_TP8j3G@4yHlUn)N@^CRp-Gwo@3HQ?UBVml%?F zi*xp=Vo3`~u?=R#c?#Fui8Iy5`o~GKqaU!JWA4g2F($eV&0x{-NP&V%?9=Xe$Y8?@ re2P#07pme!mUrVKH=*UivJ6BM0iipqLcrm^Jli6W! literal 614 zcmZ`%O;3YR5S+6~e+mSsJ$m!x$wL#51}GS+P|71M`r~b9_Cce8rrDIR^R>HNep5Jn zphAZNC7$?OBgBT4V1)-fV~-RKF^5|>VK*j5{oS8_K%~$E0=`etkCowz>e7BB)7PAv zF++-+NN3o1bO{kHIORlFM7H>*Tgh}C>VHi6EHUTF92HJfD{#I!C*&^iwI|2PN=sWC zN8X>t)b3)NaPEAc8Bnoe`quWeXNum`{1v7YH79jA5|gu(wi$8$9uw}BxEH)(YZ~fF z$LG^K}ug-|`L}pZ(3W2kmlgSLmtG(p_J~I}ro*ltdF8?0>qmcHv#G DLg`?` diff --git a/sistema/datatables.py b/sistema/datatables.py index a484b86..3716636 100644 --- a/sistema/datatables.py +++ b/sistema/datatables.py @@ -42,8 +42,8 @@ class LocalitaDatatables(BaseDatatableView): class MultimediaDatatables(BaseDatatableView): model = Multimedia - columns = ['id', 'tipologia', 'nome', 'descrizione', 'media', 'del'] - order_columns = ['id', 'tipologia', 'nome', 'descrizione', 'media', 'del'] + columns = ['id', 'tipologia', 'nome', 'descrizione', 'media', 'qr_code', 'del'] + order_columns = ['id', 'tipologia', 'nome', 'descrizione', 'media', 'qr_code', 'del'] def get_initial_queryset(self): poi = self.request.GET.get('pk') @@ -62,6 +62,11 @@ class MultimediaDatatables(BaseDatatableView): return escape('{0}'.format(row.descrizione)) if column == 'media': return f' visualizza ' + if column == 'qr_code': + if row.qr_code: + return f'' + else: + return '' % row.pk if column == 'del': return '' % row.pk else: @@ -104,8 +109,8 @@ class TipoMultimediaDatatables(BaseDatatableView): class PercorsoDatatables(BaseDatatableView): model = Percorso - columns = ['id', 'nome', 'descrizione', 'testo', 'mod', 'del'] - order_columns = ['id', 'nome', 'descrizione', 'testo', 'mod', 'del'] + columns = ['id', 'icona', 'nome', 'descrizione', 'testo', 'add', 'mod', 'del'] + order_columns = ['id', 'icona', 'nome', 'descrizione', 'testo', 'add','mod', 'del'] def get_initial_queryset(self): return self.model.objects.filter(is_active=True) @@ -113,6 +118,8 @@ class PercorsoDatatables(BaseDatatableView): def render_column(self, row, column): if column == 'id': return escape('{0}'.format(row.pk)) + if column == 'icona': + return f'' if column == 'nome': return escape('{0}'.format(row.nome)) if column == 'descrizione': @@ -122,7 +129,9 @@ class PercorsoDatatables(BaseDatatableView): if column == 'mod': return '' % row.pk if column == 'del': - return '' % row.pk + return '' % row.pk else: return super(PercorsoDatatables, self).render_column(row, column) diff --git a/sistema/forms.py b/sistema/forms.py index 73f369b..4fd8433 100644 --- a/sistema/forms.py +++ b/sistema/forms.py @@ -58,14 +58,17 @@ class PoiForm(forms.ModelForm): class Meta: model = PointOfInterest - exclude = ('is_active',) + exclude = ('is_active','url') def __init__(self, *args, **kwargs): super(PoiForm, self).__init__(*args, **kwargs) self.fields['icona'].required = False + self.fields['descrizione'].required = False for f in self.fields: - if self.fields[f].widget.input_type != 'checkbox': + 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'}) @@ -80,12 +83,26 @@ class PoiForm(forms.ModelForm): class PercorsoForm(forms.ModelForm): + # icona = forms.FileField(label='Icona', widget=forms.FileInput( + # attrs={'class': 'form-control', 'form': 'percorso_form'}), ) class Meta: model = Percorso - exclude = ('is_active',) + exclude = ('is_active','url','icona') 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): + class Meta: + model = Percorso + exclude = ('testo','nome','descrizione','prezzo','is_active','url',) + + def __init__(self, *args, **kwargs): + super(IconaPercorsoForm, self).__init__(*args, **kwargs) for f in self.fields: self.fields[f].widget.attrs.update({'class': 'form-control'}) @@ -125,7 +142,7 @@ class MultimediaForm(forms.ModelForm): class Meta: model = Multimedia - exclude = ('poi', 'is_active',) + exclude = ('poi', 'is_active', 'chiave_qr_code', 'qr_code') def __init__(self, *args, **kwargs): super(MultimediaForm, self).__init__(*args, **kwargs) diff --git a/sistema/models.py b/sistema/models.py index d4cee6b..e2e4e63 100644 --- a/sistema/models.py +++ b/sistema/models.py @@ -32,6 +32,8 @@ class PointOfInterest(models.Model): lat = models.FloatField() long = models.FloatField() icona = models.FileField(upload_to='icon/', null=True) + url = models.URLField(null=True) + descrizione = models.TextField() is_danger = models.BooleanField(default=False) is_active = models.BooleanField(default=True) @@ -39,7 +41,9 @@ 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(max_length=255, null=False) + testo = models.TextField() + icona = models.FileField(upload_to='icon_percorso/', null=True) + url = models.URLField(null=True) prezzo = models.FloatField() is_active = models.BooleanField(default=True) @@ -91,6 +95,8 @@ class Multimedia(models.Model): nome = models.CharField(max_length=255, null=False) descrizione = models.CharField(max_length=255, null=False) testo = models.TextField(max_length=255, 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) @@ -105,7 +111,7 @@ class Feedback(models.Model): class PercorsoSerializer(serializers.ModelSerializer): class Meta: model = Percorso - fields = ('id', 'nome', 'descrizione', 'testo') + fields = ('id', 'nome', 'descrizione', 'testo', 'icona', 'url') class FeedbackSerializer(serializers.ModelSerializer): @@ -117,7 +123,7 @@ class FeedbackSerializer(serializers.ModelSerializer): class PoiSerializer(serializers.ModelSerializer): class Meta: model = PointOfInterest - fields = ('id', 'nome', 'lat', 'long', 'icona','is_danger') + fields = ('id', 'nome', 'lat', 'long', 'icona','is_danger', 'url', 'descrizione') class MultimediaSerializer(serializers.ModelSerializer): @@ -127,4 +133,4 @@ class MultimediaSerializer(serializers.ModelSerializer): ) class Meta: model = Multimedia - fields = ('id', 'nome', 'tipologia', 'media', 'nome', 'descrizione', 'testo') \ No newline at end of file + fields = ('id', 'nome', 'tipologia', 'media', 'nome', 'descrizione', 'testo', 'qr_code') \ No newline at end of file diff --git a/sistema/templates/add_mod_percorso.html b/sistema/templates/add_mod_percorso.html index bbfef72..89f0aff 100644 --- a/sistema/templates/add_mod_percorso.html +++ b/sistema/templates/add_mod_percorso.html @@ -451,4 +451,4 @@ -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/sistema/templates/add_mod_poi.html b/sistema/templates/add_mod_poi.html index 75d9919..2920493 100644 --- a/sistema/templates/add_mod_poi.html +++ b/sistema/templates/add_mod_poi.html @@ -69,6 +69,7 @@ Nome Descrizione Media + QRcode @@ -137,13 +138,33 @@ url: "//cdn.datatables.net/plug-ins/1.10.20/i18n/Italian.json" }, columnDefs: [ - {"targets": 5, "orderable": false, "width": "5%"}, + {"targets": 5, "orderable": false, "width": "8%"}, + {"targets": 6, "orderable": false, "width": "5%"}, ], "order": [] }); {% endif %} }); + function crea_qr_code(pk) { + $.ajax({ + type: "POST", + data: { + 'pk': pk, + }, + headers: {'X-CSRFToken': '{{ csrf_token }}'}, + url: '{% url 'sistema:crea_qr_code' %}', + success: function(data) { + location.reload(); + var url = window.location.origin; + window.open(url+'/'+data.qr_code, '_blank'); + }, + error: function(data) { + Swal.fire("Attenzione!", data.response , "error") + }, + }); + } + function DeleteMultimedia(pk) { Swal.fire({ title: "Sei sicuro?", diff --git a/sistema/templates/base.html b/sistema/templates/base.html index 95650d9..fce0852 100644 --- a/sistema/templates/base.html +++ b/sistema/templates/base.html @@ -192,7 +192,6 @@ {% endblock %} -