almost finish migrate new circumstances

This commit is contained in:
2025-08-24 19:44:36 +09:00
parent 1ba305641e
commit fe5a044c82
67 changed files with 1194889 additions and 467 deletions

235
rog/views_apis/s3_views.py Normal file
View File

@ -0,0 +1,235 @@
"""
API views for S3 image management
"""
import json
from rest_framework import status
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from django.views.decorators.csrf import csrf_exempt
from ..services.s3_service import S3Service
import logging
logger = logging.getLogger(__name__)
@api_view(['POST'])
@permission_classes([IsAuthenticated])
@csrf_exempt
def upload_checkin_image(request):
"""
Upload checkin image to S3
POST /api/upload-checkin-image/
{
"event_code": "FC岐阜",
"team_code": "3432",
"cp_number": 10,
"image": <file>
}
"""
try:
# Validate required fields
event_code = request.data.get('event_code')
team_code = request.data.get('team_code')
image_file = request.FILES.get('image')
cp_number = request.data.get('cp_number')
if not all([event_code, team_code, image_file]):
return Response({
'error': 'event_code, team_code, and image are required'
}, status=status.HTTP_400_BAD_REQUEST)
# Initialize S3 service
s3_service = S3Service()
# Upload image
s3_url = s3_service.upload_checkin_image(
image_file=image_file,
event_code=event_code,
team_code=team_code,
cp_number=cp_number
)
return Response({
'success': True,
'image_url': s3_url,
'message': 'Image uploaded successfully'
}, status=status.HTTP_201_CREATED)
except Exception as e:
logger.error(f"Error uploading checkin image: {e}")
return Response({
'error': str(e)
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
@api_view(['POST'])
@permission_classes([IsAuthenticated])
@csrf_exempt
def upload_standard_image(request):
"""
Upload standard image (goal, start, etc.) to S3
POST /api/upload-standard-image/
{
"event_code": "FC岐阜",
"image_type": "goal", # goal, start, checkpoint, etc.
"image": <file>
}
"""
try:
# Validate required fields
event_code = request.data.get('event_code')
image_type = request.data.get('image_type')
image_file = request.FILES.get('image')
if not all([event_code, image_type, image_file]):
return Response({
'error': 'event_code, image_type, and image are required'
}, status=status.HTTP_400_BAD_REQUEST)
# Validate image_type
valid_types = ['goal', 'start', 'checkpoint', 'finish']
if image_type not in valid_types:
return Response({
'error': f'image_type must be one of: {valid_types}'
}, status=status.HTTP_400_BAD_REQUEST)
# Initialize S3 service
s3_service = S3Service()
# Upload standard image
s3_url = s3_service.upload_standard_image(
image_file=image_file,
event_code=event_code,
image_type=image_type
)
return Response({
'success': True,
'image_url': s3_url,
'message': 'Standard image uploaded successfully'
}, status=status.HTTP_201_CREATED)
except Exception as e:
logger.error(f"Error uploading standard image: {e}")
return Response({
'error': str(e)
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
@api_view(['GET'])
def get_standard_image(request):
"""
Get standard image URL
GET /api/get-standard-image/?event_code=FC岐阜&image_type=goal
"""
try:
event_code = request.GET.get('event_code')
image_type = request.GET.get('image_type')
if not all([event_code, image_type]):
return Response({
'error': 'event_code and image_type are required'
}, status=status.HTTP_400_BAD_REQUEST)
# Initialize S3 service
s3_service = S3Service()
# Get standard image URL
image_url = s3_service.get_standard_image_url(event_code, image_type)
if image_url:
return Response({
'success': True,
'image_url': image_url
}, status=status.HTTP_200_OK)
else:
return Response({
'success': False,
'message': 'Standard image not found',
'image_url': None
}, status=status.HTTP_404_NOT_FOUND)
except Exception as e:
logger.error(f"Error getting standard image: {e}")
return Response({
'error': str(e)
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
@api_view(['GET'])
def list_event_images(request):
"""
List all images for an event
GET /api/list-event-images/?event_code=FC岐阜&limit=50
"""
try:
event_code = request.GET.get('event_code')
limit = int(request.GET.get('limit', 100))
if not event_code:
return Response({
'error': 'event_code is required'
}, status=status.HTTP_400_BAD_REQUEST)
# Initialize S3 service
s3_service = S3Service()
# List event images
image_urls = s3_service.list_event_images(event_code, limit)
return Response({
'success': True,
'event_code': event_code,
'image_count': len(image_urls),
'images': image_urls
}, status=status.HTTP_200_OK)
except Exception as e:
logger.error(f"Error listing event images: {e}")
return Response({
'error': str(e)
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
@api_view(['DELETE'])
@permission_classes([IsAuthenticated])
@csrf_exempt
def delete_image(request):
"""
Delete image from S3
DELETE /api/delete-image/
{
"image_url": "https://sumasenrogaining.s3.us-west-2.amazonaws.com/FC岐阜/3432/image.jpg"
}
"""
try:
image_url = request.data.get('image_url')
if not image_url:
return Response({
'error': 'image_url is required'
}, status=status.HTTP_400_BAD_REQUEST)
# Initialize S3 service
s3_service = S3Service()
# Delete image
success = s3_service.delete_image(image_url)
if success:
return Response({
'success': True,
'message': 'Image deleted successfully'
}, status=status.HTTP_200_OK)
else:
return Response({
'success': False,
'message': 'Failed to delete image'
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
except Exception as e:
logger.error(f"Error deleting image: {e}")
return Response({
'error': str(e)
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)