Add Purchases and tournament payments

clubs
Laurent 2 years ago
parent cc3059b9ed
commit 37c6d121a3
  1. 1
      padelclub_backend/urls.py
  2. 8
      tournaments/admin.py
  3. 26
      tournaments/migrations/0026_purchase.py
  4. 18
      tournaments/migrations/0027_tournament_payment.py
  5. 23
      tournaments/migrations/0028_rename_productid_purchase_product_id_and_more.py
  6. 3
      tournaments/models/__init__.py
  7. 6
      tournaments/models/enums.py
  8. 13
      tournaments/models/purchase.py
  9. 3
      tournaments/models/tournament.py
  10. 58
      tournaments/serializers.py
  11. 6
      tournaments/templates/tournaments/tournament_row.html
  12. 9
      tournaments/templates/tournaments/tournaments.html
  13. 22
      tournaments/views.py

@ -31,6 +31,7 @@ router.register(r'matches', views.MatchViewSet)
router.register(r'team-scores', views.TeamScoreViewSet) router.register(r'team-scores', views.TeamScoreViewSet)
router.register(r'team-registrations', views.TeamRegistrationViewSet) router.register(r'team-registrations', views.TeamRegistrationViewSet)
router.register(r'player-registrations', views.PlayerRegistrationViewSet) router.register(r'player-registrations', views.PlayerRegistrationViewSet)
router.register(r'purchases', views.PurchaseViewSet)
# router.register(r'exp-tournaments', views.ExpandedTournamentViewSet, basename='tournaments-json') # router.register(r'exp-tournaments', views.ExpandedTournamentViewSet, basename='tournaments-json')
urlpatterns = [ urlpatterns = [

@ -1,5 +1,5 @@
from django.contrib import admin from django.contrib import admin
from .models import Club, TeamScore, Tournament, CustomUser, Event, Round, GroupStage, Match, TeamRegistration, PlayerRegistration from .models import Club, TeamScore, Tournament, CustomUser, Event, Round, GroupStage, Match, TeamRegistration, PlayerRegistration, Purchase
from django.contrib.auth.admin import UserAdmin from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserCreationForm, UserChangeForm from django.contrib.auth.forms import UserCreationForm, UserChangeForm
@ -11,7 +11,7 @@ class CustomUserAdmin(UserAdmin):
model = CustomUser model = CustomUser
list_display = ['email', 'username', 'is_active', 'is_staff', 'first_name', 'last_name', ] list_display = ['email', 'username', 'is_active', 'is_staff', 'first_name', 'last_name', ]
fieldsets = [ fieldsets = [
(None, {'fields': ['username', 'email', 'password', 'first_name', 'last_name', 'is_active', 'clubs', 'country', 'phone', 'licence_id', 'umpire_code', ]}), (None, {'fields': ['id', 'username', 'email', 'password', 'first_name', 'last_name', 'is_active', 'clubs', 'country', 'phone', 'licence_id', 'umpire_code', ]}),
] ]
add_fieldsets = [ add_fieldsets = [
( (
@ -50,6 +50,9 @@ class EventAdmin(admin.ModelAdmin):
class ClubAdmin(admin.ModelAdmin): class ClubAdmin(admin.ModelAdmin):
list_display = ['name', 'acronym', 'phone'] list_display = ['name', 'acronym', 'phone']
class PurchaseAdmin(admin.ModelAdmin):
list_display = ['user', 'identifier', 'purchase_date', 'product_id']
admin.site.register(CustomUser, CustomUserAdmin) admin.site.register(CustomUser, CustomUserAdmin)
admin.site.register(Club, ClubAdmin) admin.site.register(Club, ClubAdmin)
admin.site.register(Event, EventAdmin) admin.site.register(Event, EventAdmin)
@ -60,3 +63,4 @@ admin.site.register(TeamScore, TeamScoreAdmin)
admin.site.register(TeamRegistration, TeamRegistrationAdmin) admin.site.register(TeamRegistration, TeamRegistrationAdmin)
admin.site.register(Tournament, TournamentAdmin) admin.site.register(Tournament, TournamentAdmin)
admin.site.register(PlayerRegistration, PlayerRegistrationAdmin) admin.site.register(PlayerRegistration, PlayerRegistrationAdmin)
admin.site.register(Purchase, PurchaseAdmin)

@ -0,0 +1,26 @@
# Generated by Django 4.2.11 on 2024-04-12 15:41
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import uuid
class Migration(migrations.Migration):
dependencies = [
('tournaments', '0025_customuser_country'),
]
operations = [
migrations.CreateModel(
name='Purchase',
fields=[
('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
('identifier', models.IntegerField()),
('purchaseDate', models.DateTimeField()),
('productId', models.CharField(max_length=100)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]

@ -0,0 +1,18 @@
# Generated by Django 4.2.11 on 2024-04-17 08:11
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('tournaments', '0026_purchase'),
]
operations = [
migrations.AddField(
model_name='tournament',
name='payment',
field=models.IntegerField(blank=True, choices=[(0, 'Gratuit'), (1, 'Unité'), (2, 'Unité abonnement'), (3, 'Illimité')], default=0, null=True),
),
]

@ -0,0 +1,23 @@
# Generated by Django 4.2.11 on 2024-04-22 07:59
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('tournaments', '0027_tournament_payment'),
]
operations = [
migrations.RenameField(
model_name='purchase',
old_name='productId',
new_name='product_id',
),
migrations.RenameField(
model_name='purchase',
old_name='purchaseDate',
new_name='purchase_date',
),
]

@ -1,6 +1,6 @@
from .custom_user import CustomUser from .custom_user import CustomUser
from .club import Club from .club import Club
from .enums import FederalCategory, FederalLevelCategory, FederalAgeCategory, FederalMatchCategory from .enums import TournamentPayment, FederalCategory, FederalLevelCategory, FederalAgeCategory, FederalMatchCategory
from .event import Event from .event import Event
from .tournament import Tournament, TeamSummon from .tournament import Tournament, TeamSummon
from .group_stage import GroupStage from .group_stage import GroupStage
@ -9,3 +9,4 @@ from .match import Match, LiveMatch
from .team_registration import TeamRegistration from .team_registration import TeamRegistration
from .player_registration import PlayerRegistration from .player_registration import PlayerRegistration
from .team_score import TeamScore from .team_score import TeamScore
from .purchase import Purchase

@ -1,6 +1,12 @@
from django.db import models from django.db import models
import uuid import uuid
class TournamentPayment(models.IntegerChoices):
FREE = 0, 'Gratuit'
UNIT = 1, 'Unité'
SUBSCRIPTION_UNIT = 2, 'Unité abonnement'
UNLIMITED = 3, 'Illimité'
class FederalCategory(models.IntegerChoices): class FederalCategory(models.IntegerChoices):
MEN = 0, 'Homme' MEN = 0, 'Homme'
WOMEN = 1, 'Femme' WOMEN = 1, 'Femme'

@ -0,0 +1,13 @@
from django.db import models
import uuid
from . import CustomUser
class Purchase(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=True)
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
identifier = models.IntegerField()
purchase_date = models.DateTimeField()
product_id = models.CharField(max_length=100)
def __str__(self):
return f"{self.identifier} > {self.product_id} - {self.purchase_date} - {self.user.username}"

@ -1,5 +1,5 @@
from django.db import models from django.db import models
from . import Event, FederalMatchCategory, FederalCategory, FederalLevelCategory, FederalAgeCategory from . import Event, TournamentPayment, FederalMatchCategory, FederalCategory, FederalLevelCategory, FederalAgeCategory
import uuid import uuid
from django.utils import timezone, formats from django.utils import timezone, formats
@ -32,6 +32,7 @@ class Tournament(models.Model):
prioritize_club_members = models.BooleanField() prioritize_club_members = models.BooleanField()
qualified_per_group_stage = models.IntegerField(default=0) qualified_per_group_stage = models.IntegerField(default=0)
teams_per_group_stage = models.IntegerField(default=0) teams_per_group_stage = models.IntegerField(default=0)
payment = models.IntegerField(default=TournamentPayment.FREE, choices=TournamentPayment.choices, null=True, blank=True)
def __str__(self): def __str__(self):
if self.name: if self.name:

@ -1,5 +1,5 @@
from rest_framework import serializers from rest_framework import serializers
from .models import Club, LiveMatch, TeamScore, Tournament, CustomUser, Event, Round, GroupStage, Match, TeamRegistration, PlayerRegistration from .models import Club, LiveMatch, TeamScore, Tournament, CustomUser, Event, Round, GroupStage, Match, TeamRegistration, PlayerRegistration, Purchase
from django.contrib.auth import password_validation from django.contrib.auth import password_validation
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
# email # email
@ -146,6 +146,11 @@ class PlayerRegistrationSerializer(serializers.ModelSerializer):
fields = '__all__' fields = '__all__'
# ['id', 'team_registration_id', 'first_name', 'last_name', 'licence_id', 'rank', 'has_paid'] # ['id', 'team_registration_id', 'first_name', 'last_name', 'licence_id', 'rank', 'has_paid']
class PurchaseSerializer(serializers.ModelSerializer):
class Meta:
model = Purchase
fields = '__all__'
class ChangePasswordSerializer(serializers.Serializer): class ChangePasswordSerializer(serializers.Serializer):
old_password = serializers.CharField(max_length=128, write_only=True, required=True) old_password = serializers.CharField(max_length=128, write_only=True, required=True)
new_password1 = serializers.CharField(max_length=128, write_only=True, required=True) new_password1 = serializers.CharField(max_length=128, write_only=True, required=True)
@ -176,54 +181,3 @@ class LiveMatchSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = LiveMatch model = LiveMatch
fields = '__all__' # ['title', 'date'] # Serialize all fields of the model fields = '__all__' # ['title', 'date'] # Serialize all fields of the model
# class ExpandedMatchSerializer(serializers.ModelSerializer):
# team_states = TeamScoreSerializer(many=True, read_only=True)
# class Meta:
# round_id = serializers.PrimaryKeyRelatedField(queryset=Round.objects.all())
# group_stage_id = serializers.PrimaryKeyRelatedField(queryset=GroupStage.objects.all())
# model = Match
# fields = ['id', 'round_id', 'group_stage_id', 'index', 'format', 'court', 'start_date', 'end_date',
# 'serving_team_id', 'winning_team_id', 'losing_team_id', 'team_states']
# class ExpandedRoundSerializer(serializers.ModelSerializer):
# match_set = ExpandedMatchSerializer(many=True, read_only=True)
# class Meta:
# tournament_id = serializers.PrimaryKeyRelatedField(queryset=Tournament.objects.all())
# loser_id = serializers.PrimaryKeyRelatedField(queryset=Round.objects.all())
# model = Round
# fields = ['id', 'index', 'tournament_id', 'loser_id', 'format', 'match_set']
# class ExpandedGroupStageSerializer(serializers.ModelSerializer):
# match_set = ExpandedMatchSerializer(many=True, read_only=True)
# class Meta:
# tournament_id = serializers.PrimaryKeyRelatedField(queryset=Tournament.objects.all())
# model = GroupStage
# fields = ['id', 'index', 'tournament_id', 'format', 'match_set']
# class ExpandedTeamRegistrationSerializer(serializers.ModelSerializer):
# playerregistration_set = PlayerRegistrationSerializer(many=True, read_only=True)
# call_date = serializers.DateTimeField(format='%H:%M')
# class Meta:
# # match_id = serializers.PrimaryKeyRelatedField(queryset=Match.objects.all())
# group_stage_id = serializers.PrimaryKeyRelatedField(queryset=GroupStage.objects.all())
# model = TeamRegistration
# fields = ['id', 'group_stage_id', 'registration_date', 'call_date', 'initial_position',
# 'group_stage_position', 'logo', 'playerregistration_set']
# class ExpandedTournamentSerializer(serializers.ModelSerializer):
# teamregistration_set = ExpandedTeamRegistrationSerializer(many=True, read_only=True)
# round_set = ExpandedRoundSerializer(many=True, read_only=True)
# groupstage_set = ExpandedGroupStageSerializer(many=True, read_only=True)
# class Meta:
# # club_id = serializers.PrimaryKeyRelatedField(queryset=Club.objects.all())
# event_id = serializers.PrimaryKeyRelatedField(queryset=Event.objects.all())
# creator_id = serializers.PrimaryKeyRelatedField(queryset=CustomUser.objects.all())
# model = Tournament
# fields = ['id', 'name', 'event_id', 'creator_id', 'start_date', 'end_date', 'creation_date',
# 'is_private', 'format', 'group_stage_format', 'round_format', 'loser_round_format', 'bracket_sort_mode',
# 'group_stage_count', 'rank_source_date', 'day_duration', 'team_count', 'team_sorting',
# 'federal_category', 'federal_level_category', 'federal_age_category', 'group_stage_court_count',
# 'seed_count', 'closed_registration_date', 'group_stage_additional_qualified', 'court_count', 'prioritize_club_members',
# 'qualified_per_group_stage', 'teams_per_group_stage', 'teamregistration_set', 'round_set', 'groupstage_set']

@ -6,11 +6,11 @@
<div class="small">{{ tournament.category }}</div> <div class="small">{{ tournament.category }}</div>
</div> </div>
<div class="table-cell table-cell-large horizontal-padding semibold"> <div class="table-cell table-cell-large horizontal-padding semibold">
{% if club %} {% if tournament.name %}
<span>{{ tournament.name }}</span>
{% else %}
<span>{{ tournament.event.club.name }}: </span> <span>{{ tournament.event.club.name }}: </span>
<span>{{ tournament.name }}</span> <span>{{ tournament.name }}</span>
{% else %}
<span>{{ tournament.event.club.name }}</span>
{% endif %} {% endif %}
</div> </div>
<div class="table-cell"><div class="mybox">{{ tournament.formatted_start_date }}</div></div> <div class="table-cell"><div class="mybox">{{ tournament.formatted_start_date }}</div></div>

@ -20,24 +20,23 @@
<div class="cell medium-6 large-6 topblock my-block"> <div class="cell medium-6 large-6 topblock my-block">
<div class="bubble"> <div class="bubble">
{% if live %} {% if live %}
<label class="title">En cours</label> <label class="title">En cours</label>
{% for tournament in live %} {% for tournament in live %}
{% include 'tournaments/tournament_row.html' %} {% include 'tournaments/tournament_row.html' %}
{% endfor %}
{% endfor %} {% endif %} {% endif %}
{% if future %} {% if future %}
<label class="title top-margin20">À venir</label> <label class="title top-margin20">À venir</label>
{% for tournament in future %} {% for tournament in future %}
{% include 'tournaments/tournament_row.html' %} {% include 'tournaments/tournament_row.html' %}
{% endfor %}
{% endfor %} {% endif %} {% endif %}
</div> </div>
</div> </div>
{% endif %} {% endif %}

@ -5,8 +5,8 @@ from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from .tokens import account_activation_token from .tokens import account_activation_token
from tournaments.models import group_stage from tournaments.models import group_stage
from .serializers import ClubSerializer, TournamentSerializer, UserSerializer, ChangePasswordSerializer, EventSerializer, RoundSerializer, GroupStageSerializer, MatchSerializer, TeamScoreSerializer, TeamRegistrationSerializer, PlayerRegistrationSerializer, LiveMatchSerializer from .serializers import ClubSerializer, TournamentSerializer, UserSerializer, ChangePasswordSerializer, EventSerializer, RoundSerializer, GroupStageSerializer, MatchSerializer, TeamScoreSerializer, TeamRegistrationSerializer, PlayerRegistrationSerializer, LiveMatchSerializer, PurchaseSerializer
from .models import Club, Tournament, CustomUser, Event, Round, GroupStage, Match, TeamScore, TeamRegistration, PlayerRegistration from .models import Club, Tournament, CustomUser, Event, Round, GroupStage, Match, TeamScore, TeamRegistration, PlayerRegistration, Purchase
from .models import TeamSummon from .models import TeamSummon
from datetime import datetime from datetime import datetime
import datetime import datetime
@ -17,6 +17,7 @@ from rest_framework.response import Response
from rest_framework.decorators import api_view from rest_framework.decorators import api_view
from rest_framework import status from rest_framework import status
from rest_framework.generics import UpdateAPIView from rest_framework.generics import UpdateAPIView
from rest_framework.exceptions import MethodNotAllowed
from django.template import loader from django.template import loader
from datetime import date from datetime import date
from django.http import JsonResponse from django.http import JsonResponse
@ -203,6 +204,23 @@ class TournamentViewSet(viewsets.ModelViewSet):
queryset = Tournament.objects.all() queryset = Tournament.objects.all()
serializer_class = TournamentSerializer serializer_class = TournamentSerializer
class PurchaseViewSet(viewsets.ModelViewSet):
queryset = Purchase.objects.all()
serializer_class = PurchaseSerializer
def get_queryset(self):
if self.request.user:
return self.queryset.filter(user=self.request.user)
return []
def put(self, request, pk):
raise MethodNotAllowed('PUT')
def patch(self, request, pk):
raise MethodNotAllowed('PATCH')
def delete(self, request, pk):
raise MethodNotAllowed('DELETE')
# class ExpandedTournamentViewSet(viewsets.ModelViewSet): # class ExpandedTournamentViewSet(viewsets.ModelViewSet):
# queryset = Tournament.objects.all() # queryset = Tournament.objects.all()

Loading…
Cancel
Save