|  | 
| 2 | 2 | Defines command-line utilities for use with packet | 
| 3 | 3 | """ | 
| 4 | 4 | 
 | 
|  | 5 | +import sys | 
|  | 6 | + | 
| 5 | 7 | from secrets import token_hex | 
| 6 | 8 | from datetime import datetime, time, timedelta | 
| 7 | 9 | import csv | 
| @@ -31,9 +33,9 @@ def create_secret(): | 
| 31 | 33 | 
 | 
| 32 | 34 | class CSVFreshman: | 
| 33 | 35 |     def __init__(self, row): | 
| 34 |  | -        self.name = row[0] | 
| 35 |  | -        self.rit_username = row[3] | 
| 36 |  | -        self.onfloor = row[1] == 'TRUE' | 
|  | 36 | +        self.name = row[0].strip() | 
|  | 37 | +        self.rit_username = row[3].strip() | 
|  | 38 | +        self.onfloor = row[1].strip() == 'TRUE' | 
| 37 | 39 | 
 | 
| 38 | 40 | 
 | 
| 39 | 41 | def parse_csv(freshmen_csv): | 
| @@ -219,31 +221,59 @@ def ldap_sync(): | 
| 219 | 221 | 
 | 
| 220 | 222 | 
 | 
| 221 | 223 | @app.cli.command('fetch-results') | 
| 222 |  | -def fetch_results(): | 
|  | 224 | +@click.option('-f', '--file', 'file_path', required=False, type=click.Path(exists=False, writable=True), | 
|  | 225 | +        help='The file to write to. If no file provided, output is sent to stdout.') | 
|  | 226 | +@click.option('--csv/--no-csv', 'use_csv', required=False, default=False, help='Format output as comma separated list.') | 
|  | 227 | +@click.option('--date', 'date_str', required=False, default='', help='Packet end date in the format MM/DD/YYYY.') | 
|  | 228 | +def fetch_results(file_path, use_csv, date_str): | 
| 223 | 229 |     """ | 
| 224 | 230 |     Fetches and prints the results from a given packet season. | 
| 225 | 231 |     """ | 
| 226 |  | -    end_date = datetime.combine(input_date("Enter the last day of the packet season you'd like to retrieve results " | 
|  | 232 | +    end_date = None | 
|  | 233 | +    try: | 
|  | 234 | +        end_date = datetime.combine(datetime.strptime(date_str, '%m/%d/%Y').date(), packet_end_time) | 
|  | 235 | +    except ValueError: | 
|  | 236 | +        end_date = datetime.combine(input_date("Enter the last day of the packet season you'd like to retrieve results " | 
| 227 | 237 |                                            'from'), packet_end_time) | 
| 228 | 238 | 
 | 
| 229 |  | -    for packet in Packet.query.filter_by(end=end_date).all(): | 
| 230 |  | -        print() | 
| 231 | 239 | 
 | 
| 232 |  | -        print('{} ({}):'.format(packet.freshman.name, packet.freshman.rit_username)) | 
|  | 240 | +    file_handle = open(file_path, 'w', newline='') if file_path else sys.stdout | 
| 233 | 241 | 
 | 
|  | 242 | +    column_titles = ['Name (RIT Username)', 'Upperclassmen Score', 'Total Score', 'Upperclassmen', 'Freshmen', | 
|  | 243 | +            'Miscellaneous', 'Total Missed'] | 
|  | 244 | +    data = list() | 
|  | 245 | +    for packet in Packet.query.filter_by(end=end_date).all(): | 
| 234 | 246 |         received = packet.signatures_received() | 
| 235 | 247 |         required = packet.signatures_required() | 
| 236 | 248 | 
 | 
| 237 |  | -        print('\tUpperclassmen score: {:0.2f}%'.format(received.member_total / required.member_total * 100)) | 
| 238 |  | -        print('\tTotal score: {:0.2f}%'.format(received.total / required.total * 100)) | 
| 239 |  | -        print() | 
| 240 |  | - | 
| 241 |  | -        print('\tUpperclassmen: {}/{}'.format(received.upper, required.upper)) | 
| 242 |  | -        print('\tFreshmen: {}/{}'.format(received.fresh, required.fresh)) | 
| 243 |  | -        print('\tMiscellaneous: {}/{}'.format(received.misc, required.misc)) | 
| 244 |  | -        print() | 
| 245 |  | - | 
| 246 |  | -        print('\tTotal missed:', required.total - received.total) | 
|  | 249 | +        row = [ | 
|  | 250 | +        '{} ({}):'.format(packet.freshman.name, packet.freshman.rit_username), | 
|  | 251 | +        '{:0.2f}%'.format(received.member_total / required.member_total * 100), | 
|  | 252 | +        '{:0.2f}%'.format(received.total / required.total * 100), | 
|  | 253 | +        '{}/{}'.format(received.upper, required.upper), | 
|  | 254 | +        '{}/{}'.format(received.fresh, required.fresh), | 
|  | 255 | +        '{}/{}'.format(received.misc, required.misc), | 
|  | 256 | +        required.total - received.total, | 
|  | 257 | +        ] | 
|  | 258 | +        data.append(row) | 
|  | 259 | + | 
|  | 260 | +    if use_csv: | 
|  | 261 | +        writer = csv.writer(file_handle) | 
|  | 262 | +        writer.writerow(column_titles) | 
|  | 263 | +        writer.writerows(data) | 
|  | 264 | +    else: | 
|  | 265 | +        for row in data: | 
|  | 266 | +            file_handle.write(f''' | 
|  | 267 | +
 | 
|  | 268 | +{row[0]} | 
|  | 269 | +\t{column_titles[1]}: {row[1]} | 
|  | 270 | +\t{column_titles[2]}: {row[2]} | 
|  | 271 | +\t{column_titles[3]}: {row[3]} | 
|  | 272 | +\t{column_titles[4]}: {row[4]} | 
|  | 273 | +\t{column_titles[5]}: {row[5]} | 
|  | 274 | +
 | 
|  | 275 | +\t{column_titles[6]}: {row[6]} | 
|  | 276 | +''') | 
| 247 | 277 | 
 | 
| 248 | 278 | 
 | 
| 249 | 279 | @app.cli.command('extend-packet') | 
|  | 
0 commit comments