from django.shortcuts import render from rest_framework import permissions, status, generics from rest_framework.response import Response from rest_framework.authtoken.models import Token from django.contrib.auth.models import User from rest_framework.decorators import api_view, permission_classes from django.contrib.sites.shortcuts import get_current_site from django.utils.encoding import force_bytes, force_text from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode from django.template.loader import render_to_string from django.contrib.auth.tokens import PasswordResetTokenGenerator from django.core.mail import EmailMultiAlternatives from .serializers import UserRegisterSerializer, UserResetPasswordSerializer, UserPasswordSerializer, GameListSerializer, TeamSerializer, CurrentCheckPointSerializer, CheckPointCoordinatesSerializer, ProfileInfoSerializer from django.utils.html import strip_tags from django.contrib.auth.password_validation import validate_password from django_filters.rest_framework import DjangoFilterBackend from rest_framework.filters import OrderingFilter, SearchFilter from .models import Game, Team, Gamer, Profile, InvitationToken, CurrentCheckPoint, CheckPoint from django.conf import settings from django.utils import timezone from hashlib import sha1 import six import threading import math class EmailTokenGenerator(PasswordResetTokenGenerator): def _make_hash_value(self, user, timestamp): return(six.text_type(user.pk) + six.text_type(timestamp) + six.text_type(user.is_active)) email_token_gen = EmailTokenGenerator() password_token_gen = PasswordResetTokenGenerator() def list_to_queryset(model_list): if len(model_list) > 0: return model_list[0].__class__.objects.filter( pk__in=[obj.pk for obj in model_list]) else: return [] class ListGamesAPIView(generics.ListAPIView): serializer_class = GameListSerializer permission_classes = [permissions.IsAuthenticated] filter_backends = [SearchFilter, OrderingFilter, DjangoFilterBackend] filterset_fields = ['co_op','max_gamers','active','average_time'] ordering_fields = ['max_gamers','active','average_time','name'] search_fields = ['name', 'description'] def get_queryset(self): profile = Profile.objects.get(user = self.request.user) data = [] for game_i in Game.objects.filter(active = True): teams = game_i.teams.all() if(self.kwargs['visited'] == '0'): test = True for team_i in teams: gamer_i = Gamer.objects.filter(team = team_i, profile = profile) if(gamer_i.exists()): test = False break if(test): data.append(game_i) else: test = False for team_i in teams: gamer_i = Gamer.objects.filter(team = team_i, profile = profile) if(gamer_i.exists()): test = True break if(test): data.append(game_i) if(len(data)!=0): return list_to_queryset(data) else: return Game.objects.none() @api_view(['GET']) @permission_classes([permissions.IsAuthenticated]) def SingleGameAPIView(request, slug): game = Game.objects.filter(slug = slug) if(game.exists()): profile = Profile.objects.get(user = request.user) game = game.first() teams = Team.objects.filter(game = game) team = [] for team_i in teams: if(Gamer.objects.filter(profile = profile, team = team_i).exists()): team = team_i break if(team): serializer = TeamSerializer(team) data = serializer.data gamers = data['gamers'] can_start = False invite_token = '' if(not team.active): if(team.captain == profile and (not game.co_op or len(gamers) == game.max_gamers) and not team.finished): can_start = True if(team.captain == profile and len(gamers) != game.max_gamers and not team.finished): invite = InvitationToken.objects.filter(team = team) if(invite.exists()): invite = invite.first() invite_token = invite.token if(team.finished): done_chepoints = [] cur_checkpoint = CurrentCheckPoint.objects.get(team = team).check_point temp_check_point = CheckPoint.objects.get(game = team.game, start = True) done_chepoints.append(CheckPointCoordinatesSerializer(temp_check_point).data) while temp_check_point.id!=cur_checkpoint.id: temp_check_point = temp_check_point.next_checkpoint done_chepoints.append(CheckPointCoordinatesSerializer(temp_check_point).data) return Response({'ok':True, 'can_take_part':False, 'can_start':can_start, 'invite_token':invite_token, **data, 'done_chepoints':done_chepoints}, status = status.HTTP_200_OK) return Response({'ok':True, 'can_take_part':False, 'can_start':can_start, 'invite_token':invite_token, **data}, status = status.HTTP_200_OK) else: done_chepoints = [] cur_checkpoint = CurrentCheckPoint.objects.get(team = team).check_point cur_checkpoint_serializer = CurrentCheckPointSerializer(cur_checkpoint) temp_check_point = CheckPoint.objects.get(game = team.game, start = True) done_chepoints.append(CheckPointCoordinatesSerializer(temp_check_point).data) while temp_check_point.id!=cur_checkpoint.id: temp_check_point = temp_check_point.next_checkpoint done_chepoints.append(CheckPointCoordinatesSerializer(temp_check_point).data) return Response({'ok':True, 'can_take_part':False, 'can_start':can_start, 'invite_token':invite_token, **data, 'current_checkpoint':cur_checkpoint_serializer.data, 'done_chepoints':done_chepoints}, status = status.HTTP_200_OK) else: serializer = GameListSerializer(game) data = serializer.data return Response({'ok':True, 'can_take_part':True, **serializer.data}, status = status.HTTP_200_OK) return Response({'ok':False, 'error':'Game does not exist'}, status = status.HTTP_400_BAD_REQUEST) @api_view(['POST']) @permission_classes([permissions.IsAuthenticated]) def CloseCheckPointAPIView(request, slug): game = Game.objects.filter(slug = slug) if(game.exists()): profile = Profile.objects.get(user = request.user) game = game.first() teams = Team.objects.filter(game = game) team = [] for team_i in teams: if(Gamer.objects.filter(profile = profile, team = team_i).exists()): team = team_i break if(team): temp_check_point = CheckPointCoordinatesSerializer(data = request.data) if(temp_check_point.is_valid() and team.active and not team.finished): temp_check_point = temp_check_point.validated_data cur_checkpoint = CurrentCheckPoint.objects.get(team = team) dest = math.sqrt((temp_check_point['coordinates_lat']-cur_checkpoint.check_point.next_checkpoint.coordinates_lat)**2 + (temp_check_point['coordinates_lon']-cur_checkpoint.check_point.next_checkpoint.coordinates_lon)**2) if(dest