private Response ExecPost(List <AnswerWithResultViewModel> Risps, string QuestionnaireContext = "") { #if DEBUG Logger.Error(Request.Headers.ToString()); #endif int QuestionId = 0; if (_orchardServices.Authorizer.Authorize(Permissions.SubmitQuestionnaire)) { if (Risps.Count > 0) { var currentUser = _orchardServices.WorkContext.CurrentUser; if (Risps[0].Id > 0) { QuestionId = _repositoryAnswer.Fetch(x => x.Id == Risps[0].Id).FirstOrDefault().QuestionRecord_Id; } else { QuestionId = Risps[0].QuestionRecord_Id; } Int32 id = _repositoryQuestions.Fetch(x => x.Id == QuestionId).FirstOrDefault().QuestionnairePartRecord_Id; var content = _contentManager.Get(id); var qp = content.As <QuestionnairePart>(); QuestionnaireWithResultsViewModel qVM = _questionnairesServices.BuildViewModelWithResultsForQuestionnairePart(qp); foreach (QuestionWithResultsViewModel qresult in qVM.QuestionsWithResults) { if (qresult.QuestionType == QuestionType.OpenAnswer) { foreach (AnswerWithResultViewModel Risp in Risps) { if (qresult.Id == Risp.QuestionRecord_Id && !(string.IsNullOrEmpty(Risp.AnswerText))) { qresult.OpenAnswerAnswerText = Risp.AnswerText; } } } else { foreach (AnswerWithResultViewModel asw in qresult.AnswersWithResult) { foreach (AnswerWithResultViewModel Risp in Risps) { if (asw.Id == Risp.Id) { if (qresult.QuestionType == QuestionType.SingleChoice) { qresult.SingleChoiceAnswer = asw.Id; } else { asw.Answered = true; } } } } } } var context = new ValidationContext(qVM, serviceProvider: null, items: null); var results = new List <ValidationResult>(); var isValid = Validator.TryValidateObject(qVM, context, results); if (!isValid) { string messaggio = ""; foreach (var validationResult in results) { messaggio += validationResult.ErrorMessage + " "; } return(_utilsServices.GetResponse(ResponseType.Validation, T("Validation:").ToString() + messaggio)); } else { qVM.Context = QuestionnaireContext; string uniqueId; var request = HttpContext.Current.Request; if (request != null && request.Headers["x-uuid"] != null) { uniqueId = request.Headers["x-uuid"]; } else { uniqueId = HttpContext.Current.Session.SessionID; } if (_questionnairesServices.Save(qVM, currentUser, uniqueId)) { return(_utilsServices.GetResponse(ResponseType.Success)); } else { return(_utilsServices.GetResponse(ResponseType.Validation, T("Questionnaire already submitted.").ToString())); } } } else { return(_utilsServices.GetResponse(ResponseType.Validation, T("Validation: data list is empty.").ToString())); } } else { return(_utilsServices.GetResponse(ResponseType.UnAuthorized)); } }
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!")); } }
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 viewModel = _questServices.BuildViewModelWithResultsForQuestionnairePart(part); //Modello mappato senza risposte if (_controllerContextAccessor.Context != null) { // valorizza il context var questionnaireContext = part.Settings.GetModel <QuestionnairesPartSettingVM>().QuestionnaireContext; //questionnaireContext = _tokenizer.Replace(questionnaireContext, new Dictionary<string, object> {{ "Content", part.ContentItem}}); questionnaireContext = _tokenizer.Replace(questionnaireContext, new Dictionary <string, object> { { "Content", _currentContentAccessor.CurrentContentItem } }); 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 var fullModelWithAnswers = _controllerContextAccessor.Context.Controller.TempData["QuestUpdatedEditModel"]; var hasAcceptedTerms = _controllerContextAccessor.Context.Controller.TempData["HasAcceptedTerms"]; 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++) { switch (viewModel.QuestionsWithResults[i].QuestionType) { case QuestionType.OpenAnswer: viewModel.QuestionsWithResults[i].OpenAnswerAnswerText = risposteModel.QuestionsWithResults[i].OpenAnswerAnswerText; break; case QuestionType.SingleChoice: viewModel.QuestionsWithResults[i].SingleChoiceAnswer = risposteModel.QuestionsWithResults[i].SingleChoiceAnswer; break; case QuestionType.MultiChoice: for (var j = 0; j < viewModel.QuestionsWithResults[i].AnswersWithResult.Count(); j++) { viewModel.QuestionsWithResults[i].AnswersWithResult[j].Answered = risposteModel.QuestionsWithResults[i].AnswersWithResult[j].Answered; } break; } } } else if (hasAcceptedTerms != null) // l'utente ha appena accettato le condizionoi { viewModel.HasAcceptedTerms = (bool)_controllerContextAccessor.Context.Controller.TempData["HasAcceptedTerms"]; } } 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.Parts_Questionnaire_FrontEnd_Edit( Questionnaire: viewModel, Prefix: Prefix))); } else { throw new OrchardSecurityException(T("You have to be logged in, before answering a questionnaire!")); } }