修改选课页面课程表
This commit is contained in:
@@ -1011,7 +1011,11 @@ public sealed class CourseSelectionsController(
|
|||||||
x.TeachingTask!.Status == TeachingTaskStatus.Published &&
|
x.TeachingTask!.Status == TeachingTaskStatus.Published &&
|
||||||
(x.IsOpenToAll ||
|
(x.IsOpenToAll ||
|
||||||
x.TeachingTask.Classes.Any(item =>
|
x.TeachingTask.Classes.Any(item =>
|
||||||
item.AdministrativeClassId == student.AdministrativeClassId)))
|
item.AdministrativeClassId == student.AdministrativeClassId) ||
|
||||||
|
x.Enrollments.Any(item =>
|
||||||
|
item.StudentId == student.Id &&
|
||||||
|
(item.Status == CourseEnrollmentStatus.Enrolled ||
|
||||||
|
item.Status == CourseEnrollmentStatus.Waitlisted))))
|
||||||
.OrderBy(x => x.TeachingTask!.Course!.Code)
|
.OrderBy(x => x.TeachingTask!.Course!.Code)
|
||||||
.Select(x => new StudentOfferingDto(
|
.Select(x => new StudentOfferingDto(
|
||||||
x.Id,
|
x.Id,
|
||||||
|
|||||||
@@ -205,6 +205,79 @@ public sealed class CourseSelectionsControllerTests
|
|||||||
x.Grade == 2026));
|
x.Grade == 2026));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task Student_options_include_an_administrator_assigned_offering_outside_the_students_class_scope()
|
||||||
|
{
|
||||||
|
await using var connection = new SqliteConnection("Data Source=:memory:");
|
||||||
|
await connection.OpenAsync();
|
||||||
|
var options = new DbContextOptionsBuilder<AppDbContext>()
|
||||||
|
.UseSqlite(connection)
|
||||||
|
.Options;
|
||||||
|
await using var db = new AppDbContext(options);
|
||||||
|
await db.Database.EnsureCreatedAsync();
|
||||||
|
var data = await SeedFullOfferingAsync(db);
|
||||||
|
|
||||||
|
var originalClass = await db.AdministrativeClasses.SingleAsync();
|
||||||
|
var otherClass = new AdministrativeClass
|
||||||
|
{
|
||||||
|
Code = "CS2026-02",
|
||||||
|
Name = "计科 2026-2 班",
|
||||||
|
MajorId = originalClass.MajorId,
|
||||||
|
Grade = 2026
|
||||||
|
};
|
||||||
|
var taskId = await db.CourseSelectionOfferings
|
||||||
|
.Where(x => x.Id == data.OfferingId)
|
||||||
|
.Select(x => x.TeachingTaskId)
|
||||||
|
.SingleAsync();
|
||||||
|
var task = await db.TeachingTasks
|
||||||
|
.Include(x => x.Classes)
|
||||||
|
.SingleAsync(x => x.Id == taskId);
|
||||||
|
task.Classes.Clear();
|
||||||
|
task.Classes.Add(new TeachingTaskClass { AdministrativeClassId = otherClass.Id });
|
||||||
|
task.SchedulingMode = TeachingTaskSchedulingMode.Standard;
|
||||||
|
var termId = await db.CourseSelectionRounds
|
||||||
|
.Where(x => x.Id == data.RoundId)
|
||||||
|
.Select(x => x.AcademicTermId)
|
||||||
|
.SingleAsync();
|
||||||
|
var plan = new SchedulePlan
|
||||||
|
{
|
||||||
|
AcademicTermId = termId,
|
||||||
|
Name = "正式课表",
|
||||||
|
Version = "V1",
|
||||||
|
Status = SchedulePlanStatus.Published,
|
||||||
|
PublishedAt = DateTime.UtcNow
|
||||||
|
};
|
||||||
|
db.AddRange(otherClass, plan);
|
||||||
|
await db.SaveChangesAsync();
|
||||||
|
db.ScheduleEntries.Add(new ScheduleEntry
|
||||||
|
{
|
||||||
|
SchedulePlanId = plan.Id,
|
||||||
|
TeachingTaskId = task.Id,
|
||||||
|
DayOfWeek = 1,
|
||||||
|
StartPeriod = 1,
|
||||||
|
PeriodCount = 2,
|
||||||
|
StartWeek = 1,
|
||||||
|
EndWeek = 16,
|
||||||
|
WeekPattern = WeekPattern.All
|
||||||
|
});
|
||||||
|
await db.SaveChangesAsync();
|
||||||
|
db.ChangeTracker.Clear();
|
||||||
|
|
||||||
|
var controller = new CourseSelectionsController(
|
||||||
|
db,
|
||||||
|
new StudentDataScope(data.EnrolledUserId));
|
||||||
|
var result = Assert.IsType<OkObjectResult>(await controller.GetStudentOptions(
|
||||||
|
data.RoundId,
|
||||||
|
CancellationToken.None));
|
||||||
|
var offerings = ReadProperty<IEnumerable<StudentOfferingDto>>(
|
||||||
|
result.Value, "Offerings");
|
||||||
|
var assignedOffering = Assert.Single(offerings);
|
||||||
|
|
||||||
|
Assert.Equal(data.OfferingId, assignedOffering.Id);
|
||||||
|
Assert.Equal(CourseEnrollmentStatus.Enrolled, assignedOffering.EnrollmentStatus);
|
||||||
|
Assert.Single(assignedOffering.Schedules);
|
||||||
|
}
|
||||||
|
|
||||||
private static async Task<SeededSelection> SeedFullOfferingAsync(AppDbContext db)
|
private static async Task<SeededSelection> SeedFullOfferingAsync(AppDbContext db)
|
||||||
{
|
{
|
||||||
var college = new College { Code = "CS", Name = "计算机学院" };
|
var college = new College { Code = "CS", Name = "计算机学院" };
|
||||||
@@ -358,6 +431,14 @@ public sealed class CourseSelectionsControllerTests
|
|||||||
return Assert.IsType<int>(property.GetValue(value));
|
return Assert.IsType<int>(property.GetValue(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static T ReadProperty<T>(object? value, string propertyName)
|
||||||
|
{
|
||||||
|
Assert.NotNull(value);
|
||||||
|
var property = value.GetType().GetProperty(propertyName);
|
||||||
|
Assert.NotNull(property);
|
||||||
|
return Assert.IsAssignableFrom<T>(property.GetValue(value));
|
||||||
|
}
|
||||||
|
|
||||||
private static Student CreateStudent(
|
private static Student CreateStudent(
|
||||||
string number,
|
string number,
|
||||||
string name,
|
string name,
|
||||||
|
|||||||
Reference in New Issue
Block a user