示例#1
0
        public ActionResult Save(string returnUrl)
        {
            var editModel   = new ViewModels.QuestionnaireWithResultsViewModel();
            var currentUser = _orchardServices.WorkContext.CurrentUser;

            try {
                if (TryUpdateModel(editModel, _prefix))
                {
                    TempData["QuestUpdatedEditModel"] = editModel; // devo avere modo di fare non perdere le risposte date finora!!!
                    TempData["HasAcceptedTerms"]      = editModel.HasAcceptedTerms;

                    QuestionnairesPartSettingVM questionnairePartSettings = null;
                    var questionnaire = _orchardServices.ContentManager.Get(editModel.Id);
                    if (questionnaire != null && questionnaire.As <QuestionnairePart>() != null)
                    {
                        questionnairePartSettings = questionnaire.As <QuestionnairePart>().Settings.GetModel <QuestionnairesPartSettingVM>();
                    }

                    // verifica se il questionario può essere compilato una volta sola ed è già stato compilato
                    bool canBeFilled = true;
                    var  questionnaireModuleSettings = _orchardServices.WorkContext.CurrentSite.As <QuestionnaireModuleSettingsPart>();
                    if (questionnaireModuleSettings.Disposable)
                    {
                        if (currentUser == null || (questionnairePartSettings != null && questionnairePartSettings.ForceAnonymous))
                        {
                            var cookie = Request.Cookies["Questionnaires"];
                            if (cookie != null)
                            {
                                var ids = cookie.Value;
                                if (ids.Contains("," + editModel.Id + ","))
                                {
                                    canBeFilled = false;
                                }
                            }
                        }
                    }
                    if (canBeFilled)
                    {
                        canBeFilled = _questionnairesServices.Save(editModel, currentUser, ControllerContext.HttpContext.Session.SessionID);
                    }
                    //if (editModel.UseRecaptcha && !_captchaServices.IsCaptchaValid(_orchardServices.WorkContext.HttpContext.Request.Form, _orchardServices.WorkContext.HttpContext.Request.UserHostAddress)) {
                    //    throw new Exception("Invalid captcha!");
                    //}

                    //if (editModel.MustAcceptTerms && !editModel.HasAcceptedTerms) {
                    //    TempData["QuestError"] = T("Please, accept our terms and conditions!");
                    //} else {
                    //    foreach (var q in editModel.QuestionsWithResults) {
                    //        if (q.QuestionType == QuestionType.OpenAnswer) {
                    //            if (!String.IsNullOrWhiteSpace(q.OpenAnswerAnswerText)) {
                    //                var userAnswer = new UserAnswersRecord();
                    //                userAnswer.AnswerText = q.OpenAnswerAnswerText;
                    //                userAnswer.QuestionText = q.Question;
                    //                userAnswer.QuestionRecord_Id = q.Id;
                    //                userAnswer.User_Id = currentUser.Id;
                    //                userAnswer.QuestionnairePartRecord_Id = editModel.Id;
                    //                userAnswer.SessionID = ControllerContext.HttpContext.Session.SessionID;
                    //                _questionnairesServices.CreateUserAnswers(userAnswer);
                    //            }
                    //        } else if (q.QuestionType == QuestionType.SingleChoice) {
                    //            if (q.SingleChoiceAnswer > 0) {
                    //                var userAnswer = new UserAnswersRecord();
                    //                userAnswer.AnswerRecord_Id = q.SingleChoiceAnswer;
                    //                userAnswer.AnswerText = _questionnairesServices.GetAnswer(q.SingleChoiceAnswer).Answer;
                    //                userAnswer.QuestionRecord_Id = q.Id;
                    //                userAnswer.User_Id = currentUser.Id;
                    //                userAnswer.QuestionText = q.Question;
                    //                userAnswer.QuestionnairePartRecord_Id = editModel.Id;
                    //                userAnswer.SessionID = ControllerContext.HttpContext.Session.SessionID;
                    //                _questionnairesServices.CreateUserAnswers(userAnswer);
                    //            }
                    //        } else if (q.QuestionType == QuestionType.MultiChoice) {
                    //            var answerList = q.AnswersWithResult.Where(w => w.Answered);
                    //            foreach (var a in answerList) {
                    //                var userAnswer = new UserAnswersRecord();
                    //                userAnswer.AnswerRecord_Id = a.Id;
                    //                userAnswer.AnswerText = _questionnairesServices.GetAnswer(a.Id).Answer;
                    //                userAnswer.QuestionRecord_Id = q.Id;
                    //                userAnswer.User_Id = currentUser.Id;
                    //                userAnswer.QuestionText = q.Question;
                    //                userAnswer.QuestionnairePartRecord_Id = editModel.Id;
                    //                userAnswer.SessionID = ControllerContext.HttpContext.Session.SessionID;
                    //                _questionnairesServices.CreateUserAnswers(userAnswer);
                    //            }
                    //        }
                    //    }
                    if (canBeFilled == false)
                    {
                        TempData["QuestError"]       = T("Sorry, you already submitted this questionnaire.");
                        TempData["AlreadySubmitted"] = true;
                    }
                    else
                    {
                        TempData["QuestSuccess"] = T("Thank you for submitting your feedback.");
                    }
                    //var content = _orchardServices.ContentManager.Get(editModel.Id);
                    //_workflowManager.TriggerEvent("QuestionnaireSubmitted", content, () => new Dictionary<string, object> { { "Content", content } });


                    //}
                }
                else
                {
                    TempData["QuestUpdatedEditModel"] = editModel; // devo avere modo di fare non perdere le risposte date finora!!!
                    _transactionManager.Cancel();
                    var errors = ModelState.Values.Where(w => w.Errors.Count() > 0).Select(s => s.Errors.First().ErrorMessage);
                    TempData["QuestError"] = String.Join("\r\n", errors);
                }
            } catch (Exception ex) {
                TempData["QuestUpdatedEditModel"] = editModel; // devo avere modo di fare non perdere le risposte date finora!!!
                _transactionManager.Cancel();
                TempData["QuestError"] = T(ex.Message) + ex.StackTrace;
            }
            return(this.RedirectLocal(returnUrl, "~/"));
        }
