From: Valeria Vitti Date: Tue, 15 Oct 2024 15:18:44 +0000 (+0200) Subject: generazione qrcode X-Git-Url: https://git.atlas4tour.it/?a=commitdiff_plain;h=3f456634a7ab387ce89bafed8cb88ae78aadcf39;p=pia_atlas.git generazione qrcode modifiche poi e percorso su icone e immagini --- 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 d826176..0000000 Binary files a/media/icon/default.png and /dev/null differ diff --git a/requirements.txt b/requirements.txt index a298f85..a28aaac 100644 Binary files a/requirements.txt and b/requirements.txt differ 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 %} -