Stop tracking migrations and release 4.8.9
This commit is contained in:
467
rog/views.py
467
rog/views.py
@ -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):
|
||||
|
||||
Reference in New Issue
Block a user