示例#2
0
        public ActionResult Save(string returnUrl)
        {
            var editModel   = new ViewModels.QuestionnaireWithResultsViewModel();
            var currentUser = _orchardServices.WorkContext.CurrentUser;

            try {
                if (TryUpdateModel(editModel, _prefix))
                {
                    TempData["QuestUpdatedEditModel"] = editModel; // devo avere modo di fare non perdere le risposte date finora!!!
                    TempData["HasAcceptedTerms"]      = editModel.HasAcceptedTerms;

                    QuestionnairesPartSettingVM questionnairePartSettings = null;
                    var questionnaire = _orchardServices.ContentManager.Get(editModel.Id);
                    if (questionnaire != null && questionnaire.As <QuestionnairePart>() != null)
                    {
                        questionnairePartSettings = questionnaire.As <QuestionnairePart>().Settings.GetModel <QuestionnairesPartSettingVM>();
                    }

                    // verifica se il questionario può essere compilato una volta sola ed è già stato compilato
                    bool canBeFilled = true;
                    var  questionnaireModuleSettings = _orchardServices.WorkContext.CurrentSite.As <QuestionnaireModuleSettingsPart>();
                    if (questionnaireModuleSettings.Disposable)
                    {
                        if (currentUser == null || (questionnairePartSettings != null && questionnairePartSettings.ForceAnonymous))
                        {
                            var cookie = Request.Cookies["Questionnaires"];
                            if (cookie != null)
                            {
                                var ids = cookie.Value;
                                if (ids.Contains("," + editModel.Id + ","))
                                {
                                    canBeFilled = false;
                                }
                            }
                        }
                    }
                    if (canBeFilled)
                    {
                        string uniqueId;
                        var    request = ControllerContext.HttpContext.Request;

                        if (request != null && request.Headers["x-uuid"] != null)
                        {
                            uniqueId = request.Headers["x-uuid"];
                        }
                        else
                        {
                            uniqueId = ControllerContext.HttpContext.Session.SessionID;
                        }

                        canBeFilled = _questionnairesServices.Save(editModel, currentUser, uniqueId);
                    }
                    if (canBeFilled == false)
                    {
                        TempData["QuestError"]       = T("Sorry, you already submitted this questionnaire.");
                        TempData["AlreadySubmitted"] = true;
                    }
                    else
                    {
                        TempData["QuestSuccess"] = T("Thank you for submitting your feedback.");
                    }
                }
                else
                {
                    TempData["QuestUpdatedEditModel"] = editModel; // devo avere modo di fare non perdere le risposte date finora!!!
                    _transactionManager.Cancel();
                    var errors = ModelState.Values.Where(w => w.Errors.Count() > 0).Select(s => s.Errors.First().ErrorMessage);
                    TempData["QuestError"] = String.Join("\r\n", errors);
                }
            } catch (Exception ex) {
                TempData["QuestUpdatedEditModel"] = editModel; // devo avere modo di fare non perdere le risposte date finora!!!
                _transactionManager.Cancel();
                TempData["QuestError"] = T(ex.Message) + ex.StackTrace;
            }
            return(this.RedirectLocal(returnUrl, "~/"));
        }
