utils.models.semester 源代码

from typing import TypeAlias, TypeVar

from django.db.models import TextChoices, QuerySet, Model
from utils.models.choice import choice


__all__ = [
    'Semester',
    'select_current',
]


T = TypeVar('T', bound=Model)
AnySemester: TypeAlias = 'Semester | str'


[文档] class Semester(TextChoices): FALL = choice('Fall', '秋') SPRING = choice('Spring', '春') ANNUAL = choice('Fall+Spring', '春秋')
[文档] @classmethod def get(cls, semester: AnySemester) -> 'Semester': '''将一个表示学期的字符串转为返回相应的状态''' match semester: case Semester(): return semester case 'Fall' | '秋' | '秋季': return Semester.FALL case 'Spring' | '春' | '春季': return Semester.SPRING case 'Annual' | 'Fall+Spring' | '全年' | '春秋': return Semester.ANNUAL case _: raise ValueError(f'{semester}不是合法的学期状态')
[文档] def select_current(queryset: QuerySet[T], /, year_field: str = 'year', semester_field: str = 'semester', *, noncurrent: bool | None = False, exact: bool = False): ''' 获取学期的对应筛选结果 exact: 学期必须完全匹配(全年和单一学期将不再匹配) noncurrent: 取反结果, 如果为None则直接返回queryset.all() ''' if noncurrent is None: return queryset.all() from boot.config import GLOBAL_CONFIG kwargs = {} kwargs[year_field] = GLOBAL_CONFIG.acadamic_year if not exact: semester_field += '__contains' kwargs[semester_field] = GLOBAL_CONFIG.semester.value return queryset.exclude(**kwargs) if noncurrent else queryset.filter(**kwargs)