diff --git a/DjangoFiles/Administration/admin_tenant.py b/DjangoFiles/Administration/admin_tenant.py index a843b11..973aceb 100644 --- a/DjangoFiles/Administration/admin_tenant.py +++ b/DjangoFiles/Administration/admin_tenant.py @@ -97,9 +97,45 @@ staff_admin_site.register(TermUser, TermUserAdmin) ######################################################################## +class ConfigurationAdmin(SingletonModelAdmin): + # readonly_fields = [] + + fieldsets = ( + (None, { + 'fields': ( + 'organisation', + 'short_description', + 'adresse', + 'phone', + 'email', + 'twitter', + 'facebook', + 'instagram', + 'img', + ) + }), + ('Paiements', { + 'fields': ( + 'mollie_api_key', + ), + }), + ('Billetterie', { + 'fields': ( + 'jauge_max', + 'option_generale_radio', + 'option_generale_checkbox', + ), + }), + ('Cashless', { + 'fields': ( + 'server_cashless', + 'key_cashless', + ), + }), + ) -staff_admin_site.register(Configuration, SingletonModelAdmin) +staff_admin_site.register(Configuration, ConfigurationAdmin) class EventAdmin(admin.ModelAdmin): diff --git a/DjangoFiles/AuthBillet/views.py b/DjangoFiles/AuthBillet/views.py index 6e67343..1e9c394 100644 --- a/DjangoFiles/AuthBillet/views.py +++ b/DjangoFiles/AuthBillet/views.py @@ -14,6 +14,7 @@ from TiBillet import settings from djoser import utils User = get_user_model() + class activate(APIView): permission_classes = [AllowAny] @@ -22,7 +23,7 @@ class activate(APIView): print(uid) print(token) - import ipdb; ipdb.set_trace() + # import ipdb; ipdb.set_trace() user = User.objects.get(pk=utils.decode_uid(uid)) PR = PasswordResetTokenGenerator() diff --git a/DjangoFiles/BaseBillet/models.py b/DjangoFiles/BaseBillet/models.py index 5e610f8..4d9b910 100644 --- a/DjangoFiles/BaseBillet/models.py +++ b/DjangoFiles/BaseBillet/models.py @@ -11,9 +11,11 @@ from django.utils.translation import ugettext_lazy as _ from stdimage import StdImageField from stdimage.validators import MaxSizeValidator +from PaiementStripe.models import Paiement_stripe from TiBillet import settings + class OptionGenerale(models.Model): name = models.CharField(max_length=30) poids = models.PositiveSmallIntegerField(default=0, verbose_name=_("Poids")) @@ -28,7 +30,7 @@ class OptionGenerale(models.Model): @receiver(post_save, sender=OptionGenerale) -def poids_option_generaler(sender, instance: OptionGenerale, created, **kwargs): +def poids_option_generale(sender, instance: OptionGenerale, created, **kwargs): if created: # poids d'apparition if instance.poids == 0: @@ -76,6 +78,20 @@ class Configuration(SingletonModel): related_name="checkbox") + server_cashless = models.URLField( + max_length=300, + blank=True, + null=True, + verbose_name="Adresse du serveur Cashless" + ) + + key_cashless = models.CharField( + max_length=41, + blank=True, + null=True, + verbose_name="Clé d'API du serveur cashless" + ) + class Billet(models.Model): name = models.CharField(max_length=50, blank=True, null=True) @@ -133,6 +149,9 @@ class Event(models.Model): else: return False + def __str__(self): + return f"{self.datetime.strftime('%d/%m')} {self.name}" + class Meta: ordering = ('datetime',) verbose_name = _('Evenement') @@ -189,7 +208,7 @@ class Reservation(models.Model): return " - ".join([f"{option.name}" for option in self.options.all()]) @receiver(post_save, sender=Reservation) -def poids_option_generaler(sender, instance: Reservation, created, **kwargs): +def verif_mail_valide(sender, instance: Reservation, created, **kwargs): if created: if not instance.user_commande.is_active : instance.status = instance.MAIL_NON_VALIDEE @@ -199,14 +218,18 @@ def poids_option_generaler(sender, instance: Reservation, created, **kwargs): class LigneArticle(models.Model): uuid = models.UUIDField(primary_key=True, db_index=True, default=uuid.uuid4) - reservation = models.ForeignKey(Reservation, on_delete=models.CASCADE, verbose_name="lignes_article") + reservation = models.ForeignKey(Reservation, on_delete=models.CASCADE, blank=True, null=True) article = models.ForeignKey(Article, on_delete=models.CASCADE, blank=True, null=True) billet = models.ForeignKey(Billet, on_delete=models.CASCADE, blank=True, null=True) qty = models.SmallIntegerField() reste = models.SmallIntegerField() + paiement_stripe = models.ForeignKey(Paiement_stripe, on_delete=models.PROTECT, blank=True, null=True) + + # def __str__(self): + # if self.reservation : + # if self.article : + # return f"{self.reservation.user_commande.email} {self.qty} {self.article}" + # if self.billet : + # return f"{self.reservation.user_commande.email} {self.qty} {self.billet}" + - def __str__(self): - if self.article : - return f"{self.reservation.user_commande.email} {self.qty} {self.article}" - if self.billet : - return f"{self.reservation.user_commande.email} {self.qty} {self.billet}" diff --git a/DjangoFiles/PaiementStripe/__init__.py b/DjangoFiles/PaiementStripe/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/DjangoFiles/PaiementStripe/admin.py b/DjangoFiles/PaiementStripe/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/DjangoFiles/PaiementStripe/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/DjangoFiles/PaiementStripe/apps.py b/DjangoFiles/PaiementStripe/apps.py new file mode 100644 index 0000000..12f2881 --- /dev/null +++ b/DjangoFiles/PaiementStripe/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class PaiementstripeConfig(AppConfig): + name = 'PaiementStripe' diff --git a/DjangoFiles/PaiementStripe/migrations/__init__.py b/DjangoFiles/PaiementStripe/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/DjangoFiles/PaiementStripe/models.py b/DjangoFiles/PaiementStripe/models.py new file mode 100644 index 0000000..50299cb --- /dev/null +++ b/DjangoFiles/PaiementStripe/models.py @@ -0,0 +1,41 @@ +from django.db import models +import uuid +# Create your models here. + + +class Paiement_stripe(models.Model): + """ + La commande + """ + uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True, db_index=True) + + id_stripe = models.CharField(max_length=20, blank=True, null=True) + + order_date = models.DateTimeField(auto_now=True, verbose_name="Date") + + NON, OPEN, PENDING, PAID, VALID, CANCELED = 'N', 'O', 'W', 'P', 'V', 'C' + STATUT_CHOICES = ( + (NON, 'Lien de paiement non crée'), + (OPEN, 'Envoyée a Stripe'), + (PENDING, 'En attente de paiement'), + (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") + + # a remplir par default sur le front par User.email. + email_billet = models.CharField(max_length=30, verbose_name="Email de récéption des billets", blank=True) + + # def total(self): + # total = 0 + # for article in ArticleCommande.objects.filter(commande=self): + # total += article.total() + # + # return total + + def __str__(self): + return self.status + + + diff --git a/DjangoFiles/PaiementStripe/tests.py b/DjangoFiles/PaiementStripe/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/DjangoFiles/PaiementStripe/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/DjangoFiles/PaiementStripe/views.py b/DjangoFiles/PaiementStripe/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/DjangoFiles/PaiementStripe/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/DjangoFiles/QrcodeCashless/__init__.py b/DjangoFiles/QrcodeCashless/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/DjangoFiles/QrcodeCashless/admin.py b/DjangoFiles/QrcodeCashless/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/DjangoFiles/QrcodeCashless/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/DjangoFiles/QrcodeCashless/apps.py b/DjangoFiles/QrcodeCashless/apps.py new file mode 100644 index 0000000..ca31b20 --- /dev/null +++ b/DjangoFiles/QrcodeCashless/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class QrcodecashlessConfig(AppConfig): + name = 'QrcodeCashless' diff --git a/DjangoFiles/QrcodeCashless/migrations/__init__.py b/DjangoFiles/QrcodeCashless/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/DjangoFiles/QrcodeCashless/models.py b/DjangoFiles/QrcodeCashless/models.py new file mode 100644 index 0000000..63fd1c0 --- /dev/null +++ b/DjangoFiles/QrcodeCashless/models.py @@ -0,0 +1,27 @@ +from django.db import models + +# Create your models here. +from Customers.models import Client as Customers_Client + + +class CarteCashless(models.Model): + tag_id = models.CharField( + db_index=True, + max_length=8, + unique=True + ) + + uuid_qrcode = models.UUIDField( + blank=True, null=True, + verbose_name='Uuid', + ) + + number = models.CharField( + db_index=True, + max_length=8, + blank=True, + null=True, + unique=True + ) + + origine = models.ForeignKey(Customers_Client, on_delete=models.PROTECT) \ No newline at end of file diff --git a/DjangoFiles/QrcodeCashless/templates/RechargementWebUuid.html b/DjangoFiles/QrcodeCashless/templates/RechargementWebUuid.html new file mode 100644 index 0000000..268584b --- /dev/null +++ b/DjangoFiles/QrcodeCashless/templates/RechargementWebUuid.html @@ -0,0 +1,61 @@ + + +
+ +Rechargement Cashless {{ domain.capitalize }}
+{% if liste_assets %} +Disponible sur votre carte : + {% for asset in liste_assets %} +
{{ asset }}
+ {% endfor %} + +{% else %} +Votre carte est vide.
+{% endif %} +