You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

117 lines
4.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

from django.db import models
import datetime
from user.models import Student, Teacher
from constants import COURSE_STATUS, COURSE_OPERATION
# Create your models here.
def current_year():
return datetime.date.today().year
class Course(models.Model):
credits = [(i, i) for i in range(1, 6)]
semesters = [
('Autumn', ''),
('Spring', '')
]
name = models.CharField(max_length=50, verbose_name="课程名")
introduction = models.CharField(max_length=250, verbose_name='介绍')
credit = models.IntegerField(verbose_name='学分', choices=credits)
max_number = models.IntegerField(verbose_name="课程最大人数")
year = models.IntegerField(verbose_name='年份', default=current_year)
semester = models.CharField(max_length=20, verbose_name='学期', choices=semesters)
# 未开始选课, 1
# 开始选课,未结束选课 2
# 结束选课, 3
# 结课 4
# 已打完分 5
status = models.IntegerField(verbose_name="课程状态", default=1)
# ForeignKey**有两个必需要设置的参数:
# to:第一个参数,指定其外键是哪个模型,
# on_delete: 当被一个ForeignKey引用的对象被删除时Django将模拟on_delete参数指定的SQL约束对应的行为。
# 通俗的来讲,这个参数设置的是删除外键引用的对象时的影响。
# CASCADE联级删除删除外键引用的对象时也删除所有包含该外键的对象。
# 比如一个老师对应多个课程,删除一个老师,也删除该老师的所有课程。
teacher = models.ForeignKey(Teacher, verbose_name="课程教师", on_delete=models.CASCADE)
# get_status_text和get_op_text方法是为了方便在模板中调用。
def get_status_text(self):
return COURSE_STATUS[self.status]
def get_op_text(self):
return COURSE_OPERATION[self.status]
def get_current_count(self):
courses = StudentCourse.objects.filter(course=self, with_draw=False)
return len(courses)
def get_schedules(self):
schedules = Schedule.objects.filter(course=self)
return schedules
def __str__(self):
return "%s (%s)" % (self.name, self.teacher.name)
def weekday_choices():
weekday_str = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
return [(i + 1, weekday_str[i]) for i in range(7)]
class Schedule(models.Model):
weekday = models.IntegerField(choices=weekday_choices(), verbose_name="日期")
start_time = models.TimeField(verbose_name="上课时间")
end_time = models.TimeField(verbose_name="下课时间")
location = models.CharField(max_length=100, verbose_name="上课地点")
remarks = models.CharField(max_length=100, verbose_name="备注", null=True, blank=True)
start_week = models.IntegerField(verbose_name="第几周开始")
end_week = models.IntegerField(verbose_name="第几周结束")
intervals = [
(1, "无间隔"),
(2, "每隔一周上一次")
]
week_interval = models.IntegerField(verbose_name="周间隔", choices=intervals, default=1)
course = models.ForeignKey(Course, verbose_name="课程名", on_delete=models.CASCADE)
def __str__(self):
s = "%s周-第%s" % (self.start_week, self.end_week)
if self.week_interval == 2:
s += "隔一周 "
s += "%s %s-%s " % (self.get_weekday_display(), self.start_time.strftime("%H:%M"),
self.end_time.strftime("%H:%M"))
s += "%s" % self.location
if self.remarks:
s += " %s" % self.remarks
return s
class StudentCourse(models.Model):
create_time = models.DateTimeField(auto_now=True)
with_draw = models.BooleanField(default=False)
with_draw_time = models.DateTimeField(default=None, null=True)
scores = models.IntegerField(verbose_name="成绩", null=True)
comments = models.CharField(max_length=250, verbose_name="老师评价", null=True)
rates = [(i, i) for i in range(1, 6)]
rating = models.IntegerField(verbose_name="学生评分", choices=rates, null=True,
help_text="最高5分最低分1分")
assessment = models.CharField(max_length=250, verbose_name="学生评价", null=True)
student = models.ForeignKey(Student, on_delete=models.CASCADE)
course = models.ForeignKey(Course, on_delete=models.CASCADE)