Api création tarifs et events
This commit is contained in:
parent
9006da23d8
commit
4043bae575
|
|
@ -10,7 +10,7 @@ from django.utils.translation import gettext, gettext_lazy as _
|
||||||
from QrcodeCashless.models import Detail, CarteCashless
|
from QrcodeCashless.models import Detail, CarteCashless
|
||||||
|
|
||||||
|
|
||||||
# from boutique.models import Category, Product, Tag, VAT, Event, LandingPageContent, Billet
|
# from boutique.models import Category, Product, Tag, VAT, Event, LandingPageContent, TarifBillet
|
||||||
# from solo.admin import SingletonModelAdmin
|
# from solo.admin import SingletonModelAdmin
|
||||||
|
|
||||||
class PublicAdminSite(AdminSite):
|
class PublicAdminSite(AdminSite):
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ from django.contrib.auth.models import Group
|
||||||
from solo.admin import SingletonModelAdmin
|
from solo.admin import SingletonModelAdmin
|
||||||
|
|
||||||
from AuthBillet.models import HumanUser, SuperHumanUser, TermUser
|
from AuthBillet.models import HumanUser, SuperHumanUser, TermUser
|
||||||
from BaseBillet.models import Configuration, Event, OptionGenerale, Article, Billet, Reservation, LigneArticle
|
from BaseBillet.models import Configuration, Event, OptionGenerale, Article, TarifBillet, Reservation, LigneArticle
|
||||||
from django.contrib.auth.admin import UserAdmin
|
from django.contrib.auth.admin import UserAdmin
|
||||||
|
|
||||||
from Customers.models import Client
|
from Customers.models import Client
|
||||||
|
|
@ -213,7 +213,7 @@ staff_admin_site.register(LigneArticle, admin.ModelAdmin)
|
||||||
|
|
||||||
staff_admin_site.register(OptionGenerale, OptionGeneraleAdmin)
|
staff_admin_site.register(OptionGenerale, OptionGeneraleAdmin)
|
||||||
|
|
||||||
staff_admin_site.register(Billet, admin.ModelAdmin)
|
staff_admin_site.register(TarifBillet, admin.ModelAdmin)
|
||||||
|
|
||||||
|
|
||||||
class PaiementStripeAdmin(admin.ModelAdmin):
|
class PaiementStripeAdmin(admin.ModelAdmin):
|
||||||
|
|
|
||||||
|
|
@ -35,15 +35,3 @@ class Command(BaseCommand):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
tenant_raffinerie = Client.objects.get_or_create(schema_name="raffinerie",
|
|
||||||
name="raffinerie",
|
|
||||||
paid_until='2200-12-05',
|
|
||||||
on_trial=False)[0]
|
|
||||||
|
|
||||||
# Add one or more domains for the tenant
|
|
||||||
|
|
||||||
tenant_raffinerie_domain = Domain.objects.get_or_create(domain=f'raffinerie.{os.getenv("DOMAIN")}',
|
|
||||||
tenant=tenant_demo,
|
|
||||||
is_primary=True,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,76 @@
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from BaseBillet.models import Event
|
import json
|
||||||
|
from django.utils.translation import gettext, gettext_lazy as _
|
||||||
|
from rest_framework.generics import get_object_or_404
|
||||||
|
|
||||||
|
from BaseBillet.models import Event, TarifBillet
|
||||||
|
|
||||||
|
|
||||||
|
class TarifsSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = TarifBillet
|
||||||
|
fields = [
|
||||||
|
'uuid',
|
||||||
|
"name",
|
||||||
|
"prix",
|
||||||
|
"reservation_par_user_max",
|
||||||
|
]
|
||||||
|
extra_kwargs = {'event': {'required': False}}
|
||||||
|
|
||||||
|
|
||||||
|
class EventSerializer(serializers.ModelSerializer):
|
||||||
|
tarifs = TarifsSerializer(
|
||||||
|
many=True,
|
||||||
|
read_only=True
|
||||||
|
)
|
||||||
|
|
||||||
class EventSerializer(serializers.HyperlinkedModelSerializer):
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Event
|
model = Event
|
||||||
fields = [
|
fields = [
|
||||||
|
'uuid',
|
||||||
'name',
|
'name',
|
||||||
'short_description',
|
'short_description',
|
||||||
'long_description',
|
'long_description',
|
||||||
'datetime',
|
'datetime',
|
||||||
# 'billets',
|
'tarifs',
|
||||||
# 'articles',
|
'articles',
|
||||||
'img',
|
'img',
|
||||||
# 'reservations',
|
'reservations',
|
||||||
# 'complet',
|
'complet',
|
||||||
]
|
]
|
||||||
|
read_only_fields = ['reservations']
|
||||||
|
depth = 1
|
||||||
|
|
||||||
|
def validate(self, attrs):
|
||||||
|
|
||||||
|
tarifs = self.initial_data.get('tarifs')
|
||||||
|
if tarifs:
|
||||||
|
try:
|
||||||
|
tarifs_list = json.loads(tarifs)
|
||||||
|
except json.decoder.JSONDecodeError as e :
|
||||||
|
raise serializers.ValidationError(_(f'tarifs doit être un json valide : {e}'))
|
||||||
|
|
||||||
|
self.tarif_to_db = []
|
||||||
|
for tarif in tarifs_list:
|
||||||
|
self.tarif_to_db.append(get_object_or_404(TarifBillet, uuid=tarif.get('uuid')))
|
||||||
|
return super().validate(attrs)
|
||||||
|
else:
|
||||||
|
raise serializers.ValidationError(_('tarifs doit être un json valide'))
|
||||||
|
|
||||||
|
def save(self, **kwargs):
|
||||||
|
instance = super().save(**kwargs)
|
||||||
|
instance.tarifs.clear()
|
||||||
|
for tarif in self.tarif_to_db :
|
||||||
|
instance.tarifs.add(tarif)
|
||||||
|
return instance
|
||||||
|
|
||||||
|
'''
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"uuid": "37a1093f-565d-4b38-858d-680568269d43",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uuid": "94d36be2-9bb9-4aa6-ab60-fc76287a1290",
|
||||||
|
}
|
||||||
|
]
|
||||||
|
'''
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,8 @@ from ApiBillet import views as api_view
|
||||||
from rest_framework import routers
|
from rest_framework import routers
|
||||||
|
|
||||||
router = routers.DefaultRouter()
|
router = routers.DefaultRouter()
|
||||||
router.register(r'events', api_view.EventViewSet)
|
router.register(r'events', api_view.EventsViewSet, basename='event')
|
||||||
|
router.register(r'tarifs', api_view.TarifBilletViewSet, basename='billet')
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
from rest_framework import serializers
|
||||||
|
import json
|
||||||
|
|
||||||
|
from BaseBillet.models import Event, TarifBillet
|
||||||
|
|
||||||
|
class BilletSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = TarifBillet
|
||||||
|
fields = [
|
||||||
|
'uuid',
|
||||||
|
"name",
|
||||||
|
"prix",
|
||||||
|
"reservation_par_user_max",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class EventSerializer(serializers.ModelSerializer):
|
||||||
|
billets = BilletSerializer(
|
||||||
|
many=True,
|
||||||
|
read_only=True,
|
||||||
|
)
|
||||||
|
# billets = serializers.PrimaryKeyRelatedField(queryset=TarifBillet.objects.all(), many=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Event
|
||||||
|
fields = [
|
||||||
|
'uuid',
|
||||||
|
'name',
|
||||||
|
'short_description',
|
||||||
|
'long_description',
|
||||||
|
'datetime',
|
||||||
|
'billets',
|
||||||
|
# 'articles',
|
||||||
|
'img',
|
||||||
|
# 'reservations',
|
||||||
|
'complet',
|
||||||
|
]
|
||||||
|
# depth = 1
|
||||||
|
|
||||||
|
def save(self, **kwargs):
|
||||||
|
return super().save(**kwargs)
|
||||||
|
|
||||||
|
# def validate(self, value):
|
||||||
|
# pass
|
||||||
|
# billets = self.initial_data.get('billets')
|
||||||
|
# if billets:
|
||||||
|
# billets_list = json.loads(billets)
|
||||||
|
# billet_to_db = []
|
||||||
|
# for billet in billets_list :
|
||||||
|
# billet_to_db.append(billet.get('uuid'))
|
||||||
|
# value['billets'] = serializers.ManyRelatedField(queryset=TarifBillet.objects.filter(uuid__in=billet_to_db), many=True)
|
||||||
|
# return value
|
||||||
|
|
||||||
|
|
@ -1,10 +1,14 @@
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
|
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
from ApiBillet.serializers import EventSerializer
|
from rest_framework.generics import get_object_or_404
|
||||||
|
from rest_framework.response import Response
|
||||||
|
|
||||||
|
from ApiBillet.serializers import EventSerializer, TarifsSerializer
|
||||||
|
from AuthBillet.models import TenantAdminPermission
|
||||||
from Customers.models import Client, Domain
|
from Customers.models import Client, Domain
|
||||||
from BaseBillet.models import Event
|
from BaseBillet.models import Event, TarifBillet
|
||||||
from rest_framework import viewsets, permissions
|
from rest_framework import viewsets, permissions, status
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
|
@ -23,8 +27,75 @@ def new_tenants(schema_name):
|
||||||
|
|
||||||
return tenant, tenant_domain
|
return tenant, tenant_domain
|
||||||
|
|
||||||
|
class TarifBilletViewSet(viewsets.ViewSet):
|
||||||
|
def list(self, request):
|
||||||
|
queryset = TarifBillet.objects.all().order_by('prix')
|
||||||
|
serializer = TarifsSerializer(queryset, many=True, context={'request': request})
|
||||||
|
return Response(serializer.data)
|
||||||
|
|
||||||
|
def create(self, request):
|
||||||
|
serializer = TarifsSerializer(data=request.data)
|
||||||
|
if serializer.is_valid():
|
||||||
|
serializer.save()
|
||||||
|
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
||||||
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
def get_permissions(self):
|
||||||
|
"""
|
||||||
|
Instantiates and returns the list of permissions that this view requires.
|
||||||
|
"""
|
||||||
|
if self.action in ['list','retrieve']:
|
||||||
|
permission_classes = [permissions.AllowAny]
|
||||||
|
else:
|
||||||
|
permission_classes = [TenantAdminPermission]
|
||||||
|
return [permission() for permission in permission_classes]
|
||||||
|
|
||||||
|
class EventsViewSet(viewsets.ViewSet):
|
||||||
|
queryset = Event.objects.all().order_by('-datetime')
|
||||||
|
|
||||||
|
def list(self, request):
|
||||||
|
serializer = EventSerializer(self.queryset, many=True, context={'request': request})
|
||||||
|
return Response(serializer.data)
|
||||||
|
|
||||||
|
|
||||||
|
def retrieve(self, request, pk=None):
|
||||||
|
print(f"retrieve : {pk}")
|
||||||
|
event = get_object_or_404(self.queryset, pk=pk)
|
||||||
|
serializer = EventSerializer(event)
|
||||||
|
return Response(serializer.data)
|
||||||
|
|
||||||
|
def create(self, request):
|
||||||
|
serializer = EventSerializer(data=request.data)
|
||||||
|
if serializer.is_valid():
|
||||||
|
serializer.save()
|
||||||
|
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
||||||
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
def update(self, request, pk=None):
|
||||||
|
print(f"update : {pk}")
|
||||||
|
event = get_object_or_404(self.queryset, pk=pk)
|
||||||
|
print(event)
|
||||||
|
serializer = EventSerializer(event, data=request.data)
|
||||||
|
if serializer.is_valid(raise_exception=True):
|
||||||
|
# import ipdb; ipdb.set_trace()
|
||||||
|
serializer.save()
|
||||||
|
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
||||||
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
def destroy(self, request, pk=None):
|
||||||
|
event = get_object_or_404(self.queryset, pk=pk)
|
||||||
|
event.delete()
|
||||||
|
return Response(('deleted'), status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
def get_permissions(self):
|
||||||
|
"""
|
||||||
|
Instantiates and returns the list of permissions that this view requires.
|
||||||
|
"""
|
||||||
|
if self.action in ['list','retrieve']:
|
||||||
|
permission_classes = [permissions.AllowAny]
|
||||||
|
else:
|
||||||
|
permission_classes = [TenantAdminPermission]
|
||||||
|
return [permission() for permission in permission_classes]
|
||||||
|
|
||||||
class EventViewSet(viewsets.ModelViewSet):
|
class EventViewSet(viewsets.ModelViewSet):
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,19 @@ import uuid
|
||||||
from django.contrib.auth.models import AbstractUser, Group, Permission
|
from django.contrib.auth.models import AbstractUser, Group, Permission
|
||||||
from Customers.models import Client
|
from Customers.models import Client
|
||||||
from django.db import connection
|
from django.db import connection
|
||||||
|
from rest_framework import permissions
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class TenantAdminPermission(permissions.BasePermission):
|
||||||
|
message = 'No admin in tenant'
|
||||||
|
|
||||||
|
def has_permission(self, request, view):
|
||||||
|
if request.user.is_authenticated :
|
||||||
|
return bool((connection.tenant in request.user.client_admin.all() and request.user.is_staff) or request.user.is_superuser)
|
||||||
|
else :
|
||||||
|
return False
|
||||||
|
|
||||||
class TibilletManager(BaseUserManager):
|
class TibilletManager(BaseUserManager):
|
||||||
def _create_user(self, email, password, **extra_fields):
|
def _create_user(self, email, password, **extra_fields):
|
||||||
# import ipdb; ipdb.set_trace()
|
# import ipdb; ipdb.set_trace()
|
||||||
|
|
@ -14,7 +25,9 @@ class TibilletManager(BaseUserManager):
|
||||||
raise ValueError(_("email obligatoire"))
|
raise ValueError(_("email obligatoire"))
|
||||||
|
|
||||||
email = self.normalize_email(email)
|
email = self.normalize_email(email)
|
||||||
user = self.model(username=email, email=email, **extra_fields)
|
user = self.model(**extra_fields)
|
||||||
|
user.username = email
|
||||||
|
user.email = email
|
||||||
user.set_password(password)
|
user.set_password(password)
|
||||||
|
|
||||||
user.client_source = connection.tenant
|
user.client_source = connection.tenant
|
||||||
|
|
@ -50,11 +63,11 @@ class TibilletUser(AbstractUser):
|
||||||
|
|
||||||
uuid = models.UUIDField(default=uuid.uuid4, editable=False)
|
uuid = models.UUIDField(default=uuid.uuid4, editable=False)
|
||||||
|
|
||||||
USERNAME_FIELD = 'email'
|
# USERNAME_FIELD = 'email'
|
||||||
REQUIRED_FIELDS = [] # removes email from REQUIRED_FIELDS
|
# REQUIRED_FIELDS = [] # removes email from REQUIRED_FIELDS
|
||||||
|
|
||||||
email = models.EmailField(_('email'), unique=True) # changes email to unique and blank to false
|
email = models.EmailField(_('email'), unique=True) # changes email to unique and blank to false
|
||||||
username = models.CharField(max_length=200, null=True, blank=True)
|
username = models.CharField(max_length=200, unique=True)
|
||||||
phone = models.CharField(max_length=20, null=True, blank=True)
|
phone = models.CharField(max_length=20, null=True, blank=True)
|
||||||
|
|
||||||
TYPE_TERM, TYPE_HUM, TYPE_ANDR = 'TE', 'HU', 'AN'
|
TYPE_TERM, TYPE_HUM, TYPE_ANDR = 'TE', 'HU', 'AN'
|
||||||
|
|
|
||||||
|
|
@ -7,13 +7,35 @@ from rest_framework import status
|
||||||
from rest_framework.permissions import AllowAny
|
from rest_framework.permissions import AllowAny
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
from djoser.views import UserViewSet
|
from djoser.views import UserViewSet, TokenCreateView
|
||||||
import requests
|
import requests
|
||||||
from django.db import connection
|
from django.db import connection
|
||||||
from TiBillet import settings
|
from TiBillet import settings
|
||||||
|
from djoser.conf import settings as djoser_settings
|
||||||
|
|
||||||
from djoser import utils
|
from djoser import utils
|
||||||
User = get_user_model()
|
User = get_user_model()
|
||||||
|
|
||||||
|
class TokenCreateView_custom(TokenCreateView):
|
||||||
|
"""
|
||||||
|
Use this endpoint to obtain user authentication token.
|
||||||
|
"""
|
||||||
|
|
||||||
|
serializer_class = djoser_settings.SERIALIZERS.token_create
|
||||||
|
permission_classes = djoser_settings.PERMISSIONS.token_create
|
||||||
|
|
||||||
|
def _action(self, serializer):
|
||||||
|
token = utils.login_user(self.request, serializer.user)
|
||||||
|
token_serializer_class = djoser_settings.SERIALIZERS.token
|
||||||
|
|
||||||
|
# on modifie la creation du token pour rajouter access_token dans la réponse pour Postman
|
||||||
|
data_response = token_serializer_class(token).data
|
||||||
|
data_response['access_token'] = data_response.get('auth_token')
|
||||||
|
# import ipdb; ipdb.set_trace()
|
||||||
|
print(f'data_response {data_response}')
|
||||||
|
return Response(
|
||||||
|
data=data_response, status=status.HTTP_200_OK
|
||||||
|
)
|
||||||
|
|
||||||
class activate(APIView):
|
class activate(APIView):
|
||||||
permission_classes = [AllowAny]
|
permission_classes = [AllowAny]
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
# Generated by Django 2.2 on 2021-09-27 13:39
|
# Generated by Django 2.2 on 2021-10-23 09:56
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
|
|
@ -13,8 +13,9 @@ class Migration(migrations.Migration):
|
||||||
initial = True
|
initial = True
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('PaiementStripe', '0001_initial'),
|
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
('PaiementStripe', '0001_initial'),
|
||||||
|
('QrcodeCashless', '0002_cartecashless_user'),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
|
|
@ -33,27 +34,18 @@ class Migration(migrations.Migration):
|
||||||
('id_price_stripe', models.CharField(blank=True, max_length=30, null=True)),
|
('id_price_stripe', models.CharField(blank=True, max_length=30, null=True)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
|
||||||
name='Billet',
|
|
||||||
fields=[
|
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('name', models.CharField(blank=True, max_length=50, null=True)),
|
|
||||||
('prix', models.FloatField()),
|
|
||||||
('reservation_par_user_max', models.PositiveSmallIntegerField(default=6)),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Event',
|
name='Event',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
|
||||||
('name', models.CharField(max_length=200)),
|
('name', models.CharField(max_length=200)),
|
||||||
('short_description', models.CharField(max_length=250)),
|
('short_description', models.CharField(max_length=250)),
|
||||||
('long_description', models.TextField(blank=True, null=True)),
|
('long_description', models.TextField(blank=True, null=True)),
|
||||||
('datetime', models.DateTimeField()),
|
('datetime', models.DateTimeField()),
|
||||||
('img', stdimage.models.StdImageField(blank=True, null=True, upload_to='images/', validators=[stdimage.validators.MaxSizeValidator(1920, 1920)])),
|
('img', stdimage.models.StdImageField(upload_to='images/', validators=[stdimage.validators.MaxSizeValidator(1920, 1920)])),
|
||||||
('reservations', models.PositiveSmallIntegerField(default=0)),
|
('reservations', models.PositiveSmallIntegerField(default=0)),
|
||||||
('articles', models.ManyToManyField(to='BaseBillet.Article')),
|
('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")),
|
||||||
('billets', models.ManyToManyField(to='BaseBillet.Billet')),
|
('articles', models.ManyToManyField(blank=True, to='BaseBillet.Article')),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'verbose_name': 'Evenement',
|
'verbose_name': 'Evenement',
|
||||||
|
|
@ -64,7 +56,7 @@ class Migration(migrations.Migration):
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='OptionGenerale',
|
name='OptionGenerale',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
|
||||||
('name', models.CharField(max_length=30)),
|
('name', models.CharField(max_length=30)),
|
||||||
('poids', models.PositiveSmallIntegerField(default=0, verbose_name='Poids')),
|
('poids', models.PositiveSmallIntegerField(default=0, verbose_name='Poids')),
|
||||||
],
|
],
|
||||||
|
|
@ -75,20 +67,18 @@ class Migration(migrations.Migration):
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='TarifsAdhesion',
|
name='TarifBillet',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
|
||||||
('name', models.CharField(max_length=30)),
|
('name', models.CharField(blank=True, max_length=50, null=True)),
|
||||||
('tarif', models.FloatField()),
|
('prix', models.FloatField()),
|
||||||
|
('reservation_par_user_max', models.PositiveSmallIntegerField(default=6)),
|
||||||
],
|
],
|
||||||
options={
|
|
||||||
'ordering': ('-tarif',),
|
|
||||||
},
|
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='VAT',
|
name='VAT',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
|
||||||
('percent', models.FloatField(verbose_name='Taux de TVA (%)')),
|
('percent', models.FloatField(verbose_name='Taux de TVA (%)')),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
|
|
@ -111,14 +101,19 @@ class Migration(migrations.Migration):
|
||||||
fields=[
|
fields=[
|
||||||
('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, primary_key=True, serialize=False)),
|
('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, primary_key=True, serialize=False)),
|
||||||
('qty', models.SmallIntegerField()),
|
('qty', models.SmallIntegerField()),
|
||||||
('reste', models.SmallIntegerField()),
|
|
||||||
('datetime', models.DateTimeField(auto_now=True)),
|
('datetime', models.DateTimeField(auto_now=True)),
|
||||||
('article', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Article')),
|
('article', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Article')),
|
||||||
('billet', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Billet')),
|
('billet', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.TarifBillet')),
|
||||||
|
('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')),
|
('paiement_stripe', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='PaiementStripe.Paiement_stripe')),
|
||||||
('reservation', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation')),
|
('reservation', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='BaseBillet.Reservation')),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='event',
|
||||||
|
name='tarifs',
|
||||||
|
field=models.ManyToManyField(to='BaseBillet.TarifBillet'),
|
||||||
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Configuration',
|
name='Configuration',
|
||||||
fields=[
|
fields=[
|
||||||
|
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
# Generated by Django 2.2 on 2021-09-27 13:59
|
|
||||||
|
|
||||||
from django.db import migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('BaseBillet', '0001_initial'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.RemoveField(
|
|
||||||
model_name='lignearticle',
|
|
||||||
name='reste',
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
# Generated by Django 2.2 on 2021-09-27 14:24
|
|
||||||
|
|
||||||
from django.db import migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('BaseBillet', '0002_remove_lignearticle_reste'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.DeleteModel(
|
|
||||||
name='TarifsAdhesion',
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
# Generated by Django 2.2 on 2021-09-30 08:15
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('QrcodeCashless', '0002_cartecashless_user'),
|
|
||||||
('BaseBillet', '0003_delete_tarifsadhesion'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='lignearticle',
|
|
||||||
name='carte',
|
|
||||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='QrcodeCashless.CarteCashless'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
@ -19,6 +19,7 @@ import stripe
|
||||||
|
|
||||||
|
|
||||||
class OptionGenerale(models.Model):
|
class OptionGenerale(models.Model):
|
||||||
|
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True, db_index=True)
|
||||||
name = models.CharField(max_length=30)
|
name = models.CharField(max_length=30)
|
||||||
poids = models.PositiveSmallIntegerField(default=0, verbose_name=_("Poids"))
|
poids = models.PositiveSmallIntegerField(default=0, verbose_name=_("Poids"))
|
||||||
|
|
||||||
|
|
@ -41,7 +42,6 @@ def poids_option_generale(sender, instance: OptionGenerale, created, **kwargs):
|
||||||
instance.save()
|
instance.save()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Configuration(SingletonModel):
|
class Configuration(SingletonModel):
|
||||||
organisation = models.CharField(max_length=50)
|
organisation = models.CharField(max_length=50)
|
||||||
short_description = models.CharField(max_length=250)
|
short_description = models.CharField(max_length=250)
|
||||||
|
|
@ -119,7 +119,8 @@ class Configuration(SingletonModel):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class Billet(models.Model):
|
class TarifBillet(models.Model):
|
||||||
|
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True, db_index=True)
|
||||||
name = models.CharField(max_length=50,
|
name = models.CharField(max_length=50,
|
||||||
blank=True, null=True)
|
blank=True, null=True)
|
||||||
prix = models.FloatField()
|
prix = models.FloatField()
|
||||||
|
|
@ -137,6 +138,7 @@ class VAT(models.Model):
|
||||||
"""
|
"""
|
||||||
Les différents taux de TVA sont associés à des produits.
|
Les différents taux de TVA sont associés à des produits.
|
||||||
"""
|
"""
|
||||||
|
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True, db_index=True)
|
||||||
percent = models.FloatField(verbose_name="Taux de TVA (%)")
|
percent = models.FloatField(verbose_name="Taux de TVA (%)")
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
@ -253,15 +255,15 @@ class Article(models.Model):
|
||||||
|
|
||||||
|
|
||||||
class Event(models.Model):
|
class Event(models.Model):
|
||||||
|
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True, db_index=True)
|
||||||
name = models.CharField(max_length=200)
|
name = models.CharField(max_length=200)
|
||||||
short_description = models.CharField(max_length=250)
|
short_description = models.CharField(max_length=250)
|
||||||
long_description = models.TextField(blank=True, null=True)
|
long_description = models.TextField(blank=True, null=True)
|
||||||
datetime = models.DateTimeField()
|
datetime = models.DateTimeField()
|
||||||
billets = models.ManyToManyField(Billet)
|
tarifs = models.ManyToManyField(TarifBillet)
|
||||||
articles = models.ManyToManyField(Article)
|
articles = models.ManyToManyField(Article, blank=True)
|
||||||
|
|
||||||
img = StdImageField(upload_to='images/',
|
img = StdImageField(upload_to='images/',
|
||||||
null=True, blank=True,
|
|
||||||
validators=[MaxSizeValidator(1920, 1920)],
|
validators=[MaxSizeValidator(1920, 1920)],
|
||||||
variations={
|
variations={
|
||||||
'fhd': (1920, 1920),
|
'fhd': (1920, 1920),
|
||||||
|
|
@ -273,6 +275,20 @@ class Event(models.Model):
|
||||||
|
|
||||||
reservations = models.PositiveSmallIntegerField(default=0)
|
reservations = models.PositiveSmallIntegerField(default=0)
|
||||||
|
|
||||||
|
CONCERT = "LIV"
|
||||||
|
FESTIVAL = "FES"
|
||||||
|
REUNION = "REU"
|
||||||
|
CONFERENCE = "CON"
|
||||||
|
TYPE_CHOICES = [
|
||||||
|
(CONCERT, _('Concert')),
|
||||||
|
(FESTIVAL, _('Festival')),
|
||||||
|
(REUNION, _('Réunion')),
|
||||||
|
(CONFERENCE, _('Conférence')),
|
||||||
|
]
|
||||||
|
|
||||||
|
categorie = models.CharField(max_length=3, choices=TYPE_CHOICES, default=CONCERT,
|
||||||
|
verbose_name=_("Catégorie d'évènement"))
|
||||||
|
|
||||||
def complet(self):
|
def complet(self):
|
||||||
# TODO: Benchmarker et tester si c'est pas mieux dans template
|
# TODO: Benchmarker et tester si c'est pas mieux dans template
|
||||||
if self.reservations >= Configuration.get_solo().jauge_max:
|
if self.reservations >= Configuration.get_solo().jauge_max:
|
||||||
|
|
@ -352,7 +368,7 @@ class LigneArticle(models.Model):
|
||||||
reservation = models.ForeignKey(Reservation, on_delete=models.CASCADE, blank=True, null=True)
|
reservation = models.ForeignKey(Reservation, on_delete=models.CASCADE, blank=True, null=True)
|
||||||
article = models.ForeignKey(Article, on_delete=models.CASCADE, blank=True, null=True)
|
article = models.ForeignKey(Article, on_delete=models.CASCADE, blank=True, null=True)
|
||||||
carte = models.ForeignKey(CarteCashless, on_delete=models.PROTECT, blank=True, null=True)
|
carte = models.ForeignKey(CarteCashless, on_delete=models.PROTECT, blank=True, null=True)
|
||||||
billet = models.ForeignKey(Billet, on_delete=models.CASCADE, blank=True, null=True)
|
billet = models.ForeignKey(TarifBillet, on_delete=models.CASCADE, blank=True, null=True)
|
||||||
qty = models.SmallIntegerField()
|
qty = models.SmallIntegerField()
|
||||||
paiement_stripe = models.ForeignKey(Paiement_stripe, on_delete=models.PROTECT, blank=True, null=True)
|
paiement_stripe = models.ForeignKey(Paiement_stripe, on_delete=models.PROTECT, blank=True, null=True)
|
||||||
datetime = models.DateTimeField(auto_now=True)
|
datetime = models.DateTimeField(auto_now=True)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from BaseBillet.models import OptionGenerale, Configuration, Event, Article, Billet
|
from BaseBillet.models import OptionGenerale, Configuration, Event, Article, TarifBillet
|
||||||
|
|
||||||
|
|
||||||
class ReservationValidator(serializers.Serializer):
|
class ReservationValidator(serializers.Serializer):
|
||||||
|
|
@ -25,7 +25,7 @@ class ReservationValidator(serializers.Serializer):
|
||||||
|
|
||||||
def validate_billets(self, value):
|
def validate_billets(self, value):
|
||||||
value_dict = {}
|
value_dict = {}
|
||||||
billet_obj = Billet.objects.all()
|
billet_obj = TarifBillet.objects.all()
|
||||||
for couple in value:
|
for couple in value:
|
||||||
pk, qty = billet_obj.get(pk=couple.split(',')[0]), int(couple.split(',')[1])
|
pk, qty = billet_obj.get(pk=couple.split(',')[0]), int(couple.split(',')[1])
|
||||||
value_dict[pk] = qty
|
value_dict[pk] = qty
|
||||||
|
|
|
||||||
|
|
@ -77,9 +77,13 @@ def creation_de_la_reservation(user: TibilletUser, event: Event, data):
|
||||||
|
|
||||||
return reservation
|
return reservation
|
||||||
|
|
||||||
|
|
||||||
|
#Modèle MVC
|
||||||
class event(APIView):
|
class event(APIView):
|
||||||
permission_classes = [AllowAny]
|
permission_classes = [AllowAny]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def get(self, request, id):
|
def get(self, request, id):
|
||||||
event = get_object_or_404(Event, pk=id)
|
event = get_object_or_404(Event, pk=id)
|
||||||
configuration = Configuration.get_solo()
|
configuration = Configuration.get_solo()
|
||||||
|
|
|
||||||
|
|
@ -16,11 +16,14 @@ Including another URLconf
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.urls import path, include, re_path
|
from django.urls import path, include, re_path
|
||||||
from Administration.admin_public import public_admin_site
|
from Administration.admin_public import public_admin_site
|
||||||
|
# on modifie la creation du token pour rajouter access_token dans la réponse pour Postman
|
||||||
|
# from AuthBillet.views import TokenCreateView_custom
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('jet/', include('jet.urls', 'jet')), # Django JET URLS
|
path('jet/', include('jet.urls', 'jet')), # Django JET URLS
|
||||||
re_path(r'^jet/dashboard/', include('jet.dashboard.urls', 'jet-dashboard')), # Django JET dashboard URLS
|
re_path(r'^jet/dashboard/', include('jet.dashboard.urls', 'jet-dashboard')), # Django JET dashboard URLS
|
||||||
|
# on modifie la creation du token pour rajouter access_token dans la réponse pour Postman
|
||||||
|
# re_path(r"^auth/token/login/?$", TokenCreateView_custom.as_view(), name="login"),
|
||||||
re_path(r'^auth/', include('djoser.urls')),
|
re_path(r'^auth/', include('djoser.urls')),
|
||||||
path('admin/', public_admin_site.urls, name="public_admin_url"),
|
path('admin/', public_admin_site.urls, name="public_admin_url"),
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,8 @@ from django.conf.urls.static import static
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from Administration.admin_tenant import staff_admin_site
|
from Administration.admin_tenant import staff_admin_site
|
||||||
|
|
||||||
|
# on modifie la creation du token pour rajouter access_token dans la réponse pour Postman
|
||||||
|
from AuthBillet.views import TokenCreateView_custom
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('jet/', include('jet.urls', 'jet')), # Django JET URLS
|
path('jet/', include('jet.urls', 'jet')), # Django JET URLS
|
||||||
|
|
@ -26,6 +28,9 @@ urlpatterns = [
|
||||||
# path('admin/', staff_admin_site.urls, name="staff_admin_site"),
|
# path('admin/', staff_admin_site.urls, name="staff_admin_site"),
|
||||||
re_path(r'^admin\/{0,}', staff_admin_site.urls, name="staff_admin_site"),
|
re_path(r'^admin\/{0,}', staff_admin_site.urls, name="staff_admin_site"),
|
||||||
|
|
||||||
|
# on modifie la creation du token pour rajouter access_token dans la réponse pour Postman
|
||||||
|
re_path(r"^auth/token/login/?$", TokenCreateView_custom.as_view(), name="login"),
|
||||||
|
|
||||||
re_path(r'^auth/', include('djoser.urls')),
|
re_path(r'^auth/', include('djoser.urls')),
|
||||||
re_path(r'^auth/', include('djoser.urls.authtoken')),
|
re_path(r'^auth/', include('djoser.urls.authtoken')),
|
||||||
re_path(r'^auth/', include('djoser.urls.jwt')),
|
re_path(r'^auth/', include('djoser.urls.jwt')),
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,11 @@ docker exec -ti tibillet_django bash
|
||||||
python manage.py migrate
|
python manage.py migrate
|
||||||
|
|
||||||
# Populate the database with example
|
# Populate the database with example
|
||||||
python manage.py create_demo_tenant
|
python manage.py createdemo
|
||||||
|
|
||||||
|
# Create the root user
|
||||||
|
python manage.py create_tenant_superuser
|
||||||
|
-> public
|
||||||
|
|
||||||
# Launch the http dev' server ( for production, see the Django & gunicorn doc )
|
# Launch the http dev' server ( for production, see the Django & gunicorn doc )
|
||||||
python /DjangoFiles/manage.py runserver_plus 0.0.0.0:8002
|
python /DjangoFiles/manage.py runserver_plus 0.0.0.0:8002
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue