initialize supervisor...still has bugs
This commit is contained in:
110
rog/views.py
110
rog/views.py
@ -85,6 +85,9 @@ from django.conf import settings
|
||||
from django.db import transaction
|
||||
from django.core.exceptions import ValidationError
|
||||
|
||||
import xlsxwriter
|
||||
from io import BytesIO
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@api_view(['PATCH'])
|
||||
@ -2309,3 +2312,110 @@ class UserLastGoalTimeView(APIView):
|
||||
'message': 'User not found'
|
||||
}, status=status.HTTP_404_NOT_FOUND)
|
||||
|
||||
|
||||
# ----- 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])
|
||||
|
||||
@api_view(['GET'])
|
||||
def get_zekken_numbers(request, event_code):
|
||||
entries = Entry.objects.filter(
|
||||
event__event_name=event_code,
|
||||
is_active=True
|
||||
).order_by('zekken_number')
|
||||
return Response([entry.zekken_number for entry in entries])
|
||||
|
||||
@api_view(['GET'])
|
||||
def get_team_info(request, zekken_number):
|
||||
entry = Entry.objects.select_related('team').get(zekken_number=zekken_number)
|
||||
members = Member.objects.filter(team=entry.team)
|
||||
|
||||
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
|
||||
})
|
||||
|
||||
@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])
|
||||
|
||||
@api_view(['POST'])
|
||||
def update_checkins(request):
|
||||
with transaction.atomic():
|
||||
for update in request.data:
|
||||
checkin = GpsCheckin.objects.get(id=update['id'])
|
||||
checkin.path_order = update['path_order']
|
||||
checkin.validate_location = update['validate_location']
|
||||
checkin.save()
|
||||
return Response({'status': 'success'})
|
||||
|
||||
@api_view(['GET'])
|
||||
def export_excel(request, zekken_number):
|
||||
# エントリー情報の取得
|
||||
entry = Entry.objects.select_related('team').get(zekken_number=zekken_number)
|
||||
checkins = GpsCheckin.objects.filter(zekken_number=zekken_number).order_by('path_order')
|
||||
|
||||
# Excelファイルの生成
|
||||
output = BytesIO()
|
||||
workbook = xlsxwriter.Workbook(output)
|
||||
worksheet = workbook.add_worksheet('通過証明書')
|
||||
|
||||
# スタイルの定義
|
||||
header_format = workbook.add_format({
|
||||
'bold': True,
|
||||
'bg_color': '#CCCCCC',
|
||||
'border': 1
|
||||
})
|
||||
|
||||
# ヘッダー情報の書き込み
|
||||
worksheet.write('A1', 'チーム名', header_format)
|
||||
worksheet.write('B1', entry.team.team_name)
|
||||
worksheet.write('A2', 'ゼッケン番号', header_format)
|
||||
worksheet.write('B2', zekken_number)
|
||||
|
||||
# チェックインデータの書き込み
|
||||
headers = ['順序', 'CP番号', 'チェックイン時刻', '検証', 'ポイント']
|
||||
for col, header in enumerate(headers):
|
||||
worksheet.write(3, col, header, header_format)
|
||||
|
||||
for row, checkin in enumerate(checkins, start=4):
|
||||
worksheet.write(row, 0, checkin.path_order)
|
||||
worksheet.write(row, 1, checkin.cp_number)
|
||||
worksheet.write(row, 2, checkin.create_at.strftime('%Y-%m-%d %H:%M:%S'))
|
||||
worksheet.write(row, 3, '✓' if checkin.validate_location else '')
|
||||
worksheet.write(row, 4, checkin.points)
|
||||
|
||||
workbook.close()
|
||||
|
||||
# レスポンスの生成
|
||||
output.seek(0)
|
||||
response = HttpResponse(
|
||||
output.read(),
|
||||
content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
||||
)
|
||||
response['Content-Disposition'] = f'attachment; filename=通過証明書_{zekken_number}.xlsx'
|
||||
return response
|
||||
|
||||
# ----- for Supervisor -----
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user