From 86f23fb7d74a641320779ba6531d23099536d6b7 Mon Sep 17 00:00:00 2001 From: Costantino Vitale Date: Wed, 5 Oct 2022 12:43:00 +0200 Subject: [PATCH] - Implementazione API --- api/urls.py | 3 +- api/views.py | 27 +++++++++++---- sistema/models.py | 19 +++++++---- sistema/templates/add_mod_percorso.html | 44 ++++++++++++++++++++++--- sistema/views.py | 7 ++-- socoin_atlas/urls.py | 1 + utenti/mixins.py | 13 ++------ 7 files changed, 84 insertions(+), 30 deletions(-) diff --git a/api/urls.py b/api/urls.py index fca688d..d566f96 100644 --- a/api/urls.py +++ b/api/urls.py @@ -2,9 +2,10 @@ 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 +from api.views import Login_v2, RegistrationAPI, ListaPercorsiAPI 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'), ] diff --git a/api/views.py b/api/views.py index a07eb90..03dc0ee 100644 --- a/api/views.py +++ b/api/views.py @@ -4,6 +4,7 @@ from django.utils.translation import ugettext as _ from rest_framework import status from django.contrib.auth import authenticate from rest_framework import serializers +from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView from rest_framework_simplejwt.serializers import PasswordField @@ -11,9 +12,13 @@ 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 + class TokenObtainLoginSerializer(serializers.Serializer): - login = 'login' + login = 'username' default_error_messages = { 'no_active_account': _('Credenziali errate') @@ -69,15 +74,11 @@ class TokenObtainPairLoginSerializer(TokenObtainLoginSerializer): refresh = self.get_token(self.user) data['refresh'] = str(refresh) - #data['access'] = str(refresh.access_token) data['token'] = str(refresh.access_token) - data['change_password'] = self.user.change_password if self.user.last_login: data['last_login'] = self.user.last_login.strftime('%Y-%M-%d %H:%M:%S') else: data['last_login'] = None - data['gender'] = self.user.gender - data['birth_date'] = self.user.birth_date data['pk'] = self.user.pk return data @@ -121,4 +122,18 @@ class RegistrationAPI(APIView): # # role = Role.objects.filter(name='Paziente').first() - return Response({'errors': '', 'error': False, 'data': '', 'messages': ['OK']}, status=status.HTTP_200_OK) \ No newline at end of file + return Response({'errors': '', 'error': False, 'data': '', 'messages': ['OK']}, status=status.HTTP_200_OK) + + +class ListaPercorsiAPI(APIView): + def get(self, request): + errors = [] + error = False + + filter = Percorso.objects.filter(is_active=True) + percorsi_serialize = PercorsoSerializer(filter, many=True) + + 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 diff --git a/sistema/models.py b/sistema/models.py index 3c0bb0a..2d8ff1c 100644 --- a/sistema/models.py +++ b/sistema/models.py @@ -1,7 +1,7 @@ from django.db import models from django.contrib.auth.models import User from django.utils import timezone - +from rest_framework import serializers class Localita(models.Model): descrizione = models.CharField(max_length=255, null=False) @@ -13,6 +13,7 @@ class Localita(models.Model): def __str__(self): return self.descrizione + ', ' + self.provincia + ' (' + self.regione + ')' + class Gestisce(models.Model): utente = models.ForeignKey(User, on_delete=models.DO_NOTHING) localita = models.ForeignKey(Localita, on_delete=models.DO_NOTHING) @@ -21,6 +22,13 @@ class Gestisce(models.Model): is_active = models.BooleanField(default=True) +class PointOfInterest(models.Model): + nome = models.CharField(max_length=255, null=False) + lat = models.FloatField() + long = models.FloatField() + is_active = models.BooleanField(default=True) + + class Percorso(models.Model): nome = models.CharField(max_length=255, null=False) descrizione = models.CharField(max_length=255, null=False) @@ -28,11 +36,10 @@ class Percorso(models.Model): is_active = models.BooleanField(default=True) -class PointOfInterest(models.Model): - nome = models.CharField(max_length=255, null=False) - lat = models.FloatField() - long = models.FloatField() - is_active = models.BooleanField(default=True) +class PercorsoSerializer(serializers.ModelSerializer): + class Meta: + model = Percorso + fields = ('id', 'nome', 'descrizione', 'testo') class Tappa(models.Model): diff --git a/sistema/templates/add_mod_percorso.html b/sistema/templates/add_mod_percorso.html index e2436c4..ac79df8 100644 --- a/sistema/templates/add_mod_percorso.html +++ b/sistema/templates/add_mod_percorso.html @@ -52,7 +52,7 @@

