public ActionResult EditGroupTest(int groupInfoId, int?id) { var groupTest = new GroupTest(); groupTest.TestPassRule = new TestPassRule(); var modules = new List <TestModule>(); var modulePercents = new Dictionary <int, int>(); if (id.HasValue) { GroupTestService.LoadWith(x => x.Test, x => x.TestPassRule); groupTest = GroupTestService.GetByPK(id.Value); modulePercents = EntityUtils.GetModulePercents(groupTest.TestPassRule); modules = TestModuleService.GetForTest(groupTest.TestId).ToList(); } else { var groupId = GetGroupIdForInfo(groupInfoId); var group = GroupService.GetByPK(groupId); groupTest.GroupInfoId = groupInfoId; groupTest.DateBegin = group.DateBeg ?? DateTime.Now; groupTest.DateEnd = group.DateEnd ?? DateTime.Now; } var model = new GroupTestEditVM { GroupTest = groupTest, Modules = modules, ModulePercents = modulePercents, }; return(BaseView(new PagePart(new GroupTestEditView().Init(model, Url)))); }
public ActionResult EditTest(int?id) { var test = new Test(); AjaxGridVM modulesModel = null; AjaxGridVM moduleSetsModel = null; AjaxGridVM questionsModel = null; var modules = new List <TestModule>(); var modulePercents = new Dictionary <int, int>(); if (id.HasValue) { TestService.LoadWith(x => x.TestPassRule); test = TestService.GetByPK(id); EditTestPermission(test.Id); modulesModel = new AjaxGridVM { GetListUrl = Url.Action <TestEditController>(c => c.GetModules(id.Value, null)), EditUrl = Url.Action <TestEditController>(c => c.EditModule(id.Value, null)), DeleteUrl = Url.Action <TestEditController>(c => c.DeleteModule(null)), Caption = "Модули" }; AddColumns <TestModule>(modulesModel, x => x.Name); moduleSetsModel = new AjaxGridVM { GetListUrl = Url.Action <TestEditController>(c => c.GetModuleSets(id.Value, null)), EditUrl = Url.Action <TestEditController>(c => c.EditModuleSet(id.Value, null)), Caption = "План тестирования" }; AddColumns <TestModuleSet>(moduleSetsModel, x => x.Number); AddColumns <TestModuleSet>(moduleSetsModel, x => x.Description); questionsModel = new AjaxGridVM { GetListUrl = Url.Action <TestEditController>(c => c.GetQuestions(id.Value, null)), EditUrl = Url.Action <TestEditController>(c => c.EditQuestion(id.Value, null)), DeleteUrl = Url.Action <TestEditController>(c => c.DeleteQuestion(null)), Caption = "Вопросы" }; AddColumns <TestQuestion>(questionsModel, x => x.Description); modulePercents = EntityUtils.GetModulePercents(test.TestPassRule); modules = TestModuleService.GetAll(x => x.TestId == id.Value).ToList(); } test.TestPassRule = test.TestPassRule ?? new TestPassRule(); var testEditVM = new TestEditVM { Test = test, CourseName = CourseService.AllCourseLinks() .GetValueOrDefault(test.CourseTCList).GetOrDefault(x => x.WebName), Modules = modules, ModulePercents = modulePercents }; return(BaseView( new PagePart(new TestEditView().Init(testEditVM, Url)), modulesModel == null ? null : new PagePart(PartialViewNames.AjaxList, modulesModel), questionsModel == null ? null : new PagePart(PartialViewNames.AjaxList, questionsModel), moduleSetsModel == null || test.CompanyId.HasValue ? null : new PagePart(PartialViewNames.AjaxList, moduleSetsModel) )); }
public void Validate(TestPassRule rule) { var totalPercents = EntityUtils.GetModulePercents(rule).Sum(x => x.Value); ErrorIfFalse(totalPercents == 100 || totalPercents == 0, "Сумма процентов модулей должна быть 100"); ErrorIfFalse(rule.QuestionCount > 0, "Количество вопросов должно быть больше 0"); ErrorIfFalse(rule.Time > 0, "Время должно быть больше 0"); ErrorIfFalse((!rule.AverageMark.HasValue && !rule.ExpertMark.HasValue) || (rule.PassMark < rule.AverageMark && rule.AverageMark < rule.ExpertMark) , "Проходные баллы должны идти по возрастанию"); }
public object Modules() { var percents = EntityUtils.GetModulePercents(Model.Test.TestPassRule); if (percents.Sum(x => x.Value) == 0) { return(strong["Равномерно распределение по модулям"]); } return(div[h3["Модули"], Model.Modules.Select((m, i) => p[strong[m.Name], " - ", percents.GetValueOrDefault(m.Id).NotNullString() + "%"])]); }
public ActionResult EditGroupTest(GroupTestEditVM model) { if (!LinqToSqlValidator.Validate(ModelState, model.GroupTest)) { return(ErrorJson()); } GroupTestService.EnableTracking(); var newGroupTest = model.GroupTest; if (newGroupTest.Id == 0) { var rule = TestPassRuleService.FirstOrDefault(x => x.TestId == newGroupTest.TestId); if (newGroupTest.TestPassRule.QuestionCount == 0) { newGroupTest.TestPassRule.UpdateBy(rule); } newGroupTest.TestPassRule.ModulePercents = rule.ModulePercents; Validate(newGroupTest); if (!ModelState.IsValid) { return(ErrorJson()); } GroupTestService.InsertAndSubmit(newGroupTest); return(UrlJson(Url.Action <GroupTestController>(c => c.EditGroupTest(newGroupTest.GroupInfoId, newGroupTest.Id)))); } GroupTestService.LoadWith(x => x.TestPassRule); var groupTest = GroupTestService.GetByPK(newGroupTest.Id); var isNewTest = groupTest.TestId != newGroupTest.TestId; if (isNewTest) { var rule = TestPassRuleService.FirstOrDefault(x => x.TestId == newGroupTest.TestId); model.ModulePercents = EntityUtils.GetModulePercents(rule); } groupTest.Update(newGroupTest, x => x.TestId, x => x.DateBegin, x => x.DateEnd, x => x.AttemptCount); groupTest.TestPassRule.UpdateBy(newGroupTest.TestPassRule); EntityUtils.SetModulePercents(groupTest.TestPassRule, model.ModulePercents); Validate(groupTest); if (!ModelState.IsValid) { return(ErrorJson()); } GroupTestService.SubmitChanges(); if (isNewTest) { return(UrlJson(Url.GroupTest().Urls.EditGroupTest(groupTest.GroupInfoId, groupTest.Id))); } return(UrlJson(Url.Action <GroupTestController>(c => c.EditGroupTest(groupTest.GroupInfoId, groupTest.Id)))); }
private List <TestQuestion> GetQuestions() { var questions = new List <TestQuestion>(); var modulePercents = EntityUtils.GetModulePercents(Model.UserTest.TestPassRule); var questionCount = Model.UserTest.TestPassRule.QuestionCount; var testQuestions = Model.Test.TestQuestions.Shuffle(); if (Model.OtherPreTestQuestions.Any()) { testQuestions = testQuestions.Concat(Model.OtherPreTestQuestions) .Shuffle(); } if (modulePercents.Count == 0 || Model.UserTest.IsPrerequisite) { return(testQuestions.Take(questionCount).ToList()); } if (modulePercents.All(x => x.Value == 0)) { var modules = testQuestions.Select(x => x.ModuleId.GetValueOrDefault()).Where(x => x != 0) .Distinct().ToList(); var average = 100 / modules.Count; modulePercents = modules.ToDictionary(x => x, y => average); } var counts = modulePercents.ToDictionary(x => x.Key, x => (questionCount * x.Value) / 100); foreach (var moduleCount in counts) { questions.AddRange(testQuestions .Where(x => x.ModuleId == moduleCount.Key).Take(moduleCount.Value)); } if (questionCount > questions.Count) { var ids = new HashSet <int>(questions.Select(x => x.Id)); questions.AddRange( testQuestions.Where(x => !ids.Contains(x.Id)).Take(questionCount - questions.Count)); } return(questions); }
public ActionResult EditModuleSet(int testId, int?id) { EditTestPermission(testId); var model = new ModuleSetVM(); var set = new TestModuleSet(); var modulePercents = new Dictionary <int, int>(); set.TestPassRule = new TestPassRule(); if (id.HasValue) { TestModuleSetService.LoadWith(x => x.TestPassRule); set = TestModuleSetService.GetByPK(id.Value); modulePercents = EntityUtils.GetModulePercents(set.TestPassRule); } else { set.TestId = testId; set.Number = (short)(1 + MaxModuleSetNumber(testId)); } model.ModulePercents = modulePercents; model.ModuleSet = set; model.Modules = TestModuleService.GetForTest(testId).ToList(); return(BaseViewWithModel(new ModuleSetEditView(), model)); }