From: Costantino Vitale Date: Thu, 13 Oct 2022 15:41:57 +0000 (+0200) Subject: - Serializer X-Git-Url: https://git.atlas4tour.it/?a=commitdiff_plain;h=60b289f63a17d8d01f006f8f943fb6918f5acfd1;p=pia_atlas.git - Serializer - Implementazione API --- diff --git a/api/urls.py b/api/urls.py index d566f96..28a75d7 100644 --- a/api/urls.py +++ b/api/urls.py @@ -2,10 +2,14 @@ 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 +from api.views import Login_v2, RegistrationAPI, ListaPercorsiAPI, DetailPercorsoAPI, DetailPoiAPI, SendFeedbackAPI urlpatterns = [ path('api-login/', Login_v2.as_view(), name='api_login'), path('api-registration/', RegistrationAPI.as_view(), name='api_registration'), path('lista_percorsi/', ListaPercorsiAPI.as_view(), name='lista_percorsi'), + path('detail_percorso/', DetailPercorsoAPI.as_view(), name='detail_percorso'), + path('detail_poi/', DetailPoiAPI.as_view(), name='detail_poi'), + + path('send_feedback/', SendFeedbackAPI.as_view(), name='send_feedback'), ] diff --git a/api/views.py b/api/views.py index 03dc0ee..8bc2904 100644 --- a/api/views.py +++ b/api/views.py @@ -1,3 +1,4 @@ +from django.contrib.auth.models import User from django.http import JsonResponse from django.shortcuts import render from django.utils.translation import ugettext as _ @@ -12,9 +13,8 @@ from rest_framework_simplejwt.tokens import RefreshToken from rest_framework_simplejwt.views import TokenViewBase from rest_framework_simplejwt.exceptions import AuthenticationFailed -from sistema.models import Percorso, PercorsoSerializer -from socoin_atlas import settings -from utenti.mixins import AuthorizationRequiredMixin +from sistema.models import Percorso, PercorsoSerializer, Tappa, TappaSerializer, Feedback, FeedbackSerializer, \ + PointOfInterest, PoiSerializer, Multimedia, MultimediaSerializer class TokenObtainLoginSerializer(serializers.Serializer): @@ -136,4 +136,111 @@ class ListaPercorsiAPI(APIView): if error: return Response({'errors': errors, 'error': error, 'data': '', 'messages': ['KO']}) else: - return Response({'errors': errors, 'error': error, 'data': percorsi_serialize.data, 'messages': ['OK']}) \ No newline at end of file + return Response({'errors': errors, 'error': error, 'data': percorsi_serialize.data, 'messages': ['OK']}) + + +class DetailPercorsoAPI(APIView): + def get(self, request): + errors = [] + error = False + data = [] + + id_percorso = request.data['id_percorso'] + + if id_percorso: + + filter = Percorso.objects.filter(id=int(id_percorso), is_active=True) + + if filter: + percorsi_serialize = PercorsoSerializer(filter, many=True) + + 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) + + data.append({ + 'percorso': percorsi_serialize.data, + 'tappe': tappe_list.data, + 'feedback': feedback_list.data + }) + + return Response({'errors': errors, 'error': error, 'data': data, 'messages': ['OK']}) + else: + return Response({'errors': 'Percorso non presente', 'error': True, 'data': '', 'messages': ['']}) + + else: + return Response({'errors': 'ID percorso non inviato', 'error': True, 'data': '', 'messages': ['']}) + + +class DetailPoiAPI(APIView): + def get(self, request): + errors = [] + error = False + data = [] + + id_poi = request.data['id_poi'] + + if id_poi: + + filter = PointOfInterest.objects.filter(id=int(id_poi), is_active=True) + + if filter: + poi_serialize = PoiSerializer(filter, many=True) + + multimedia = Multimedia.objects.filter(poi=filter.first(), is_active=True) + multimedia_list = MultimediaSerializer(multimedia, many=True) + + data.append({ + 'poi': poi_serialize.data, + 'multimedia': multimedia_list.data, + }) + + return Response({'errors': errors, 'error': error, 'data': data, 'messages': ['OK']}) + else: + return Response({'errors': 'Punto di interesse non presente', 'error': True, 'data': '', 'messages': ['']}) + + else: + return Response({'errors': 'ID punto di interesse non inviato', 'error': True, 'data': '', 'messages': ['']}) + + +class SendFeedbackAPI(APIView): + def post(self, request): + errors = [] + error = False + data = [] + + id_utente = request.data['pk_utente'] + id_percorso = request.data['percorso'] + valutazione = request.data['valutazione'] + commento = request.data['commento'] + + if id_utente and id_percorso and valutazione: + + utente = User.objects.get(pk=int(id_utente)) + if utente: + + percorso = Percorso.objects.get(pk=int(id_percorso)) + if percorso: + + try: + Feedback.objects.create( + utente=utente, + percorso=percorso, + valutazione=int(valutazione), + commento=commento + ) + return Response({'errors': errors, 'error': error, 'data': data, 'messages': ['OK']}) + + except Exception as e: + return Response( + {'errors': str(e), 'error': True, 'data': '', 'messages': ['']}) + else: + return Response( + {'errors': 'Percorso non trovato a sistema', 'error': True, 'data': '', 'messages': ['KO']}) + else: + return Response({'errors': 'Utente non trovato a sistema', 'error': True, 'data': '', 'messages': ['KO']}) + else: + return Response( + {'errors': 'Assicurati che le informazioni relative all\'utente, percorso e valutazione siano state inviate', 'error': True, 'data': '', 'messages': ['KO']}) diff --git a/sistema/datatables.py b/sistema/datatables.py index 7c56e7f..db18796 100644 --- a/sistema/datatables.py +++ b/sistema/datatables.py @@ -151,7 +151,7 @@ class PoiDatatables(BaseDatatableView): if column == 'mod': return '' % row.pk if column == 'del': - return '' % row.pk + return '' % row.pk else: return super(PoiDatatables, self).render_column(row, column) @@ -164,8 +164,8 @@ class PoiDatatables(BaseDatatableView): class FeedbackDatatables(BaseDatatableView): model = Feedback - columns = ['id', 'utente', 'valutazione', 'commento', 'mod', 'del'] - order_columns = ['id', 'utente', 'valutazione', 'commento', 'mod', 'del'] + columns = ['id', 'utente', 'valutazione', 'commento', 'del'] + order_columns = ['id', 'utente', 'valutazione', 'commento', 'del'] def get_initial_queryset(self): return self.model.objects.filter(is_active=True) @@ -176,13 +176,14 @@ class FeedbackDatatables(BaseDatatableView): if column == 'utente': return escape('{0}'.format(row.utente.username)) if column == 'valutazione': - return escape('{0}'.format(row.valutazione)) + value = '' + for i in range(0, int(row.valutazione)): + value += '' + return f'{value}' if column == 'commento': return escape('{0}'.format(row.commento)) - if column == 'mod': - return '' #% row.pk if column == 'del': - return '' #% row.pk + return '' % row.pk else: return super(FeedbackDatatables, self).render_column(row, column) diff --git a/sistema/models.py b/sistema/models.py index fe5d3ca..e083044 100644 --- a/sistema/models.py +++ b/sistema/models.py @@ -39,12 +39,6 @@ class Percorso(models.Model): is_active = models.BooleanField(default=True) -class PercorsoSerializer(serializers.ModelSerializer): - class Meta: - model = Percorso - fields = ('id', 'nome', 'descrizione', 'testo') - - class Tappa(models.Model): percorso = models.ForeignKey(Percorso, on_delete=models.DO_NOTHING) poi = models.ForeignKey(PointOfInterest, on_delete=models.DO_NOTHING) @@ -106,3 +100,27 @@ class Feedback(models.Model): valutazione = models.IntegerField() commento = models.TextField(max_length=255, null=True, blank=True) is_active = models.BooleanField(default=True) + + +class PercorsoSerializer(serializers.ModelSerializer): + class Meta: + model = Percorso + fields = ('id', 'nome', 'descrizione', 'testo') + + +class FeedbackSerializer(serializers.ModelSerializer): + class Meta: + model = Feedback + fields = ('id', 'utente', 'percorso', 'valutazione', 'commento') + + +class PoiSerializer(serializers.ModelSerializer): + class Meta: + model = PointOfInterest + fields = ('id', 'nome', 'lat', 'long', ) + + +class MultimediaSerializer(serializers.ModelSerializer): + class Meta: + model = Multimedia + fields = ('id', 'nome', 'tipologia__nome', 'media', 'nome', 'descrizione', 'testo') \ No newline at end of file diff --git a/sistema/templates/add_mod_percorso.html b/sistema/templates/add_mod_percorso.html index b17fe89..934a19d 100644 --- a/sistema/templates/add_mod_percorso.html +++ b/sistema/templates/add_mod_percorso.html @@ -67,20 +67,64 @@ - + +
+
+

Feedback degli utenti

+
+
+
+
+ + + + + + + + + + + + + +
+
+