예제 #1
0
        public IActionResult CreateExamSuite([FromBody] ExamSuiteDetail request)
        {
            //HACK: use SubjectId instead of ConsiderationStatus
            var _subject = repoQ.GetInActiveSubject(request.ConsiderationStatus);
            //var qid = string.Concat(qcode, "TH");
            var qid    = Guid.NewGuid().ToString();
            var qsuite = new TheS.ExamBank.DataFormats.QuestionSuite()
            {
                _id         = qid,
                Code        = request.TitleCode,
                Title       = request.TitleName,
                SubjectName = _subject.SubjectName,
                Description = "Description",
                SubjectId   = request.ConsiderationStatus,
                SubjectCode = _subject.SubjectCode,
                Level       = 1,
                LayoutCode  = "LayoutCode",
                Questions   = Enumerable.Empty <TheS.ExamBank.DataFormats.Question>(),
            };

            repoQ.InsertQuestionSuite(qsuite);

            var examSuiteCount = repoQ.GetAllQuestionSuiteBySubjectId(_subject._id).Count();

            repoQ.UpdateQuestionCount(_subject._id, _subject.QuestionCount, examSuiteCount);

            return(Ok(new { Message = $"Created!", ExamSuiteId = qid }));
        }
예제 #2
0
        public void EditQuestion(string TitleCode, int?QuestionId, [FromBody] Question question)
        {
            //For Edit IsAllowrandom กับ เฉลย
            if (question == null || !QuestionId.HasValue)
            {
                return;
            }

            var _suite    = repoQ.GetQuestionSuite(question.ExamSuiteId);
            var _question = _suite?.Questions?.Where(x => x.No == question.QuestionNumber)?.FirstOrDefault();

            if (_question != null)
            {
                return;
            }

            _question.NoShuffleChoice = question?.IsAllowRandomChoice ?? false;
            _question.Choices         = question.Choices?.Select(x => new TheS.ExamBank.DataFormats.SelectableChoice
            {
                Code            = x.id,
                Content         = x.Detail,
                IsCorrectAnswer = x.IsCorrect,
            });

            //Convert QuestionSuiteVM To QuestionSuite
            var qsuite = new TheS.ExamBank.DataFormats.QuestionSuite()
            {
                _id         = _suite?._id,
                Code        = _suite?.Code,
                Title       = _suite?.Title,
                SubjectName = _suite?.SubjectName,
                Description = _suite?.Description,
                SubjectId   = _suite?.Description,
                SubjectCode = _suite?.SubjectCode,
                Level       = _suite?.Level ?? 0,
                LayoutCode  = _suite?.LayoutCode,
                Questions   = _suite?.Questions,
            };

            repoQ.Upsert(qsuite);
        }
예제 #3
0
        public IActionResult DeleteQuestion(string examsuiteid, string questionid)
        {
            var qsuiteVm = repoQ.GetQuestionSuite(examsuiteid);
            var qsuite   = new TheS.ExamBank.DataFormats.QuestionSuite()
            {
                _id         = qsuiteVm?._id,
                Code        = qsuiteVm?.Code,
                Title       = qsuiteVm?.Title,
                SubjectName = qsuiteVm?.SubjectName,
                Description = qsuiteVm?.Description,
                SubjectId   = qsuiteVm?.Description,
                SubjectCode = qsuiteVm?.SubjectCode,
                Level       = qsuiteVm?.Level ?? 0,
                LayoutCode  = qsuiteVm?.LayoutCode,
                Questions   = qsuiteVm.Questions.Where(q => q._id != questionid).ToList(),
            };

            repoQ.Upsert(qsuite);

            return(Ok(new { Message = $"Deleted!", QuestionId = questionid }));
        }