示例#3
0
        protected override DriverResult Display(QuestionnairePart part, string displayType, dynamic shapeHelper)
        {
            if (displayType == "Summary")
            {
                return(ContentShape("Parts_Questionnaire_Summary",
                                    () => shapeHelper.Parts_Questionnaire_Summary(
                                        QuestionsCount: part.Questions.Count(c => c.Published)
                                        )));
            }
            if (displayType == "SummaryAdmin")
            {
                return(ContentShape("Parts_Questionnaire_SummaryAdmin",
                                    () => shapeHelper.Parts_Questionnaire_SummaryAdmin(
                                        QuestionsCount: part.Questions.Count(c => c.Published),
                                        QuestionsTotalCount: part.Questions.Count()
                                        )));
            }

            if (IsAuthorized)
            {
                var partSettings = part.Settings.TryGetModel <QuestionnairesPartSettingVM>();
                if (partSettings == null)
                {
                    partSettings = new QuestionnairesPartSettingVM();
                }
                QuestionnaireWithResultsViewModel viewModel;
                if (_controllerContextAccessor.Context != null)
                {
                    bool questionnaireHasJustBeenSubmitted;
                    // valorizza il context
                    var questionnaireContext = partSettings.QuestionnaireContext;
                    var currentUser          = _orchardServices.WorkContext.CurrentUser;
                    questionnaireContext = _tokenizer.Replace(questionnaireContext, new Dictionary <string, object> {
                        { "Content", _currentContentAccessor.CurrentContentItem }
                    });
                    // TempData may contains current answers to the current questionnaire instance.
                    // So if TempData is not null means that the current user just answered to the questionnaire.
                    var fullModelWithAnswers = _controllerContextAccessor.Context.Controller.TempData["QuestUpdatedEditModel"];
                    var hasAcceptedTerms     = _controllerContextAccessor.Context.Controller.TempData["HasAcceptedTerms"];
                    questionnaireHasJustBeenSubmitted = fullModelWithAnswers != null;
                    viewModel = _questServices.BuildViewModelWithResultsForQuestionnairePart(part); //Modello mappato senza risposte
                    if (currentUser != null && fullModelWithAnswers == null && partSettings.ShowLatestAnswers)
                    {
                        //if the current questionnaire instance has not answers and settings require to show current user's latest answers
                        fullModelWithAnswers = _questServices.GetMostRecentAnswersInstance(part, currentUser, questionnaireContext);
                    }
                    viewModel.Context = questionnaireContext;

                    // limita la lunghezza del context a 255 chars
                    if (viewModel.Context.Length > 255)
                    {
                        viewModel.Context = viewModel.Context.Substring(0, 255);
                    }

                    // valorizza le altre proprietà del viewModel
                    if (fullModelWithAnswers != null)   // Mappo le risposte
                    {
                        var risposteModel = (QuestionnaireWithResultsViewModel)fullModelWithAnswers;
                        //Mappo l'oggetto principale per evitare che mi richieda di accettare le condizioni
                        viewModel.MustAcceptTerms  = risposteModel.MustAcceptTerms;
                        viewModel.HasAcceptedTerms = risposteModel.HasAcceptedTerms;

                        for (var i = 0; i < viewModel.QuestionsWithResults.Count(); i++)
                        {
                            var question = viewModel.QuestionsWithResults[i];
                            // Gets the userAnswers having same question id (Id) and same question text (Question) of question of the content.
                            // If missing, means that the current user never answered to that question.
                            var questionWithAnswers = risposteModel.QuestionsWithResults.FirstOrDefault(x => x.Id == question.Id && x.Question == question.Question);
                            if (questionWithAnswers != null)
                            {
                                switch (viewModel.QuestionsWithResults[i].QuestionType)
                                {
                                case QuestionType.OpenAnswer:
                                    viewModel.QuestionsWithResults[i].OpenAnswerAnswerText = questionWithAnswers.OpenAnswerAnswerText;
                                    break;

                                case QuestionType.SingleChoice:
                                    viewModel.QuestionsWithResults[i].SingleChoiceAnswer = questionWithAnswers.SingleChoiceAnswer;
                                    break;

                                case QuestionType.MultiChoice:
                                    for (var j = 0; j < viewModel.QuestionsWithResults[i].AnswersWithResult.Count(); j++)
                                    {
                                        var choice = question.AnswersWithResult[j];
                                        // Gets the answers of question having same answer id (Id) and same answer text (userResponse.AnswerText > answer.Answer) of the answer of the content.
                                        // If missing, means that the current user never answered with current option.
                                        var answer = questionWithAnswers.AnswersWithResult.SingleOrDefault(x => x.Id == choice.Id && (questionnaireHasJustBeenSubmitted || x.AnswerText == choice.Answer));
                                        viewModel.QuestionsWithResults[i].AnswersWithResult[j].Answered = answer != null ? answer.Answered : false;
                                    }
                                    break;
                                }
                            }
                        }
                    }
                    else if (hasAcceptedTerms != null)   // l'utente ha appena accettato le condizionoi
                    {
                        viewModel.HasAcceptedTerms = (bool)_controllerContextAccessor.Context.Controller.TempData["HasAcceptedTerms"];
                    }
                }
                else
                {
                    // There's not a WorkContext
                    viewModel = _questServices.BuildViewModelWithResultsForQuestionnairePart(part); //Modello mappato senza risposte
                }
                if (viewModel.UseRecaptcha)                                                         // se è previsto un recaptcha creo l'html e il js del recaptcha
                {
                    viewModel.CaptchaHtmlWidget = _capthcaServices.GenerateCaptcha();
                }
                return(ContentShape("Parts_Questionnaire_FrontEnd_Edit",
                                    () => shapeHelper.EditorTemplate(TemplateName: "Parts/Questionnaire_FrontEnd_Edit",
                                                                     Model: viewModel,
                                                                     Prefix: Prefix)));
            }
            else
            {
                throw new OrchardSecurityException(T("You have to be logged in, before answering a questionnaire!"));
            }
        }