/// <summary> Ctor. </summary> public TaskVariantModel(TaskVariant variant) { Contract.Requires(variant != null); Id = variant.Id; Number = variant.Number; Version = variant.Version; GeneratorVersion = variant.GeneratorVersion; }
/// <summary> Регистрирует начало выполнения задания </summary> /// <param name="taskId"> Идентификатор модуля-задания </param> /// <param name="sessionGuid"> Идентификатор сессии </param> /// <returns> Данные для задания - как правило, исходный граф, или что-то типа того </returns> public TaskVariantDto GetVariant(long taskId, Guid sessionGuid) { using (var op = _operationFactory.Create()) { var session = GetSessionWithChecks(op.DataContext.Query, sessionGuid); TaskVariant taskVariant = null; if (new [] { UserRole.Teacher, UserRole.Administrator }.Contains(session.User.Role))//вообще должен быть Teacher/Admin { var task = op.DataContext.Query.Get <Task>(taskId); taskVariant = op.DataContext.Query.OfEntities <TaskVariant>().First(v => v.Task == task); } else if (session.User.Role == UserRole.Student) { var task = op.DataContext.Query.Get <Task>(taskId); var resultLog = GetCurrentResultLog(op.DataContext.Query, session); var taskResultLog = GetCurrentTaskResultLog(resultLog, task); var variant = resultLog.LabVariant; taskVariant = variant.TaskVariants.Single(v => v.Task == task); var action = op.DataContext.Factory.Create <StudentAction>(); action.TaskResult = taskResultLog; action.Time = _systemDate.Now(); action.Description = "$['Task {task.Id}' -> Variant {taskVariant.Number}]"; action.Penalty = 0; taskResultLog.StudentActions.Add(action); op.Complete(); } else { throw new NotSupportedException("Неизвестный науке зверь!"); } return(new TaskVariantDto { Data = taskVariant.Data, GeneratorVersion = taskVariant.GeneratorVersion, Id = taskVariant.Id, Number = taskVariant.Number, Version = taskVariant.Version }); } }
public TaskVariantViewModel GetTaskVariant(string userId, int taskVariantId) { TaskVariant taskVariant = _context.TaskVariants .Include(tv => tv.TaskGroup) .Include(tv => tv.TaskGroup.Course) .Include(tv => tv.Assignments) .FirstOrDefault(tv => tv.Id == taskVariantId); if (taskVariant == null) { throw new NotFoundException(); } return(new TaskVariantViewModel() { Id = taskVariantId, Name = taskVariant.Name, Description = taskVariant.Description, TaskGroupId = taskVariant.TaskGroupId, TaskGroupName = taskVariant.TaskGroup.Name, CourseId = taskVariant.TaskGroup.CourseId, CourseName = taskVariant.TaskGroup.Course.Name, IsAssigned = taskVariant.Assignments.Any(assignment => assignment.UserId == userId), IsNeedingReview = taskVariant.Assignments.Any(assignment => assignment.ReviewerId == userId), AssignmentsCount = taskVariant.Assignments.Count, Assignments = taskVariant.Assignments .Select(assignment => new AssignmentViewModel { TaskVariantId = taskVariant.Id, Status = assignment.Status, Score = assignment.Score, TaskName = taskVariant.Name, UserId = assignment.UserId }).ToList(), IsUserTeacher = KaCakeUtils.IsCourseTeacher(_context, taskVariant.TaskGroup.CourseId, userId) }); }
public async Task <TaskVariant> CreateOrUpdate(long id, string json) { var taskVariant = await _db.TaskVariants.SingleOrDefaultAsync(v => v.Id == id); if (taskVariant == null) { taskVariant = new TaskVariant(); } var variant = TryExecute(() => JObject.Parse(json), "Не удалось распарсить данные."); var idFromJson = TryExecute(() => variant["meta"]["id"].Value <long>(), "Не удалось прочитать значение meta/id"); if (idFromJson != taskVariant.Id) { throw new VariantConvertException( "Не совпадает id в json (meta/id) и идентификатор реально обновляемого варианта."); } var moduleId = TryExecute(() => variant["meta"]["moduleId"].Value <long>(), "Не удалось прочитать значение meta/moduleId"); if (taskVariant.TaskModule == null) { var module = await _db.TaskModules.SingleOrDefaultAsync(m => m.Id == moduleId); if (module == null) { throw new VariantConvertException($"Модуль с id={moduleId} не найден."); } taskVariant.TaskModule = module; } else if (moduleId != taskVariant.TaskModule.Id) { throw new VariantConvertException( "Значение moduleId в json (meta/moduleId) не совпадает с реальным идентификатором модуля"); } var name = TryExecute(() => variant["meta"]["name"].Value <string>(), "Не удалось прочитать значение meta/name"); if (string.IsNullOrWhiteSpace(name)) { throw new VariantConvertException("Имя варианта (meta/name) не может быть пустым"); } taskVariant.Name = name; var dataArray = TryExecute(() => variant["data"], "Не удалось прочитать значение data"); foreach (var data in dataArray.Children()) { var type = TryExecute(() => data["type"].Value <string>(), "Не удалось прочитать значение data/type"); if (string.IsNullOrWhiteSpace(type)) { throw new VariantConvertException("Тип варианта (data/type) не может быть пустым"); } var value = TryExecute(() => data["value"], "Не удалось прочитать значение data/value"); if (!value.Children().Any()) { throw new VariantConvertException("Значение варианта (data/value) не может быть пустым"); } } taskVariant.VariantData = TryExecute(() => dataArray.ToString(), "Непредвиденная ошибка при записи VariantData"); if (taskVariant.Id == 0) { _db.Add(taskVariant); } await _db.SaveChangesAsync(); return(taskVariant); }