updated for team, member and email registration

This commit is contained in:
2024-07-20 14:24:52 +09:00
parent 6de4aabebb
commit 1a8e97e945
5 changed files with 340 additions and 14 deletions

View File

@ -1,15 +1,16 @@
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
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
from .models import GoalImages, Location, Location_line, Location_polygon, JpnAdminMainPerf, Useractions, GifuAreas, RogUser, CustomUser, UserTracks, GoalImages, CheckinImages, TempUser
from rest_framework import viewsets,status
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, Team, Member, Entry, CustomUserSerializer
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
from .serializers import LocationSerializer, TeamSerializer, MemberSerializer, EntrySerializer
from django.http import JsonResponse
from rest_framework.permissions import IsAuthenticated
from django.contrib.gis.db.models import Extent, Union
@ -29,8 +30,9 @@ from rest_framework.parsers import JSONParser, MultiPartParser
from django.views.decorators.csrf import csrf_exempt
import uuid
from django.shortcuts import render
from django.utils import timezone
from django.db import transaction
class LocationViewSet(viewsets.ModelViewSet):
queryset=Location.objects.all()
@ -53,6 +55,113 @@ class Jpn_Main_PerfViewSet(viewsets.ModelViewSet):
serializer_class=JPN_main_perfSerializer
filter_fields = ["adm1_ja"]
#===== AKira ここから
class CustomUserViewSet(viewsets.ModelViewSet):
queryset = CustomUser.objects.all()
serializer_class = CustomUserSerializer
permission_classes = [IsAuthenticated]
def get_queryset(self):
return CustomUser.objects.filter(id=self.request.user.id)
class TeamViewSet(viewsets.ModelViewSet):
queryset = Team.objects.all()
serializer_class = TeamSerializer
@transaction.atomic
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
# チーム登録後にエントリー登録と外部APIコールを行う
self.register_entry_and_call_external_api(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
def register_entry_and_call_external_api(self, team_data):
# エントリーの登録
entry_data = {
'zekken_number': team_data['zekken_number'],
'event_code': request.data.get('event_code'), # エントリー用のevent_codeを取得
'date': request.data.get('date') # エントリー用の日付を取得
}
entry_serializer = EntrySerializer(data=entry_data)
if entry_serializer.is_valid():
entry_serializer.save()
# 外部APIへのコール
self.call_external_api(team_data, entry_data)
else:
# エントリー登録に失敗した場合のエラーハンドリング
raise serializers.ValidationError(entry_serializer.errors)
def call_external_api(self, team_data, entry_data):
external_api_url = "https://rogaining.sumasen.net/gifuroge/register_team"
payload = {
'zekken_number': team_data['zekken_number'],
'event_code': entry_data['event_code'],
'team_name': team_data['team_name'],
'class_name': team_data.get('class_name', 'Default'), # class_nameがない場合はデフォルト値を設定
'password': team_data['password']
}
try:
response = requests.post(external_api_url, data=payload)
response.raise_for_status() # エラーレスポンスの場合は例外を発生させる
# レスポンスの処理(必要に応じて)
print(f"External API response: {response.json()}")
except requests.RequestException as e:
# 外部APIコールに失敗した場合のエラーハンドリング
print(f"Failed to call external API: {str(e)}")
# ここでエラーをログに記録したり、管理者に通知したりすることができます
def get_queryset(self):
user = self.request.user
return Team.objects.filter(member__userid=user)
class MemberViewSet(viewsets.ModelViewSet):
queryset = Member.objects.all()
serializer_class = MemberSerializer
permission_classes = [IsAuthenticated]
def create(self, request):
serializer = self.get_serializer(data=request.data)
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)
def get_queryset(self):
user = self.request.user
return Member.objects.filter(userid=user)
class EntryViewSet(viewsets.ModelViewSet):
queryset = Entry.objects.all()
serializer_class = EntrySerializer
permission_classes = [IsAuthenticated]
def create(self, request):
serializer = self.get_serializer(data=request.data)
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)
def get_queryset(self):
user = self.request.user
return Entry.objects.filter(zekken_number__member__userid=user)
#===== AKira ここまで
class UserTracksViewSet(viewsets.ModelViewSet):
@ -550,10 +659,49 @@ class TestActionViewSet(viewsets.ModelViewSet):
def PrivacyView(request):
return render(request, "rog/privacy.html")
class RegistrationView(APIView):
class RegistrationView_old(APIView):
def post(self, request):
serializer = RegistrationSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class RegistrationView(APIView):
def post(self, request):
serializer = RegistrationSerializer(data=request.data)
if serializer.is_valid():
temp_user = serializer.save()
verification_url = request.build_absolute_uri(
reverse('verify_email', kwargs={'verification_code': temp_user.verification_code})
)
send_mail(
'Verify your email',
f'Please click the link to verify your email: {verification_url}',
settings.DEFAULT_FROM_EMAIL,
[temp_user.email],
fail_silently=False,
)
return Response({"message": "Please check your email to complete registration."}, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class VerifyEmailView(APIView):
def get(self, request, verification_code):
try:
temp_user = TempUser.objects.get(verification_code=verification_code)
if not temp_user.is_valid():
temp_user.delete()
return Response({"error": "Verification link has expired. Please register again."}, status=status.HTTP_400_BAD_REQUEST)
user = CustomUser.objects.create_user(
email=temp_user.email,
password=temp_user.password,
is_rogaining=temp_user.is_rogaining,
zekken_number=temp_user.zekken_number,
event_code=temp_user.event_code,
team_name=temp_user.team_name,
group=temp_user.group
)