- + @@ -73,8 +73,29 @@ var list_tappe = []; var selected_items = [] + $(document).ready(function () { updateSelect(); + + {% if associated_tappe %} + list_tappe = {{ associated_tappe|safe }} + selected_items = {{ associated_tappe|safe }} + + $('#select-start').val(selected_items[0]); + $('#select-end').val(selected_items[selected_items.length - 1]); + + tappe = [] + for(var i=1; i { + return Number(str); + }); + selected_items_list = list_tappe.filter(value => selected_items.includes(value)); $.ajax({ @@ -198,6 +224,16 @@ method = '' pk_percorso_form = '' + + selected_list = [] + selected_list.push($("#select-start").val()) + + tappe_intermedie = $("#select-tappe").val() + for(k in tappe_intermedie){ + selected_list.push(tappe_intermedie[k]) + } + selected_list.push($("#select-end").val()) + {% if form.instance.pk %} method = 'mod' pk_percorso_form = {{ form.instance.pk }} @@ -207,7 +243,7 @@ data: { 'percorso_form': JSON.stringify(percorso_form), 'pk_percorso_form': pk_percorso_form, - 'tappe': list_tappe.filter(value => selected_items.includes(value)), + 'tappe': selected_list, 'method': method, }, type: "POST", diff --git a/sistema/views.py b/sistema/views.py index 9103908..ff75181 100644 --- a/sistema/views.py +++ b/sistema/views.py @@ -241,7 +241,8 @@ class PercorsoView(View): 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'), - 'form': PercorsoForm(instance=Percorso.objects.get(pk=int(self.kwargs['pk'])))}) + 'form': PercorsoForm(instance=Percorso.objects.get(pk=int(self.kwargs['pk']))), + 'associated_tappe': list(Tappa.objects.filter(percorso_id=int(self.kwargs['pk'])).values_list('poi_id', flat=True)),}) else: return render(request, 'add_mod_percorso.html', {'poi_list': PointOfInterest.objects.filter(is_active=True).values('id', 'nome'), 'form': PercorsoForm()}) @@ -250,4 +251,6 @@ class PercorsoView(View): if 'mod' in request.POST: print('modifica') else: - print('inserimento') \ No newline at end of file + self.add_percorso(request) + + return redirect(reverse('sistema:percorsi_list')) diff --git a/socoin_atlas/urls.py b/socoin_atlas/urls.py index 67ece39..87fdf7d 100644 --- a/socoin_atlas/urls.py +++ b/socoin_atlas/urls.py @@ -22,4 +22,5 @@ urlpatterns = [ path('admin/', admin.site.urls), path('', include(('sistema.urls', 'sistema'), namespace='sistema')), path('utenti/', include(('utenti.urls', 'utenti'), namespace='utenti')), + path('api/', include(('api.urls', 'api'), namespace='api')), ] diff --git a/utenti/mixins.py b/utenti/mixins.py index 5da9fce..79934ad 100644 --- a/utenti/mixins.py +++ b/utenti/mixins.py @@ -38,17 +38,8 @@ class AuthorizationRequiredMixin(object): authorization_required = None def dispatch(self, request, *args, **kwargs): + print(request) if request.user.is_authenticated: - if request.session.get('structure'): - user_authorization = request.user.get_all_authorizations_by_structure_flat( - request.session['structure']) - if len(set(user_authorization).intersection(self.authorization_required)) <= 0: - raise PermissionDenied - return super(AuthorizationRequiredMixin, self).dispatch(request, *args, **kwargs) - else: - user_authorization = request.user.get_all_authorizations_flat() - if len(set(user_authorization).intersection(self.authorization_required)) <= 0: - raise PermissionDenied - return super(AuthorizationRequiredMixin, self).dispatch(request, *args, **kwargs) + return super(AuthorizationRequiredMixin, self).dispatch(request, *args, **kwargs) else: raise PermissionDenied \ No newline at end of file -- 2.43.0