自选项目实验优化
This commit is contained in:
1 parent
9b32ee916c
commit
e69ab6f580
11 files changed
+7578
-67
No files matched your search
@@ -419,6 +419,14 @@ public sealed class ExperimentGradesController(
|
||||
|
||||
var recordsSource = db.ExperimentGradeRecords.AsNoTracking()
|
||||
.Where(x => x.ExperimentGradeSheetId == id);
|
||||
var scope = currentUserDataScope.Current;
|
||||
var isBoundInstructor = scope.Scope == DataScope.Self &&
|
||||
scope.IsInRole(SystemRoles.Teacher) &&
|
||||
sheet.ArrangementMode == ExperimentArrangementMode.SelfScheduled;
|
||||
if (isBoundInstructor)
|
||||
recordsSource = recordsSource.Where(x =>
|
||||
x.ExperimentSession != null && x.ExperimentSession.Instructors.Any(
|
||||
instructor => instructor.Teacher!.UserId == scope.UserId));
|
||||
if (studentKeyword is not null)
|
||||
recordsSource = recordsSource.Where(x =>
|
||||
x.Student!.StudentNumber.Contains(studentKeyword) ||
|
||||
@@ -512,7 +520,7 @@ public sealed class ExperimentGradesController(
|
||||
sheet.CreatedAt,
|
||||
sheet.UpdatedAt
|
||||
},
|
||||
CanEdit = CanEdit(task) &&
|
||||
CanEdit = (CanEdit(task) || isBoundInstructor) &&
|
||||
sheet.Status is
|
||||
ExperimentGradeSheetStatus.Draft or
|
||||
ExperimentGradeSheetStatus.Returned,
|
||||
@@ -584,13 +592,18 @@ public sealed class ExperimentGradesController(
|
||||
.Include(x => x.Items)
|
||||
.Include(x => x.Records)
|
||||
.ThenInclude(x => x.ItemScores)
|
||||
.Include(x => x.Records)
|
||||
.ThenInclude(x => x.ExperimentSession)
|
||||
.ThenInclude(x => x!.Instructors)
|
||||
.ThenInclude(x => x.Teacher)
|
||||
.Include(x => x.ExperimentProject)
|
||||
.ThenInclude(x => x!.TeachingTask)
|
||||
.ThenInclude(x => x!.Teachers)
|
||||
.ThenInclude(x => x.Teacher)
|
||||
.FirstOrDefaultAsync(x => x.Id == id, cancellationToken);
|
||||
if (sheet is null) return NotFound();
|
||||
if (!CanEdit(sheet.ExperimentProject!.TeachingTask!)) return Forbid();
|
||||
if (!CanEdit(sheet.ExperimentProject!.TeachingTask!) &&
|
||||
!CanEditBoundSessionRecords(sheet, request.Records)) return Forbid();
|
||||
if (sheet.Status is not (
|
||||
ExperimentGradeSheetStatus.Draft or
|
||||
ExperimentGradeSheetStatus.Returned))
|
||||
@@ -1138,6 +1151,15 @@ public sealed class ExperimentGradesController(
|
||||
|
||||
private IQueryable<ExperimentProject> ScopedProjects()
|
||||
{
|
||||
var scope = currentUserDataScope.Current;
|
||||
if (scope.Scope == DataScope.Self && scope.IsInRole(SystemRoles.Teacher))
|
||||
return db.ExperimentProjects.Where(x =>
|
||||
(x.ArrangementMode == ExperimentArrangementMode.Centralized &&
|
||||
x.TeachingTask!.Teachers.Any(item =>
|
||||
item.Teacher!.UserId == scope.UserId)) ||
|
||||
(x.ArrangementMode == ExperimentArrangementMode.SelfScheduled &&
|
||||
x.Sessions.Any(session => session.Instructors.Any(instructor =>
|
||||
instructor.Teacher!.UserId == scope.UserId))));
|
||||
var taskIds = AccessibleTeachingTasks().Select(x => x.Id);
|
||||
return db.ExperimentProjects.Where(x =>
|
||||
taskIds.Contains(x.TeachingTaskId));
|
||||
@@ -1160,6 +1182,22 @@ public sealed class ExperimentGradesController(
|
||||
currentUserDataScope.Current.IsInRole(SystemRoles.SuperAdmin) ||
|
||||
IsAssignedTeacher(task);
|
||||
|
||||
private bool CanEditBoundSessionRecords(
|
||||
ExperimentGradeSheet sheet,
|
||||
IReadOnlyCollection<ExperimentGradeRecordRequest> requestedRecords)
|
||||
{
|
||||
var scope = currentUserDataScope.Current;
|
||||
if (sheet.ExperimentProject!.ArrangementMode != ExperimentArrangementMode.SelfScheduled ||
|
||||
scope.Scope != DataScope.Self || !scope.IsInRole(SystemRoles.Teacher) ||
|
||||
requestedRecords.Count == 0)
|
||||
return false;
|
||||
var requestedIds = requestedRecords.Select(x => x.Id).ToHashSet();
|
||||
return requestedIds.All(recordId => sheet.Records.Any(record =>
|
||||
record.Id == recordId &&
|
||||
record.ExperimentSession?.Instructors.Any(instructor =>
|
||||
instructor.Teacher?.UserId == scope.UserId) == true));
|
||||
}
|
||||
|
||||
private bool IsAssignedTeacher(TeachingTask task) =>
|
||||
task.Teachers.Any(x =>
|
||||
x.Teacher?.UserId == currentUserDataScope.Current.UserId);
|
||||
|
||||
Reference in new issue
Block a user