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, "~/")); }
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, "~/")); }
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!")); } }