Stop tracking migrations and release 4.8.9

This commit is contained in:
2024-08-04 18:56:11 +00:00
parent d851e7e4ad
commit 3d195973fc
47 changed files with 313 additions and 1935 deletions

View File

@ -966,161 +966,202 @@ class TeamViewSet(viewsets.ModelViewSet):
def perform_create(self, serializer):
logger.info(f"Creating new team for user: {self.request.user.email}")
team = serializer.save(owner=self.request.user)
logger.info(f"Team created successfully: {team.id}")
with transaction.atomic():
def update_related_entries(self, team):
current_entries = Entry.objects.filter(team=team, is_active=True)
for entry in current_entries:
self.update_external_system(entry.zekken_number, team.owner.event_code, team.team_name)
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() 式の結果を評価
team = serializer.save(owner=self.request.user, zekken_number=zekken_number)
logger.info(f"Team created successfully: {team.id}")
# 外部システムの更新
success = self.register_team(
team.owner,
team.zekken_number,
team.owner.event_code,
team.team_name,
team.category.category_name,
team.owner.password
)
if not success:
logger.error("Failed to register external system")
raise serializers.ValidationError("外部システムの更新に失敗しました。")
logger.info("External system register successfully")
def register_team(self, owner,zekken_number,event_code,team_name,category_name,password):
logger.info(f"register_team ==> zekken_number={zekken_number},event_code={event_code},team_name={team_name},category_name={category_name},password={password}")
api_url = f"{settings.FRONTEND_URL}/gifuroge/register_team"
user = owner
headers = {
"Content-Type": "application/x-www-form-urlencoded"
}
data = {
"zekken_number": zekken_number,
"event_code": event_code,
"team_name": team_name,
"class_name": category_name,
"password": password # パスワードの扱いに注意が必要です
}
try:
response = requests.post(api_url,headers=headers,data=data)
response.raise_for_status()
logger.info(f"Team registered successfully for team {team_name}")
return True
except requests.RequestException as e:
logger.error(f"Failed to register team for entry {entry.id}. Error: {str(e)}")
# エラーが発生しても、エントリー自体は作成されています
# 必要に応じて、ここでエラーハンドリングを追加できます
return False
def destroy(self, request, *args, **kwargs):
team = self.get_object()
if team.members.exists():
return Response(
{
"error": "チームにメンバーが残っているため削除できません。",
"error_code": "TEAM_HAS_MEMBERS"
},
status=status.HTTP_400_BAD_REQUEST
)
#return Response({"error": "チームにメンバーが残っているため削除できません。"}, status=status.HTTP_400_BAD_REQUEST)
return super().destroy(request, *args, **kwargs)
def update_external_system(zekken_number, event_code, team_name, class_name, password):
def update_external_system(self, zekken_number, event_code, team_name):
api_url = f"{settings.FRONTEND_URL}/gifuroge/update_team_name"
headers = {
"Content-Type": "application/x-www-form-urlencoded"
}
headers = {"Content-Type": "application/x-www-form-urlencoded"}
data = {
"zekken_number": zekken_number,
"new_team_name": team_name,
"event_code": event_code,
}
try:
response = requests.post(api_url,headers=headers, data=data)
response = requests.post(api_url, headers=headers, data=data)
response.raise_for_status()
logger.info(f"External system updated for zekken_number: {zekken_number}")
return True
except requests.RequestException as e:
logger.error(f"Failed to update external system. Error: {str(e)}")
return False
def update(self, request, *args, **kwargs):
try:
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)
except Exception as e:
return Response({"error": "更新に失敗しました。競合が発生した可能性があります。"}, status=status.HTTP_409_CONFLICT)
# 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() 式の結果を評価
#
# team = serializer.save(owner=self.request.user, zekken_number=zekken_number)
# logger.info(f"Team created successfully: {team.id}")
#
# # 外部システムの更新
# success = self.register_team(
# team.owner,
# team.zekken_number,
# team.owner.event_code,
# team.team_name,
# team.category.category_name,
# team.owner.password
# )
# if not success:
# logger.error("Failed to register external system")
# raise serializers.ValidationError("外部システムの更新に失敗しました。")
# logger.info("External system register successfully")
#
# def register_team(self, owner,zekken_number,event_code,team_name,category_name,password):
# logger.info(f"register_team ==> zekken_number={zekken_number},event_code={event_code},team_name={team_name},category_name={category_name},password={password}")
# api_url = f"{settings.FRONTEND_URL}/gifuroge/register_team"
# user = owner
#
# headers = {
# "Content-Type": "application/x-www-form-urlencoded"
# }
# data = {
# "zekken_number": zekken_number,
# "event_code": event_code,
# "team_name": team_name,
# "class_name": category_name,
# "password": password # パスワードの扱いに注意が必要です
# }
#
# try:
# response = requests.post(api_url,headers=headers,data=data)
# response.raise_for_status()
# logger.info(f"Team registered successfully for team {team_name}")
# return True
#
# except requests.RequestException as e:
# logger.error(f"Failed to register team for entry {entry.id}. Error: {str(e)}")
# # エラーが発生しても、エントリー自体は作成されています
# # 必要に応じて、ここでエラーハンドリングを追加できます
# return False
#
# def destroy(self, request, *args, **kwargs):
# team = self.get_object()
# if team.members.exists():
# return Response(
# {
# "error": "チームにメンバーが残っているため削除できません。",
# "error_code": "TEAM_HAS_MEMBERS"
# },
# status=status.HTTP_400_BAD_REQUEST
# )
#
# #return Response({"error": "チームにメンバーが残っているため削除できません。"}, status=status.HTTP_400_BAD_REQUEST)
# return super().destroy(request, *args, **kwargs)
#
# def update_external_system(zekken_number, event_code, team_name, class_name, password):
# api_url = f"{settings.FRONTEND_URL}/gifuroge/update_team_name"
# headers = {
# "Content-Type": "application/x-www-form-urlencoded"
# }
# data = {
# "zekken_number": zekken_number,
# "new_team_name": team_name,
# "event_code": event_code,
# }
# try:
# response = requests.post(api_url,headers=headers, data=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
#
# def update(self, request, *args, **kwargs):
# try:
# return super().update(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)
# 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("外部システムの更新に失敗しました。")
else:
print("岐阜ロゲシステム更新に成功")
@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)
#
#
## 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)
#
# 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("外部システムの更新に失敗しました。")
# else:
# print("岐阜ロゲシステム更新に成功")
#
# @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]
#permission_classes = [IsAuthenticated]
@action(detail=True, methods=['POST'])
def get_zekken_number(self, request, pk=None):
try:
with transaction.atomic():
category = NewCategory.objects.select_for_update().get(pk=pk)
category.category_number += 1
category.save()
serializer = self.get_serializer(category)
return Response(serializer.data)
except NewCategory.DoesNotExist:
return Response({"error": "Category not found"}, status=status.HTTP_404_NOT_FOUND)
except Exception as e:
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
class NewCategoryListView(generics.ListAPIView):
queryset = NewCategory.objects.all()
@ -1168,73 +1209,117 @@ class EntryViewSet(viewsets.ModelViewSet):
# 両方のチームに関連するエントリーを取得
return Entry.objects.filter(Q(team__id__in=owned_team_ids) | Q(team__id__in=member_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': self.format_errors(e.detail)}, status=status.HTTP_400_BAD_REQUEST)
# except IntegrityError:
# return Response({'error': '既に登録済みです'}, status=status.HTTP_400_BAD_REQUEST)
except IntegrityError as e:
return Response({'error': f'データベースエラー: {str(e)}'}, status=status.HTTP_400_BAD_REQUEST)
except Exception as e:
return Response({'error': f"予期せぬエラーが発生しました: {str(e),'type': str(type(e))}"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
@transaction.atomic
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
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()
team = serializer.validated_data['team']
entry = serializer.save(owner=self.request.user, zekken_number=zekken_number)
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)
# 外部システムの更新
success = self.register_team(
entry.zekken_number,
team.owner.event_code,
team.team_name,
category.category_name,
team.owner.password
)
if not success:
logger.error("Failed to register external system")
raise serializers.ValidationError("外部システムの更新に失敗しました。")
logger.info("External system registered successfully")
def register_team(self, zekken_number, event_code, team_name, category_name, password):
api_url = f"{settings.FRONTEND_URL}/gifuroge/register_team"
headers = {"Content-Type": "application/x-www-form-urlencoded"}
data = {
"zekken_number": zekken_number,
"event_code": event_code,
"team_name": team_name,
"class_name": category_name,
"password": password
}
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)
response = requests.post(api_url, headers=headers, data=data)
response.raise_for_status()
logger.info(f"Team registered successfully for zekken_number {zekken_number}")
return True
except requests.RequestException as e:
logger.error(f"Failed to register team. Error: {str(e)}")
return False
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)
def get_error_message(self, exception):
if hasattr(exception, 'detail'):
if isinstance(exception.detail, dict):
return '. '.join([f"{key}: {', '.join(value)}" for key, value in exception.detail.items()])
elif isinstance(exception.detail, list):
return '. '.join(exception.detail)
return str(exception)
def format_errors(self, errors):
if isinstance(errors, list):
return '. '.join(errors)
elif isinstance(errors, dict):
return '. '.join([f"{key}: {value}" if isinstance(value, str) else f"{key}: {', '.join(value)}" for key, value in errors.items()])
else:
return str(errors)
# 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': self.format_errors(e.detail)}, status=status.HTTP_400_BAD_REQUEST)
# # except IntegrityError:
# # return Response({'error': '既に登録済みです'}, status=status.HTTP_400_BAD_REQUEST)
# except IntegrityError as e:
# return Response({'error': f'データベースエラー: {str(e)}'}, status=status.HTTP_400_BAD_REQUEST)
#
# except Exception as e:
# return Response({'error': f"予期せぬエラーが発生しました: {str(e),'type': str(type(e))}"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
#
# def perform_create(self, serializer):
# serializer.save(owner=self.request.user)
#
#
# 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)
#
# 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):
# instance = self.get_object()
# self.perform_destroy(instance)
# return Response(status=status.HTTP_204_NO_CONTENT)
#
# def get_error_message(self, exception):
# if hasattr(exception, 'detail'):
# if isinstance(exception.detail, dict):
# return '. '.join([f"{key}: {', '.join(value)}" for key, value in exception.detail.items()])
# elif isinstance(exception.detail, list):
# return '. '.join(exception.detail)
# return str(exception)
#
# def format_errors(self, errors):
# if isinstance(errors, list):
# return '. '.join(errors)
# elif isinstance(errors, dict):
# return '. '.join([f"{key}: {value}" if isinstance(value, str) else f"{key}: {', '.join(value)}" for key, value in errors.items()])
# else:
# return str(errors)
class MemberViewSet(viewsets.ModelViewSet):