mirror of
https://github.com/AquaMorph/dotfiles.git
synced 2025-04-29 09:15:34 +00:00
174 lines
7.3 KiB
Python
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()
|