dotfiles/scripts/bin/frc-photo-checklist.py

174 lines
7.3 KiB
Python

#!/usr/bin/env python3
# Program to create a photo checklist of a given frc event.
import configparser
import datetime as dt
import re
import operator
import os
import sys
import tbapy
import todoist
# getProjectID() returns the project id that matches the name given.
def getProjectID(api, name):
for project in api.state['projects']:
if project['name'] == name:
return project['id']
print('Error: No project with the name {} found'.format(name))
exit(1)
# getChecklistName()
def getChecklistName(evemt):
return '{} Photos'.format(event['name'])
# getEventListID() returns the id of the checklist for the event and if there is none
# returns -1.
def getEventListID(items, event):
for item in items:
if item['content'] == getChecklistName(event):
return item['id']
return -1
# matchToTeamList() converts a match to two lists of teams
def matchToTeamList(match):
return match['alliances']['red']['team_keys'], match['alliances']['blue']['team_keys']
# createChecklistItem() creates a checklist item of the highest priority.
def createChecklistItem(name, api, projectID, item, date):
return api.items.add(name,
project_id=projectID,
parent_id=item['id'],
date_string=date,
priority=4)
# createPhotoChecklistItem() creates a checklist item that requires a photo.
def createPhotoChecklistItem(name, api, projectID, item, date):
return createChecklistItem('Take photo of **{}**'.format(name),
api, projectID, item, date)
# createPitList() creates a checklist for taking photos of a teams pit.
def createPitList(api, teams, projectID, checklist, date):
item = api.items.add('**Take** Pit Photos',
project_id=projectID,
parent_id=checklist['id'],
date_string=date,
priority=3)
for team in teams:
createChecklistItem('Pit photo of **{}** {}'.format(team['team_number'], team['nickname']),
api, projectID, item, date)
# createGroupsList() creates a checklist of the different groups of volenteers.
def createGroupsList(api, projectID, checklist, date):
item = api.items.add('Groups',
project_id=projectID,
parent_id=checklist['id'],
date_string=date,
priority=3)
groups = ['Judges', 'Robot Inspectors', 'Referees', 'Safety Inspectors',
'Field Reset', 'Queuers', 'CSAs', 'VC and Pit Admin']
for group in groups:
createPhotoChecklistItem(group, api, projectID, item, date)
# createWinnersList() creates a checklist of the winners of an event.
def createWinnersList(api, projectID, checklist, date):
item = api.items.add('Winners',
project_id=projectID,
parent_id=checklist['id'],
date_string=date,
priority=3)
groups = ['Chairman\'s award', 'Engineering Inspiration', 'Rookie All-Star', 'Winning Alliance',
'Winning Team 1', 'Winning Team 2', 'Winning Team 3']
for group in groups:
createPhotoChecklistItem(group, api, projectID, item, date)
# createRobotList() creates a checklist for taking photos of a team's robot.
def createRobotList(api, teams, projectID, checklist, date):
item = api.items.add('**Take** Robot Photos',
project_id=projectID,
parent_id=checklist['id'],
date_string=date,
priority=3)
for team in teams:
createChecklistItem('Robot photo of **{}** {}'.format(team['team_number'], team['nickname']),
api, projectID, item, date)
# Parse settings config
configString = '[Settings]\n' + open('../settings.conf').read()
configParser = configparser.RawConfigParser()
configParser.read_string(configString)
# Load needed credentials
tbaKey = configParser.get('Settings', 'TBAKey')
todoistToken = configParser.get('Settings', 'TodoistToken')
# Setup Todoist
api = todoist.TodoistAPI(todoistToken)
api.sync()
projectID = getProjectID(api, '🤖 Robotics')
items = api.state['items']
# Setup the Blue Alliance
tba = tbapy.TBA(tbaKey)
eventKey = sys.argv[1]
event = tba.event(eventKey)
setupDay = event['start_date']
day1 = (dt.datetime.strptime(setupDay, '%Y-%m-%d') + dt.timedelta(days=1)).strftime('%Y-%m-%d')
day2 = event['end_date']
teams = sorted(tba.event_teams(eventKey), key=operator.attrgetter('team_number'))
def firstMatch(team, matches):
for match in matches:
red, blue = matchToTeamList(match)
if team in red:
return match, 'red'
elif team in blue:
return match, 'blue'
return None, None
# Check if list already exists
eventListID = getEventListID(items, event)
if eventListID == -1:
# Create checklist
checklist = api.items.add(getChecklistName(event),
project_id=projectID,
date_string=day2,
priority=2)
# Setup
createPitList(api, teams, projectID, checklist, setupDay)
createChecklistItem('**Schedule** Judges photo', api, projectID, checklist, setupDay)
createChecklistItem('**Schedule** Inspectors photo', api, projectID, checklist, setupDay)
createChecklistItem('**Schedule** Seniors photo', api, projectID, checklist, setupDay)
createGroupsList(api, projectID, checklist, setupDay)
# Day 1
createPhotoChecklistItem('Guest Speakers', api, projectID, checklist, day1)
createRobotList(api, teams, projectID, checklist, day1)
# Day 2
createPhotoChecklistItem('Guest Speakers', api, projectID, checklist, day2)
createPhotoChecklistItem('Mentors after parade', api, projectID, checklist, day2)
createPhotoChecklistItem('Seniors', api, projectID, checklist, day2)
createPhotoChecklistItem('Alliances Representatives', api, projectID, checklist, day2)
createWinnersList(api, projectID, checklist, day2)
createChecklistItem('**Email** guest speakers and winners photos', api, projectID, checklist, day2)
else:
print('List already created')
matches = sorted(tba.event_matches(eventKey), key=operator.attrgetter('time'))
if not matches:
print('No match schedule yet')
else:
photoParentID = [item['id'] for item in items if 'parent_id' in item
and item['parent_id'] == eventListID
and 'Robot Photos' in item['content']][0]
robotPhotoList = [item for item in items if 'Robot photo of' in item['content']
and item['parent_id'] == photoParentID]
for robot in robotPhotoList:
if 'match' not in robot['content']:
team = 'frc{}'.format(re.findall(r'\d+', robot['content'])[0])
match, side = firstMatch(team, matches)
if match != None:
matchNumber = match['match_number']
matchTime = dt.datetime.fromtimestamp(match['time']).strftime('%Y-%m-%d %I:%M %p')
robot.update(date_string=matchTime, content='{} match {} {}'.format(robot['content'], matchNumber, side))
api.commit()