public Grade(Assessment assessment, Profile profile) { IsLate = false; Assessment = assessment; Student = profile; SubmissionRecord record = (from s in assessment.SubmissionRecords where s.StudentID == profile.MembershipID orderby s.Score descending select s).FirstOrDefault(); if (record == null) { Points = 0; Percentage = 0; SubmissionRecord = null; } else { Points = record.Score; Percentage = (assessment.IsExtraCredit)? 100 : ((record.Score / assessment.Weight) * 100); SubmissionRecord = record; if (record.SubmissionDate.CompareTo(assessment.DueDate) > 0) { IsLate = true; } } }
public ActionResult Create(string courseTermShortName, string siteShortName, Assessment newAssessment) { if (ModelState.IsValid) { try { newAssessment.CourseTermID = courseTerm.CourseTermID; dataRepository.SaveAssessment(newAssessment); string previewlink = Url.Action("preview", new { controller = "assessment", siteShortName = site.ShortName, courseTermShortName = courseTerm.ShortName, id = newAssessment.AssessmentID }); FlashMessageHelper.AddMessage(string.Format(@"Assessment Saved Successfully! <a href=""{0}"" target=""_NEWWINDOW_"">Click here to preview.</a>", previewlink)); return RedirectToAction("Edit", new { siteShortName = siteShortName, courseTermShortName = courseTermShortName, id = newAssessment.AssessmentID }); //return RedirectToAction("Index", new { siteShortName = siteShortName, courseTermShortName = courseTermShortName }); } catch (RuleViolationException) { ModelState.AddModelErrors(newAssessment.GetRuleViolations()); } catch (Exception ex) { ModelState.AddModelError("_FORM", ex.Message); } } string data = DesignerHelper.LoadAssessment(newAssessment.Data); SelectList assessments = new SelectList(dataRepository.GetAllNonTestBankAssessments(courseTerm), "AssessmentID", "Name", newAssessment.PrereqAssessmentID); return View(new AssessmentFormViewModel(newAssessment, dataRepository.GetAssessmentTypesSelectList(courseTerm, newAssessment.AssessmentTypeID),data, assessments)); }
public bool HasUserSubmittedAssessment(Assessment assessment) { Guid Userid = (Guid)Membership.GetUser(HttpContext.Current.User.Identity.Name).ProviderUserKey; int submissionCount = dc.SubmissionRecords.Count(s => s.AssessmentID == assessment.AssessmentID && s.StudentID == Userid); return (submissionCount > 0); }
public void DeleteAllTagsFromAssessment(Assessment assessment) { List<Tag> tags = GetTagsForAssessment(assessment); foreach (Tag tag in tags) { DeleteTagFromAssessment(assessment, tag); } }
public void DeleteAssessment(Assessment assessment) { dc.SubmissionExceptions.DeleteAllOnSubmit(assessment.SubmissionExceptions); DeleteAllTagsFromAssessment(assessment); foreach (var question in assessment.Questions) { DeleteQuestion(question); } dc.SubmissionRecords.DeleteAllOnSubmit(assessment.SubmissionRecords); dc.Assessments.DeleteOnSubmit(assessment); }
public static bool StudentHasExtension(Assessment assessment, Guid StudentID) { SubmissionException exc = (from se in assessment.SubmissionExceptions where se.StudentID == StudentID select se).OrderByDescending(se => se.DueDate).FirstOrDefault(); if (exc != null && exc.DueDate.CompareTo(DateTime.Now) > 0) { return true; } else { return false; } }
public bool AssessmentHasTag(Assessment assessment, Tag tag) { int tagCount = dc.AssessmentTags.Count(at => at.TagID == tag.TagID && at.AssessmentID == assessment.AssessmentID); return tagCount > 0; }
public void AddTagToAssessment(Tag tag, Assessment assessment) { AddTagToAssessment(tag.TagID,assessment.AssessmentID); }
public void GradeAllResponses(Assessment assessment) { foreach (SubmissionRecord record in assessment.SubmissionRecords) { GradeSubmission(record); } }
public SubmissionRecordViewModel(List<Assessment> assessments, Assessment selectedAssessment) { assessments.Sort(new Comparison<Assessment>((a1, a2) => a1.Name.CompareTo(a2.Name))); AssessmentList = new SelectList(assessments, "AssessmentID", "Name", selectedAssessment.AssessmentID); Submissions = selectedAssessment.SubmissionRecords.OrderBy(sub => sub.Profile.LastName).ToList(); }
public static string RenderImportForm(Assessment assessment) { return RenderAssessmentForm(assessment, "~/Content/import.xsl", null, null, null); }
public AssessmentFormViewModel(Assessment assessment, SelectList assessmentTypes, string data, SelectList assessments) { Assessment = assessment; AssessmentTypes = assessmentTypes; DesignerData = data; Assessments = assessments; }
public ActionResult Create(string courseTermShortName, string siteShortName) { Assessment assessment = new Assessment() { AllowMultipleSubmissions = true, DueDate = DateTime.Now.AddDays(1), CreatedDate = DateTime.Now }; SelectList assessments = new SelectList(dataRepository.GetAllNonTestBankAssessments(courseTerm), "AssessmentID", "Name", assessment.PrereqAssessmentID); return View(new AssessmentFormViewModel(assessment, dataRepository.GetAssessmentTypesSelectList(courseTerm), assessments)); }
public void SaveAssessment(Assessment assessment, bool isNew) { try { using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required, TimeSpan.MaxValue)) { if (isNew) { dc.Assessments.InsertOnSubmit(assessment); dc.SubmitChanges(); } XElement markup = XElement.Parse(assessment.Data); //TODO: Remove this code and replace it with code to notify if related tag is missing from tag list // after the ability to delete tags from an assessment is added to the UI DeleteAllTagsFromAssessment(assessment); XAttribute tags = markup.Attribute("tags"); if (tags != null && !string.IsNullOrEmpty(tags.Value)) { string[] tagList = tags.Value.Split(new char[] { ',' }); foreach (string tagname in tagList) { string cleanName = tagname.Trim(); if (string.IsNullOrEmpty(cleanName)) { continue; } Tag tag = GetTagByName(assessment.CourseTerm, cleanName); if (tag == null) { throw new Exception("Tag not found."); tag = new Tag() { Profile = GetLoggedInProfile(), Name = cleanName, CourseTerm = assessment.CourseTerm }; //TODO find a way to defer saving tags to db in order //to link tags to questions dc.Tags.InsertOnSubmit(tag); dc.SubmitChanges(); //throw new Exception(string.Format("Invalid TagID in Assessments 'tags' attribute. ID = {{{0}}}", tagid)); } if (!AssessmentHasTag(assessment, tag)) { AddTagToAssessment(tag, assessment); } } } foreach (XElement questionNode in markup.Elements("question")) { Question question; if (questionNode.Attribute("id") != null && isNew) { throw new InvalidOperationException("Do not use 'id' Attribute when creating new Assessments"); } if (isNew || questionNode.Attribute("id") == null) { question = new Question(); assessment.Questions.Add(question); } else { question = dc.Questions.SingleOrDefault(q => q.QuestionID.ToString() == questionNode.Attribute("id").Value); } question.Weight = questionNode.Elements("answer").Sum(a => Convert.ToDouble(a.Attribute("weight").Value)); question.Data = questionNode.ToString(); if (isNew || questionNode.Attribute("id") == null) { dc.SubmitChanges(); questionNode.SetAttributeValue("id", question.QuestionID); } question.Data = questionNode.ToString(); //TODO: Remove this line DeleteAllTagsFromQuestion(question); tags = questionNode.Attribute("tags"); if (tags != null && !string.IsNullOrEmpty(tags.Value)) { string[] tagList = tags.Value.Split(new char[] { ',' }); foreach (string tagname in tagList) { string cleanName = tagname.Trim(); if (string.IsNullOrEmpty(cleanName)) { continue; } Tag tag = GetTagByName(assessment.CourseTerm, cleanName); if (tag == null) { throw new Exception("Tag not found."); tag = new Tag() { Profile = GetLoggedInProfile(), Name = cleanName, CourseTerm = assessment.CourseTerm }; //TODO find a way to defer saving tags to db in order //to link tags to questions dc.Tags.InsertOnSubmit(tag); dc.SubmitChanges(); //throw new Exception(string.Format("Invalid TagID in Question 'tags' attribute. ID = {{{0}}}, Question ID = {{{1}}}", tagname, question.QuestionID)); } if (!QuestionHasTag(question, tag)) { AddTagToQuestion(tag, question); } } } foreach (XElement answerNode in questionNode.Elements("answer")) { Answer answer; if (answerNode.Attribute("id") != null && isNew) { throw new InvalidOperationException("Do not use 'id' Attribute when creating new Assessments"); } if (isNew || answerNode.Attribute("id") == null) { answer = new Answer(); } else { answer = dc.Answers.SingleOrDefault(a => a.AnswerID.ToString() == answerNode.Attribute("id").Value); } //answer.AnswerKey = answerNode.Attribute("key").Value; dc.AnswerKeys.DeleteAllOnSubmit(answer.AnswerKeys.ToList()); dc.SubmitChanges(); XElement keysNode = answerNode.Element("AnswerKeys"); if (keysNode != null) { answer.AnswerKeyText = keysNode.ToString(); foreach (XElement key in keysNode.Elements("AnswerKey")) { AnswerKey newKey = new AnswerKey(); XAttribute keyWeight = key.Attribute("weight"); // It is assumed that this required attribute will always // be present newKey.Weight = Convert.ToDouble(keyWeight.Value); newKey.Value = key.Value; answer.AnswerKeys.Add(newKey); } } answer.Type = answerNode.Attribute("type").Value; answer.Weight = Convert.ToDouble(answerNode.Attribute("weight").Value); answer.Question = question; XElement stdin = answerNode.Element("Stdin"); if (stdin != null) { answer.Stdin = stdin.Value; } XElement fstream = answerNode.Element("Fstream"); if (fstream != null) { answer.Fstream = fstream.Value; } if (isNew || answerNode.Attribute("id") == null) { answer.Assessment = assessment; dc.Answers.InsertOnSubmit(answer); dc.SubmitChanges(); answerNode.SetAttributeValue("id", answer.AnswerID); } //TODO: Remove this line DeleteAllTagsFromAnswer(answer); tags = answerNode.Attribute("tags"); if (tags != null && !string.IsNullOrEmpty(tags.Value)) { string[] tagList = tags.Value.Split(new char[] { ',' }); foreach (string tagname in tagList) { string cleanName = tagname.Trim(); if (string.IsNullOrEmpty(cleanName)) { continue; } Tag tag = GetTagByName(assessment.CourseTerm, cleanName); if (tag == null) { throw new Exception("Tag not found."); tag = new Tag() { Profile = GetLoggedInProfile(), Name = cleanName, CourseTerm = assessment.CourseTerm }; //TODO find a way to defer saving tags to db in order //to link tags to questions dc.Tags.InsertOnSubmit(tag); dc.SubmitChanges(); //throw new Exception(string.Format("Invalid TagID in Answer 'tags' attribute. ID = {{{0}}}, Answer ID = {{{1}}}", tagname, answer.AnswerID)); } if (!AnswerHasTag(answer, tag)) { AddTagToAnswer(tag, answer); } } } } question.Data = questionNode.ToString(); dc.SubmitChanges(); } assessment.Data = markup.ToString(); //Ensure that we aren't deleting an answer and leaving dangling responses foreach (Answer answer in assessment.Answers) { XElement answerNode = markup.XPathSelectElement(string.Format("//answer[@id='{0}']", answer.AnswerID)); if (answerNode == null) { DeleteAnswer(answer); } } //Do the same for questions foreach (Question question in assessment.Questions) { XElement questionNode = markup.XPathSelectElement(string.Format("//question[@id='{0}']", question.QuestionID)); if (questionNode == null) { DeleteQuestion(question); } } dc.SubmitChanges(); transaction.Complete(); } } catch { throw; } }
public void SaveAssessment(Assessment assessment) { SaveAssessment(assessment, true); }
public static string RenderAssessmentSubmissionForm(this HtmlHelper helper, Assessment assessment) { NameValueCollection answers = helper.ViewContext.HttpContext.Request.Form; return helper.RenderAssessmentForm(assessment, "~/Content/submit.xsl", answers, null); }
public static string RenderAssessmentForm(this HtmlHelper helper, Assessment assessment, string stylesheet, NameValueCollection answers, NameValueCollection inputs, NameValueCollection comments) { return RenderAssessmentForm(assessment, stylesheet, answers, inputs, comments); }
public AssessmentFormViewModel(Assessment assessment, SelectList assessmentTypes, SelectList assessments) : this(assessment, assessmentTypes, "", assessments) { }
public static string RenderAssessmentForm(Assessment assessment, string stylesheet, NameValueCollection answers, NameValueCollection inputs, NameValueCollection comments) { XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load(HttpContext.Current.Server.MapPath(stylesheet)); //Prepare the xml output writer XmlWriterSettings settings = new XmlWriterSettings(); settings.ConformanceLevel = ConformanceLevel.Fragment; StringWriter sw = new StringWriter(); XmlWriter writer = XmlWriter.Create(sw, settings); //Load the xml document XmlDocument assessmentData = new XmlDocument(); assessmentData.LoadXml(assessment.Data); XmlNodeReader reader = new XmlNodeReader(assessmentData); //Perform the transform xslt.Transform(reader, writer); string markup = sw.ToString(); XmlDocument transformedData = new XmlDocument(); transformedData.LoadXml(markup); //Insert answers into the input fields if available if (answers != null && answers.Count > 0) { foreach (Answer answer in assessment.Answers) { XmlNode answerNode; //Answernode may be null in some instances, mainly if an answer is deleted from //an assessment it will still exist in the db but not in the xml if (answer.Type == "short-answer") { answerNode = transformedData.SelectSingleNode(String.Format("//input[@id='{0}']", answer.AnswerID.ToString())); if (answerNode != null) { XmlAttribute value = transformedData.CreateAttribute("value"); value.Value = answers[answer.AnswerID.ToString()]; answerNode.Attributes.Append(value); } } else if (answer.Type == "attachment") { if (string.IsNullOrEmpty(answers[answer.AnswerID.ToString()])) continue; answerNode = transformedData.SelectSingleNode(String.Format("//p[@id='download-{0}']", answer.AnswerID.ToString())); //For submit and import this will be null, for view and grade there will be a paragraph to insert a download link if (answerNode != null) { answerNode.InnerXml = answers[answer.AnswerID.ToString()]; } } else if (answer.Type == "long-answer") { answerNode = transformedData.SelectSingleNode(String.Format("//textarea[@id='{0}']", answer.AnswerID.ToString())); if (answerNode != null) { answerNode.InnerText = answers[answer.AnswerID.ToString()]; } } else if (answer.Type == "code-answer") { answerNode = transformedData.SelectSingleNode(String.Format("//pre[@id='{0}']", answer.AnswerID.ToString())); if (answerNode != null) { answerNode.InnerText = answers[answer.AnswerID.ToString()]; } } else if (answer.Type == "multichoice") { string escapedAnswer = System.Security.SecurityElement.Escape(answers[answer.AnswerID.ToString()]); answerNode = transformedData.SelectSingleNode(String.Format(@"//input[starts-with(@id,'{0}')][@value=""{1}""]", answer.AnswerID.ToString(), escapedAnswer)); if (answerNode != null) { XmlAttribute checkedAttr = transformedData.CreateAttribute("checked"); checkedAttr.Value = "true"; answerNode.Attributes.Append(checkedAttr); } } } } //insert any other form input data if (inputs != null && inputs.Count > 0) { XmlNode inputNode; foreach (string id in inputs.AllKeys) { //This assumes all inputs are "input" elements with type="text" string nodePath = string.Format("//node()[@name='{0}']", id); inputNode = transformedData.SelectSingleNode(nodePath); XmlAttribute value = transformedData.CreateAttribute("value"); value.Value = inputs[id]; inputNode.Attributes.Append(value); } } if (comments != null && comments.Count > 0) { XmlElement commentNode; foreach (string id in comments.AllKeys) { //This assumes all inputs are "input" elements with type="text" string nodePath = string.Format("//node()[@name='{0}']", id); commentNode = (XmlElement)transformedData.SelectSingleNode(nodePath); commentNode.InnerText = comments[id]; } } return transformedData.DocumentElement.OuterXml; }
public void DeleteTagFromAssessment(Assessment assessment, Tag tag) { dc.sp_DeleteTagFromAssessment(tag.TagID, assessment.AssessmentID); }
public List<Tag> GetTagsForAssessment(Assessment assessment) { var tags = from aTag in dc.AssessmentTags join a in dc.Assessments on aTag.AssessmentID equals a.AssessmentID join t in dc.Tags on aTag.TagID equals t.TagID where a.AssessmentID == assessment.AssessmentID select t; return tags.ToList(); }
public double GetWeightedPointValue(Assessment assessment) { if (assessment.IsExtraCredit) return 0.0; double totalAssignedPoints = GetAllNonTestBankAssessments(assessment.CourseTerm, false).Sum(a => a.Weight); double assessmentTypePercentage = assessment.AssessmentType.Weight / 100.0; double assessmentTypeWeightedPoints = assessmentTypePercentage * totalAssignedPoints; double assessmentTypeTotalPoints = GetAllNonTestBankAssessments(assessment.CourseTerm,false).Where(a => a.AssessmentType == assessment.AssessmentType).Sum(a => a.Weight); double assessmentPointPercentage = assessment.Weight / assessmentTypeTotalPoints; double weightedValue = assessmentPointPercentage * assessmentTypeWeightedPoints; return weightedValue; }