from rest_framework import serializers from .models import TournamentModel, TournamentGameModel from profiles.serializers import ProfileSerializer from games.serializers import GameSerializer nb_participants = [2 ** i for i in range(1, 6)] class TournamentSerializer(serializers.ModelSerializer): state = serializers.SerializerMethodField(read_only=True, required=False) participants = serializers.SerializerMethodField(read_only=True, required=False) round = serializers.ReadOnlyField() games = serializers.SerializerMethodField(read_only=True, required=False) started = serializers.ReadOnlyField() finished = serializers.ReadOnlyField() name = serializers.CharField(default="") class Meta: model = TournamentModel fields = ["name", "nb_participants", "round", "started", "finished", "id", "state", "participants", "games"] def get_participants(self, instance: TournamentModel): return ProfileSerializer(instance.get_participants(), many=True).data def get_games(self, instance: TournamentModel): return [GameSerializer(games, many=True).data for games in instance.get_games()] def get_state(self, instance: TournamentModel): return ["waiting", "started", "finished"][instance.started + instance.finished] def validate_nb_participants(self, value: int): if (value not in nb_participants): raise serializers.ValidationError(f"The numbers of participants must be {str(nb_participants)}.") return value class TournamentGameSerializer(serializers.ModelSerializer): players = serializers.SerializerMethodField() winner_id = serializers.ReadOnlyField() state = serializers.SerializerMethodField() started = serializers.ReadOnlyField() finished = serializers.ReadOnlyField() start_timestamp = serializers.ReadOnlyField() stop_timestamp = serializers.ReadOnlyField() gamemode = serializers.ReadOnlyField() round = serializers.ReadOnlyField() pos = serializers.ReadOnlyField() class Meta: model = TournamentGameModel fields = ["id", "winner_id", "state", "started", "finished", "players", "start_timestamp", "stop_timestamp", "game_type", "round", "pos"] def get_state(self, instance: TournamentGameModel): if (instance.finished): return "finished" if (instance.started): return "started" return "waiting" def get_players(self, instance: TournamentGameModel): return ProfileSerializer(instance.get_players_profiles(), many=True).data