From 41cd94e07245e64728d06c68442cc0284e5d08b6 Mon Sep 17 00:00:00 2001 From: Jonas 12t Date: Fri, 29 Oct 2021 16:18:05 +0400 Subject: [PATCH] =?UTF-8?q?utilise=20un=20dict=20plut=C3=B4t=20qu'une=20cl?= =?UTF-8?q?asse.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DjangoFiles/Administration/admin_tenant.py | 3 +- DjangoFiles/ApiBillet/serializers.py | 4 +- DjangoFiles/BaseBillet/__init__.py | 1 + DjangoFiles/BaseBillet/apps.py | 1 - .../BaseBillet/migrations/0001_initial.py | 58 +++++++++++----- .../migrations/0002_auto_20211024_1431.py | 19 ------ .../0002_paiement_stripe_reservation.py | 19 ++++++ .../migrations/0003_remove_event_tarifs.py | 17 ----- .../0004_remove_lignearticle_product.py | 17 ----- .../migrations/0005_lignearticle_price.py | 20 ------ .../migrations/0006_auto_20211025_0931.py | 30 --------- .../migrations/0007_auto_20211025_0936.py | 18 ----- ..._configuration_name_required_for_ticket.py | 18 ----- .../migrations/0009_reservation_datetime.py | 18 ----- .../migrations/0010_auto_20211025_1002.py | 24 ------- .../migrations/0011_auto_20211026_1459.py | 27 -------- .../migrations/0012_reservation_paiement.py | 20 ------ .../migrations/0013_lignearticle_status.py | 18 ----- .../migrations/0014_auto_20211027_1643.py | 26 -------- .../migrations/0015_auto_20211027_1654.py | 18 ----- .../migrations/0016_auto_20211027_1654.py | 18 ----- DjangoFiles/BaseBillet/models.py | 61 ++++++++++++++++- DjangoFiles/BaseBillet/signals.py | 61 +++++------------ .../PaiementStripe/migrations/0001_initial.py | 32 --------- .../migrations/0002_auto_20211026_1617.py | 23 ------- .../migrations/0003_auto_20211026_1619.py | 18 ----- DjangoFiles/PaiementStripe/models.py | 66 +------------------ DjangoFiles/PaiementStripe/views.py | 6 +- DjangoFiles/QrcodeCashless/views.py | 4 +- 29 files changed, 150 insertions(+), 515 deletions(-) delete mode 100644 DjangoFiles/BaseBillet/migrations/0002_auto_20211024_1431.py create mode 100644 DjangoFiles/BaseBillet/migrations/0002_paiement_stripe_reservation.py delete mode 100644 DjangoFiles/BaseBillet/migrations/0003_remove_event_tarifs.py delete mode 100644 DjangoFiles/BaseBillet/migrations/0004_remove_lignearticle_product.py delete mode 100644 DjangoFiles/BaseBillet/migrations/0005_lignearticle_price.py delete mode 100644 DjangoFiles/BaseBillet/migrations/0006_auto_20211025_0931.py delete mode 100644 DjangoFiles/BaseBillet/migrations/0007_auto_20211025_0936.py delete mode 100644 DjangoFiles/BaseBillet/migrations/0008_configuration_name_required_for_ticket.py delete mode 100644 DjangoFiles/BaseBillet/migrations/0009_reservation_datetime.py delete mode 100644 DjangoFiles/BaseBillet/migrations/0010_auto_20211025_1002.py delete mode 100644 DjangoFiles/BaseBillet/migrations/0011_auto_20211026_1459.py delete mode 100644 DjangoFiles/BaseBillet/migrations/0012_reservation_paiement.py delete mode 100644 DjangoFiles/BaseBillet/migrations/0013_lignearticle_status.py delete mode 100644 DjangoFiles/BaseBillet/migrations/0014_auto_20211027_1643.py delete mode 100644 DjangoFiles/BaseBillet/migrations/0015_auto_20211027_1654.py delete mode 100644 DjangoFiles/BaseBillet/migrations/0016_auto_20211027_1654.py delete mode 100644 DjangoFiles/PaiementStripe/migrations/0001_initial.py delete mode 100644 DjangoFiles/PaiementStripe/migrations/0002_auto_20211026_1617.py delete mode 100644 DjangoFiles/PaiementStripe/migrations/0003_auto_20211026_1619.py diff --git a/DjangoFiles/Administration/admin_tenant.py b/DjangoFiles/Administration/admin_tenant.py index 30be14a..f156252 100644 --- a/DjangoFiles/Administration/admin_tenant.py +++ b/DjangoFiles/Administration/admin_tenant.py @@ -4,11 +4,10 @@ from django.contrib.auth.models import Group from solo.admin import SingletonModelAdmin from AuthBillet.models import HumanUser, SuperHumanUser, TermUser -from BaseBillet.models import Configuration, Event, OptionGenerale, Product, Price, Reservation, LigneArticle, Ticket +from BaseBillet.models import Configuration, Event, OptionGenerale, Product, Price, Reservation, LigneArticle, Ticket, Paiement_stripe from django.contrib.auth.admin import UserAdmin from Customers.models import Client -from PaiementStripe.models import Paiement_stripe class StaffAdminSite(AdminSite): diff --git a/DjangoFiles/ApiBillet/serializers.py b/DjangoFiles/ApiBillet/serializers.py index d960d86..0824ea5 100644 --- a/DjangoFiles/ApiBillet/serializers.py +++ b/DjangoFiles/ApiBillet/serializers.py @@ -7,8 +7,7 @@ from rest_framework.generics import get_object_or_404 import PaiementStripe from AuthBillet.models import TibilletUser, HumanUser -from BaseBillet.models import Event, Price, Product, Reservation, Configuration, LigneArticle, Ticket -from PaiementStripe.models import Paiement_stripe +from BaseBillet.models import Event, Price, Product, Reservation, Configuration, LigneArticle, Ticket, Paiement_stripe from PaiementStripe.views import creation_paiement_stripe @@ -261,6 +260,7 @@ class ReservationValidator(serializers.Serializer): liste_ligne_article=lignes_article, metadata=metadata, source=Paiement_stripe.API_BILLETTERIE, + reservation=reservation, absolute_domain=self.context.get('request').build_absolute_uri().partition('/api')[0], ) diff --git a/DjangoFiles/BaseBillet/__init__.py b/DjangoFiles/BaseBillet/__init__.py index e69de29..294e9b9 100644 --- a/DjangoFiles/BaseBillet/__init__.py +++ b/DjangoFiles/BaseBillet/__init__.py @@ -0,0 +1 @@ +default_app_config = 'BaseBillet.apps.BasebilletConfig' diff --git a/DjangoFiles/BaseBillet/apps.py b/DjangoFiles/BaseBillet/apps.py index 6a54e66..12d7f6d 100644 --- a/DjangoFiles/BaseBillet/apps.py +++ b/DjangoFiles/BaseBillet/apps.py @@ -6,4 +6,3 @@ class BasebilletConfig(AppConfig): def ready(self): import BaseBillet.signals - super().ready() diff --git a/DjangoFiles/BaseBillet/migrations/0001_initial.py b/DjangoFiles/BaseBillet/migrations/0001_initial.py index a019066..73f0dc6 100644 --- a/DjangoFiles/BaseBillet/migrations/0001_initial.py +++ b/DjangoFiles/BaseBillet/migrations/0001_initial.py @@ -1,6 +1,7 @@ -# Generated by Django 2.2 on 2021-10-24 10:22 +# Generated by Django 2.2 on 2021-10-29 10:24 from django.conf import settings +import django.contrib.postgres.fields.jsonb from django.db import migrations, models import django.db.models.deletion import stdimage.models @@ -15,7 +16,6 @@ class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('QrcodeCashless', '0002_cartecashless_user'), - ('PaiementStripe', '0001_initial'), ] operations = [ @@ -24,9 +24,9 @@ class Migration(migrations.Migration): fields=[ ('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)), ('name', models.CharField(max_length=200)), + ('datetime', models.DateTimeField()), ('short_description', models.CharField(max_length=250)), ('long_description', models.TextField(blank=True, null=True)), - ('datetime', models.DateTimeField()), ('img', stdimage.models.StdImageField(upload_to='images/', validators=[stdimage.validators.MaxSizeValidator(1920, 1920)])), ('reservations', models.PositiveSmallIntegerField(default=0)), ('categorie', models.CharField(choices=[('LIV', 'Concert'), ('FES', 'Festival'), ('REU', 'Réunion'), ('CON', 'Conférence')], default='LIV', max_length=3, verbose_name="Catégorie d'évènement")), @@ -64,12 +64,26 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Reservation', fields=[ - ('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, primary_key=True, serialize=False)), - ('status', models.CharField(choices=[('NAN', 'Annulée'), ('MNV', 'Email non validé'), ('NPA', 'Non payée'), ('VAL', 'Validée'), ('PAY', 'Payée')], default='NPA', max_length=3, verbose_name='Status de la réservation')), + ('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)), + ('datetime', models.DateTimeField(auto_now=True)), + ('status', models.CharField(choices=[('C', 'Annulée'), ('N', 'Non payée'), ('P', 'Payée'), ('V', 'Validée')], default='N', max_length=3, verbose_name='Status de la réservation')), ('event', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='reservation', to='BaseBillet.Event')), - ('options', models.ManyToManyField(to='BaseBillet.OptionGenerale')), + ('options', models.ManyToManyField(blank=True, to='BaseBillet.OptionGenerale')), ('user_commande', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], + options={ + 'ordering': ('-datetime',), + }, + ), + migrations.CreateModel( + name='Ticket', + fields=[ + ('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)), + ('first_name', models.CharField(max_length=200)), + ('last_name', models.CharField(max_length=200)), + ('status', models.CharField(choices=[('N', 'Non actif'), ('K', 'Non scanné'), ('S', 'scanné')], default='N', max_length=1, verbose_name='Status du scan')), + ('reservation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tickets', to='BaseBillet.Reservation')), + ], ), migrations.CreateModel( name='Price', @@ -81,7 +95,22 @@ class Migration(migrations.Migration): ('id_price_stripe', models.CharField(blank=True, max_length=30, null=True)), ('stock', models.SmallIntegerField(blank=True, null=True)), ('max_per_user', models.PositiveSmallIntegerField(default=10)), - ('product', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Product')), + ('product', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='prices', to='BaseBillet.Product')), + ], + ), + migrations.CreateModel( + name='Paiement_stripe', + fields=[ + ('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)), + ('detail', models.CharField(blank=True, max_length=50, null=True)), + ('id_stripe', models.CharField(blank=True, max_length=80, null=True)), + ('metadata_stripe', django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True)), + ('order_date', models.DateTimeField(auto_now_add=True, verbose_name='Date')), + ('last_action', models.DateTimeField(auto_now=True)), + ('status', models.CharField(choices=[('N', 'Lien de paiement non créé'), ('O', 'Envoyée a Stripe'), ('W', 'En attente de paiement'), ('E', 'Expiré'), ('P', 'Payée'), ('V', 'Payée et validée'), ('C', 'Annulée')], default='N', max_length=1, verbose_name='Statut de la commande')), + ('source', models.CharField(choices=[('Q', 'Depuis scan QR-Code'), ('B', 'Depuis billetterie')], default='B', max_length=1, verbose_name='Source de la commande')), + ('total', models.FloatField(default=0)), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( @@ -90,22 +119,20 @@ class Migration(migrations.Migration): ('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, primary_key=True, serialize=False)), ('datetime', models.DateTimeField(auto_now=True)), ('qty', models.SmallIntegerField()), + ('status', models.CharField(choices=[('C', 'Annulée'), ('N', 'Non payée'), ('P', 'Payée'), ('V', 'Validée par serveur cashless')], default='N', max_length=3, verbose_name='Status de ligne article')), ('carte', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='QrcodeCashless.CarteCashless')), - ('paiement_stripe', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='PaiementStripe.Paiement_stripe')), - ('product', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Product')), - ('reservation', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation')), + ('paiement_stripe', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Paiement_stripe')), + ('price', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Price')), ], + options={ + 'ordering': ('-datetime',), + }, ), migrations.AddField( model_name='event', name='products', field=models.ManyToManyField(blank=True, to='BaseBillet.Product'), ), - migrations.AddField( - model_name='event', - name='tarifs', - field=models.ManyToManyField(to='BaseBillet.Price'), - ), migrations.CreateModel( name='Configuration', fields=[ @@ -120,6 +147,7 @@ class Migration(migrations.Migration): ('facebook', models.URLField(blank=True, null=True)), ('instagram', models.URLField(blank=True, null=True)), ('adhesion_obligatoire', models.BooleanField(default=False)), + ('name_required_for_ticket', models.BooleanField(default=False, verbose_name='Billet nominatifs')), ('carte_restaurant', stdimage.models.StdImageField(blank=True, null=True, upload_to='images/', validators=[stdimage.validators.MaxSizeValidator(1920, 1920)], verbose_name='Carte du restaurant')), ('img', stdimage.models.StdImageField(blank=True, null=True, upload_to='images/', verbose_name='Background')), ('mollie_api_key', models.CharField(blank=True, max_length=50, null=True)), diff --git a/DjangoFiles/BaseBillet/migrations/0002_auto_20211024_1431.py b/DjangoFiles/BaseBillet/migrations/0002_auto_20211024_1431.py deleted file mode 100644 index 3c350e3..0000000 --- a/DjangoFiles/BaseBillet/migrations/0002_auto_20211024_1431.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 2.2 on 2021-10-24 10:31 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('BaseBillet', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='price', - name='product', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='prices', to='BaseBillet.Product'), - ), - ] diff --git a/DjangoFiles/BaseBillet/migrations/0002_paiement_stripe_reservation.py b/DjangoFiles/BaseBillet/migrations/0002_paiement_stripe_reservation.py new file mode 100644 index 0000000..9cc0648 --- /dev/null +++ b/DjangoFiles/BaseBillet/migrations/0002_paiement_stripe_reservation.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2 on 2021-10-29 10:52 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('BaseBillet', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='paiement_stripe', + name='reservation', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='BaseBillet.Reservation'), + ), + ] diff --git a/DjangoFiles/BaseBillet/migrations/0003_remove_event_tarifs.py b/DjangoFiles/BaseBillet/migrations/0003_remove_event_tarifs.py deleted file mode 100644 index 829f9e8..0000000 --- a/DjangoFiles/BaseBillet/migrations/0003_remove_event_tarifs.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 2.2 on 2021-10-24 10:40 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('BaseBillet', '0002_auto_20211024_1431'), - ] - - operations = [ - migrations.RemoveField( - model_name='event', - name='tarifs', - ), - ] diff --git a/DjangoFiles/BaseBillet/migrations/0004_remove_lignearticle_product.py b/DjangoFiles/BaseBillet/migrations/0004_remove_lignearticle_product.py deleted file mode 100644 index 1bd122f..0000000 --- a/DjangoFiles/BaseBillet/migrations/0004_remove_lignearticle_product.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 2.2 on 2021-10-24 11:32 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('BaseBillet', '0003_remove_event_tarifs'), - ] - - operations = [ - migrations.RemoveField( - model_name='lignearticle', - name='product', - ), - ] diff --git a/DjangoFiles/BaseBillet/migrations/0005_lignearticle_price.py b/DjangoFiles/BaseBillet/migrations/0005_lignearticle_price.py deleted file mode 100644 index 3f34781..0000000 --- a/DjangoFiles/BaseBillet/migrations/0005_lignearticle_price.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 2.2 on 2021-10-24 11:32 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('BaseBillet', '0004_remove_lignearticle_product'), - ] - - operations = [ - migrations.AddField( - model_name='lignearticle', - name='price', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Price'), - preserve_default=False, - ), - ] diff --git a/DjangoFiles/BaseBillet/migrations/0006_auto_20211025_0931.py b/DjangoFiles/BaseBillet/migrations/0006_auto_20211025_0931.py deleted file mode 100644 index 1c7b8b3..0000000 --- a/DjangoFiles/BaseBillet/migrations/0006_auto_20211025_0931.py +++ /dev/null @@ -1,30 +0,0 @@ -# Generated by Django 2.2 on 2021-10-25 05:31 - -from django.db import migrations, models -import django.db.models.deletion -import uuid - - -class Migration(migrations.Migration): - - dependencies = [ - ('BaseBillet', '0005_lignearticle_price'), - ] - - operations = [ - migrations.AlterField( - model_name='reservation', - name='uuid', - field=models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True), - ), - migrations.CreateModel( - name='Ticket', - fields=[ - ('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)), - ('first_name', models.CharField(max_length=200)), - ('last_name', models.CharField(max_length=200)), - ('scan_status', models.CharField(choices=[('N', 'Non scanné'), ('S', 'scanné')], default='N', max_length=1, verbose_name='Status du scan')), - ('reservation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation')), - ], - ), - ] diff --git a/DjangoFiles/BaseBillet/migrations/0007_auto_20211025_0936.py b/DjangoFiles/BaseBillet/migrations/0007_auto_20211025_0936.py deleted file mode 100644 index 80d2e3e..0000000 --- a/DjangoFiles/BaseBillet/migrations/0007_auto_20211025_0936.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 2.2 on 2021-10-25 05:36 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('BaseBillet', '0006_auto_20211025_0931'), - ] - - operations = [ - migrations.AlterField( - model_name='reservation', - name='status', - field=models.CharField(choices=[('C', 'Annulée'), ('N', 'Non payée'), ('P', 'Payée'), ('V', 'Validée')], default='N', max_length=3, verbose_name='Status de la réservation'), - ), - ] diff --git a/DjangoFiles/BaseBillet/migrations/0008_configuration_name_required_for_ticket.py b/DjangoFiles/BaseBillet/migrations/0008_configuration_name_required_for_ticket.py deleted file mode 100644 index 5f035f4..0000000 --- a/DjangoFiles/BaseBillet/migrations/0008_configuration_name_required_for_ticket.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 2.2 on 2021-10-25 05:43 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('BaseBillet', '0007_auto_20211025_0936'), - ] - - operations = [ - migrations.AddField( - model_name='configuration', - name='name_required_for_ticket', - field=models.BooleanField(default=False), - ), - ] diff --git a/DjangoFiles/BaseBillet/migrations/0009_reservation_datetime.py b/DjangoFiles/BaseBillet/migrations/0009_reservation_datetime.py deleted file mode 100644 index 0986049..0000000 --- a/DjangoFiles/BaseBillet/migrations/0009_reservation_datetime.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 2.2 on 2021-10-25 05:45 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('BaseBillet', '0008_configuration_name_required_for_ticket'), - ] - - operations = [ - migrations.AddField( - model_name='reservation', - name='datetime', - field=models.DateTimeField(auto_now=True), - ), - ] diff --git a/DjangoFiles/BaseBillet/migrations/0010_auto_20211025_1002.py b/DjangoFiles/BaseBillet/migrations/0010_auto_20211025_1002.py deleted file mode 100644 index 5442416..0000000 --- a/DjangoFiles/BaseBillet/migrations/0010_auto_20211025_1002.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 2.2 on 2021-10-25 06:02 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('BaseBillet', '0009_reservation_datetime'), - ] - - operations = [ - migrations.AlterField( - model_name='lignearticle', - name='reservation', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='paiements', to='BaseBillet.Reservation'), - ), - migrations.AlterField( - model_name='ticket', - name='reservation', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tickets', to='BaseBillet.Reservation'), - ), - ] diff --git a/DjangoFiles/BaseBillet/migrations/0011_auto_20211026_1459.py b/DjangoFiles/BaseBillet/migrations/0011_auto_20211026_1459.py deleted file mode 100644 index 1f6b60e..0000000 --- a/DjangoFiles/BaseBillet/migrations/0011_auto_20211026_1459.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 2.2 on 2021-10-26 10:59 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('BaseBillet', '0010_auto_20211025_1002'), - ] - - operations = [ - migrations.RemoveField( - model_name='lignearticle', - name='reservation', - ), - migrations.AlterField( - model_name='configuration', - name='name_required_for_ticket', - field=models.BooleanField(default=False, verbose_name='Billet nominatifs'), - ), - migrations.AlterField( - model_name='ticket', - name='scan_status', - field=models.CharField(choices=[('N', 'Non actif'), ('K', 'Non scanné'), ('S', 'scanné')], default='N', max_length=1, verbose_name='Status du scan'), - ), - ] diff --git a/DjangoFiles/BaseBillet/migrations/0012_reservation_paiement.py b/DjangoFiles/BaseBillet/migrations/0012_reservation_paiement.py deleted file mode 100644 index 482cd39..0000000 --- a/DjangoFiles/BaseBillet/migrations/0012_reservation_paiement.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 2.2 on 2021-10-26 11:07 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('PaiementStripe', '0001_initial'), - ('BaseBillet', '0011_auto_20211026_1459'), - ] - - operations = [ - migrations.AddField( - model_name='reservation', - name='paiement', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='reservation', to='PaiementStripe.Paiement_stripe'), - ), - ] diff --git a/DjangoFiles/BaseBillet/migrations/0013_lignearticle_status.py b/DjangoFiles/BaseBillet/migrations/0013_lignearticle_status.py deleted file mode 100644 index c40afcb..0000000 --- a/DjangoFiles/BaseBillet/migrations/0013_lignearticle_status.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 2.2 on 2021-10-26 11:26 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('BaseBillet', '0012_reservation_paiement'), - ] - - operations = [ - migrations.AddField( - model_name='lignearticle', - name='status', - field=models.CharField(choices=[('C', 'Annulée'), ('N', 'Non payée'), ('P', 'Payée'), ('V', 'Validée par serveur cashless')], default='N', max_length=3, verbose_name='Status de ligne article'), - ), - ] diff --git a/DjangoFiles/BaseBillet/migrations/0014_auto_20211027_1643.py b/DjangoFiles/BaseBillet/migrations/0014_auto_20211027_1643.py deleted file mode 100644 index 7664a55..0000000 --- a/DjangoFiles/BaseBillet/migrations/0014_auto_20211027_1643.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 2.2 on 2021-10-27 12:43 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('BaseBillet', '0013_lignearticle_status'), - ] - - operations = [ - migrations.AlterModelOptions( - name='lignearticle', - options={'ordering': ('-datetime',)}, - ), - migrations.AlterModelOptions( - name='reservation', - options={'ordering': ('-datetime',)}, - ), - migrations.RenameField( - model_name='ticket', - old_name='scan_status', - new_name='status', - ), - ] diff --git a/DjangoFiles/BaseBillet/migrations/0015_auto_20211027_1654.py b/DjangoFiles/BaseBillet/migrations/0015_auto_20211027_1654.py deleted file mode 100644 index 37fdd9c..0000000 --- a/DjangoFiles/BaseBillet/migrations/0015_auto_20211027_1654.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 2.2 on 2021-10-27 12:54 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('BaseBillet', '0014_auto_20211027_1643'), - ] - - operations = [ - migrations.AlterField( - model_name='reservation', - name='options', - field=models.ManyToManyField(blank=True, null=True, to='BaseBillet.OptionGenerale'), - ), - ] diff --git a/DjangoFiles/BaseBillet/migrations/0016_auto_20211027_1654.py b/DjangoFiles/BaseBillet/migrations/0016_auto_20211027_1654.py deleted file mode 100644 index 18862de..0000000 --- a/DjangoFiles/BaseBillet/migrations/0016_auto_20211027_1654.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 2.2 on 2021-10-27 12:54 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('BaseBillet', '0015_auto_20211027_1654'), - ] - - operations = [ - migrations.AlterField( - model_name='reservation', - name='options', - field=models.ManyToManyField(blank=True, to='BaseBillet.OptionGenerale'), - ), - ] diff --git a/DjangoFiles/BaseBillet/models.py b/DjangoFiles/BaseBillet/models.py index 2bde32c..6a28708 100644 --- a/DjangoFiles/BaseBillet/models.py +++ b/DjangoFiles/BaseBillet/models.py @@ -9,13 +9,13 @@ from django.db.models import Q from django.db.models.signals import post_save, pre_save from django.dispatch import receiver from django.utils import timezone +from django.contrib.postgres.fields import JSONField from solo.models import SingletonModel from django.utils.translation import ugettext_lazy as _ from stdimage import StdImageField from stdimage.validators import MaxSizeValidator from django.db import connection -from PaiementStripe.models import Paiement_stripe from QrcodeCashless.models import CarteCashless from TiBillet import settings import stripe @@ -314,6 +314,8 @@ class Event(models.Model): verbose_name_plural = _('Evenements') + + class Reservation(models.Model): uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True, db_index=True) datetime = models.DateTimeField(auto_now=True) @@ -335,8 +337,8 @@ class Reservation(models.Model): status = models.CharField(max_length=3, choices=TYPE_CHOICES, default=UNPAID, verbose_name=_("Status de la réservation")) - paiement = models.OneToOneField(Paiement_stripe, on_delete=models.PROTECT, blank=True, null=True, - related_name='reservation') + # paiement = models.OneToOneField(Paiement_stripe, on_delete=models.PROTECT, blank=True, null=True, + # related_name='reservation') options = models.ManyToManyField(OptionGenerale, blank=True) @@ -408,6 +410,59 @@ class Ticket(models.Model): ordering = ('-datetime',) + +class Paiement_stripe(models.Model): + """ + La commande + """ + uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True, db_index=True) + detail = models.CharField(max_length=50, blank=True, null=True) + + id_stripe = models.CharField(max_length=80, blank=True, null=True) + metadata_stripe = JSONField(blank=True, null=True) + + order_date = models.DateTimeField(auto_now_add=True, verbose_name="Date") + last_action = models.DateTimeField(auto_now=True) + + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, blank=True, null=True) + + NON, OPEN, PENDING, EXPIRE, PAID, VALID, CANCELED = 'N', 'O', 'W', 'E', 'P', 'V', 'C' + STATUT_CHOICES = ( + (NON, 'Lien de paiement non créé'), + (OPEN, 'Envoyée a Stripe'), + (PENDING, 'En attente de paiement'), + (EXPIRE, 'Expiré'), + (PAID, 'Payée'), + (VALID, 'Payée et validée'), # envoyé sur serveur cashless + (CANCELED, 'Annulée'), + ) + + reservation = models.ForeignKey(Reservation, on_delete=models.PROTECT, blank=True, null=True) + + status = models.CharField(max_length=1, choices=STATUT_CHOICES, default=NON, verbose_name="Statut de la commande") + + QRCODE, API_BILLETTERIE = 'Q', 'B' + SOURCE_CHOICES = ( + (QRCODE, _('Depuis scan QR-Code')), + (API_BILLETTERIE, _('Depuis billetterie')), + ) + source = models.CharField(max_length=1, choices=SOURCE_CHOICES, default=API_BILLETTERIE, verbose_name="Source de la commande") + + total = models.FloatField(default=0) + + def uuid_8(self): + return f"{self.uuid}".partition('-')[0] + + def __str__(self): + return self.uuid_8() + + def articles(self): + return " - ".join( + [f"{ligne.product.name} {ligne.qty * ligne.product.prix}€" for ligne in self.lignearticle_set.all()]) + + + + class LigneArticle(models.Model): uuid = models.UUIDField(primary_key=True, db_index=True, default=uuid.uuid4) datetime = models.DateTimeField(auto_now=True) diff --git a/DjangoFiles/BaseBillet/signals.py b/DjangoFiles/BaseBillet/signals.py index 2abc2a0..bb3646d 100644 --- a/DjangoFiles/BaseBillet/signals.py +++ b/DjangoFiles/BaseBillet/signals.py @@ -2,13 +2,13 @@ import requests from django.db.models.signals import post_save, pre_save from django.dispatch import receiver -from BaseBillet.models import Reservation, LigneArticle, Ticket, Product, Configuration +from BaseBillet.models import Reservation, LigneArticle, Ticket, Product, Configuration, Paiement_stripe import logging -from PaiementStripe.models import Paiement_stripe - logger = logging.getLogger(__name__) +logger.info(f'import basebillet.signals') + @receiver(post_save, sender=Reservation) def trigger_reservation(sender, instance: Reservation, created, **kwargs): @@ -122,9 +122,11 @@ def set_ligne_article_paid(old_instance, new_instance): ligne_article.save() # si ya une reservation, on la met aussi en payée : + # try : if new_instance.reservation: new_instance.reservation.status = Reservation.PAID new_instance.reservation.save() + # except new_instance.reservation.RelatedObjectDoesNotExist: def expire_paiement_stripe(old_instance, new_instance): @@ -136,6 +138,7 @@ def valide_stripe_paiement(old_instance, new_instance): logger.info(f" TRIGGER PAIEMENT STRIPE valide_stripe_paiement {old_instance.status} to {new_instance.status}") pass + ######################## TRIGGER RESERVATION ######################## @@ -153,42 +156,23 @@ def error_regression(old_instance, new_instance): pass -# def pass(old_instance, new_instance): - # On déclare les transitions possibles entre différents etats des statuts. # Exemple première ligne : Si status passe de PENDING vers PAID, alors on lance set_ligne_article_paid -class Transitions(): - '''''' - ''' - Reservation choices : - (CANCELED, _('Annulée')), - (UNPAID, _('Non payée')), - (PAID, _('Payée')), - (VALID, _('Validée')), - ''' - RESERVATION = { + +TRANSITIONS = { + 'RESERVATION': { Reservation.UNPAID: { - Reservation.PAID : send_billet_to_mail + Reservation.PAID: send_billet_to_mail }, Reservation.PAID: { LigneArticle.PAID: send_billet_to_mail, - '_else_': error_regression, + '_else_': error_regression, }, Reservation.VALID: { '_all_': error_regression, } - } - ''' - Paiement_stripe choices : - (NON, 'Lien de paiement non créé'), - (OPEN, 'Envoyée a Stripe'), - (PENDING, 'En attente de paiement'), - (EXPIRE, 'Expiré'), - (PAID, 'Payée'), - (VALID, 'Payée et validée'), # envoyé sur serveur cashless - (CANCELED, 'Annulée'), - ''' - PAIEMENT_STRIPE = { + }, + 'PAIEMENT_STRIPE': { Paiement_stripe.PENDING: { Paiement_stripe.PAID: set_ligne_article_paid, Paiement_stripe.EXPIRE: expire_paiement_stripe, @@ -202,15 +186,8 @@ class Transitions(): Paiement_stripe.VALID: { '_all_': error_regression, } - } - ''' - LigneArticle Choices : - (CANCELED, _('Annulée')), - (UNPAID, _('Non payée')), - (PAID, _('Payée')), - (VALID, _('Validée par serveur cashless')), - ''' - LIGNEARTICLE = { + }, + 'LIGNEARTICLE': { LigneArticle.UNPAID: { LigneArticle.PAID: check_paid, }, @@ -222,13 +199,13 @@ class Transitions(): LigneArticle.VALID: { '_all_': error_regression, } - } + }, +} def pre_save_signal_status(old_instance, new_instance): - # import ipdb; ipdb.set_trace() sender_str = old_instance.__class__.__name__.upper() - dict_transition = getattr(Transitions, f"{sender_str}", None) + dict_transition = TRANSITIONS.get(sender_str) if dict_transition: logger.info(f"dict_transition {sender_str} {new_instance} : {old_instance.status} to {new_instance.status}") transitions = dict_transition.get(old_instance.status, None) @@ -240,8 +217,6 @@ def pre_save_signal_status(old_instance, new_instance): )))) if trigger_function: - # import ipdb; ipdb.set_trace() - if not callable(trigger_function): raise Exception(f'Fonction {trigger_function} is not callable. Disdonc !?') trigger_function(old_instance, new_instance) diff --git a/DjangoFiles/PaiementStripe/migrations/0001_initial.py b/DjangoFiles/PaiementStripe/migrations/0001_initial.py deleted file mode 100644 index 1bd383d..0000000 --- a/DjangoFiles/PaiementStripe/migrations/0001_initial.py +++ /dev/null @@ -1,32 +0,0 @@ -# Generated by Django 2.2 on 2021-09-27 13:39 - -from django.conf import settings -import django.contrib.postgres.fields.jsonb -from django.db import migrations, models -import django.db.models.deletion -import uuid - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='Paiement_stripe', - fields=[ - ('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)), - ('detail', models.CharField(blank=True, max_length=50, null=True)), - ('id_stripe', models.CharField(blank=True, max_length=80, null=True)), - ('metadata_stripe', django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True)), - ('order_date', models.DateTimeField(auto_now=True, verbose_name='Date')), - ('status', models.CharField(choices=[('N', 'Lien de paiement non crée'), ('O', 'Envoyée a Stripe'), ('W', 'En attente de paiement'), ('E', 'Expiré'), ('P', 'Payée'), ('V', 'Payée et validée'), ('C', 'Annulée')], default='N', max_length=1, verbose_name='Statut de la commande')), - ('total', models.FloatField(default=0)), - ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), - ], - ), - ] diff --git a/DjangoFiles/PaiementStripe/migrations/0002_auto_20211026_1617.py b/DjangoFiles/PaiementStripe/migrations/0002_auto_20211026_1617.py deleted file mode 100644 index cf0a2de..0000000 --- a/DjangoFiles/PaiementStripe/migrations/0002_auto_20211026_1617.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 2.2 on 2021-10-26 12:17 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('PaiementStripe', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='paiement_stripe', - name='source', - field=models.CharField(choices=[('Q', 'Depuis scan QR-Code'), ('B', 'Depuis billetterie')], default='N', max_length=1, verbose_name='Statut de la commande'), - ), - migrations.AlterField( - model_name='paiement_stripe', - name='status', - field=models.CharField(choices=[('N', 'Lien de paiement non créé'), ('O', 'Envoyée a Stripe'), ('W', 'En attente de paiement'), ('E', 'Expiré'), ('P', 'Payée'), ('V', 'Payée et validée'), ('C', 'Annulée')], default='N', max_length=1, verbose_name='Statut de la commande'), - ), - ] diff --git a/DjangoFiles/PaiementStripe/migrations/0003_auto_20211026_1619.py b/DjangoFiles/PaiementStripe/migrations/0003_auto_20211026_1619.py deleted file mode 100644 index 2b82470..0000000 --- a/DjangoFiles/PaiementStripe/migrations/0003_auto_20211026_1619.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 2.2 on 2021-10-26 12:19 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('PaiementStripe', '0002_auto_20211026_1617'), - ] - - operations = [ - migrations.AlterField( - model_name='paiement_stripe', - name='source', - field=models.CharField(choices=[('Q', 'Depuis scan QR-Code'), ('B', 'Depuis billetterie')], default='B', max_length=1, verbose_name='Statut de la commande'), - ), - ] diff --git a/DjangoFiles/PaiementStripe/models.py b/DjangoFiles/PaiementStripe/models.py index 61ab053..27f478d 100644 --- a/DjangoFiles/PaiementStripe/models.py +++ b/DjangoFiles/PaiementStripe/models.py @@ -1,67 +1,5 @@ -from django.db import models -from django.contrib.postgres.fields import JSONField -import uuid -from django.utils.translation import gettext, gettext_lazy as _ +# from django.db import models +# from django.utils.translation import gettext, gettext_lazy as _ # Create your models here. -from TiBillet import settings - -class Paiement_stripe(models.Model): - """ - La commande - """ - uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True, db_index=True) - detail = models.CharField(max_length=50, blank=True, null=True) - - id_stripe = models.CharField(max_length=80, blank=True, null=True) - metadata_stripe = JSONField(blank=True, null=True) - - order_date = models.DateTimeField(auto_now_add=True, verbose_name="Date") - last_action = models.DateTimeField(auto_now=True) - - user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, blank=True, null=True) - - NON, OPEN, PENDING, EXPIRE, PAID, VALID, CANCELED = 'N', 'O', 'W', 'E', 'P', 'V', 'C' - STATUT_CHOICES = ( - (NON, 'Lien de paiement non créé'), - (OPEN, 'Envoyée a Stripe'), - (PENDING, 'En attente de paiement'), - (EXPIRE, 'Expiré'), - (PAID, 'Payée'), - (VALID, 'Payée et validée'), # envoyé sur serveur cashless - (CANCELED, 'Annulée'), - ) - - status = models.CharField(max_length=1, choices=STATUT_CHOICES, default=NON, verbose_name="Statut de la commande") - - QRCODE, API_BILLETTERIE = 'Q', 'B' - SOURCE_CHOICES = ( - (QRCODE, _('Depuis scan QR-Code')), - (API_BILLETTERIE, _('Depuis billetterie')), - ) - source = models.CharField(max_length=1, choices=SOURCE_CHOICES, default=API_BILLETTERIE, verbose_name="Source de la commande") - - total = models.FloatField(default=0) - - def uuid_8(self): - return f"{self.uuid}".partition('-')[0] - - def __str__(self): - return self.uuid_8() - - def articles(self): - return " - ".join( - [f"{ligne.product.name} {ligne.qty * ligne.product.prix}€" for ligne in self.lignearticle_set.all()]) - - -''' RECEIVER PRESAVE DANS LE VIEW QRCODECASHELESS -@receiver(pre_save, sender=Paiement_stripe) -def changement_paid_to_valid(sender, instance: Paiement_stripe, update_fields=None, **kwargs): - try: - old_instance = Paiement_stripe.objects.get(pk=instance.pk) - if old_instance.status != Paiement_stripe.PAID : - print(f"on passe de {old_instance.status} à {instance.status}") - if instance.status == Paiement_stripe.PAID: - on lance la recharge vers le serveur cashless -''' diff --git a/DjangoFiles/PaiementStripe/views.py b/DjangoFiles/PaiementStripe/views.py index f7a3316..d7926fa 100644 --- a/DjangoFiles/PaiementStripe/views.py +++ b/DjangoFiles/PaiementStripe/views.py @@ -12,8 +12,7 @@ from django.utils import timezone from django.views import View from AuthBillet.models import HumanUser -from BaseBillet.models import Configuration, LigneArticle -from PaiementStripe.models import Paiement_stripe +from BaseBillet.models import Configuration, LigneArticle, Paiement_stripe, Reservation import logging logger = logging.getLogger(__name__) @@ -25,6 +24,7 @@ class creation_paiement_stripe(): email_paiement: str, liste_ligne_article: list, metadata: dict, + reservation: (Reservation, None), source: str, absolute_domain: str ) -> None: @@ -33,6 +33,7 @@ class creation_paiement_stripe(): self.liste_ligne_article = liste_ligne_article self.email_paiement = email_paiement self.metadata = metadata + self.reservation = reservation self.source = source self.configuration = Configuration.get_solo() @@ -74,6 +75,7 @@ class creation_paiement_stripe(): user=self.user, total=self.total, metadata_stripe=self.metadata_json, + reservation=self.reservation, source=self.source, ) diff --git a/DjangoFiles/QrcodeCashless/views.py b/DjangoFiles/QrcodeCashless/views.py index 404a770..8c4559c 100644 --- a/DjangoFiles/QrcodeCashless/views.py +++ b/DjangoFiles/QrcodeCashless/views.py @@ -11,8 +11,7 @@ from rest_framework.generics import get_object_or_404 from django.views import View from rest_framework import status -from BaseBillet.models import Configuration, Product, LigneArticle, Price -from PaiementStripe.models import Paiement_stripe +from BaseBillet.models import Configuration, Product, LigneArticle, Price, Paiement_stripe from PaiementStripe.views import creation_paiement_stripe from QrcodeCashless.models import CarteCashless @@ -202,6 +201,7 @@ class index_scan(View): email_paiement=data.get('email'), liste_ligne_article=ligne_articles, metadata=metadata, + reservation=None, source=Paiement_stripe.QRCODE, absolute_domain=request.build_absolute_uri().partition('/qr')[0], )