修复教师实验管理页的可见性问题

This commit is contained in:
biss committed 2026-08-18 09:54:03 +08:00
1 parent 0b63d31e67
commit 7db082639c
2 files changed
+37 -4

No files matched your search

@@ -196,12 +196,11 @@ public sealed class ExperimentsController(
int page = 1, int page = 1,
int pageSize = 20) int pageSize = 20)
{ {
// 项目列表按任课教学任务授权。场次的名单、取消和代选仍由
// CanManageSession 限制到已绑定的指导教师,不能以此反向过滤项目:
// 草稿尚未安排场次,集中安排项目也没有独立的场次指导教师绑定。
var source = ScopedProjects().AsNoTracking(); var source = ScopedProjects().AsNoTracking();
var scope = currentUserDataScope.Current; var scope = currentUserDataScope.Current;
if (scope.Scope == DataScope.Self && scope.IsInRole(SystemRoles.Teacher))
source = source.Where(x => x.Sessions.Any(session =>
session.Instructors.Any(instructor =>
instructor.Teacher!.UserId == scope.UserId)));
if (academicTermId.HasValue) if (academicTermId.HasValue)
source = source.Where(x => source = source.Where(x =>
x.TeachingTask!.AcademicTermId == academicTermId); x.TeachingTask!.AcademicTermId == academicTermId);
@@ -7,11 +7,45 @@ using Jiaowu.Api.Infrastructure.Timetables;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Data.Sqlite; using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using System.Text.Json;
namespace Jiaowu.Api.Tests; namespace Jiaowu.Api.Tests;
public sealed class ExperimentsControllerTests public sealed class ExperimentsControllerTests
{ {
[Fact]
public async Task TeacherManagement_ListsOwnDraftAndPublishedProjectsWithoutSessionInstructorBinding()
{
await using var fixture = await ExperimentFixture.CreateAsync();
var teacherScope = new FixedScope(new CurrentUserScope(
fixture.ManagerScope.Current.UserId,
fixture.ManagerScope.Current.DisplayName,
fixture.ManagerScope.Current.CollegeId,
DataScope.Self,
new HashSet<string>([SystemRoles.Teacher])));
var controller = fixture.Controller(teacherScope);
Assert.IsType<CreatedResult>(await controller.CreateProject(
fixture.ProjectRequest(ExperimentArrangementMode.SelfScheduled),
CancellationToken.None));
Assert.IsType<CreatedResult>(await controller.CreateProject(
fixture.ProjectRequest(ExperimentArrangementMode.Centralized),
CancellationToken.None));
var centralized = await fixture.Db.ExperimentProjects.SingleAsync(x =>
x.ArrangementMode == ExperimentArrangementMode.Centralized);
Assert.IsType<NoContentResult>(await controller.PublishProject(
centralized.Id, CancellationToken.None));
var result = Assert.IsType<OkObjectResult>(
await controller.GetManagementProjects(
null, null, null, null, null, null, null, null,
CancellationToken.None));
using var response = JsonDocument.Parse(JsonSerializer.Serialize(result.Value));
Assert.Equal(1, response.RootElement.GetProperty("Total").GetInt32());
Assert.Equal(2, response.RootElement.GetProperty("Items").GetArrayLength());
}
[Fact] [Fact]
public async Task BatchProjects_CreateSameDefinitionForSameCourseTasks() public async Task BatchProjects_CreateSameDefinitionForSameCourseTasks()
{ {