示例#1
0
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)