debug temp

This commit is contained in:
2024-07-31 00:56:23 +00:00
parent 26e8e68dbd
commit 49b3ee7342
9 changed files with 383 additions and 100 deletions

View File

@ -1,7 +1,7 @@
from rest_framework import serializers
from django.db import IntegrityError
from django.urls import reverse
from .utils import send_verification_email,send_invitation_email,send_team_join_email,send_entry_email
from .utils import send_verification_email,send_invitation_email,send_team_join_email
from django.conf import settings
import uuid
from rest_framework.exceptions import ValidationError as DRFValidationError
@ -86,6 +86,95 @@ class UserTracksViewSet(viewsets.ModelViewSet):
serializer_class = UserTracksSerializer
@api_view(['PUT'])
@permission_classes([IsAuthenticated])
def update_user_info(request, user_id):
try:
user = CustomUser.objects.get(id=user_id)
except CustomUser.DoesNotExist:
return Response({"error": "User not found"}, status=status.HTTP_404_NOT_FOUND)
if request.user.id != user_id:
return Response({"error": "You don't have permission to update this user's information"}, status=status.HTTP_403_FORBIDDEN)
data = request.data
logger.debug(f"Received data for update: {data}")
# CustomUserの更新可能なフィールドを指定
updateable_fields = ['zekken_number', 'event_code', 'team_name', 'group']
#for field in updateable_fields:
# if field in data:
# setattr(user, field, data[field])
updated_fields = []
for field in updateable_fields:
if field in data:
old_value = getattr(user, field)
setattr(user, field, data[field])
new_value = getattr(user, field)
if old_value != new_value:
updated_fields.append(f"{field}: {old_value} -> {new_value}")
logger.debug(f"Fields to be updated: {updated_fields}")
try:
user.save()
logger.info(f"User {user_id} updated. Changed fields: {', '.join(updated_fields)}")
serializer = CustomUserSerializer(user)
return Response(serializer.data, status=status.HTTP_200_OK)
except Exception as e:
logger.error(f"Error updating user {user_id}: {str(e)}")
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
@api_view(['PUT'])
@permission_classes([IsAuthenticated])
def update_user_detail(request, user_id):
try:
user = CustomUser.objects.get(id=user_id)
except CustomUser.DoesNotExist:
return Response({"error": "User not found"}, status=status.HTTP_404_NOT_FOUND)
if request.user.id != user_id:
return Response({"error": "You don't have permission to update this user's information"}, status=status.HTTP_403_FORBIDDEN)
data = request.data
logger.debug(f"Received data for update: {data}")
# CustomUserの更新可能なフィールドを指定
updateable_fields = ['firstname', 'lastname', 'date_of_birth', 'female']
#for field in updateable_fields:
# if field in data:
# setattr(user, field, data[field])
updated_fields = []
for field in updateable_fields:
if field in data:
old_value = getattr(user, field)
setattr(user, field, data[field])
new_value = getattr(user, field)
if old_value != new_value:
updated_fields.append(f"{field}: {old_value} -> {new_value}")
logger.debug(f"Fields to be updated: {updated_fields}")
try:
user.save()
logger.info(f"User {user_id} updated. Changed fields: {', '.join(updated_fields)}")
serializer = CustomUserSerializer(user)
return Response(serializer.data, status=status.HTTP_200_OK)
except Exception as e:
logger.error(f"Error updating user {user_id}: {str(e)}")
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
def LocationsInPerf(request):
perfecture = request.GET.get('perf')
@ -149,8 +238,38 @@ def LocationsInSubPerf(request):
serializer = LocationSerializer(locs, many=True)
return JsonResponse(serializer.data, safe=False)
# この関数LocationInBoundは、地理的な範囲内にある特定の条件を満たす位置情報を検索し、結果をJSON形式で返すものです。主なロジックは以下の通りです
#
# 1.リクエストパラメータの取得:
# 4つの緯度経度ペアlat1/lon1からlat4/lon4
# カテゴリcat
# グループgrp
# ROGRegion of Gazeフラグis_rog
#
# 2. 境界ポリゴンの作成:
# 4つの緯度経度ペアが全て提供された場合、それらを使用してジオメトリポリゴンを作成します。
#
# 3.位置情報のフィルタリング:
# 基本的に、ポリゴン内geom__within=plにある位置情報を検索します。
# イベント名がないevent_name__isnull=True位置情報のみを対象とします。
# カテゴリ、グループ、ROGフラグの有無に応じて、さらにフィルタリングを行います
# カテゴリが指定された場合、そのカテゴリに一致する位置情報のみを検索します。
# ROGフラグがある場合、cpおそらくcheck pointが0でない位置情報を検索します。
# ROGフラグがない場合、location_nameに'観光'を含む位置情報のみを検索します。
# グループが指定された場合、そのグループを含む位置情報のみを検索します。
#
# 4.結果の返却:
# 検索結果が120件を超える場合、"too_many_points"フラグを立てたJSONレスポンスを返します。
# それ以外の場合、LocationSerializerを使用して位置情報をシリアライズし、JSONレスポンスとして返します。
#
# 5.エラーハンドリング:
# 必要な緯度経度パラメータが不足している場合、空のJSONオブジェクトを返します。
#
# この関数は、主に観光関連の位置情報を特定の地理的範囲内で検索し、様々な条件でフィルタリングすることができます。ROGフラグの有無によって検索条件が変わるのが特徴的です。
#
def LocationInBound(request):
logger.debug(f"Received request parameters: {request.GET}")
lat1 = float(request.GET.get('la1'))
lon1 = float(request.GET.get('ln1'))
lat2 = float(request.GET.get('la2'))
@ -164,8 +283,35 @@ def LocationInBound(request):
is_rog = request.GET.get('rog')
logger.debug(f"Parsed parameters: lat1={lat1}, lon1={lon1}, lat2={lat2}, lon2={lon2}, "
f"lat3={lat3}, lon3={lon3}, lat4={lat4}, lon4={lon4}, "
f"cat={cat}, grp={grp}, is_rog={is_rog}")
if(lat1 != None and lon1 != None and lat2 != None and lon2 != None and lat3 != None and lon3 != None and lat4 != None and lon4 != None):
pl = geos.Polygon(((lon1, lat1), (lon2, lat2), (lon3, lat3), (lon4, lat4), (lon1, lat1)), srid=4326)
logger.debug(f"Created polygon: {pl}")
base_query = Location.objects.filter(geom__within=pl, event_name__isnull=True)
if cat:
base_query = base_query.filter(category=cat)
if is_rog:
base_query = base_query.filter(~Q(cp=0))
else:
base_query = base_query.filter(location_name__contains='観光')
if grp:
base_query = base_query.filter(group__contains=grp)
logger.debug(f"Final query: {base_query.query}")
locs = base_query
logger.debug(f"Number of locations found: {len(locs)}")
'''
if(cat):
if is_rog:
if grp:
@ -188,7 +334,9 @@ def LocationInBound(request):
locs = Location.objects.filter(geom__within=pl, event_name__isnull=True, group__contains=grp, location_name__contains='観光')
else:
locs = Location.objects.filter(geom__within=pl, event_name__isnull=True, location_name__contains='観光')
if len(locs) > 120:
'''
if len(locs) > 200:
return JsonResponse({"too_many_points": True}, safe=False, status=500)
else:
serializer = LocationSerializer(locs, many=True)
@ -684,6 +832,21 @@ class NewEventListView(generics.ListAPIView):
serializer_class = NewEventSerializer
permission_classes = [IsAuthenticated]
def update_external_system(zekken_number, event_code, team_name, class_name, password):
api_url = f"{settings.FRONTEND_URL}/gifuroge/update_team_name"
data = {
"zekken_number": zekken_number,
"new_team_name": team_name,
"event_code": event_code
}
try:
response = requests.post(api_url, json=data)
response.raise_for_status()
return True
except requests.RequestException as e:
logger.error(f"Failed to update external system. Error: {str(e)}")
return False
class TeamViewSet(viewsets.ModelViewSet):
serializer_class = TeamSerializer
permission_classes = [permissions.IsAuthenticated, IsTeamOwner]
@ -693,6 +856,7 @@ class TeamViewSet(viewsets.ModelViewSet):
def perform_create(self, serializer):
with transaction.atomic():
category = serializer.validated_data['category']
category = NewCategory.objects.select_for_update().get(id=category.id)
zekken_number = category.category_number
@ -702,6 +866,19 @@ class TeamViewSet(viewsets.ModelViewSet):
serializer.save(owner=self.request.user, zekken_number=zekken_number)
team = self.get_object()
# 外部システムの更新
success = update_external_system(
team.zekken_number,
team.owner.event_code,
team.team_name,
team.category.category_name,
team.owner.password
)
if not success:
raise serializers.ValidationError("外部システムの更新に失敗しました。")
def destroy(self, request, *args, **kwargs):
team = self.get_object()
@ -715,6 +892,22 @@ class TeamViewSet(viewsets.ModelViewSet):
except Exception as e:
return Response({"error": "更新に失敗しました。競合が発生した可能性があります。"}, status=status.HTTP_409_CONFLICT)
def perform_update(self, serializer):
with transaction.atomic():
team = serializer.save()
# 外部システムの更新
success = update_external_system(
team.zekken_number,
team.owner.event_code,
team.team_name,
team.category.category_name,
team.owner.password
)
if not success:
raise serializers.ValidationError("外部システムの更新に失敗しました。")
@action(detail=True, methods=['post'])
def copy(self, request, pk=None):
original_team = self.get_object()
@ -834,11 +1027,28 @@ class EntryViewSet(viewsets.ModelViewSet):
def update(self, request, *args, **kwargs):
logger.info(f"Update method called for Entry with ID: {kwargs.get('pk')}")
logger.debug(f"Request data: {request.data}")
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)
try:
serializer.is_valid(raise_exception=True)
logger.debug(f"Serializer validated data: {serializer.validated_data}")
except serializers.ValidationError as e:
logger.error(f"Validation error: {e.detail}")
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
try:
self.perform_update(serializer)
logger.info(f"Entry updated successfully: {serializer.data}")
except Exception as e:
logger.exception(f"Error updating Entry: {str(e)}")
return Response({"error": "An error occurred while updating the entry."}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
return Response(serializer.data)
def destroy(self, request, *args, **kwargs):
@ -921,7 +1131,8 @@ class MemberViewSet(viewsets.ModelViewSet):
**user_data,
verification_code=str(uuid.uuid4())
)
send_invitation_email(temp_user, team)
send_invitation_email(temp_user, team) #仮登録済みでも確認メールを送る。
return Response({"message": "Invitation email sent to the user."}, status=status.HTTP_201_CREATED)