Ejemplo n.º 1
0
        private IEnumerable <string> ValidateQuiz(Quiz quiz, QuizBlock block)
        {
            var errorMessages = new List <string>();

            if (quiz.Name == null)
            {
                errorMessages.Add("There is no quiz name");
            }

            if (!ValidateQuizName(quiz.Name, quiz.Id))
            {
                errorMessages.Add("Quiz name is not unique");
            }

            if (block.QuestionCount == null)
            {
                errorMessages.Add("There is no question quantity");
            }
            else if (block.QuestionCount <= 0)
            {
                errorMessages.Add("Question quantity should be greater then 0");
            }

            if (!_repository.Exists <QuizType>(q => q.Id == quiz.QuizTypeId))
            {
                errorMessages.Add("There is no such quiz type in database");
            }

            if (quiz.QuizState == null)
            {
                if (quiz.StartDate != null)
                {
                    errorMessages.Add("There is start date but state isnt Scheduled");
                }
                if (quiz.EndDate != null)
                {
                    errorMessages.Add("There is end date but state isnt Scheduled");
                }
                if (quiz.TimeLimitMinutes != null)
                {
                    errorMessages.Add("There is time limit but state isnt Scheduled");
                }
                if (quiz.UserGroup != null)
                {
                    errorMessages.Add("There is user group selected but state isnt Scheduled");
                }
            }

            if (quiz.Id != 0)
            {
                var latestEdit = _repository.Get <QuizEditHistory>(q => q.QuizId == quiz.Id, q => q.User).OrderByDescending(q => q.LastChangeDate).Take(1).FirstOrDefault();

                if (latestEdit.UserId != User.Identity.GetUserId())
                {
                    errorMessages.Add("Quiz is being edited by another user, refresh page");
                }
            }

            return(errorMessages.Count > 0 ? errorMessages : null);
        }
Ejemplo n.º 2
0
        private object GetQuizBlockForSerialization(QuizBlock block)
        {
            var minQuizBlock = new
            {
                Id            = block.Id,
                QuizId        = block.QuizId,
                TopicId       = block.TopicId,
                QuestionCount = block.QuestionCount
            };

            return(minQuizBlock);
        }
Ejemplo n.º 3
0
        public ActionResult Save(Quiz quiz, QuizBlock block, QuizEditHistory latestChange)
        {
            var errorMessages = ValidateQuiz(quiz, block);

            if (errorMessages != null)
            {
                var errorMessage = string.Format("Invalid data: {0}", string.Concat(errorMessages));
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest, errorMessage));
            }

            var now = DateTime.UtcNow;

            if (quiz.Id != 0)
            {
                quiz.QuizStateId = quiz.QuizState.Id;
                quiz.QuizState   = null;
                block.Quiz       = null;
                if (quiz.UserGroup != null)
                {
                    quiz.GroupId   = quiz.UserGroup.Id;
                    quiz.UserGroup = null;
                }
                latestChange.LastChangeDate = now;
                latestChange.User           = null;
                _repository.Update <QuizEditHistory>(latestChange);
                _repository.Update <Quiz>(quiz);
                _repository.Update <QuizBlock>(block);
            }
            else
            {
                quiz.QuizStateId = quiz.QuizState.Id;
                quiz.QuizState   = null;
                _repository.Insert <Quiz>(quiz);
                block.TopicId = 1;
                block.QuizId  = quiz.Id;
                _repository.Insert <QuizBlock>(block);
                _repository.Insert <QuizVariant>(new QuizVariant()
                {
                    QuizId = quiz.Id
                });
                latestChange = LockQuiz(quiz.Id, User.Identity.GetUserId(), now);
            }
            quiz.QuizState = _repository.GetSingle <QuizState>(q => q.Id == quiz.QuizStateId);
            quiz.UserGroup = _repository.GetSingle <UserGroup>(g => g.Id == quiz.GroupId);

            var minQuiz         = GetQuizForSerialization(quiz);
            var minQuizBlock    = GetQuizBlockForSerialization(block);
            var minLatestChange = GetQuizEditHistoryForSerialization(latestChange);

            var result = new { quiz = minQuiz, block = minQuizBlock, latestChange = minLatestChange };

            return(Json(result));
        }
Ejemplo n.º 4
0
        public List <QuizBlock> ShuffleBlocks(List <QuizBlock> blocksOriginal) // Not in-place
        {
            Random rand   = new Random();
            var    blocks = blocksOriginal.Select(b => (QuizBlock)b.Clone()).ToList();
            int    n      = blocks.Count;

            while (n > 1)
            {
                int       k = rand.Next(n--); // get some item to swap with
                QuizBlock t = blocks[k];
                blocks[k] = blocks[n];
                blocks[n] = t;
            }
            return(blocks);
        }
