Files

92 lines
3.0 KiB
Python

import csv
import io
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from .models import Player, User
from tournaments.models import Tournament, Registration
from .serializers import PlayerSerializer, PlayerImportDataSerializer
class PlayerListView(APIView):
"""Listet alle Spieler auf."""
def get(self, request):
players = Player.objects.all()
serializer = PlayerSerializer(players, many=True)
return Response(serializer.data)
class PlayerImportView(APIView):
"""
Importiert Spieler aus Moodle-CSV.
Erwartet ein POST mit JSON: { "csv_data": "...", "tournament_id": 1 }
"""
def post(self, request):
serializer = PlayerImportDataSerializer(data=request.data)
if not serializer.is_valid():
return Response(serializer.errors, status=400)
csv_string = serializer.validated_data['csv_data']
tournament_id = serializer.validated_data['tournament_id']
# Ziel-Turnier finden
try:
tournament = Tournament.objects.get(id=tournament_id)
except Tournament.DoesNotExist:
return Response({"error": "Turnier nicht gefunden"}, status=404)
created_count = 0
existing_count = 0
# CSV parsen (Moodle nutzt Semikolon als Separator)
csv_file = io.StringIO(csv_string)
reader = csv.reader(csv_file, delimiter=';')
next(reader, None) # Überspringe Header-Zeile
for row in reader:
if len(row) < 5:
continue
last_name = row[0].strip()
first_name = row[1].strip()
email = row[2].strip()
# city = row[3] (optional)
club = row[4].strip() # Die Moodle-Gruppe/Klasse als "Verein"
if not first_name or not last_name:
continue
# 1. Spieler anlegen oder aktualisieren
player, created = Player.objects.update_or_create(
defaults={'club': club},
first_name=first_name,
last_name=last_name
)
if created:
created_count += 1
else:
existing_count += 1
# 2. Spieler ins Turnier registrieren (Registration anlegen)
Registration.objects.get_or_create(
tournament=tournament,
player=player
)
# Optional: Falls ein Login-Wunsch besteht und keine User existiert:
if email and not User.objects.filter(username=email).exists():
User.objects.create_user(
username=email,
email=email,
password='schach1234' # Default-Passwort für Moodle-Imports
)
return Response({
"message": "Import abgeschlossen",
"created_players": created_count,
"updated_players": existing_count
}, status=201)