From 20ec80cad431538a1f514f07d97f9b34c218906b Mon Sep 17 00:00:00 2001 From: Jonas 12t Date: Mon, 15 Nov 2021 10:02:16 +0400 Subject: [PATCH] Ajout membership --- DjangoFiles/ApiBillet/serializers.py | 29 ++++- DjangoFiles/ApiBillet/urls.py | 1 + DjangoFiles/ApiBillet/views.py | 61 +++-------- .../migrations/0005_auto_20211112_1146.py | 23 ++++ .../migrations/0006_auto_20211112_1147.py | 23 ++++ .../0007_membership_contribution_value.py | 18 ++++ DjangoFiles/AuthBillet/models.py | 6 ++ DjangoFiles/BaseBillet/signals.py | 2 +- .../templates/arnaud_mvc/modals.html | 85 +++++++++++++++ DjangoFiles/BaseBillet/views.py | 12 +-- DjangoFiles/QrcodeCashless/views.py | 101 +++++++++--------- 11 files changed, 254 insertions(+), 107 deletions(-) create mode 100644 DjangoFiles/AuthBillet/migrations/0005_auto_20211112_1146.py create mode 100644 DjangoFiles/AuthBillet/migrations/0006_auto_20211112_1147.py create mode 100644 DjangoFiles/AuthBillet/migrations/0007_membership_contribution_value.py diff --git a/DjangoFiles/ApiBillet/serializers.py b/DjangoFiles/ApiBillet/serializers.py index 71acadc..f63d1fb 100644 --- a/DjangoFiles/ApiBillet/serializers.py +++ b/DjangoFiles/ApiBillet/serializers.py @@ -137,6 +137,34 @@ class ReservationSerializer(serializers.ModelSerializer): ] depth = 1 +class MembreshipValidator(serializers.Serializer): + email = serializers.EmailField() + + first_name = serializers.CharField(max_length=200,) + last_name = serializers.CharField(max_length=200,) + + phone = serializers.CharField(max_length=20, required=False) + postal_code = serializers.IntegerField(required=False) + birth_date = serializers.DateField(required=False) + + contribution_value = serializers.FloatField() + + def validate_email(self, value): + User: TibilletUser = get_user_model() + user_paiement, created = User.objects.get_or_create( + email=value, username=value) + + if created: + user_paiement: HumanUser + user_paiement.client_source = connection.tenant + user_paiement.client_achat.add(connection.tenant) + user_paiement.is_active = False + else: + user_paiement.client_achat.add(connection.tenant) + + user_paiement.save() + return user_paiement.email + class ReservationValidator(serializers.Serializer): email = serializers.EmailField() @@ -157,7 +185,6 @@ class ReservationValidator(serializers.Serializer): user_paiement.client_achat.add(connection.tenant) user_paiement.save() - self.user_commande = user_paiement return user_paiement.email def validate_prices(self, value): diff --git a/DjangoFiles/ApiBillet/urls.py b/DjangoFiles/ApiBillet/urls.py index ed3a281..af0f993 100644 --- a/DjangoFiles/ApiBillet/urls.py +++ b/DjangoFiles/ApiBillet/urls.py @@ -11,6 +11,7 @@ router.register(r'events', api_view.EventsViewSet, basename='event') router.register(r'products', api_view.ProductViewSet, basename='product') router.register(r'prices', api_view.TarifBilletViewSet, basename='price') router.register(r'reservations', api_view.ReservationViewset, basename='reservation') +router.register(r'membership', api_view.MembershipViewset, basename='membership') urlpatterns = [ diff --git a/DjangoFiles/ApiBillet/views.py b/DjangoFiles/ApiBillet/views.py index 24c63e4..f486f79 100644 --- a/DjangoFiles/ApiBillet/views.py +++ b/DjangoFiles/ApiBillet/views.py @@ -11,7 +11,7 @@ from rest_framework.permissions import AllowAny from rest_framework.response import Response from ApiBillet.serializers import EventSerializer, PriceSerializer, ProductSerializer, ReservationSerializer, \ - ReservationValidator + ReservationValidator, MembreshipValidator from AuthBillet.models import TenantAdminPermission from Customers.models import Client, Domain from BaseBillet.models import Event, Price, Product, Reservation, Configuration, Ticket @@ -143,54 +143,25 @@ class ReservationViewset(viewsets.ViewSet): return [permission() for permission in permission_classes] -class Membership(viewsets.ViewSet): +class MembershipViewset(viewsets.ViewSet): + permission_classes = [AllowAny] - def send_mail_to_cashless_for_membership(request, data: dict, carte: any): - sess = requests.Session() - configuration = Configuration.get_solo() + def create(self, request): + print(request.data) + validator = MembreshipValidator(data=request.data, context={'request': request}) + if validator.is_valid(): + # serializer.save() + return Response(validator.data, status=status.HTTP_201_CREATED) + return Response(validator.errors, status=status.HTTP_400_BAD_REQUEST) - r = sess.post( - f'{configuration.server_cashless}/api/billetterie_qrcode_adhesion', - headers={ - 'Authorization': f'Api-Key {configuration.key_cashless}' - }, - data={ - 'prenom': data.get('prenom'), - 'name': data.get('name'), - 'email': data.get('email'), - 'tel': data.get('tel'), - 'uuid_carte': carte.uuid, - }) - - sess.close() - - # nouveau membre crée avec uniquement l'email on demande la suite. - # HTTP_202_ACCEPTED - # HTTP_201_CREATED - if r.status_code in (201, 204): - messages.success(request, f"{data.get('email')}", extra_tags='email') - return HttpResponseRedirect(f'#demande_nom_prenom_tel') - - # partial information : - elif r.status_code == 206: - partial = json.loads(r.text) - messages.success(request, f"{data.get('email')}", extra_tags='email') - if partial.get('name'): - messages.success(request, f"Email déja connu. Name déja connu", extra_tags='name') - if partial.get('prenom'): - messages.success(request, f"Email déja connu. prenom déja connu", extra_tags='prenom') - if partial.get('tel'): - messages.success(request, f"Email déja connu. tel déja connu", extra_tags='tel') - return HttpResponseRedirect(f'#demande_nom_prenom_tel') - - # nouveau membre crée, on demande la suite. - elif r.status_code == 202: - messages.success(request, f"Carte liée au membre {data.get('email')}") - return HttpResponseRedirect(f'#adhesionsuccess') + def get_permissions(self): + if self.action in ['create']: + permission_classes = [permissions.AllowAny] else: - messages.error(request, f'Erreur {r.status_code} {r.text}') - return HttpResponseRedirect(f'#erreur') + permission_classes = [TenantAdminPermission] + + return [permission() for permission in permission_classes] class TicketPdf(WeasyTemplateView): diff --git a/DjangoFiles/AuthBillet/migrations/0005_auto_20211112_1146.py b/DjangoFiles/AuthBillet/migrations/0005_auto_20211112_1146.py new file mode 100644 index 0000000..8fc0127 --- /dev/null +++ b/DjangoFiles/AuthBillet/migrations/0005_auto_20211112_1146.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2 on 2021-11-12 07:46 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('AuthBillet', '0004_auto_20211111_1627'), + ] + + operations = [ + migrations.AlterField( + model_name='tibilletuser', + name='first_name', + field=models.CharField(max_length=200), + ), + migrations.AlterField( + model_name='tibilletuser', + name='last_name', + field=models.CharField(max_length=200), + ), + ] diff --git a/DjangoFiles/AuthBillet/migrations/0006_auto_20211112_1147.py b/DjangoFiles/AuthBillet/migrations/0006_auto_20211112_1147.py new file mode 100644 index 0000000..8d08353 --- /dev/null +++ b/DjangoFiles/AuthBillet/migrations/0006_auto_20211112_1147.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2 on 2021-11-12 07:47 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('AuthBillet', '0005_auto_20211112_1146'), + ] + + operations = [ + migrations.AlterField( + model_name='tibilletuser', + name='first_name', + field=models.CharField(blank=True, max_length=200, null=True), + ), + migrations.AlterField( + model_name='tibilletuser', + name='last_name', + field=models.CharField(blank=True, max_length=200, null=True), + ), + ] diff --git a/DjangoFiles/AuthBillet/migrations/0007_membership_contribution_value.py b/DjangoFiles/AuthBillet/migrations/0007_membership_contribution_value.py new file mode 100644 index 0000000..b296bea --- /dev/null +++ b/DjangoFiles/AuthBillet/migrations/0007_membership_contribution_value.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2 on 2021-11-15 05:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('AuthBillet', '0006_auto_20211112_1147'), + ] + + operations = [ + migrations.AddField( + model_name='membership', + name='contribution_value', + field=models.FloatField(blank=True, null=True), + ), + ] diff --git a/DjangoFiles/AuthBillet/models.py b/DjangoFiles/AuthBillet/models.py index faf1759..6f69065 100644 --- a/DjangoFiles/AuthBillet/models.py +++ b/DjangoFiles/AuthBillet/models.py @@ -67,6 +67,10 @@ class TibilletUser(AbstractUser): email = models.EmailField(_('email'), unique=True) # changes email to unique and blank to false username = models.CharField(max_length=200, unique=True) + + first_name = models.CharField(max_length=200, null=True, blank=True) + last_name = models.CharField(max_length=200, null=True, blank=True) + phone = models.CharField(max_length=20, null=True, blank=True) last_see = models.DateTimeField(auto_now=True) @@ -216,11 +220,13 @@ class HumanUser(TibilletUser): class Membership(models.Model): user = models.ForeignKey(TibilletUser, on_delete=models.PROTECT, related_name='membership') + tenant = models.ForeignKey(Client, on_delete=models.PROTECT) date_added = models.DateTimeField(auto_now_add=True) first_contribution = models.DateField(null=True, blank=True) last_contribution = models.DateField(null=True, blank=True) + contribution_value = models.FloatField(null=True, blank=True) diff --git a/DjangoFiles/BaseBillet/signals.py b/DjangoFiles/BaseBillet/signals.py index b754511..dc46aa0 100644 --- a/DjangoFiles/BaseBillet/signals.py +++ b/DjangoFiles/BaseBillet/signals.py @@ -66,7 +66,7 @@ def set_paiement_and_reservation_valid(old_instance, new_instance): logger.info( f" TRIGGER LIGNE ARTICLE set_paiement_and_reservation_valid {new_instance.price}. On test si toute les lignes sont validées") - # On exclu l'instance en cours car elle n'est pas encore validé en DB comme Valide. + # On exclu l'instance en cours car elle n'est pas encore validé en DB comme Valide : on est sur du signal pre_save # on test ici : Si toute les autre ligne sont valide et que celle ci l'est aussi. lignes_dans_paiement_stripe = new_instance.paiement_stripe.lignearticle_set.all().exclude( uuid=new_instance.uuid) diff --git a/DjangoFiles/BaseBillet/templates/arnaud_mvc/modals.html b/DjangoFiles/BaseBillet/templates/arnaud_mvc/modals.html index 02873ff..bf0c76f 100644 --- a/DjangoFiles/BaseBillet/templates/arnaud_mvc/modals.html +++ b/DjangoFiles/BaseBillet/templates/arnaud_mvc/modals.html @@ -23,6 +23,7 @@