def activities(): add_activity_form = AddActivityForm() find_times_form = FindTimesForm() find_rooms_form = FindRoomsForm() delete_activity_form = DeleteActivityForm() activities_table = [ activity.iterable_datetime() for activity in Activity.query.all() ] def datetime_sorter(combined_datetime): weeks = ['A', 'B'] days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] times = ['Before school', 'Lunch', 'After school'] combined_datetime = combined_datetime.split() week = combined_datetime[1] day = combined_datetime[2][:-1] time = combined_datetime[3] try: time += ' ' + combined_datetime[4] except IndexError: pass week = weeks.index(week) day = days.index(day) time = times.index(time) return (week * 7 + day) * 3 + time activities_table = sorted(activities_table, key=lambda x: datetime_sorter(x[2])) show_options = { 'edit_id': False, 'edit': False, 'add': False, 'delete': False, 'find_times': False, 'find_rooms': False } data = request.form if 'add' in data: show_options['add'] = True redirect('activities') if 'edit' in data: show_options['edit_id'] = True redirect('activities') if 'delete' in data: show_options['delete'] = True redirect('activities') if 'find_times' in data: show_options['find_times'] = True redirect('activities') if 'find_rooms' in data: show_options['find_rooms'] = True redirect('activities') if add_activity_form.submit_add.data and add_activity_form.validate_on_submit( ): teacher_s_names = [] for k, v in data.items(multi=True): if 'teacher' in k: teacher_s_names.append(v) r_id = find_id_room(add_activity_form.r_name.data) if Activity.query.filter( Activity.r_id == r_id and Activity.week == add_activity_form.week.data and Activity.day == add_activity_form.day.data and Activity.time == add_activity_form.time.data).all(): flash('Room not available at this time') return redirect('activities') new_activity = Activity( a_name=add_activity_form.a_name.data, r_id=r_id, week=add_activity_form.week.data, day=add_activity_form.day.data, time=add_activity_form.time.data, max_attendees=add_activity_form.max_attendees.data, food_supplied=add_activity_form.food_supplied.data) new_activity.add() teacher_ids = [ find_id_teacher(t_s_name) for t_s_name in teacher_s_names ] for t_id in teacher_ids: TeacherActivityLink(a_id=new_activity.id, t_id=t_id).add() return redirect('activities') if find_times_form.submit_find_times.data and find_times_form.validate_on_submit( ): r_id = find_id_room(find_times_form.room.data) weeks = ['A', 'B'] days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] times = ['Before school', 'Lunch', 'After school'] all_times = { week: {day: {time: None for time in times} for day in days} for week in weeks } activities_in_room = Activity.query.filter(Activity.r_id == r_id).all() for activity in activities_in_room: all_times[activity.week][activity.day][activity.time] = activity available_times = [ f'Week {week} {day}, {time}' for week in weeks for day in days for time in times if not all_times[week][day][time] ] return render_template( 'activities.html', activities_table=activities_table, add_activity_form=add_activity_form, show_options=show_options, available_times=available_times, find_times_form=find_times_form, available_times_room=Room.query.get(r_id).r_name) if find_rooms_form.submit_find_rooms.data and find_rooms_form.validate_on_submit( ): week = find_rooms_form.week.data day = find_rooms_form.day.data time = find_rooms_form.time.data all_rooms = {room: None for room in Room.query.all()} activities_at_times = Activity.query.filter( Activity.week == week, Activity.day == day, Activity.time == time).all() for activity in activities_at_times: all_rooms[Room.query.get(activity.r_id)] = activity available_rooms = [ room.r_name for room in all_rooms if not all_rooms[room] ] datetime = f'Week {week} {day}, {time}' return render_template('activities.html', activities_table=activities_table, add_activity_form=add_activity_form, show_options=show_options, available_rooms=available_rooms, find_times_form=find_times_form, available_rooms_datetime=datetime) if delete_activity_form.submit_delete_id.data and delete_activity_form.validate_on_submit( ): activity_to_delete = Activity.query.filter( Activity.a_name == delete_activity_form.a_name.data).first() if not activity_to_delete: flash('Couldn\'t find activity') else: TeacherActivityLink.query.filter( TeacherActivityLink.a_id == activity_to_delete.id).delete() Activity.query.filter( Activity.a_name == delete_activity_form.a_name.data).delete() db.session.commit() return redirect('activities') return render_template('activities.html', activities_table=activities_table, add_activity_form=add_activity_form, show_options=show_options, find_times_form=find_times_form, find_rooms_form=find_rooms_form, delete_activity_form=delete_activity_form)