コード例 #1
0
ファイル: TaskVariantModel.cs プロジェクト: eakarpov/Web
        /// <summary> Ctor. </summary>
        public TaskVariantModel(TaskVariant variant)
        {
            Contract.Requires(variant != null);

            Id               = variant.Id;
            Number           = variant.Number;
            Version          = variant.Version;
            GeneratorVersion = variant.GeneratorVersion;
        }
コード例 #2
0
        /// <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
                });
            }
        }
コード例 #3
0
        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)
            });
        }
コード例 #4
0
        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);
        }