100 lines
3.0 KiB
Python
100 lines
3.0 KiB
Python
import datetime
|
|
import sys
|
|
import os.path
|
|
from . import dsl
|
|
from . import daterange
|
|
from . import generate_timetable
|
|
from . import parse_coursefile
|
|
|
|
def parse_date(text):
|
|
split = text.split('-')
|
|
assert(len(split) == 3)
|
|
return tuple(map(int, split))
|
|
|
|
def main():
|
|
args = sys.argv[1:]
|
|
|
|
if len(args) > 2 and args[1] == '--overlaps':
|
|
only_overlaps = True
|
|
args = args[:1] + args[2:]
|
|
else:
|
|
only_overlaps = False
|
|
|
|
if len(args) == 1:
|
|
year, week, day = datetime.date.today().isocalendar()
|
|
if day >= 6: # on weekend, show next week
|
|
year, week, day = (datetime.date.today() + datetime.timedelta(2)).isocalendar()
|
|
dates = daterange.week(year, week)
|
|
filename = args[0]
|
|
elif len(args) == 2:
|
|
filename = args[0]
|
|
date = parse_date(args[1])
|
|
dates = daterange.between(date, date)
|
|
elif len(args) == 3:
|
|
filename = args[0]
|
|
start = parse_date(args[1])
|
|
end = parse_date(args[2])
|
|
dates = daterange.between(start, end)
|
|
else:
|
|
print('%s [--overlaps] file [start [end]]' % (os.path.basename(sys.argv[0])), file = sys.stderr)
|
|
print('start and end are in yyyy-mm-dd format', file = sys.stderr)
|
|
sys.exit(1)
|
|
|
|
with open(filename, 'r') as f:
|
|
courses_parsed = parse_coursefile.parse(f.read())
|
|
|
|
courses = []
|
|
for name, time_range, info, parsed_filter in courses_parsed:
|
|
date_filter = dsl.compile(parsed_filter)
|
|
courses.append((name, time_range, info, date_filter))
|
|
|
|
timetable = generate_timetable.generate_timetable(dates, courses)
|
|
|
|
timetable_by_date = []
|
|
current_date = None
|
|
current_date_entries = []
|
|
for date, time_range, name, info in timetable:
|
|
if current_date is None:
|
|
current_date = date
|
|
|
|
if date == current_date:
|
|
current_date_entries.append((time_range, name, info))
|
|
else:
|
|
timetable_by_date.append((current_date, current_date_entries))
|
|
current_date = date
|
|
current_date_entries = []
|
|
current_date_entries.append((time_range, name, info))
|
|
|
|
if current_date is not None and current_date_entries != []:
|
|
timetable_by_date.append((current_date, current_date_entries))
|
|
|
|
print(dates)
|
|
print()
|
|
|
|
for date, entries in timetable_by_date:
|
|
entries.sort(key = lambda x: x[0].range()[0])
|
|
previous_time_range = None
|
|
previous_name = None
|
|
if not only_overlaps:
|
|
print(date)
|
|
for time_range, name, info in entries:
|
|
if not only_overlaps:
|
|
print('\t%s %s: %s' % (time_range, name, info))
|
|
if previous_time_range is not None:
|
|
if time_range.overlaps(previous_time_range):
|
|
if only_overlaps:
|
|
print('%s: %s %s | %s %s' % (date, previous_time_range, previous_name, time_range, name))
|
|
else:
|
|
print('\t\tOverlap')
|
|
# If the current's ending time is before the previous's, don't change previous_time_range in case it overlaps with several
|
|
# If current's ending time after, it's safe to change
|
|
if time_range.range()[1] >= previous_time_range.range()[1]:
|
|
previous_time_range = time_range
|
|
previous_name = name
|
|
else:
|
|
previous_time_range = time_range
|
|
previous_name = name
|
|
else:
|
|
previous_time_range = time_range
|
|
previous_name = name
|