Соотнесите время студента с временным интервалом помощника, чтобы составить таблицу расписания

Я пытаюсь сделать систему планирования для помощников и студентов в моей школе.

Логика заключается в том, что у каждого ТА есть свободный период (от start_time до end_time в некоторые дни недели, и 15-минутные слоты в течение этого периода. (Я уже придумал, как вывести это в HTML). У каждого студента также есть время, в которое он хочет встретиться с доступным ТА, чей временной интервал совпадает с временем студента в тот же день недели. У меня возникают проблемы с тем, как сопоставить время студента и время ТА и поместить имя студента рядом с временем ТА.

Например, некоторые экземпляры Student будут выглядеть следующим образом:
Салли, 19:00, 4
Сэм, 20:00, 4

Некоторые случаи учителя были бы такими: Джерри, 19:00, 19:30, 4
. Джей, 20:00, 20:30, 4

Мой идеальный выход:

  1. Джерри
  • 19:00 Салли
  • 19:15
  • 19:30
  1. Джей
  • 20:00 Сэм
  • 20:15
  • 20:30

Вот мои models.py:

from django.db import models

from datetime import date, datetime, timedelta

# Create your models here.

DAYS_OF_WEEK = (
    (0, 'Monday'),
    (1, 'Tuesday'),
    (2, 'Wednesday'),
    (3, 'Thursday'),
    (4, 'Friday'),
    (5, 'Saturday'),
    (6, 'Sunday'),
)

class Student(models.Model):
    name = models.CharField(max_length=64)
    time = models.TimeField(blank=False)
    day = models.IntegerField(choices=DAYS_OF_WEEK)

    def __str__(self):
        return f"{self.name}, {self.day}, {self.time}"

class Teacher(models.Model):
    name = models.CharField(max_length=64)
    start_time = models.TimeField(blank=False)
    end_time = models.TimeField(blank=False)
    day = models.IntegerField(choices=DAYS_OF_WEEK)

    def __str__(self):
        return f"{self.name}, {self.day}: {self.start_time} to {self.end_time}"

    def minutes_slices(self, minutes=15):
        # We can't add minutes to datetime.time, so we need to convert it to datetime
        start_date_time = datetime.combine(date.today(), self.start_time)
        end_date_time = datetime.combine(date.today(), self.end_time)
        next_time = start_date_time
        minutes_slices = [next_time.time().strftime("%H:%M")]
        if start_date_time < end_date_time:
            while next_time < end_date_time:
                next_time += timedelta(minutes=minutes)
                minutes_slices.append(next_time.time().strftime("%H:%M"))
        return minutes_slices

views.py:

from django.shortcuts import render

from .models import Student, Teacher
from datetime import datetime

# Create your views here.
def index(request):
    dt = datetime.now()
    dow = dt.weekday()
    teachers = Teacher.objects.filter(day=dow)
    students = Student.objects.filter(day=dow)
    
    covered_students = []
    for teacher in teachers:
        for student in students:
            if student.time > teacher.start_time and student.time < teacher.end_time:
                if student.name not in covered_students:
                    covered_students.append(student.name) # those who has a slot for them
    
    return render(request, "students/index.html", {
        "students": covered_students, #
        "datetime": dt,
        "today": dt.strftime('%A'),
        "teachers": teachers
    })

index.html:

{% extends "students/layout.html" %}

{% block body %}
    <h1>今日抽词排班</h1>
    今天是 {{ datetime }}, {{ today }}
    <br>

        <ol>
        {% for teacher in teachers %}
            <li>
                {{ teacher.name }}, {{ teacher.start_time }} to {{ teacher.end_time }}
            </li>
                <ul>
                    {% for minutes_slice in teacher.minutes_slices %} 
                        <li>
                            {{ minutes_slice }}
                        </li>
                    {% endfor %}
                </ul>

        {% endfor %}
        </ol>

        {{ students }}
{% endblock %}

Веб-страница на данный момент: enter image description here

Вернуться на верх