From: Vincenzo Carbonara Date: Tue, 8 Oct 2024 13:05:53 +0000 (+0200) Subject: - Implementato pagamento PayPal con storage transazione nel DB X-Git-Url: https://git.atlas4tour.it/?a=commitdiff_plain;h=df6972910d5a9bc7aed00fc956c784e67ecec7e9;p=pia_atlas.git - Implementato pagamento PayPal con storage transazione nel DB - Creata Sezione I Tuoi Percorsi - Implementato filtro nome e descrizione per sezioni Percorsi. --- diff --git a/.idea/socoin_atlas.iml b/.idea/socoin_atlas.iml index 0220ca7..740ea54 100644 --- a/.idea/socoin_atlas.iml +++ b/.idea/socoin_atlas.iml @@ -16,7 +16,7 @@ - + diff --git a/pagamenti/templates/pagamenti_checkout.html b/pagamenti/templates/pagamenti_checkout.html new file mode 100644 index 0000000..bac5968 --- /dev/null +++ b/pagamenti/templates/pagamenti_checkout.html @@ -0,0 +1,11 @@ +{% extends 'base.html' %} +{% block content %} +
+

Checkout per {{ percorso.nome }}

+

Prezzo: {{ percorso.prezzo|floatformat:2 }} €

+
+ {% csrf_token %} + +
+
+{% endblock %} \ No newline at end of file diff --git a/pagamenti/templates/payment_success.html b/pagamenti/templates/payment_success.html new file mode 100644 index 0000000..1a20014 --- /dev/null +++ b/pagamenti/templates/payment_success.html @@ -0,0 +1,7 @@ +{% extends 'base.html' %} +{% block content %} +
+

Pagamento riuscito!

+

Grazie per il tuo acquisto.

