debugging entry
This commit is contained in:
278
rog/views.py
278
rog/views.py
@ -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')
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user