Ejemplo n.º 5
0
        public ActionResult Get(int id)
        {
            Quiz quiz = _repository.GetSingle <Quiz>(q => q.Id == id, r => r.UserGroup, s => s.QuizState);

            quiz.UserGroup.Quizs = null;
            quiz.QuizState.Quizs = null;
            QuizBlock block = _repository.GetSingle <QuizBlock>(b => b.QuizId == id);

            var data = JsonConvert.SerializeObject(new { quiz = quiz, block = block }, Formatting.None,
                                                   new JsonSerializerSettings()
            {
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore
            });

            return(Content(data, "application/json"));
        }
Ejemplo n.º 6
0
        public ActionResult Get(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Id is null"));
            }
            var now          = DateTime.UtcNow;
            var locked       = false;
            var latestChange = _repository.Get <QuizEditHistory>(q => q.QuizId == id, q => q.User).OrderByDescending(q => q.LastChangeDate).Take(1).FirstOrDefault();

            if (latestChange != null)
            {
                var endLock = latestChange.LastChangeDate.AddMinutes(QuizLockDuration);
                if (endLock > now && latestChange.UserId != User.Identity.GetUserId()) // && USER != latestEdit.User //UPDATE WHEN AUTH
                {
                    locked = true;
                }
                else
                {
                    latestChange = LockQuiz((int)id, User.Identity.GetUserId(), now);
                }
            }
            else
            {
                latestChange = LockQuiz((int)id, User.Identity.GetUserId(), now);
            }

            Quiz      quiz  = _repository.GetSingle <Quiz>(q => q.Id == id, r => r.UserGroup, s => s.QuizState);
            QuizBlock block = _repository.GetSingle <QuizBlock>(b => b.QuizId == id);

            var minQuiz         = GetQuizForSerialization(quiz);
            var minQuizBlock    = GetQuizBlockForSerialization(block);
            var minLatestChange = GetQuizEditHistoryForSerialization(latestChange);

            var result = new { quiz = minQuiz, block = minQuizBlock, latestChange = minLatestChange, locked = locked };

            return(Json(result, JsonRequestBehavior.AllowGet));
        }
Ejemplo n.º 7
0
        public ActionResult Save(Quiz quiz, QuizBlock block)
        {
            if (quiz.Id != 0)
            {
                //using (eQuizEntities model = new eQuizEntities(System.Configuration.ConfigurationManager.ConnectionStrings["eQuizDB"].ConnectionString))
                //{
                //    var updateQuiz = model.Quizs.FirstOrDefault(q => q.Id == quiz.Id);
                //    if (updateQuiz == null)
                //    {
                //        return new HttpStatusCodeResult(System.Net.HttpStatusCode.BadRequest, "Quiz not found");
                //    }

                //    var updateBlock = model.QuizBlocks.FirstOrDefault(q => q.Id == quiz.Id);
                //    if (updateBlock == null)
                //    {
                //        return new HttpStatusCodeResult(System.Net.HttpStatusCode.BadRequest, "QuizBlock not found");
                //    }

                //    updateQuiz.Name = quiz.Name;
                //    updateQuiz.QuizTypeId = quiz.QuizTypeId;
                //    updateQuiz.StartDate = quiz.StartDate;
                //    updateQuiz.EndDate = quiz.EndDate;
                //    updateQuiz.TimeLimitMinutes = quiz.TimeLimitMinutes;
                //    updateQuiz.GroupId = quiz.GroupId;

                //    updateBlock.QuestionCount = block.QuestionCount;

                //    model.SaveChanges();
                //    quiz = updateQuiz;
                //    quiz.UserGroup = model.UserGroups.FirstOrDefault(g => g.Id == quiz.GroupId);
                //    block = updateBlock;
                //}

                _repository.Update <Quiz>(quiz);
                _repository.Update <QuizBlock>(block);
            }
            else
            {
                //block.TopicId = 1;
                //block.Quiz = quiz;

                //using (eQuizEntities model = new eQuizEntities(System.Configuration.ConfigurationManager.ConnectionStrings["eQuizDB"].ConnectionString))
                //{
                //    quiz.UserGroup = model.UserGroups.Where(g => g.Id == quiz.UserGroup.Id).First();
                //    model.Quizs.Add(quiz);
                //    model.QuizBlocks.Add(block);
                //    //  model.QuizVariants.Add(new QuizVariant() { QuizId = quiz.Id });   UPDATE DB
                //    model.SaveChanges();
                //}


                //    //  model.QuizVariants.Add(new QuizVariant() { QuizId = quiz.Id });   UPDATE DB
                //temp
                quiz.QuizStateId = quiz.QuizState.Id;
                quiz.QuizState   = null;
                quiz.GroupId     = 1; // UPDATE DB
                //
                _repository.Insert <Quiz>(quiz);
                block.TopicId = 1;
                block.QuizId  = quiz.Id;
                _repository.Insert <QuizBlock>(block);
                _repository.Insert <QuizVariant>(new QuizVariant()
                {
                    QuizId = quiz.Id
                });
            }
            var data = JsonConvert.SerializeObject(new { quiz = quiz, block = block }, Formatting.None,
                                                   new JsonSerializerSettings()
            {
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore
            });

            return(Content(data, "application/json"));
        }
