diff --git a/3q b/3q new file mode 100644 index 0000000..92998eb --- /dev/null +++ b/3q @@ -0,0 +1,172 @@ +#!/usr/bin/env python +""" +CHURCH CALENDAR CSV GENERATOR +""" + +import calendar +from dataclasses import dataclass +from datetime import datetime +from pprint import pprint +import sys +import click +from dataclass_csv import DataclassWriter +from events import EVENT_LIST, YEAR, DEBUG + + +def debug_print(data, condition=True): + """Conditionally print data using pprint. + + Args: + data: The data to be printed. + condition: A boolean value. If True, the data will be printed. + """ + if condition: + pprint.pprint(data) + + +""" +build a list of months / weeks / day of the month in those weeks + months 1-12, weeks 0-5 days of week 5 6 are the 1st and 2nd of month + MONTHS[1] [0] [ 0 0 0 0 0 1 2 ] + +due to how months work + week 0 can have null days (represented by 0's) + weeks 1 - 4 will have all 7 days present + week 5 may have 7 days or nulls + week 6 can have a monday and/or tuesday in them if the 1st falls on a + saturday or sunday in week 0 + +EVENT_LIST has weeks as 1-6 while MONTHS has weeks as 0-5, offsetting will + be necessary +""" +MONTHS: dict[int, list[list[int]]] +MONTHS = dict(enumerate([calendar.monthcalendar(YEAR, month) for month in + range(1, 13)], start=1)) + +""" convert EVENT_LIST into monthly_events """ +monthly_events = [[] for _ in range(7)] +for event in EVENT_LIST: + monthly_events[event[0]].append(event[1:]) + +@dataclass +class Event(): + """Event for CSV export""" + # pylint: disable=too-many-instance-attributes + event_name: str + venue_name: str + organizer_name: str + start_date: str + start_time: str + end_date: str + end_time: str + all_day_event: str + categories: str + event_cost: str + event_phone: str + event_website: str + show_map_link: str + show_map: str + event_description: str + +def suffix(day: int) -> str: + """convert day to suffix""" + result: str = 'th' + if day in [1, 21, 31]: + result = 'st' + elif day in [2, 22]: + result = 'nd' + elif day in [3, 23]: + result = 'rd' + return result + + +def sort_events(events: list[Event]) -> list[Event]: + """sort events""" + events = sorted(events, key=lambda k: (k.start_date, k.start_time)) + return events + +def add_event(events: list[Event], + name: str, + categories: str, + description: str, + start, + finish) -> None: + """create event""" + # pylint: disable=too-many-arguments + event = Event(name, + "Main Campus", + "", + start.strftime("%Y-%m-%d"), + start.strftime("%I:%M %p"), + finish.strftime("%Y-%m-%d"), + finish.strftime("%I:%M %p"), + "FALSE", + categories, + "", + "", + "", + "", + "", + description) + events.append(event) + + +def write_calendar(events: list[Event]) -> None: + """write calendar to csv file""" + with open("calendar.csv", "w", encoding="utf-8") as handle: + writer =DataclassWriter(handle, events, Event) + writer.map("event_name").to("EVENT NAME") + writer.map("venue_name").to("VENUE NAME") + writer.map("organizer_name").to("ORGANIZER NAME") + writer.map("start_date").to("START DATE") + writer.map("start_time").to("START TIME") + writer.map("end_date").to("END DATE") + writer.map("end_time").to("END TIME") + writer.map("all_day_event").to("ALL DAY EVENT") + writer.map("categories").to("CATEGORIES") + writer.map("event_cost").to("EVENT COST") + writer.map("event_phone").to("EVENT PHONE") + writer.map("event_website").to("EVENT_WEBSITE") + writer.map("show_map_link").to("SHOW MAP LINK?") + writer.map("show_map").to("SHOW MAP?") + writer.map("event_description").to("EVENT DESCRIPTION") + writer.write() + + + +def process_month(MONTHS, monthly_events, week_of_month, week, events): + """process one MONTHS of events""" + for day_of_week, day in enumerate(week): + if day > 0: + """ + month, week_of_month, day_of_week, day + use monthly_events[day_of_week] + """ + debug_print(f" {day_of_week}-{day:02d}", DEBUG) + day_events = [x[1:] for x in monthly_events[day_of_week] if week_of_month + 1 in x[0]] + debug_print(day_events, DEBUG) + debug_print("", DEBUG) + return events + + +def process_months(MONTHS, monthly_events): + """process full year of MONTHS and return list of events""" + events = [] + for month in range(1, 13): + debug_print(f"MONTH: {month}", DEBUG) + for week_of_month, week in enumerate(MONTHS[month]): + debug_print(f"{week_of_month} {week}", DEBUG) + events = process_month(MONTHS, monthly_events, week_of_month, week, events) + return events + +@click.command() +def main(): + """create csv file""" + events = process_months(MONTHS, monthly_events) + events = sort_events(events) + write_calendar(events) + sys.exit(0) + + +if __name__ == "__main__": + main() # pylint: disable=E1120 diff --git a/events.py b/events.py index 27a1779..963c4e8 100755 --- a/events.py +++ b/events.py @@ -10,7 +10,6 @@ from calendar import SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATUR YEAR: int = 2025 - EVENT_LIST = ( # ------------- ---------------- # day weeks start end venue category name description (SUNDAY, [1 ], 10, 00, 12, 00, "Main Campus", "Sunday Service", "Sunday Service 10:00am", "Prayer Room open from 8:30 AM to 9:30 AM. Worship Service starts at 10:00 AM. First Sunday of the month is Missions Sunday"), @@ -30,3 +29,5 @@ EVENT_LIST = ( # ------------- -------- (SATURDAY, [2 ], 8, 00, 10, 00, "Main Campus", "Men's Meeting", "Men's Breakfast 8:00am", ""), # (--------, [- ], 18, 00, 20, 00, "Main Campus", "Youth Group", "South County Youth Group 6:00pm", ""), ) + +DEBUG = False diff --git a/main.py b/main.py index 2840ef9..34f0db4 100755 --- a/main.py +++ b/main.py @@ -10,7 +10,19 @@ from pprint import pprint import sys import click from dataclass_csv import DataclassWriter -from events import EVENT_LIST, YEAR +from events import EVENT_LIST, YEAR, DEBUG + + +def debug_print(data, condition=True): + """Conditionally print data using pprint. + + Args: + data: The data to be printed. + condition: A boolean value. If True, the data will be printed. + """ + if condition: + pprint(data) + """ build a list of months / weeks / day of the month in those weeks @@ -130,10 +142,10 @@ def process_month(MONTHS, monthly_events, week_of_month, week, events): month, week_of_month, day_of_week, day use monthly_events[day_of_week] """ - print(f" {day_of_week}-{day:02d}", end=" ") + debug_print(f" {day_of_week}-{day:02d}", DEBUG) day_events = [x[1:] for x in monthly_events[day_of_week] if week_of_month + 1 in x[0]] - print(day_events) - print() + debug_print(day_events, DEBUG) + debug_print("", DEBUG) return events @@ -141,9 +153,9 @@ def process_months(MONTHS, monthly_events): """process full year of MONTHS and return list of events""" events = [] for month in range(1, 13): - print(f"MONTH: {month}") + debug_print(f"MONTH: {month}", DEBUG) for week_of_month, week in enumerate(MONTHS[month]): - print(week_of_month, week) + debug_print(f"{week_of_month} {week}", DEBUG) events = process_month(MONTHS, monthly_events, week_of_month, week, events) return events