예제 #4
0
        public IActionResult VerifyMarkdown(IEnumerable <IFormFile> files, string Language)
        {
            var    mdFi = files.FirstOrDefault(f => System.IO.Path.GetExtension(ContentDispositionHeaderValue.Parse(f.ContentDisposition).FileName.Trim('"')) == ".md");
            string md   = string.Empty;

            if (mdFi != null)
            {
                using (var fi = new System.IO.StreamReader(mdFi.OpenReadStream()))
                {
                    md = fi.ReadToEnd();
                }
            }

            List <string> fileList  = new List <string>();
            var           subjectId = string.Empty;

            foreach (var f in files)
            {
                using (var fi = f.OpenReadStream())
                {
                    if (ZipFile.IsZipFile(fi, true))
                    {
                        fi.Seek(0, System.IO.SeekOrigin.Begin);
                        var assets = TheS.ExamBank.Parsers.AssetFileUtil.ReadZipEntries(fi).ToArray();
                        var parser = new TheS.ExamBank.Parsers.MarkdownParser();
                        if (parser.CheckAssets(md, assets))
                        {
                            fileList = assets.ToList();
                            assets   = parser.GetAssetLinks(md).ToArray();

                            fi.Seek(0, System.IO.SeekOrigin.Begin);
                            var assetFiles = TheS.ExamBank.Parsers.AssetFileUtil.GetAssets(fi, assets);
                            try
                            {
                                var questions = parser.ParseQuestionsFromString(md);
                                var header    = parser.ParseHeaderFromString(md);
                                subjectId = string.Concat(header.SubjectCode + "L" + header.Level, Language);

                                var qcode  = (header.Code ?? string.Empty).Trim();
                                var qid    = string.Concat(qcode, Language);
                                var qsuite = new TheS.ExamBank.DataFormats.QuestionSuite()
                                {
                                    _id         = qid,
                                    Code        = qcode,
                                    Title       = header.Title,
                                    SubjectName = header.SubjectName,
                                    Description = header.Description,
                                    SubjectId   = subjectId,
                                    SubjectCode = header.SubjectCode,
                                    Level       = header.Level,
                                    LayoutCode  = header.LayoutCode,

                                    Questions = questions,
                                };

                                var inActiveSubject = repoQ.GetInActiveSubject(subjectId);
                                var suite           = repoQ.GetQuestionSuite(qid);

                                //no suite and no subject  : create new suite and subject
                                if (suite == null && inActiveSubject == null)
                                {
                                    if (inActiveSubject == null)
                                    {
                                        var newSubject = new InActive.InactiveSubject
                                        {
                                            _id                  = subjectId,
                                            SubjectCode          = qsuite.SubjectCode,
                                            SubjectName          = qsuite.SubjectName,
                                            CreateDateTime       = DateTime.Now,
                                            IsEReadiness         = false, //Hack
                                            ContentLanguage      = Language,
                                            SiteId               = HomeController._centerdata.SiteId,
                                            QuestionCount        = questions.Count(),
                                            ExamSuiteCount       = 1,
                                            ExamSuiteAcceptCount = 0,
                                            ExamSuiteRejectCount = 0,
                                            ExamSuiteGroups      = new List <InActive.ExamSuiteGroup>()
                                            {
                                                new InActive.ExamSuiteGroup {
                                                    _id = "ก",
                                                    ExamSuiteGroupName = "ก", // HACK
                                                    IsUsed             = true,
                                                    PassScore          = null,
                                                    ExamDuration       = null,
                                                    ExamSuiteGroupMaps = new List <InActive.ExamSuiteGroupMap>
                                                    {
                                                        new InActive.ExamSuiteGroupMap
                                                        {
                                                            _id         = Guid.NewGuid().ToString(),
                                                            ExamSuiteId = qid,
                                                            RandomCount = 0,
                                                        }
                                                    },
                                                }
                                            },
                                        };
                                        repoQ.InsertInActiveSubject(newSubject);
                                    }
                                }
                                //has old suite and already has subject  : upsert suite   add groupmap to new suite
                                //ใช้ group map เดิม
                                else if (inActiveSubject != null && suite != null)
                                {
                                    //suite upsert ปกติ  subject ไม่เปลี่ยนอะไร
                                }
                                //new suite and already has subject : add groupmap to new suite
                                //เพิ่ม group map ใหม่
                                else if (inActiveSubject != null && suite == null)
                                {
                                    foreach (var item in inActiveSubject.ExamSuiteGroups)
                                    {
                                        item.ExamSuiteGroupMaps.Add(new InActive.ExamSuiteGroupMap
                                        {
                                            _id         = repoExamForApprove.GetNewGuid("").ToString(),
                                            ExamSuiteId = qid,
                                            RandomCount = 0,
                                        });
                                    }

                                    repoQ.UpsertInActiveSubject(inActiveSubject);
                                }

                                if (inActiveSubject != null)
                                {
                                    //update SubjectName and ContentLanguage
                                    repoQ.UpdateSubjectNameAndContentLanguage(inActiveSubject._id, qsuite.SubjectName, Language);
                                    //UpdateQuestionCount UpdateExamSuiteCount
                                    var examSuites    = repoQ.GetAllQuestionSuiteBySubjectId(subjectId);
                                    var questionCount = examSuites.Sum(es => es.Questions.Count());
                                    repoQ.UpdateQuestionCount(subjectId,
                                                              questionCount + questions.Count(),
                                                              examSuites.Count() + 1);
                                }

                                repoQ.Upsert(qsuite);
                                repoQ.UploadAssets(assetFiles, qid, this.iCloudStorage);
                            }
                            finally
                            {
                                TheS.ExamBank.Parsers.AssetFileUtil.CleanUpAssets(assetFiles, iFile);
                            }
                        }
                    }
                }
            }

            ViewData["files"] = fileList;

            return(Redirect("~/#!/inactivesubjectview/" + subjectId));
        }