+
+{% endblock %} \ No newline at end of file diff --git a/pagamenti/urls.py b/pagamenti/urls.py new file mode 100644 index 0000000..416ec6f --- /dev/null +++ b/pagamenti/urls.py @@ -0,0 +1,10 @@ +from django.urls import path +from .views import CheckoutView, PaymentSuccessView, PaymentCancelView + +app_name = 'pagamenti' + +urlpatterns = [ + path('checkout//', CheckoutView.as_view(), name='checkout'), # Checkout page + path('success/', PaymentSuccessView.as_view(), name='payment_success'), # Payment success + path('cancel/', PaymentCancelView.as_view(), name='payment_cancel'), # Payment canceled +] diff --git a/sistema/models.py b/sistema/models.py index d4cee6b..9263d87 100644 --- a/sistema/models.py +++ b/sistema/models.py @@ -44,6 +44,12 @@ class Percorso(models.Model): is_active = models.BooleanField(default=True) +class Pagamenti(models.Model): + user = models.ForeignKey(User, on_delete=models.CASCADE) + percorso = models.ForeignKey(Percorso, on_delete=models.CASCADE) + data_acquisto = models.DateTimeField(auto_now_add=True) + + class Tappa(models.Model): percorso = models.ForeignKey(Percorso, on_delete=models.DO_NOTHING) poi = models.ForeignKey(PointOfInterest, on_delete=models.DO_NOTHING) diff --git a/sistema/templates/base.html b/sistema/templates/base.html index 95650d9..05c8639 100644 --- a/sistema/templates/base.html +++ b/sistema/templates/base.html @@ -182,6 +182,12 @@ Percorsi + + + diff --git a/sistema/templates/percorsi_cliente_home.html b/sistema/templates/percorsi_cliente_home.html index ca950e0..b5e6323 100644 --- a/sistema/templates/percorsi_cliente_home.html +++ b/sistema/templates/percorsi_cliente_home.html @@ -5,14 +5,36 @@

Dettaglio percorso

+ + +
+ +
+

I tuoi percorsi

-
- +
@@ -22,22 +44,24 @@

Percorsi che puoi acquistare

-
+
{% for percorso in list_percorsi %} -
+
-
{{ percorso.nome}}
-

{{ percorso.descrizione }}

+
{{ percorso.nome}}
+

{{ percorso.descrizione }}

- + Dettaglio percorso
+ {% empty %} +

Non ci sono percorsi disponibili per l'acquisto.

{% endfor %}
@@ -46,4 +70,66 @@
+ + + + + + + {% endblock %} \ No newline at end of file diff --git a/sistema/templates/tuoi_percorsi_cliente.html b/sistema/templates/tuoi_percorsi_cliente.html new file mode 100644 index 0000000..680eb72 --- /dev/null +++ b/sistema/templates/tuoi_percorsi_cliente.html @@ -0,0 +1,101 @@ +{% extends 'base.html' %} +{% load static %} +{% block content %} + +
+
+

Dettaglio percorsi acquistati

+ +
+ +
+ +
+
+

I tuoi percorsi

+
+ +
+
+ {% for percorso in list_percorsi_pagati %} +
+ +
+
{{ percorso.nome}}
+

{{ percorso.descrizione }}

+
+ + Dettaglio percorso +
+ {% endfor %} +
+
+
+ +
+
+ + + + + +{% endblock %} \ No newline at end of file diff --git a/sistema/urls.py b/sistema/urls.py index fd37ad9..0916665 100644 --- a/sistema/urls.py +++ b/sistema/urls.py @@ -3,7 +3,7 @@ from django.urls import path from sistema.datatables import LocalitaDatatables, MultimediaDatatables, TipoMultimediaDatatables, PercorsoDatatables, \ PoiDatatables, FeedbackDatatables, GestisceLocalitaDatatables from sistema.views import Home, LocalitaListView, MultimediaListView, PuntiInteresseListView, \ - TipologiaMultimediaListView, PercorsiListView, LocalitaView, TipoMultimediaView, PoiView, PercorsoView, FeedbackView, PercorsoInfo + TipologiaMultimediaListView, PercorsiListView, TuoiPercorsiListView, LocalitaView, TipoMultimediaView, PoiView, PercorsoView, FeedbackView, PercorsoInfo urlpatterns = [ path('', Home.as_view(), name='home'), @@ -14,6 +14,7 @@ urlpatterns = [ path('poi_list/', PuntiInteresseListView.as_view(), name='poi_list'), path('tipo_multimedia_list/', TipologiaMultimediaListView.as_view(), name='tipo_multimedia_list'), path('percorsi_list/', PercorsiListView.as_view(), name='percorsi_list'), + path('tuoi_percorsi_list/', TuoiPercorsiListView.as_view(), name='tuoi_percorsi_list'), ## DATATABLES ## path('localita_datatables/', LocalitaDatatables.as_view(), name='localita_datatables'), diff --git a/sistema/views.py b/sistema/views.py index 06d9af3..eac7951 100644 --- a/sistema/views.py +++ b/sistema/views.py @@ -9,8 +9,9 @@ from django.views import View from django.views.generic import TemplateView from rest_framework import status +from pagamenti.views import CheckoutView, GetPayPalToken from sistema.forms import LocalitaForm, TipoMultimediaForm, PoiForm, PercorsoForm, MultimediaForm -from sistema.models import Localita, TipologiaMultimedia, PointOfInterest, Percorso, Tappa, TappaSerializer, Multimedia, \ +from sistema.models import Localita, TipologiaMultimedia, Pagamenti, PointOfInterest, Percorso, Tappa, TappaSerializer, Multimedia, \ Feedback, FeedbackSerializer from socoin_atlas import settings from socoin_atlas.settings import MEDIA_ROOT @@ -46,10 +47,34 @@ class MultimediaListView(TemplateView):#PermissionRequiredMixin class PercorsiListView(View): def get(self, request): if request.session['roles'] == settings.CLIENTI_GROUPS: - list_percorsi = Percorso.objects.filter(is_active=True) - return render(request, 'percorsi_cliente_home.html', {'list_percorsi': list_percorsi}) + # Ottieni gli ID dei percorsi già pagati + percorsi_pagati_id = Pagamenti.objects.filter(user=request.user).values_list('percorso_id', flat=True) + + # Ottieni i percorsi pagati + list_pagati = Percorso.objects.filter(id__in=percorsi_pagati_id) + + # Ottieni i percorsi disponibili (non pagati) + list_percorsi = Percorso.objects.exclude(id__in=percorsi_pagati_id) + + return render(request, 'percorsi_cliente_home.html', { + 'list_pagati': list_pagati, + 'list_percorsi': list_percorsi, + }) + else: + percorsi_disponibili = Percorso.objects.all() + return render(request, 'percorsi_list.html', {'percorsi': percorsi_disponibili}) + + +class TuoiPercorsiListView(View): + def get(self, request): + if request.session['roles'] == settings.CLIENTI_GROUPS: + user_id = request.user.id + pagamenti_utente = Pagamenti.objects.filter(user_id=user_id) + id_percorsi_pagati = pagamenti_utente.values_list('percorso_id', flat=True) + list_percorsi_pagati = Percorso.objects.filter(id__in=id_percorsi_pagati, is_active=True) + return render(request, 'tuoi_percorsi_cliente.html', {'list_percorsi_pagati': list_percorsi_pagati}) else: - return render(request, 'percorsi_list.html', {}) + return render(request, 'percorsi_cliente_home.html', {}) class Home(CustomLoginRequiredMixin, View): # CustomLoginRequiredMixin diff --git a/socoin_atlas/settings.py b/socoin_atlas/settings.py index 747dcb0..567eb04 100644 --- a/socoin_atlas/settings.py +++ b/socoin_atlas/settings.py @@ -12,6 +12,7 @@ https://docs.djangoproject.com/en/3.2/ref/settings/ import datetime import os from pathlib import Path +from decouple import config # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -42,7 +43,8 @@ INSTALLED_APPS = [ 'sistema', 'utenti', 'api', - 'rest_framework' + 'rest_framework', + 'pagamenti', ] @@ -104,7 +106,7 @@ DATABASES = { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'socoin_atlas', 'USER': 'root', - 'PASSWORD': "password", + 'PASSWORD': "", 'HOST': '127.0.0.1', # Or an IP Address that your DB is hosted on 'PORT': '3306', 'AUTOCOMMIT': True, @@ -170,4 +172,10 @@ ADMIN_GROUPS = 'ADMIN' ''' PER INTEGRARE I PAGAMENTI CON PAYPAL https://www.youtube.com/watch?v=8rMfW4wO-vU&ab_channel=DennisIvy -''' \ No newline at end of file + +''' + +# Credenziali PayPal +PAYPAL_ID='Af2rjE-cXvWU6Wv0vKVkP_vtl2K3d4Te-geFeHkybXqbISX8VKeLZ4to2M-1xo5UR9FbqUxX81olDJAg' +PAYPAL_SECRET='EJ3lZQRK44HWdo2HprwUjm0wov-8Pc4IQZW3hFb_z647qNC-dtLpLkEUrvYXCA2WVHB8LkMfgT7QJDqH' +PAYPAL_BASE_URL='https://sandbox.paypal.com' \ No newline at end of file diff --git a/socoin_atlas/urls.py b/socoin_atlas/urls.py index 37061b8..a271c2d 100644 --- a/socoin_atlas/urls.py +++ b/socoin_atlas/urls.py @@ -26,4 +26,5 @@ urlpatterns = [ path('', include(('sistema.urls', 'sistema'), namespace='sistema')), path('utenti/', include(('utenti.urls', 'utenti'), namespace='utenti')), path('api/', include(('api.urls', 'api'), namespace='api')), + path('pagamenti/', include(('pagamenti.urls', 'pagamenti'), namespace='pagamenti')), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + staticfiles_urlpatterns()