Ejemplo n.º 8
0
        public ActionResult Schedule(Quiz quiz, int timeZoneOffset)
        {
            var errorMessages = ValidateSchedule(quiz);

            if (errorMessages != null)
            {
                var errorMessage = string.Format("Invalid data: {0}", string.Concat(errorMessages));
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest, errorMessage));
            }


            var copy            = _repository.GetSingle <Quiz>(q => q.Id == quiz.Id);
            var sheduledStateId = _repository.GetSingle <QuizState>(q => q.Name == "Scheduled").Id;
            var newQuiz         = new Quiz()
            {
                Name             = String.Format("{0} / {1}", quiz.Name, quiz.UserGroup.Name),
                StartDate        = quiz.StartDate?.AddMinutes(timeZoneOffset),
                EndDate          = quiz.EndDate?.AddMinutes(timeZoneOffset),
                TimeLimitMinutes = quiz.TimeLimitMinutes,
                QuizStateId      = sheduledStateId,
                QuizTypeId       = copy.QuizTypeId,
                GroupId          = quiz.UserGroup.Id
            };
            var quizBlock       = _repository.GetSingle <QuizBlock>(q => q.QuizId == quiz.Id);
            var quizQuestions   = _repository.Get <QuizQuestion>(q => q.QuizBlockId == quizBlock.Id);
            var questions       = _repository.Get <QuizQuestion>(q => q.QuizBlockId == quizBlock.Id, q => q.Question).Select(q => q.Question);
            var questionAnswers = new List <QuestionAnswer>();
            var questionTags    = new List <QuestionTag>();

            foreach (var question in questions)
            {
                var currrentAnswers = _repository.Get <QuestionAnswer>(q => q.QuestionId == question.Id, q => q.Answer);
                questionAnswers.AddRange(currrentAnswers);

                var currentTags = _repository.Get <QuestionTag>(q => q.QuestionId == question.Id);
                questionTags.AddRange(currentTags);
            }
            var answers = questionAnswers.Select(q => q.Answer);

            _repository.Insert <Quiz>(newQuiz);

            var newQuizBlock = new QuizBlock()
            {
                QuizId        = newQuiz.Id,
                QuestionCount = quizBlock.QuestionCount,
                TopicId       = _repository.GetSingle <Topic>().Id
            };

            _repository.Insert <QuizBlock>(newQuizBlock);

            foreach (var question in quizQuestions)
            {
                question.Question = questions.FirstOrDefault(q => q.Id == question.QuestionId);
            }

            foreach (var answer in questionAnswers)
            {
                answer.Question = questions.FirstOrDefault(q => q.Id == answer.QuestionId);
            }

            foreach (var tag in questionTags)
            {
                tag.Question = questions.FirstOrDefault(q => q.Id == tag.QuestionId);
            }

            foreach (var question in questions)
            {
                question.QuizPassQuestions = null;
                question.QuizQuestions     = null;
                _repository.Insert(question);
            }

            foreach (var question in quizQuestions)
            {
                question.QuizBlockId = newQuizBlock.Id;
                question.QuestionId  = question.Question.Id;
                question.Question    = null;
                _repository.Insert <QuizQuestion>(question);
            }

            foreach (var answer in questionAnswers)
            {
                answer.Answer = answers.FirstOrDefault(a => a.Id == answer.AnswerId);
            }

            foreach (var answer in answers)
            {
                answer.QuestionAnswers = null;
                answer.UserAnswers     = null;
                _repository.Insert <Answer>(answer);
            }

            foreach (var answer in questionAnswers)
            {
                answer.AnswerId   = answer.Answer.Id;
                answer.Answer     = null;
                answer.QuestionId = answer.Question.Id;
                answer.Question   = null;
                _repository.Insert <QuestionAnswer>(answer);
            }

            foreach (var tag in questionTags)
            {
                tag.QuestionId = tag.Question.Id;
                tag.Question   = null;
                _repository.Insert <QuestionTag>(tag);
            }

            return(Json(newQuiz.Id));
        }