#!/usr/bin/env python3 import argparse import datetime import random from string import Template import sys class SPTemplate(Template): delimiter = '%%' def print_sp_template(template: SPTemplate, duration: str, names: list[str]): defs = [rf'\csdef{{name{i+1}}}{{{n}}}' for i, n in enumerate(names)] defs.append(rf'\csdef{{duration}}{{{duration}}}') print(template.substitute({'defs': '\n'.join(defs)})) def main(): """Entry point generating a random seating plan from students names""" parser = argparse.ArgumentParser() parser.add_argument('template') duration_group = parser.add_mutually_exclusive_group() duration_group.add_argument( '--duration', default=f'KW: {datetime.datetime.now().isocalendar()[1]}') duration_group.add_argument('--week', type=int) args = parser.parse_args() names = [line[:-1] for line in sys.stdin.readlines()] random.shuffle(names) duration = args.duration if args.week: # https://stackoverflow.com/questions/56163008/how-to-get-all-dates-of-week-based-on-week-number-in-python # Starts with knowing the day of the week week_day = datetime.datetime.now().isocalendar()[2] week_offset = args.week - datetime.datetime.now().isocalendar()[1] # Calculates Starting date (Sunday) for this case by subtracting # current date with time delta of the day of the week start_date = datetime.datetime.now() - datetime.timedelta( days=week_day) + datetime.timedelta(days=(week_offset * 7) + 1) # Prints the list of dates in a current week duration = ( f'KW: {args.week}~~~{start_date.strftime("%d.%m")} - ' f'{(start_date + datetime.timedelta(days=4)).strftime("%d.%m")}') with open(args.template, 'r', encoding='utf-8') as template_file: template = SPTemplate(template_file.read()) print_sp_template(template, duration, names) if __name__ == '__main__': main()