new supervisor step2
This commit is contained in:
19
rog/urls.py
19
rog/urls.py
@ -1,7 +1,8 @@
|
||||
from sys import prefix
|
||||
from rest_framework import urlpatterns
|
||||
from rest_framework.routers import DefaultRouter
|
||||
from .views import LocationViewSet, Location_lineViewSet, Location_polygonViewSet, Jpn_Main_PerfViewSet, LocationsInPerf, ExtentForSubPerf, SubPerfInMainPerf, ExtentForMainPerf, LocationsInSubPerf, CatView, RegistrationAPI, LoginAPI, UserAPI, UserActionViewset, UserMakeActionViewset, UserDestinations, UpdateOrder, LocationInBound, DeleteDestination, CustomAreaLocations, GetAllGifuAreas, CustomAreaNames, userDetials, UserTracksViewSet, CatByCity, ChangePasswordView, GoalImageViewSet, CheckinImageViewSet, ExtentForLocations, DeleteAccount, PrivacyView, RegistrationView, TeamViewSet,MemberViewSet,EntryViewSet,RegisterView, VerifyEmailView, NewEventListView,NewEvent2ListView,NewCategoryListView,CategoryListView, MemberUserDetailView, TeamMembersWithUserView,MemberAddView,UserActivationView,RegistrationView,TempUserRegistrationView,ResendInvitationEmailView,update_user_info,update_user_detail,ActivateMemberView, ActivateNewMemberView, PasswordResetRequestView, PasswordResetConfirmView, NewCategoryViewSet,LocationInBound2,UserLastGoalTimeView,TeamEntriesView,update_entry_status,get_events,get_zekken_numbers,get_team_info,get_checkins,update_checkins,export_excel
|
||||
from .views import LocationViewSet, Location_lineViewSet, Location_polygonViewSet, Jpn_Main_PerfViewSet, LocationsInPerf, ExtentForSubPerf, SubPerfInMainPerf, ExtentForMainPerf, LocationsInSubPerf, CatView, RegistrationAPI, LoginAPI, UserAPI, UserActionViewset, UserMakeActionViewset, UserDestinations, UpdateOrder, LocationInBound, DeleteDestination, CustomAreaLocations, GetAllGifuAreas, CustomAreaNames, userDetials, UserTracksViewSet, CatByCity, ChangePasswordView, GoalImageViewSet, CheckinImageViewSet, ExtentForLocations, DeleteAccount, PrivacyView, RegistrationView, TeamViewSet,MemberViewSet,EntryViewSet,RegisterView, VerifyEmailView, NewEventListView,NewEvent2ListView,NewCategoryListView,CategoryListView, MemberUserDetailView, TeamMembersWithUserView,MemberAddView,UserActivationView,RegistrationView,TempUserRegistrationView,ResendInvitationEmailView,update_user_info,update_user_detail,ActivateMemberView, ActivateNewMemberView, PasswordResetRequestView, PasswordResetConfirmView, NewCategoryViewSet,LocationInBound2,UserLastGoalTimeView,TeamEntriesView,update_entry_status,get_events,get_zekken_numbers,get_team_info,get_checkins,update_checkins,export_excel,debug_urls
|
||||
|
||||
|
||||
from django.urls import path, include
|
||||
from knox import views as knox_views
|
||||
@ -51,7 +52,7 @@ router.register(r'newevent2', views.NewEvent2ViewSet)
|
||||
# GET /api/teams/<team_id>/members-with-user/: 特定のチームの全メンバーとそのユーザー情報を取得
|
||||
|
||||
|
||||
|
||||
app_name = 'rog' # 名前空間を追加
|
||||
|
||||
urlpatterns = router.urls
|
||||
|
||||
@ -113,11 +114,13 @@ urlpatterns += [
|
||||
|
||||
|
||||
# for Supervisor Web app
|
||||
path('api/events/', get_events, name='get_events'),
|
||||
path('api/zekken_numbers/<str:event_code>/', get_zekken_numbers, name='get_zekken_numbers'),
|
||||
path('api/team_info/<int:zekken_number>/', get_team_info, name='get_team_info'),
|
||||
path('api/checkins/<int:zekken_number>/', get_checkins, name='get_checkins'),
|
||||
path('api/update_checkins/', update_checkins, name='update_checkins'),
|
||||
path('api/export_excel/<int:zekken_number>/', export_excel, name='export_excel'),
|
||||
path('events/', views.get_events, name='get_events'),
|
||||
path('debug/urls/', views.debug_urls, name='debug_urls'),
|
||||
path('zekken_numbers/<str:event_code>/', views.get_zekken_numbers, name='get_zekken_numbers'),
|
||||
path('team_info/<int:zekken_number>/', views.get_team_info, name='get_team_info'),
|
||||
path('checkins/<int:zekken_number>/<str:event_code>/', views.get_checkins, name='get_checkins'),
|
||||
path('update_checkins/', views.update_checkins, name='update_checkins'),
|
||||
path('export_excel/<int:zekken_number>/<str:event_code>/', views.export_excel, name='export_excel'),
|
||||
# for Supervisor Web app
|
||||
path('test/', views.test_api, name='test_api'),
|
||||
]
|
||||
|
||||
151
rog/views.py
151
rog/views.py
@ -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"})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user