diff --git a/rog/urls.py b/rog/urls.py index 8b0f544..c082fa0 100644 --- a/rog/urls.py +++ b/rog/urls.py @@ -1,7 +1,7 @@ from sys import prefix from rest_framework import urlpatterns from rest_framework.routers import DefaultRouter -from .views import LocationViewSet, Location_lineViewSet, Location_polygonViewSet, Jpn_Main_PerfViewSet, LocationsInPerf, ExtentForSubPerf, SubPerfInMainPerf, ExtentForMainPerf, LocationsInSubPerf, CatView, RegistrationAPI, LoginAPI, UserAPI, UserActionViewset, UserMakeActionViewset, UserDestinations, UpdateOrder, LocationInBound, DeleteDestination, CustomAreaLocations, GetAllGifuAreas, CustomAreaNames, userDetials, UserTracksViewSet, CatByCity, ChangePasswordView, GoalImageViewSet, CheckinImageViewSet, ExtentForLocations, DeleteAccount, PrivacyView, RegistrationView, TeamViewSet,MemberViewSet,EntryViewSet,RegisterView, VerifyEmailView, NewEventListView,NewEvent2ListView,NewCategoryListView,CategoryListView, MemberUserDetailView, TeamMembersWithUserView,MemberAddView,UserActivationView,RegistrationView,TempUserRegistrationView +from .views import LocationViewSet, Location_lineViewSet, Location_polygonViewSet, Jpn_Main_PerfViewSet, LocationsInPerf, ExtentForSubPerf, SubPerfInMainPerf, ExtentForMainPerf, LocationsInSubPerf, CatView, RegistrationAPI, LoginAPI, UserAPI, UserActionViewset, UserMakeActionViewset, UserDestinations, UpdateOrder, LocationInBound, DeleteDestination, CustomAreaLocations, GetAllGifuAreas, CustomAreaNames, userDetials, UserTracksViewSet, CatByCity, ChangePasswordView, GoalImageViewSet, CheckinImageViewSet, ExtentForLocations, DeleteAccount, PrivacyView, RegistrationView, TeamViewSet,MemberViewSet,EntryViewSet,RegisterView, VerifyEmailView, NewEventListView,NewEvent2ListView,NewCategoryListView,CategoryListView, MemberUserDetailView, TeamMembersWithUserView,MemberAddView,UserActivationView,RegistrationView,TempUserRegistrationView,ResendInvitationEmailView from django.urls import path, include from knox import views as knox_views @@ -84,5 +84,6 @@ urlpatterns += [ #path('register/', RegistrationView.as_view(), name='register'), #直接の登録はしない。 path('register/', TempUserRegistrationView.as_view(), name='temp-register'), # 仮登録 #path('register/temp/', RegisterView.as_view(), name='register'), # 古い仮登録 + path('reactivate//',ResendInvitationEmailView.as_view(),name='reactivate'), ] diff --git a/rog/utils.py b/rog/utils.py index 5e5fb7e..42a2041 100644 --- a/rog/utils.py +++ b/rog/utils.py @@ -14,8 +14,21 @@ def load_email_template(template_name, context): subject, _, body = email_content.partition('\n\n') subject = subject.replace('件名: ', '').strip() + # 件名と本文を分離し、件名から改行を削除 + subject, _, body = email_content.partition('\n\n') + subject = subject.replace('件名: ', '').strip().replace('\n', ' ') + return subject, body +def share_send_email(subject, body, recipient_email): + try: + send_mail(subject, body, settings.DEFAULT_FROM_EMAIL, [recipient_email], fail_silently=False) + logger.info(f"メールを送信しました。 受信者: {recipient_email}") + except Exception as e: + logger.error(f"メールの送信に失敗しました。 受信者: {recipient_email}, エラー: {str(e)}") + raise # エラーを再度発生させて、呼び出し元で処理できるようにします + + # 既にユーザーになっている人にチームへの参加要請メールを出す。 # def send_team_join_email(sender,user,team,entry,activation_link): @@ -26,14 +39,9 @@ def send_team_join_email(sender,user,team,entry,activation_link): 'service_name': settings.SERVICE_NAME, } - subject, body = load_email_template('activation_email.txt', context) - - try: - send_mail(subject, body, settings.DEFAULT_FROM_EMAIL, [user.email], fail_silently=False) - logger.info(f"チームへの参加承認メールを送信しました。 受信者: {user.email}") - except Exception as e: - logger.error(f"チームへの参加承認メールの送信に失敗しました。 受信者: {user.email}, エラー: {str(e)}") - raise # エラーを再度発生させて、呼び出し元で処理できるようにします + subject, body = load_email_template('team_invitation_email.txt', context) + share_send_email(subject,body,user.email) + # 自らユーザー登録した際に、メールの確認メールを送る。 # @@ -46,16 +54,7 @@ def send_verification_email(user, activation_link): } subject, body = load_email_template('verification_email.txt', context) - - logger.info(f"subject: {subject}") - logger.info(f"body: {body}") - - try: - send_mail(subject, body, settings.DEFAULT_FROM_EMAIL, [user.email], fail_silently=False) - logger.info(f"アクティベーションメールを送信しました。 受信者: {user.email}") - except Exception as e: - logger.error(f"アクティベーションメールの送信に失敗しました。 受信者: {user.email}, エラー: {str(e)}") - raise # エラーを再度発生させて、呼び出し元で処理できるようにします + share_send_email(subject,body,user.email) # まだユーザーでない人にチームメンバー招待メールを送る @@ -70,14 +69,10 @@ def send_invitation_email(sender,user,team,entry,activation_link): 'service_name': settings.SERVICE_NAME, } - subject, body = load_email_template('invitaion_email.txt', context) + subject, body = load_email_template('rogaining_invitaion_email.txt', context) + share_send_email(subject,body,user.email) + - try: - send_mail(subject, body, settings.DEFAULT_FROM_EMAIL, [user.email], fail_silently=False) - logger.info(f"招待メールを送信しました。 受信者: {user.email}") - except Exception as e: - logger.error(f"招待メールの送信に失敗しました。 受信者: {user.email}, エラー: {str(e)}") - raise # エラーを再度発生させて、呼び出し元で処理できるようにします # エントリーしたら、その内容をメンバーに送信する。 # @@ -89,12 +84,7 @@ def send_entry_email(sender,user,team,entry,activation_link): 'service_name': settings.SERVICE_NAME, } - subject, body = load_email_template('invitaion_email.txt', context) + subject, body = load_email_template('entry_notification_email.txt', context) + share_send_email(subject,body,user.email) - try: - send_mail(subject, body, settings.DEFAULT_FROM_EMAIL, [user.email], fail_silently=False) - logger.info(f"エントリーメールを送信しました。 受信者: {user.email}") - except Exception as e: - logger.error(f"エントリーメールの送信に失敗しました。 受信者: {user.email}, エラー: {str(e)}") - raise # エラーを再度発生させて、呼び出し元で処理できるようにします diff --git a/rog/views.py b/rog/views.py index 39df5fa..18fd0c8 100644 --- a/rog/views.py +++ b/rog/views.py @@ -332,6 +332,7 @@ class UserUpdateAPI(generics.UpdateAPIView): return Response(serializer.data) +# User 情報取得 class UserAPI(generics.RetrieveAPIView): permission_classes = [permissions.IsAuthenticated,] serializer_class = UserSerializer @@ -810,6 +811,28 @@ class EntryViewSet(viewsets.ModelViewSet): def perform_create(self, serializer): serializer.save(owner=self.request.user) + def register_team(self, entry): + api_url = f"{settings.FRONTEND_URL}/gifuroge/register_team" + user = self.request.user + + data = { + "zekken_number": entry.team.zekken_number, + "event_code": entry.event.event_code, + "team_name": entry.team.team_name, + "class_name": entry.category.category_name, + "password": user.password # パスワードの扱いに注意が必要です + } + + try: + response = requests.post(api_url, data=data) + response.raise_for_status() + logger.info(f"Team registered successfully for entry {entry.id}") + except requests.RequestException as e: + logger.error(f"Failed to register team for entry {entry.id}. Error: {str(e)}") + # エラーが発生しても、エントリー自体は作成されています + # 必要に応じて、ここでエラーハンドリングを追加できます + + def update(self, request, *args, **kwargs): partial = kwargs.pop('partial', False) instance = self.get_object() @@ -1133,20 +1156,75 @@ class RegisterView(APIView): return Response({'message': 'Verification email sent'}, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) +class ResendInvitationEmailView(APIView): + def post(self, request): + email = request.data.get('email') + if not email: + return Response({"error": "メールアドレスを指定してください。"}, status=status.HTTP_400_BAD_REQUEST) + + try: + temp_user = TempUser.objects.get(email=email) + verification_url = request.build_absolute_uri( + reverse('verify-email', kwargs={'verification_code': temp_user.verification_code}) + ) + send_verification_email(temp_user, verification_url) + logger.info(f"招待メールを再送信しました。Email: {email}") + return Response({"message": "招待メールを再送信しました。"}, status=status.HTTP_200_OK) + except ObjectDoesNotExist: + logger.warning(f"仮登録されていないメールアドレスに対して招待メールの再送信が試みられました。Email: {email}") + return Response({"error": "指定されたメールアドレスは仮登録されていません。"}, status=status.HTTP_404_NOT_FOUND) + + + + class TempUserRegistrationView(APIView): def post(self, request): - serializer = TempUserRegistrationSerializer(data=request.data) - if serializer.is_valid(): - temp_user = serializer.save() - verification_code = uuid.uuid4() - temp_user.verification_code = verification_code - temp_user.save() + email = request.data.get('email') + + # 本登録済みのユーザーチェック + if CustomUser.objects.filter(email=email).exists(): + logger.warning(f"既に本登録されているメールアドレスでの仮登録が試みられました。Email: {email}") + return Response({"error": "このメールアドレスは既に本登録されています。"}, status=status.HTTP_400_BAD_REQUEST) + + # 仮登録済みのユーザーチェック + try: + temp_user = TempUser.objects.get(email=email) verification_url = request.build_absolute_uri( - reverse('verify-email', kwargs={'verification_code': verification_code}) + reverse('verify-email', kwargs={'verification_code': temp_user.verification_code}) ) - send_verification_email(temp_user,verification_url) #招待メールを送る。 - return Response({"message": "仮登録が完了しました。招待メールを送信しました。"}, status=status.HTTP_201_CREATED) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + send_verification_email(temp_user, verification_url) + logger.info(f"既に仮登録されているユーザーに招待メールを再送信しました。Email: {email}") + return Response({"message": "既に仮登録は行われていますが、招待メールを再送信しました。"}, status=status.HTTP_200_OK) + except TempUser.DoesNotExist: + # 新規仮登録 + serializer = TempUserRegistrationSerializer(data=request.data) + if serializer.is_valid(): + temp_user = serializer.save() + verification_code = uuid.uuid4() + temp_user.verification_code = verification_code + temp_user.save() + verification_url = request.build_absolute_uri( + reverse('verify-email', kwargs={'verification_code': verification_code}) + ) + send_verification_email(temp_user, verification_url) + logger.info(f"新規ユーザーを仮登録し、招待メールを送信しました。Email: {email}") + return Response({"message": "仮登録が完了しました。招待メールを送信しました。"}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + + + #serializer = TempUserRegistrationSerializer(data=request.data) + #if serializer.is_valid(): + # temp_user = serializer.save() + # verification_code = uuid.uuid4() + # temp_user.verification_code = verification_code + # temp_user.save() + # verification_url = request.build_absolute_uri( + # reverse('verify-email', kwargs={'verification_code': verification_code}) + # ) + # send_verification_email(temp_user,verification_url) #招待メールを送る。 + # return Response({"message": "仮登録が完了しました。招待メールを送信しました。"}, status=status.HTTP_201_CREATED) + #return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) # アクティベーション class VerifyEmailView(APIView):