config/scripts/create_blocks.py

Summary

Maintainability
A
45 mins
Test Coverage
#!/usr/bin/env python3

import argparse
import os
import string
from datetime import datetime, timedelta

import django

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "intranet.settings")
django.setup()

from intranet.apps.eighth.models import EighthActivity, EighthBlock, EighthScheduledActivity  # noqa: E402


def generate_blocks(args: argparse.Namespace) -> None:
    activities = EighthActivity.objects.all()
    today = datetime.now()
    for i in range(args.count):
        date = (today + timedelta(days=i * args.interval)).strftime("%Y-%m-%d")
        for letter in args.letters:
            block = EighthBlock.objects.get_or_create(date=date, block_letter=letter)[0]
            block.save()
            for activity in activities:
                scheduled_activity = EighthScheduledActivity.objects.get_or_create(block=block, activity=activity)[0]
                scheduled_activity.capacity = activity.default_capacity
                scheduled_activity.save()

        if args.verbose:
            print(f"Created eighth period on {date} ({', '.join(args.letters)})")


def main() -> None:
    parser = argparse.ArgumentParser()
    parser.add_argument("-c", "--count", type=int, default=30, help="Number of eighth blocks to make, defaults to 30")
    parser.add_argument("-l", "--letters", type=str, nargs="+", required=True, choices=list(string.ascii_uppercase), help="Block letters")
    parser.add_argument("-i", "--interval", type=int, default=1, help="Interval in days between blocks, defaults to 1")
    parser.add_argument("-v", "--verbose", action="store_true", help="Enables verbose output")
    args = parser.parse_args()
    generate_blocks(args)


if __name__ == "__main__":
    main()