Соотнесите время студента с временным интервалом помощника, чтобы составить таблицу расписания
Я пытаюсь сделать систему планирования для помощников и студентов в моей школе.
Логика заключается в том, что у каждого ТА есть свободный период (от start_time
до end_time
в некоторые дни недели, и 15-минутные слоты в течение этого периода. (Я уже придумал, как вывести это в HTML). У каждого студента также есть время, в которое он хочет встретиться с доступным ТА, чей временной интервал совпадает с временем студента в тот же день недели. У меня возникают проблемы с тем, как сопоставить время студента и время ТА и поместить имя студента рядом с временем ТА.
Например, некоторые экземпляры Student будут выглядеть следующим образом:
Салли, 19:00, 4
Сэм, 20:00, 4
Некоторые случаи учителя были бы такими:
Джерри, 19:00, 19:30, 4
.
Джей, 20:00, 20:30, 4
Мой идеальный выход:
- Джерри
- 19:00 Салли
- 19:15
- 19:30
- Джей
- 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 %}
Веб-страница на данный момент: