From 1c08754905c90b750d63d5fef448afeaf6f22bbb Mon Sep 17 00:00:00 2001 From: Jonas Legion Date: Tue, 29 Jun 2021 16:34:51 +0200 Subject: [PATCH] =?UTF-8?q?cr=C3=A9ation=20d'evenements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DjangoFiles/Administration/admin_public.py | 1 + DjangoFiles/Administration/admin_tenant.py | 23 +- DjangoFiles/AuthBillet/email.py | 10 +- DjangoFiles/AuthBillet/models.py | 1 + DjangoFiles/AuthBillet/urls.py | 7 + DjangoFiles/AuthBillet/views.py | 13 + DjangoFiles/BaseBillet/models.py | 103 +++++++- .../templates/html5up-massively/base.html | 95 ++++--- .../templates/html5up-massively/event.html | 233 ++++++++++-------- DjangoFiles/BaseBillet/validator.py | 36 ++- DjangoFiles/BaseBillet/views.py | 116 ++++++++- .../migrations/0003_auto_20210623_1351.py | 29 +++ DjangoFiles/TiBillet/urls_tenants.py | 2 + 13 files changed, 483 insertions(+), 186 deletions(-) create mode 100644 DjangoFiles/AuthBillet/urls.py create mode 100644 DjangoFiles/Customers/migrations/0003_auto_20210623_1351.py diff --git a/DjangoFiles/Administration/admin_public.py b/DjangoFiles/Administration/admin_public.py index 9ecc1d1..98d8754 100644 --- a/DjangoFiles/Administration/admin_public.py +++ b/DjangoFiles/Administration/admin_public.py @@ -53,6 +53,7 @@ class UserAdminTibillet(UserAdmin): 'first_name', 'last_name', 'email', + 'phone', 'client_source', 'client_admin', 'client_achat', diff --git a/DjangoFiles/Administration/admin_tenant.py b/DjangoFiles/Administration/admin_tenant.py index 61a0e19..a843b11 100644 --- a/DjangoFiles/Administration/admin_tenant.py +++ b/DjangoFiles/Administration/admin_tenant.py @@ -4,7 +4,7 @@ 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 +from BaseBillet.models import Configuration, Event, OptionGenerale, Article, Billet, Reservation, LigneArticle from django.contrib.auth.admin import UserAdmin from Customers.models import Client @@ -124,4 +124,25 @@ class OptionGeneraleAdmin(admin.ModelAdmin): 'poids', ) +class ReservationAdmin(admin.ModelAdmin): + list_display = ( + 'user_mail', + 'total_billet', + '_options_', + 'total_prix', + 'status' + ) + readonly_fields = list_display + +staff_admin_site.register(Reservation, ReservationAdmin) + + staff_admin_site.register(OptionGenerale, OptionGeneraleAdmin) + +staff_admin_site.register(Billet, admin.ModelAdmin) +staff_admin_site.register(Article, admin.ModelAdmin) + + + + +staff_admin_site.register(LigneArticle, admin.ModelAdmin) diff --git a/DjangoFiles/AuthBillet/email.py b/DjangoFiles/AuthBillet/email.py index d0f349b..faa369b 100644 --- a/DjangoFiles/AuthBillet/email.py +++ b/DjangoFiles/AuthBillet/email.py @@ -1,11 +1,11 @@ from django.contrib.auth.tokens import default_token_generator from rest_framework import serializers from templated_mail.mail import BaseEmailMessage +from django.utils.translation import ugettext_lazy as _ from djoser import utils from djoser.conf import settings -from BaseBillet.models import Configuration class ActivationEmail(BaseEmailMessage): @@ -28,9 +28,8 @@ class ActivationEmail(BaseEmailMessage): return context def send(self, to, *args, **kwargs): - configuration = Configuration.get_solo() - if not configuration.email : - return serializers.ValidationError(_(f"Manque l'email de la structure. Merci de configurer votre instance.")) + + from_email = kwargs.get('from_email', 'contact@tibillet.re') self.render() @@ -39,11 +38,12 @@ class ActivationEmail(BaseEmailMessage): self.bcc = kwargs.pop('bcc', []) self.reply_to = kwargs.pop('reply_to', []) self.from_email = kwargs.pop( - 'from_email', configuration.email + 'from_email', from_email ) # import ipdb; ipdb.set_trace() mail_send = super(BaseEmailMessage, self).send(*args, **kwargs) + print(f'mail_send to {self.to} from {self.from_email} : {mail_send}') diff --git a/DjangoFiles/AuthBillet/models.py b/DjangoFiles/AuthBillet/models.py index a344fb6..b08b4c1 100644 --- a/DjangoFiles/AuthBillet/models.py +++ b/DjangoFiles/AuthBillet/models.py @@ -53,6 +53,7 @@ class TibilletUser(AbstractUser): email = models.EmailField(_('email'), unique=True) # changes email to unique and blank to false username = models.CharField(max_length=200, null=True, blank=True) + phone = models.CharField(max_length=20, null=True, blank=True) TYPE_TERM, TYPE_HUM, TYPE_ANDR = 'TE', 'HU', 'AN' ESPECE_CHOICES = ( diff --git a/DjangoFiles/AuthBillet/urls.py b/DjangoFiles/AuthBillet/urls.py new file mode 100644 index 0000000..393c3c8 --- /dev/null +++ b/DjangoFiles/AuthBillet/urls.py @@ -0,0 +1,7 @@ +from django.urls import include, path, re_path + +from AuthBillet import views as auth_view + +urlpatterns = [ + re_path('activate//', auth_view.activate.as_view()), +] \ No newline at end of file diff --git a/DjangoFiles/AuthBillet/views.py b/DjangoFiles/AuthBillet/views.py index 91ea44a..4f54cda 100644 --- a/DjangoFiles/AuthBillet/views.py +++ b/DjangoFiles/AuthBillet/views.py @@ -1,3 +1,16 @@ from django.shortcuts import render # Create your views here. +from rest_framework import status +from rest_framework.permissions import AllowAny +from rest_framework.response import Response +from rest_framework.views import APIView + + +class activate(APIView): + permission_classes = [AllowAny] + + def get(self, uid, token): + print(uid, token) + + return Response(f'{uid} {token}', status=status.HTTP_200_OK) \ No newline at end of file diff --git a/DjangoFiles/BaseBillet/models.py b/DjangoFiles/BaseBillet/models.py index ef6bc40..b38d42c 100644 --- a/DjangoFiles/BaseBillet/models.py +++ b/DjangoFiles/BaseBillet/models.py @@ -1,3 +1,6 @@ +import uuid + +from django.contrib.auth import get_user_model from django.db import models # Create your models here. @@ -8,6 +11,8 @@ from django.utils.translation import ugettext_lazy as _ from stdimage import StdImageField from stdimage.validators import MaxSizeValidator +from TiBillet import settings + class OptionGenerale(models.Model): name = models.CharField(max_length=30) @@ -60,8 +65,6 @@ class Configuration(SingletonModel): mollie_api_key = models.CharField(max_length=50, blank=True, null=True) - reservation_par_user_max = models.PositiveSmallIntegerField(default=6) - jauge_max = models.PositiveSmallIntegerField(default=50) option_generale_radio = models.ManyToManyField(OptionGenerale, @@ -73,11 +76,42 @@ class Configuration(SingletonModel): related_name="checkbox") +class Billet(models.Model): + name = models.CharField(max_length=50, + blank=True, null=True) + prix = models.FloatField() + + reservation_par_user_max = models.PositiveSmallIntegerField(default=6) + + def range_max(self): + return range(self.reservation_par_user_max + 1) + + def __str__(self): + return f"{self.name}" + + +class Article(models.Model): + name = models.CharField(max_length=50, + blank=True, null=True) + prix = models.FloatField() + stock = models.SmallIntegerField(blank=True, null=True) + + reservation_par_user_max = models.PositiveSmallIntegerField(default=10) + + def range_max(self): + return range(self.reservation_par_user_max + 1) + + def __str__(self): + return f"{self.name}" + + class Event(models.Model): name = models.CharField(max_length=200) short_description = models.CharField(max_length=250) long_description = models.TextField(blank=True, null=True) datetime = models.DateTimeField() + billets = models.ManyToManyField(Billet) + articles = models.ManyToManyField(Article) img = StdImageField(upload_to='images/', null=True, blank=True, @@ -105,19 +139,74 @@ class Event(models.Model): verbose_name_plural = _('Evenements') -class reservation(models.Model): +class Reservation(models.Model): + uuid = models.UUIDField(primary_key=True, db_index=True, default=uuid.uuid4) + + user_commande = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT) + event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name="reservation") - ANNULEE, NON_VALIDEE, VALIDEE, PAYEE = 'NAN', 'NOV', 'VAL', 'PAY' + ANNULEE, MAIL_NON_VALIDEE, NON_PAYEE, VALIDEE, PAYEE = 'NAN', 'MNV', 'NPA', 'VAL', 'PAY' TYPE_CHOICES = [ (ANNULEE, _('Annulée')), - (NON_VALIDEE, _('Email non validé')), + (MAIL_NON_VALIDEE, _('Email non validé')), + (NON_PAYEE, _('Non payée')), (VALIDEE, _('Validée')), (PAYEE, _('Payée')), ] - status = models.CharField(max_length=3, choices=TYPE_CHOICES, default=NON_VALIDEE, + + status = models.CharField(max_length=3, choices=TYPE_CHOICES, default=NON_PAYEE, verbose_name=_("Status de la réservation")) - qty = models.IntegerField() + options = models.ManyToManyField(OptionGenerale) + + def __str__(self): + return self.user_commande.email + + def user_mail(self): + return self.user_commande.email + + def total_billet(self): + total = 0 + for ligne in self.lignearticle_set.all(): + if ligne.billet: + total += ligne.qty + return total + + def total_prix(self): + total = 0 + for ligne in self.lignearticle_set.all(): + if ligne.article : + total += ligne.qty * ligne.article.prix + if ligne.billet : + total += ligne.qty * ligne.billet.prix + + return total + + def _options_(self): + 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): + if created: + if not instance.user_commande.is_active : + instance.status = instance.MAIL_NON_VALIDEE + instance.save() + + + +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") + 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() + + 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/BaseBillet/templates/html5up-massively/base.html b/DjangoFiles/BaseBillet/templates/html5up-massively/base.html index 1af39fe..95afda8 100644 --- a/DjangoFiles/BaseBillet/templates/html5up-massively/base.html +++ b/DjangoFiles/BaseBillet/templates/html5up-massively/base.html @@ -1,27 +1,27 @@ {% block header %} - - - - - {{ configuration.organisation }} - - - {% load static %} - - + + + + + {{ configuration.organisation }} + + + {% load static %} + + - {# #} - + {# #} + {% endblock header %} @@ -31,23 +31,22 @@ {% block footer %} - + - {#
#} - {# #} - {#
#} + {#
#} + {# #} + {#
#} -