222 lines
8.3 KiB
Python
222 lines
8.3 KiB
Python
# Create your views here.
|
|
import json
|
|
|
|
import requests
|
|
from django.contrib import messages
|
|
from django.http import HttpResponseRedirect
|
|
from django.utils import timezone
|
|
from django_weasyprint import WeasyTemplateView
|
|
from rest_framework.generics import get_object_or_404
|
|
from rest_framework.permissions import AllowAny
|
|
from rest_framework.response import Response
|
|
|
|
from ApiBillet.serializers import EventSerializer, PriceSerializer, ProductSerializer, ReservationSerializer, \
|
|
ReservationValidator
|
|
from AuthBillet.models import TenantAdminPermission
|
|
from Customers.models import Client, Domain
|
|
from BaseBillet.models import Event, Price, Product, Reservation, Configuration, Ticket
|
|
from rest_framework import viewsets, permissions, status
|
|
|
|
import os
|
|
import logging
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def new_tenants(schema_name):
|
|
tenant = Client.objects.get_or_create(schema_name=schema_name,
|
|
name=schema_name,
|
|
paid_until='2200-12-05',
|
|
on_trial=False)[0]
|
|
|
|
tenant_domain = Domain.objects.get_or_create(domain=f'{schema_name}.{os.getenv("DOMAIN")}',
|
|
tenant=tenant,
|
|
is_primary=True,
|
|
)
|
|
|
|
return tenant, tenant_domain
|
|
|
|
|
|
class TarifBilletViewSet(viewsets.ViewSet):
|
|
def list(self, request):
|
|
queryset = Price.objects.all().order_by('prix')
|
|
serializer = PriceSerializer(queryset, many=True, context={'request': request})
|
|
return Response(serializer.data)
|
|
|
|
def create(self, request):
|
|
serializer = PriceSerializer(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):
|
|
if self.action in ['list', 'retrieve']:
|
|
permission_classes = [permissions.AllowAny]
|
|
else:
|
|
permission_classes = [TenantAdminPermission]
|
|
return [permission() for permission in permission_classes]
|
|
|
|
|
|
class ProductViewSet(viewsets.ViewSet):
|
|
|
|
def list(self, request):
|
|
serializer = ProductSerializer(Product.objects.all(), many=True, context={'request': request})
|
|
print(serializer.data)
|
|
return Response(serializer.data)
|
|
|
|
def create(self, request):
|
|
serializer = ProductSerializer(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):
|
|
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):
|
|
|
|
def list(self, request):
|
|
queryset = Event.objects.all().order_by('-datetime')
|
|
serializer = EventSerializer(queryset, many=True, context={'request': request})
|
|
return Response(serializer.data)
|
|
|
|
def retrieve(self, request, pk=None):
|
|
queryset = Event.objects.all().order_by('-datetime')
|
|
event = get_object_or_404(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):
|
|
queryset = Event.objects.all().order_by('-datetime')
|
|
print(f"update : {pk}")
|
|
event = get_object_or_404(queryset, pk=pk)
|
|
print(event)
|
|
serializer = EventSerializer(event, data=request.data)
|
|
if serializer.is_valid(raise_exception=True):
|
|
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):
|
|
queryset = Event.objects.all().order_by('-datetime')
|
|
event = get_object_or_404(queryset, pk=pk)
|
|
event.delete()
|
|
return Response(('deleted'), status=status.HTTP_200_OK)
|
|
|
|
def get_permissions(self):
|
|
if self.action in ['list', 'retrieve']:
|
|
permission_classes = [permissions.AllowAny]
|
|
else:
|
|
permission_classes = [TenantAdminPermission]
|
|
return [permission() for permission in permission_classes]
|
|
|
|
|
|
class ReservationViewset(viewsets.ViewSet):
|
|
def list(self, request):
|
|
queryset = Reservation.objects.all().order_by('-datetime')
|
|
serializer = ReservationSerializer(queryset, many=True, context={'request': request})
|
|
return Response(serializer.data)
|
|
|
|
def create(self, request):
|
|
print(request.data)
|
|
validator = ReservationValidator(data=request.data, context={'request': request})
|
|
if validator.is_valid():
|
|
# serializer.save()
|
|
return Response(validator.data, status=status.HTTP_201_CREATED)
|
|
return Response(validator.errors, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
def get_permissions(self):
|
|
permission_classes = [TenantAdminPermission]
|
|
return [permission() for permission in permission_classes]
|
|
|
|
|
|
class Membership(viewsets.ViewSet):
|
|
|
|
def send_mail_to_cashless_for_membership(request, data: dict, carte: any):
|
|
sess = requests.Session()
|
|
configuration = Configuration.get_solo()
|
|
|
|
r = sess.post(
|
|
f'{configuration.server_cashless}/api/billetterie_qrcode_adhesion',
|
|
headers={
|
|
'Authorization': f'Api-Key {configuration.key_cashless}'
|
|
},
|
|
data={
|
|
'prenom': data.get('prenom'),
|
|
'name': data.get('name'),
|
|
'email': data.get('email'),
|
|
'tel': data.get('tel'),
|
|
'uuid_carte': carte.uuid,
|
|
})
|
|
|
|
sess.close()
|
|
|
|
# nouveau membre crée avec uniquement l'email on demande la suite.
|
|
# HTTP_202_ACCEPTED
|
|
# HTTP_201_CREATED
|
|
if r.status_code in (201, 204):
|
|
messages.success(request, f"{data.get('email')}", extra_tags='email')
|
|
return HttpResponseRedirect(f'#demande_nom_prenom_tel')
|
|
|
|
# partial information :
|
|
elif r.status_code == 206:
|
|
partial = json.loads(r.text)
|
|
messages.success(request, f"{data.get('email')}", extra_tags='email')
|
|
if partial.get('name'):
|
|
messages.success(request, f"Email déja connu. Name déja connu", extra_tags='name')
|
|
if partial.get('prenom'):
|
|
messages.success(request, f"Email déja connu. prenom déja connu", extra_tags='prenom')
|
|
if partial.get('tel'):
|
|
messages.success(request, f"Email déja connu. tel déja connu", extra_tags='tel')
|
|
return HttpResponseRedirect(f'#demande_nom_prenom_tel')
|
|
|
|
# nouveau membre crée, on demande la suite.
|
|
elif r.status_code == 202:
|
|
messages.success(request, f"Carte liée au membre {data.get('email')}")
|
|
return HttpResponseRedirect(f'#adhesionsuccess')
|
|
|
|
else:
|
|
messages.error(request, f'Erreur {r.status_code} {r.text}')
|
|
return HttpResponseRedirect(f'#erreur')
|
|
|
|
|
|
class TicketPdf(WeasyTemplateView):
|
|
permission_classes = [AllowAny]
|
|
template_name = 'ticket/ticket.html'
|
|
|
|
def get_context_data(self, pk_uuid, **kwargs):
|
|
logger.info(f"{timezone.now()} création de pdf demandé. uuid : {pk_uuid}")
|
|
|
|
self.config = Configuration.get_solo()
|
|
ticket: Ticket = get_object_or_404(Ticket, uuid=pk_uuid)
|
|
kwargs['ticket'] = ticket
|
|
kwargs['config'] = self.config
|
|
|
|
'''
|
|
context = {
|
|
'ticket': ticket,
|
|
'config': config,
|
|
}
|
|
'''
|
|
|
|
self.pdf_filename = ticket.pdf_filename()
|
|
return kwargs
|
|
|
|
def get_pdf_filename(self, **kwargs):
|
|
return self.pdf_filename
|
|
|
|
#
|