private DomainModel.TestPoolEntry TryGetTestPoolEntry(Result result, DomainModel.LabVariant lab, int?testIndex)
        {
            if (!testIndex.HasValue)
            {
                return(null);
            }

            var testEntry = lab.TestPool.TestPoolEntries.SingleOrDefault(e => e.Id == testIndex.Value);

            if (testEntry == null)
            {
                return(null);
            }

            var testResult = result
                             .AbstractResultEntries
                             .OfType <TestResult>()
                             .SingleOrDefault(tr => tr.TestPoolEntry.Id == testEntry.Id &&
                                              tr.Status == ExecutionStatus.Complete);

            if (testResult?.Status == ExecutionStatus.Complete)
            {
                return(null);
            }

            return(testEntry);
        }
Exemple #2
0
 public ResultVariants(DomainModel.LabVariant variant)
 {
     VarId    = variant.Id;
     VarName  = variant.Number;
     TasksVar = MakeTasksVariantFromLabVariant(variant.TaskVariants);
     IntrVar  = variant.IntroducingVariant;
 }
Exemple #3
0
 public JSONResultEditVariant(DomainModel.LabVariant variant)
 {
     Name               = variant.Number;
     Variant            = MakeVariantFromTasksVariant(variant.TaskVariants);
     IntroducingVariant = variant.IntroducingVariant;
     TestPoolId         = (variant.TestPool != null) ? variant.TestPool.Id : -1;
 }
        protected VariantExecutionModelBase LoadImpl(DomainModel.LabVariant variant, int?taskIndex, int?testIndex, Uri taskCompleteRedirect)
        {
            var lab = variant.LabWork;

            var student             = GetCurrentStudent();
            var resultsToInterrupt  = FindResultsToInterrupt(student);
            var latestCurrentResult = FindLatestCurrentResult(resultsToInterrupt, lab);

            // Если есть, то вместо начала нового выполнения, продолжим старое.
            if (latestCurrentResult != null)
            {
                resultsToInterrupt = resultsToInterrupt.Except(new[] { latestCurrentResult }).ToArray();
            }

            foreach (var oldResult in resultsToInterrupt)
            {
                oldResult.Score  = null;
                oldResult.Status = ExecutionStatus.Interrupted;
            }

            Result result;

            if (latestCurrentResult == null)
            {
                // Если не нашли, то заводим новый
                result            = Factory.Create <Result>();
                result.LabVariant = variant;
                result.Mode       = variant.IntroducingVariant
                    ? LabExecutionMode.IntroductoryMode
                    : LabExecutionMode.TestMode;
                result.Student = student;

                foreach (var taskVariant in variant.TaskVariants)
                {
                    var taskResult = Factory.Create <TaskResult>();
                    taskResult.Status      = ExecutionStatus.Executing;
                    taskResult.TaskVariant = taskVariant;
                    taskResult.Result      = result;

                    result.AbstractResultEntries.Add(taskResult);
                }

                if (variant.TestPool != null)
                {
                    var randomArray = new Randomizer[variant.TestPool.TestPoolEntries.Count];
                    randomArray = Randomizer.InitializeArray(randomArray);
                    var randomer = new Random(variant.TestPool.TestPoolEntries.Count);
                    foreach (var testQuestion in variant.TestPool.TestPoolEntries)
                    {
                        var testResult = Factory.Create <TestResult>();
                        testResult.TestPoolEntry = testQuestion;
                        var number = Randomizer.GetNewValue(randomArray, randomer);
                        testResult.Index          = number.ToString();
                        testResult.Result         = result;
                        randomArray               = Randomizer.ChoseNumber(randomArray, number);
                        testResult.StudentAnswers = new List <DomainModel.StudentAnswer>();
                        result.AbstractResultEntries.Add(testResult);
                    }
                }
            }
            else
            {
                result = latestCurrentResult;
            }

            var task = TryGetTaskByIndex(result, lab, taskIndex)
                       ?? GetFirstUnsolvedTask(result);

            var test = TryGetTestPoolEntry(result, variant, testIndex)
                       ?? GetFirstUnsolvedTest(result);

            var model = task == null
                ? test == null?CompleteVariant(result) : CreateTestExecutionModel(taskCompleteRedirect, test, variant, lab, result)
                            : IsTestPoolCompleted(variant, testIndex) ? CreateTestExecutionModel(taskCompleteRedirect, test, variant, lab, result) : CreateTaskExecutionModel(taskCompleteRedirect, task, variant, lab, result);

            return(model);
        }
        private VariantExecutionModelBase CreateTaskExecutionModel(Uri taskCompleteRedirect, Task task, DomainModel.LabVariant variant, LabWork lab, Result result)
        {
            var initParams = InitParams.ForDemoMode(
                _authService.GetSessionInfo().SessionGuid,
                task.Id,
                variant.Id,
                lab.Id,
                taskCompleteRedirect);

            var model = CreateModelHeader <TaskVariantExecutionModel>(result, task);

            model.TaskName   = task.Name;
            model.TaskId     = task.Id;
            model.InitParams = _initParamsProvider.GetInitParamsString(initParams);
            return(model);
        }
 private bool IsTestPoolCompleted(DomainModel.LabVariant variant, int?testIndex)
 {
     // TODO: Добавить организацию запрещения перехода к заданию, если TestPool - блокирующий (При добавлении подобного функционала в БД)
     return(testIndex != null);
 }
        private VariantExecutionModelBase CreateTestExecutionModel(Uri taskCompleteRedirect, DomainModel.TestPoolEntry test, DomainModel.LabVariant variant, LabWork lab, Result result)
        {
            var model = new TestExecutionModel();

            model.Name       = test.TestPool.Name;
            model.Question   = test.TestQuestion.Question;
            model.Answers    = test.TestQuestion.AnswerVariants;
            model.QuestionId = test.Id;
            model.OtherTasks = GetOtherTasksModels(lab, result, null, test).ToArray();
            model.VariantId  = variant.Id;
            model.LabName    = lab.Name;
            var operation  = _operationFactory.Create();
            var testResult = operation.DataContext.Query.OfEntities <TestResult>().FirstOrDefault(e => e.TestPoolEntry.Id == test.Id & e.Result.Id == result.Id);

            operation.Complete();
            model.TestResult = testResult.Id;
            return(model);
        }