API 95%完成。メール未テスト、早野API未テスト、ユーザー情報・削除は動いてない。

This commit is contained in:
2024-07-26 14:54:24 +00:00
parent bcfcceb068
commit 44ad30093c
3 changed files with 112 additions and 43 deletions

View File

@ -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/<str:activation_token>/',ResendInvitationEmailView.as_view(),name='reactivate'),
]

View File

@ -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 # エラーを再度発生させて、呼び出し元で処理できるようにします

View File

@ -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):