示例#1
0
 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);
 }
示例#4
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;
     }
 }
示例#7
0
 public bool AssessmentHasTag(Assessment assessment, Tag tag)
 {
     int tagCount = dc.AssessmentTags.Count(at => at.TagID == tag.TagID && at.AssessmentID == assessment.AssessmentID);
     return tagCount > 0;
 }
示例#8
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));
 }
示例#14
0
        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;
            }
        }
示例#15
0
 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;
        }
示例#20
0
 public void DeleteTagFromAssessment(Assessment assessment, Tag tag)
 {
     dc.sp_DeleteTagFromAssessment(tag.TagID, assessment.AssessmentID);
 }
示例#21
0
 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();
 }
示例#22
0
        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;
        }