utilise un dict plutôt qu'une classe.

This commit is contained in:
Jonas 12t 2021-10-29 16:18:05 +04:00
parent 412aa86c7e
commit 41cd94e072
29 changed files with 150 additions and 515 deletions

View File

@ -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):

View File

@ -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],
)

View File

@ -0,0 +1 @@
default_app_config = 'BaseBillet.apps.BasebilletConfig'

View File

@ -6,4 +6,3 @@ class BasebilletConfig(AppConfig):
def ready(self):
import BaseBillet.signals
super().ready()

View File

@ -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)),

View File

@ -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'),
),
]

View File

@ -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'),
),
]

View File

@ -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',
),
]

View File

@ -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',
),
]

View File

@ -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,
),
]

View File

@ -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')),
],
),
]

View File

@ -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'),
),
]

View File

@ -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),
),
]

View File

@ -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),
),
]

View File

@ -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'),
),
]

View File

@ -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'),
),
]

View File

@ -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'),
),
]

View File

@ -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'),
),
]

View File

@ -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',
),
]

View File

@ -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'),
),
]

View File

@ -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'),
),
]

View File

@ -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)

View File

@ -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)

View File

@ -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)),
],
),
]

View File

@ -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'),
),
]

View File

@ -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'),
),
]

View File

@ -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
'''

View File

@ -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,
)

View File

@ -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],
)