pre_save post_save pour activer les billets

This commit is contained in:
Jonas 12t 2021-10-27 17:41:39 +04:00
parent 3641c3bfe2
commit 579cf24219
5 changed files with 114 additions and 34 deletions

View File

@ -181,7 +181,7 @@ class ReservationAdmin(admin.ModelAdmin):
'event', 'event',
'status', 'status',
) )
readonly_fields = list_display # readonly_fields = list_display
staff_admin_site.register(Reservation, ReservationAdmin) staff_admin_site.register(Reservation, ReservationAdmin)
@ -190,8 +190,10 @@ class TicketAdmin(admin.ModelAdmin):
list_display = [ list_display = [
'first_name', 'first_name',
'last_name', 'last_name',
'event',
'reservation', 'reservation',
'scan_status', 'status',
'datetime',
] ]
readonly_fields = list_display readonly_fields = list_display

View File

@ -260,7 +260,7 @@ class ReservationValidator(serializers.Serializer):
email_paiement=self.user_commande.email, email_paiement=self.user_commande.email,
liste_ligne_article=lignes_article, liste_ligne_article=lignes_article,
metadata=metadata, metadata=metadata,
source=Paiement_stripe.BILLETTERIE, source=Paiement_stripe.API_BILLETTERIE,
absolute_domain=self.context.get('request').build_absolute_uri().partition('/api')[0], absolute_domain=self.context.get('request').build_absolute_uri().partition('/api')[0],
) )

View File

