debugging entry

This commit is contained in:
2024-07-25 00:57:48 +00:00
parent 09e39987e2
commit c0fb177d02
24 changed files with 1051 additions and 395 deletions

View File

@ -1,12 +1,28 @@
from rest_framework import serializers
from django.db import IntegrityError
from django.urls import reverse
from .utils import send_activation_email
import uuid
from rest_framework.exceptions import ValidationError as DRFValidationError
from django.db import transaction
from django.db.models import F
from rest_framework import viewsets, permissions, status
from rest_framework.decorators import action
from rest_framework.response import Response
from django.shortcuts import get_object_or_404
from .models import Team, Member, CustomUser, NewCategory
from .serializers import TeamSerializer, MemberSerializer, CustomUserSerializer, TeamDetailSerializer,UserUpdateSerializer
from .permissions import IsTeamOwner
from curses.ascii import NUL
from django.core.serializers import serialize
from .models import GoalImages, Location, Location_line, Location_polygon, JpnAdminMainPerf, Useractions, GifuAreas, RogUser, CustomUser, UserTracks, GoalImages, CheckinImages, NewEvent, Team, Category, Entry, Member, TempUser
from .models import GoalImages, Location, Location_line, Location_polygon, JpnAdminMainPerf, Useractions, GifuAreas, RogUser, CustomUser, UserTracks, GoalImages, CheckinImages, NewEvent,NewEvent2, Team, Category, NewCategory,Entry, Member, TempUser,EntryMember
from rest_framework import viewsets
from .serializers import LocationSerializer, Location_lineSerializer, Location_polygonSerializer, JPN_main_perfSerializer, LocationCatSerializer, CreateUserSerializer, UserSerializer, LoginUserSerializer, UseractionsSerializer, UserDestinationSerializer, GifuAreaSerializer, LocationEventNameSerializer, RogUserSerializer, UserTracksSerializer, ChangePasswordSerializer, GolaImageSerializer, CheckinImageSerializer, RegistrationSerializer, MemberWithUserSerializer
from knox.models import AuthToken
from rest_framework import viewsets, generics, status
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.parsers import JSONParser, MultiPartParser
from .serializers import LocationSerializer
@ -14,7 +30,7 @@ from django.http import JsonResponse
from rest_framework.permissions import IsAuthenticated
from django.contrib.gis.db.models import Extent, Union
from .serializers import TestSerialiser,NewEventSerializer, TeamSerializer, CategorySerializer, EntrySerializer, MemberSerializer, TempUserSerializer, CustomUserSerializer
from .serializers import TestSerialiser,NewEventSerializer,NewEvent2Serializer, TeamSerializer, NewCategorySerializer,CategorySerializer, EntrySerializer, MemberSerializer, TempUserSerializer, CustomUserSerializer,EntryMemberSerializer,EntryCreationSerializer
from .models import TestModel
from django.shortcuts import get_object_or_404
from django.db.models import F
@ -27,13 +43,17 @@ from rest_framework.decorators import api_view
from rest_framework.decorators import api_view, permission_classes
from rest_framework.parsers import JSONParser, MultiPartParser
from django.views.decorators.csrf import csrf_exempt
import uuid
from django.shortcuts import render
from .permissions import IsMemberOrTeamOwner
from django.utils.decorators import method_decorator
from django.utils.encoding import force_str
import logging
logger = logging.getLogger(__name__)
class LocationViewSet(viewsets.ModelViewSet):
queryset=Location.objects.all()
serializer_class=LocationSerializer
@ -288,6 +308,25 @@ class LoginAPI(generics.GenericAPIView):
"token": AuthToken.objects.create(user)[1]
})
class UserUpdateAPI(generics.UpdateAPIView):
permission_classes = [permissions.IsAuthenticated]
serializer_class = UserUpdateSerializer
def get_object(self):
return self.request.user
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
if getattr(instance, '_prefetched_objects_cache', None):
instance._prefetched_objects_cache = {}
return Response(serializer.data)
class UserAPI(generics.RetrieveAPIView):
permission_classes = [permissions.IsAuthenticated,]
serializer_class = UserSerializer
@ -509,6 +548,17 @@ def CustomAreaNames(request):
return JsonResponse(serializer.data, safe=False)
class UserActivationView(APIView):
def get(self, request, activation_token):
try:
user = CustomUser.objects.get(activation_token=activation_token, is_active=False)
user.is_active = True
user.activation_token = None
user.save()
return Response({"message": "アカウントが正常にアクティベートされました。"}, status=status.HTTP_200_OK)
except CustomUser.DoesNotExist:
return Response({"error": "無効なアクティベーショントークンです。"}, status=status.HTTP_400_BAD_REQUEST)
class ChangePasswordView(generics.UpdateAPIView):
"""
An endpoint for changing password.
@ -562,32 +612,96 @@ class RegistrationView(APIView):
# Akira
@method_decorator(csrf_exempt, name='dispatch')
class NewEvent2ViewSet(viewsets.ModelViewSet):
queryset = NewEvent2.objects.all()
serializer_class = NewEvent2Serializer
permission_classes = [IsAuthenticated]
class NewEvent2ListView(generics.ListAPIView):
queryset = NewEvent2.objects.all()
serializer_class = NewEvent2Serializer
permission_classes = [IsAuthenticated]
class NewEventViewSet(viewsets.ModelViewSet):
queryset = NewEvent.objects.all()
serializer_class = NewEventSerializer
permission_classes = [IsAuthenticated]
@method_decorator(csrf_exempt, name='dispatch')
class NewEventListView(generics.ListAPIView):
queryset = NewEvent.objects.all()
serializer_class = NewEventSerializer
permission_classes = [IsAuthenticated]
class TeamViewSet(viewsets.ModelViewSet):
queryset = Team.objects.all()
serializer_class = TeamSerializer
permission_classes = [permissions.IsAuthenticated]
permission_classes = [permissions.IsAuthenticated, IsTeamOwner]
def get_queryset(self):
return Team.objects.filter(owner=self.request.user)
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
with transaction.atomic():
category = serializer.validated_data['category']
category = NewCategory.objects.select_for_update().get(id=category.id)
zekken_number = category.category_number
category.category_number = F('category_number') + 1
category.save()
category.refresh_from_db() # F() 式の結果を評価
serializer.save(owner=self.request.user, zekken_number=zekken_number)
def destroy(self, request, *args, **kwargs):
team = self.get_object()
if team.members.exists():
return Response({"error": "チームにメンバーが残っているため削除できません。"}, status=status.HTTP_400_BAD_REQUEST)
return super().destroy(request, *args, **kwargs)
def update(self, request, *args, **kwargs):
try:
return super().update(request, *args, **kwargs)
except Exception as e:
return Response({"error": "更新に失敗しました。競合が発生した可能性があります。"}, status=status.HTTP_409_CONFLICT)
@action(detail=True, methods=['post'])
def copy(self, request, pk=None):
original_team = self.get_object()
with transaction.atomic():
category = NewCategory.objects.select_for_update().get(id=original_team.category.id)
new_zekken_number = category.category_number
category.category_number = F('category_number') + 1
category.save()
category.refresh_from_db() # F() 式の結果を評価
new_team = Team.objects.create(
zekken_number=new_zekken_number,
team_name=f"{original_team.team_name} (コピー)",
category=category,
owner=request.user
)
for member in original_team.members.all():
Member.objects.create(
team=new_team,
user=member.user
)
return Response(TeamSerializer(new_team).data, status=status.HTTP_201_CREATED)
class NewCategoryViewSet(viewsets.ModelViewSet):
queryset = NewCategory.objects.all()
serializer_class = NewCategorySerializer
permission_classes = [IsAuthenticated]
class NewCategoryListView(generics.ListAPIView):
queryset = NewCategory.objects.all()
serializer_class = NewCategorySerializer
permission_classes = [IsAuthenticated]
class CategoryViewSet(viewsets.ModelViewSet):
queryset = Category.objects.all()
serializer_class = CategorySerializer
permission_classes = [IsAuthenticated]
@method_decorator(csrf_exempt, name='dispatch')
class CategoryListView(generics.ListAPIView):
queryset = Category.objects.all()
serializer_class = CategorySerializer
@ -611,16 +725,148 @@ class EntryViewSet(viewsets.ModelViewSet):
serializer_class = EntrySerializer
permission_classes = [permissions.IsAuthenticated]
def perform_create(self, serializer):
team = Team.objects.get(owner=self.request.user)
serializer.save(team=team)
#def perform_create(self, serializer):
# team = Team.objects.get(owner=self.request.user)
# serializer.save(team=team)
def get_queryset(self):
user = self.request.user
# ユーザーが所属するチームのIDを取得
team_ids = Member.objects.filter(user=user).values_list('team_id', flat=True)
# そのチームに関連するエントリーを取得
return Entry.objects.filter(team__id__in=team_ids)
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
try:
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
except DRFValidationError as e:
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
#except ValidationError as e:
# return Response({'error': str(e)}, status=status.HTTP_400_BAD_REQUEST)
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
return Response(serializer.data)
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
self.perform_destroy(instance)
return Response(status=status.HTTP_204_NO_CONTENT)
class MemberViewSet(viewsets.ModelViewSet):
queryset = Member.objects.all()
serializer_class = MemberSerializer
permission_classes = [permissions.IsAuthenticated,IsTeamOwner]
def get_queryset(self):
team_id = self.kwargs['team_id']
return Member.objects.filter(team_id=team_id)
def create(self, request, *args, **kwargs):
team = Team.objects.get(id=self.kwargs['team_id'])
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
try:
self.perform_create(serializer)
except DRFValidationError as e:
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
#except ValidationError as e:
# return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
except IntegrityError:
return Response({"error": "このユーザーは既にチームのメンバーです。"}, status=status.HTTP_400_BAD_REQUEST)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
def perform_create(self, serializer):
team = Team.objects.get(id=self.kwargs['team_id'])
serializer.save(team=team)
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
if not instance.user.email.startswith('dummy_'):
return Response({"error": "このユーザーの情報は更新できません。"}, status=status.HTTP_400_BAD_REQUEST)
self.perform_update(serializer)
if getattr(instance, '_prefetched_objects_cache', None):
instance._prefetched_objects_cache = {}
return Response(serializer.data)
def perform_update(self, serializer):
serializer.save()
def get_object(self):
queryset = self.get_queryset()
member_id = self.kwargs['pk']
obj = get_object_or_404(queryset, id=member_id)
self.check_object_permissions(self.request, obj)
return obj
class OwnerEntriesView(generics.ListAPIView):
serializer_class = EntrySerializer
permission_classes = [permissions.IsAuthenticated]
def get_queryset(self):
user = self.request.user
return Entry.objects.filter(owner=user)
class OwnerTeamsView(generics.ListAPIView):
serializer_class = TeamSerializer
permission_classes = [permissions.IsAuthenticated]
def get_queryset(self):
user = self.request.user
return Team.objects.filter(owner=user)
class OwnerMembersView(generics.ListAPIView):
serializer_class = MemberSerializer
permission_classes = [permissions.IsAuthenticated]
def get_queryset(self):
user = self.request.user
return Member.objects.filter(team__owner=user)
class MemberAddView(APIView):
def post(self, request, team_id):
logger.info(f"Received request to add member to team {team_id}")
logger.debug(f"Request data: {request.data}")
team = get_object_or_404(Team, id=team_id)
logger.info(f"Found team: {team}")
serializer = MemberSerializer(data=request.data)
if serializer.is_valid():
logger.info("Serializer is valid")
try:
member = serializer.save(team=team)
logger.info(f"Member added successfully: {member}")
return Response(serializer.data, status=status.HTTP_201_CREATED)
except Exception as e:
logger.error(f"Error saving member: {str(e)}")
return Response({"detail": str(e)}, status=status.HTTP_400_BAD_REQUEST)
else:
logger.error(f"Serializer errors: {serializer.errors}")
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class TempUserViewSet(viewsets.ModelViewSet):
queryset = TempUser.objects.all()
@ -639,9 +885,6 @@ class CustomUserViewSet(viewsets.ModelViewSet):
return CustomUser.objects.all()
return CustomUser.objects.filter(id=user.id)
# 追加の機能として、チームメンバーを取得するビュー
from rest_framework.decorators import action
from rest_framework.response import Response
class TeamMembersView(generics.ListAPIView):
serializer_class = MemberSerializer
@ -738,4 +981,3 @@ class TeamMembersWithUserView(generics.ListAPIView):
team_id = self.kwargs['team_id']
return Member.objects.filter(team_id=team_id).select_related('user', 'team')