new supervisor step2

This commit is contained in:
hayano
2024-10-28 20:25:05 +00:00
parent 2913a435c1
commit a6b816c9f2
12 changed files with 733 additions and 138 deletions

View File

@ -30,7 +30,7 @@ from .permissions import IsTeamOwner,IsTeamOwnerOrMember
from curses.ascii import NUL
from django.core.serializers import serialize
from .models import GoalImages, Location, Location_line, Location_polygon, JpnAdminMainPerf, Useractions, GifuAreas, RogUser, CustomUser, UserTracks, GoalImages, CheckinImages, NewEvent,NewEvent2, Team, Category, NewCategory,Entry, Member, TempUser,EntryMember
from .models import GoalImages, Location, Location_line, Location_polygon, JpnAdminMainPerf, Useractions, GifuAreas, RogUser, CustomUser, UserTracks, GoalImages, CheckinImages, NewEvent,NewEvent2, Team, Category, NewCategory,Entry, Member, TempUser, EntryMember, GpsCheckin
from rest_framework import viewsets
from .serializers import LocationSerializer, Location_lineSerializer, Location_polygonSerializer, JPN_main_perfSerializer, LocationCatSerializer, UserSerializer, LoginUserSerializer, UseractionsSerializer, UserDestinationSerializer, GifuAreaSerializer, LocationEventNameSerializer, RogUserSerializer, UserTracksSerializer, ChangePasswordSerializer, GolaImageSerializer, CheckinImageSerializer, RegistrationSerializer, MemberWithUserSerializer,TempUserRegistrationSerializer, PasswordResetRequestSerializer, PasswordResetConfirmSerializer
from knox.models import AuthToken
@ -52,7 +52,6 @@ from django.db.models import Q
from rest_framework import permissions
from rest_framework.views import APIView
from rest_framework.decorators import api_view
from rest_framework.decorators import api_view, permission_classes
from rest_framework.parsers import JSONParser, MultiPartParser
from django.views.decorators.csrf import csrf_exempt
@ -63,7 +62,7 @@ from django.utils.decorators import method_decorator
from django.utils.encoding import force_str
import logging
from datetime import datetime
from datetime import datetime,timedelta
from django.contrib.gis.measure import D
from django.contrib.gis.geos import Point
@ -88,6 +87,8 @@ from django.core.exceptions import ValidationError
import xlsxwriter
from io import BytesIO
from django.urls import get_resolver
logger = logging.getLogger(__name__)
@api_view(['PATCH'])
@ -2316,14 +2317,38 @@ class UserLastGoalTimeView(APIView):
# ----- for Supervisor -----
@api_view(['GET'])
def get_events(request):
events = NewEvent2.objects.filter(public=True)
return Response([{
'code': event.event_name,
'name': event.event_name
} for event in events])
def debug_urls(request):
"""デバッグ用利用可能なURLパターンを表示"""
resolver = get_resolver()
urls = []
for pattern in resolver.url_patterns:
try:
urls.append(str(pattern.pattern))
except:
urls.append(str(pattern))
return JsonResponse({'urls': urls})
@api_view(['GET'])
def get_events(request):
logger.debug(f"get_events was called. Path: {request.path}")
try:
events = NewEvent2.objects.filter(public=True)
logger.debug(f"Found {events.count()} events") # デバッグ用ログ
return Response([{
'code': event.event_name,
'name': event.event_name,
'start_datetime': event.start_datetime,
'end_datetime': event.end_datetime,
} for event in events])
logger.debug(f"Returning data: {data}") # デバッグ用ログ
return JsonResponse(data, safe=False)
except Exception as e:
print(f"Error in get_events: {str(e)}") # デバッグ用
return Response(
{"error": "Failed to retrieve events"},
status=status.HTTP_500_INTERNAL_SERVER_ERROR
)
@api_view(['GET'])
def get_zekken_numbers(request, event_code):
entries = Entry.objects.filter(
event__event_name=event_code,
@ -2333,31 +2358,101 @@ def get_zekken_numbers(request, event_code):
@api_view(['GET'])
def get_team_info(request, zekken_number):
entry = Entry.objects.select_related('team').get(zekken_number=zekken_number)
entry = Entry.objects.select_related('team','event').get(zekken_number=zekken_number)
members = Member.objects.filter(team=entry.team)
# チームのゴール時間を取得
goal_record = GoalImages.objects.filter(
team_name=entry.team.team_name,
event_code=entry.event.event_name
).order_by('-goaltime').first()
return Response({
'team_name': entry.team.team_name,
'members': ', '.join([f"{m.lastname} {m.firstname}" for m in members]),
'start_time': entry.start_time.strftime('%Y-%m-%d %H:%M:%S') if entry.start_time else None,
'goal_time': entry.goal_time.strftime('%Y-%m-%d %H:%M:%S') if entry.goal_time else None,
'late_points': entry.late_point or 0
'event_code': entry.event.event_name,
'start_datetime': entry.event.start_datetime,
'end_datetime': goal_record.goaltime if goal_record else None
})
def create(self, request, *args, **kwargs):
logger.info(f"Attempting to create new member for team: {self.kwargs['team_id']}")
logger.debug(f"Received data: {request.data}")
team = Team.objects.get(id=self.kwargs['team_id'])
@api_view(['GET'])
def get_checkins(request, zekken_number):
checkins = GpsCheckin.objects.filter(
zekken_number=zekken_number
).order_by('path_order')
return Response([{
'id': c.id,
'path_order': c.path_order,
'cp_number': c.cp_number,
'create_at': c.create_at,
'validate_location': c.validate_location,
'points': c.points,
'buy_flag': c.buy_flag
} for c in checkins])
def get_checkins(request, *args, **kwargs):
#def get_checkins(request, zekken_number, event_code):
try:
# イベントコードをクエリパラメータから取得
zekken_number = kwargs['zekken_number']
if not zekken_number:
logger.debug(f"=== Zekken_number is required.")
return Response({"error": "zekken_number is required"}, status=400)
event_code = kwargs['event_code']
if not event_code:
logger.debug(f"=== event_code is required.")
return Response({"error": "event_code is required"}, status=400)
# チェックインデータの取得とCP情報の結合
checkins = GpsCheckin.objects.filter(
zekken_number=zekken_number,
event_code=event_code
).order_by('path_order')
# すべてのフィールドを確実に取得できるようにデバッグログを追加
logger.debug(f"Found {checkins.count()} checkins for zekken_number {zekken_number} and event_code {event_code}")
data = []
for c in checkins:
location = Location.objects.filter(cp=c.cp_number,group=event_code).first()
if location:
formatted_time = None
if c.create_at:
try:
# create_atが文字列の場合はdatetimeに変換
if isinstance(c.create_at, str):
c.create_at = datetime.strptime(c.create_at, '%Y-%m-%d %H:%M:%S')
# JST(+9時間)に変換して時刻フォーマット
jst_time = c.create_at + timedelta(hours=9)
formatted_time = jst_time.strftime('%H:%M:%S')
except (ValueError, TypeError, AttributeError) as e:
logger.error(f"Error formatting create_at for checkin {c.id}: {str(e)}")
logger.error(f"Raw create_at value: {c.create_at}")
formatted_time = None
data.append({
'id': c.id,
'path_order': c.path_order,
'cp_number': c.cp_number,
'sub_loc_id': location.sub_loc_id if location else f"#{c.cp_number}",
'location_name': location.location_name if location else None,
'create_at': formatted_time, #(c.create_at + timedelta(hours=9)).strftime('%H:%M:%S') if c.create_at else None,
'validate_location': c.validate_location,
'points': c.points or 0,
'buy_flag': c.buy_flag,
'photos': location.photos if location else None,
'image_address': c.image_address,
'receipt_address': c.image_receipt,
'location_name': location.location_name if location else None,
'checkin_point': location.checkin_point if location else None,
'buy_point': location.buy_point
})
logger.debug(f"data={data}")
return Response(data)
except Exception as e:
logger.error(f"Error in get_checkins: {str(e)}", exc_info=True)
return Response(
{"error": f"Failed to retrieve checkins: {str(e)}"},
status=status.HTTP_500_INTERNAL_SERVER_ERROR
)
@api_view(['POST'])
def update_checkins(request):
@ -2418,4 +2513,8 @@ def export_excel(request, zekken_number):
# ----- for Supervisor -----
@api_view(['GET'])
def test_api(request):
logger.debug("Test API endpoint called")
return JsonResponse({"status": "API is working"})