@ -20,6 +20,10 @@ from QrcodeCashless.models import CarteCashless
from TiBillet import settings from TiBillet import settings
import stripe import stripe
import logging
logger = logging.getLogger(__name__)
class OptionGenerale(models.Model): class OptionGenerale(models.Model):
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True, db_index=True) uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True, db_index=True)
@ -331,14 +335,19 @@ class Reservation(models.Model):
status = models.CharField(max_length=3, choices=TYPE_CHOICES, default=UNPAID, status = models.CharField(max_length=3, choices=TYPE_CHOICES, default=UNPAID,
verbose_name=_("Status de la réservation")) 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) options = models.ManyToManyField(OptionGenerale, blank=True)
class Meta:
ordering = ('-datetime',)
def user_mail(self): def user_mail(self):
return self.user_commande.email return self.user_commande.email
def __str__(self):
return f"{str(self.uuid).partition('-')[0]} - {self.user_commande.email}"
# def total_billet(self): # def total_billet(self):
# total = 0 # total = 0
# for ligne in self.paiements.all(): # for ligne in self.paiements.all():
@ -358,13 +367,15 @@ class Reservation(models.Model):
# return " - ".join([f"{option.name}" for option in self.options.all()]) # return " - ".join([f"{option.name}" for option in self.options.all()])
# #
@receiver(post_save, sender=Reservation) @receiver(post_save, sender=Reservation)
def verif_mail_valide(sender, instance: Reservation, created, **kwargs): def trigger_reservation(sender, instance: Reservation, created, **kwargs):
if created: if instance.status == Reservation.PAID:
# noinspection PyUnresolvedReferences if instance.tickets:
if not instance.user_commande.is_active: for ticket in instance.tickets.filter(status=Ticket.NOT_ACTIV):
instance.status = instance.MAIL_NON_VALIDEE logger.info(f'trigger_reservation, activation des tickets {ticket} NOT_SCANNED')
instance.save() ticket.status = Ticket.NOT_SCANNED
ticket.save()
class Ticket(models.Model): class Ticket(models.Model):
@ -382,9 +393,26 @@ class Ticket(models.Model):
(SCANNED, _('scanné')), (SCANNED, _('scanné')),
] ]
scan_status = models.CharField(max_length=1, choices=SCAN_CHOICES, default=NOT_ACTIV, status = models.CharField(max_length=1, choices=SCAN_CHOICES, default=NOT_ACTIV,
verbose_name=_("Status du scan")) verbose_name=_("Status du scan"))
def event(self):
return self.reservation.event
event.allow_tags = True
event.short_description = 'Évènement'
event.admin_order_field = 'reservation__event'
def datetime(self):
return self.reservation.datetime
datetime.allow_tags = True
datetime.short_description = 'Date de reservation'
datetime.admin_order_field = 'reservation__datetime'
class meta:
ordering = ('-datetime',)
class LigneArticle(models.Model): class LigneArticle(models.Model):
uuid = models.UUIDField(primary_key=True, db_index=True, default=uuid.uuid4) uuid = models.UUIDField(primary_key=True, db_index=True, default=uuid.uuid4)
@ -409,6 +437,9 @@ class LigneArticle(models.Model):
status = models.CharField(max_length=3, choices=TYPE_CHOICES, default=UNPAID, status = models.CharField(max_length=3, choices=TYPE_CHOICES, default=UNPAID,
verbose_name=_("Status de ligne article")) verbose_name=_("Status de ligne article"))
class Meta:
ordering = ('-datetime',)
def status_stripe(self): def status_stripe(self):
if self.paiement_stripe: if self.paiement_stripe:
return self.paiement_stripe.status return self.paiement_stripe.status
@ -419,27 +450,39 @@ class LigneArticle(models.Model):
@receiver(post_save, sender=LigneArticle) @receiver(post_save, sender=LigneArticle)
def check_status_stripe(sender, instance: LigneArticle, created, **kwargs): def check_status_stripe(sender, instance: LigneArticle, created, **kwargs):
if instance.paiement_stripe: if instance.paiement_stripe:
logger.info(f"Trigger LigneArticle {instance.status}")
if instance.paiement_stripe.status != Paiement_stripe.VALID:
lignes_dans_paiement_stripe = instance.paiement_stripe.lignearticle_set.all() lignes_dans_paiement_stripe = instance.paiement_stripe.lignearticle_set.all()
if len(lignes_dans_paiement_stripe) == len(lignes_dans_paiement_stripe.filter(status=LigneArticle.VALID)):
# toute les lignes d'article sont VALID # toute les lignes d'article sont VALID
if len(lignes_dans_paiement_stripe) == len(lignes_dans_paiement_stripe.filter(status=LigneArticle.VALID)):
# Si le paiement à une reservation, on la passe en payée.
# Cela enclanchera la création et l'envoie des billets
if instance.paiement_stripe.reservation:
if instance.paiement_stripe.reservation.status not in [Reservation.PAID, Reservation.VALID]:
instance.paiement_stripe.reservation.status = Reservation.PAID
instance.paiement_stripe.reservation.save()
# on passe le status du paiement stripe en VALID # on passe le status du paiement stripe en VALID
logger.info(
f"Trigger LigneArticle {instance} check_status_stripe Passage de {instance.paiement_stripe} {instance.paiement_stripe.status} à VALID")
instance.paiement_stripe.status = Paiement_stripe.VALID instance.paiement_stripe.status = Paiement_stripe.VALID
instance.paiement_stripe.save() instance.paiement_stripe.save()
@receiver(pre_save, sender=Paiement_stripe) @receiver(pre_save, sender=Paiement_stripe)
def send_to_cashless(sender, instance: Paiement_stripe, update_fields=None, **kwargs): def trigger_paiement_stripe(sender, instance: Paiement_stripe, update_fields=None, **kwargs):
# si l'instance vient d'être créé, ne rien faire : # si l'instance vient d'être créé, ne rien faire :
if instance.pk is None: if instance.pk is None:
pass pass
else: else:
if instance.status == Paiement_stripe.PAID:
logger.info(f"trigger_paiement_stripe {instance} PAID")
paiementStripe = instance paiementStripe = instance
if paiementStripe.status == Paiement_stripe.PAID:
data_pour_serveur_cashless = {'uuid_commande': paiementStripe.uuid}
for ligne_article in paiementStripe.lignearticle_set.all(): data_pour_serveur_cashless = {'uuid_commande': paiementStripe.uuid}
for ligne_article in paiementStripe.lignearticle_set.exclude(status=LigneArticle.VALID):
if ligne_article.carte: if ligne_article.carte:
data_pour_serveur_cashless['uuid'] = ligne_article.carte.uuid data_pour_serveur_cashless['uuid'] = ligne_article.carte.uuid
@ -449,7 +492,19 @@ def send_to_cashless(sender, instance: Paiement_stripe, update_fields=None, **kw
if ligne_article.price.product.categorie_article == Product.ADHESION: if ligne_article.price.product.categorie_article == Product.ADHESION:
data_pour_serveur_cashless['tarif_adhesion'] = ligne_article.price.prix data_pour_serveur_cashless['tarif_adhesion'] = ligne_article.price.prix
# si il y a autre chose que uuid_commande : logger.info(
f"trigger_paiement_stripe, ligne_article : {ligne_article.qty} x {ligne_article.price} payé ! status = PAID")
ligne_article.status = LigneArticle.PAID
ligne_article.save()
# Si il y a une reservation, on a la met en payée
if instance.reservation:
if instance.reservation.status not in [Reservation.PAID, Reservation.VALID]:
logger.info(f"trigger_paiement_stripe, reservation : {instance.reservation} payé ! status = PAID")
instance.reservation.status = Reservation.PAID
instance.reservation.save()
# si il y a des données a envoyer au serveur cashless :
if len(data_pour_serveur_cashless) > 1: if len(data_pour_serveur_cashless) > 1:
sess = requests.Session() sess = requests.Session()
configuration = Configuration.get_solo() configuration = Configuration.get_solo()
@ -462,7 +517,7 @@ def send_to_cashless(sender, instance: Paiement_stripe, update_fields=None, **kw
) )
sess.close() sess.close()
print( logger.info(
f"{timezone.now()} demande au serveur cashless pour un rechargement. réponse : {r.status_code} ") f"{timezone.now()} demande au serveur cashless pour un rechargement. réponse : {r.status_code} ")
if r.status_code == 200: if r.status_code == 200:
@ -470,5 +525,10 @@ def send_to_cashless(sender, instance: Paiement_stripe, update_fields=None, **kw
for ligne_article in paiementStripe.lignearticle_set.filter( for ligne_article in paiementStripe.lignearticle_set.filter(
Q(price__product__categorie_article=Product.RECHARGE_CASHLESS) | Q(price__product__categorie_article=Product.RECHARGE_CASHLESS) |
Q(price__product__categorie_article=Product.ADHESION)): Q(price__product__categorie_article=Product.ADHESION)):
logger.info(
f'réponse serveur cashless ok : on passe {ligne_article} {ligne_article.status} -> VALID')
ligne_article.status = LigneArticle.VALID ligne_article.status = LigneArticle.VALID
ligne_article.save() ligne_article.save()
else:
logger.error(
f"erreur réponse serveur cashless {r.status_code} {r.text} pour paiement stripe {instance}")

View File

@ -16,7 +16,6 @@ from BaseBillet.models import Configuration, LigneArticle
from PaiementStripe.models import Paiement_stripe from PaiementStripe.models import Paiement_stripe
import logging import logging
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -184,7 +183,7 @@ class retour_stripe(View):
elif checkout_session.payment_status == "paid": elif checkout_session.payment_status == "paid":
paiement_stripe.status = Paiement_stripe.PAID paiement_stripe.status = Paiement_stripe.PAID
logger.info(f"retour_stripe - checkout_session.payment_status : {checkout_session.payment_status}")
# le .save() lance le process pre_save BaseBillet.models.send_to_cashless # le .save() lance le process pre_save BaseBillet.models.send_to_cashless
# qui modifie le status de chaque ligne # qui modifie le status de chaque ligne
# et envoie les informations au serveur cashless. # et envoie les informations au serveur cashless.

View File

@ -219,3 +219,22 @@ EMAIL_USE_SSL = os.environ.get('EMAIL_USE_SSL', True)
JET_SIDE_MENU_COMPACT = True JET_SIDE_MENU_COMPACT = True
JET_CHANGE_FORM_SIBLING_LINKS = False JET_CHANGE_FORM_SIBLING_LINKS = False
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
'logfile': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': f"{BASE_DIR}/www/Djangologfile",
},
},
'root': {
'level': 'INFO',
'handlers': ['console', 'logfile']
},
}