public override DynamicDictionary BuildTableForTeam(IAssignmentTeam assignmentTeam) { dynamic data = Builder.BuildTableForTeam(assignmentTeam); data.studentRubricsReceived = new DynamicDictionary(); List <bool> hasRubricList = new List <bool>(); List <int> authorTeamIds = new List <int>(); foreach (TeamMember tm in assignmentTeam.Team.TeamMembers) { AssignmentTeam previousTeam = OSBLEController.GetAssignmentTeam(assignmentTeam.Assignment.PreceedingAssignment, tm.CourseUser); authorTeamIds.Add(previousTeam.TeamID); using (OSBLEContext db = new OSBLEContext()) { hasRubricList.Add((from e in db.RubricEvaluations where e.AssignmentID == assignmentTeam.AssignmentID && e.RecipientID == previousTeam.TeamID && e.Evaluator.AbstractRoleID == (int)CourseRole.CourseRoles.Student && e.IsPublished select e.ID).Count() > 0); } } data.studentRubricsReceived.assignmentID = assignmentTeam.AssignmentID; data.studentRubricsReceived.hasRubricList = hasRubricList; data.studentRubricsReceived.authorTeamIDs = authorTeamIds; return(data); }
public override DynamicDictionary BuildTableForTeam(IAssignmentTeam assignmentTeam) { dynamic data = Builder.BuildTableForTeam(assignmentTeam); data.Multiplier = new DynamicDictionary(); // Note: assume assignment team size == 1 because TeamEvaluationIndex // splits each courseUser into their own seperate team double avg = -1; int denom = (from t in TeamEvaluations where t.RecipientID == assignmentTeam.Team.TeamMembers.FirstOrDefault().CourseUserID select t).Count(); if (denom > 0) { avg = (from t in TeamEvaluations where t.RecipientID == assignmentTeam.Team.TeamMembers.FirstOrDefault().CourseUserID select t.Points).Sum() / denom; } if (avg == -1) { data.Multiplier.MultiplierText = "-"; } else { data.Multiplier.MultiplierText = (avg /= 100).ToString(); } return(data); }
public override DynamicDictionary BuildTableForTeam(IAssignmentTeam assignmentTeam) { dynamic data = Builder.BuildTableForTeam(assignmentTeam); data.AssignmentTeam = assignmentTeam; return(data); }
public override DynamicDictionary BuildTableForTeam(IAssignmentTeam discussionTeam) { //discussionTeam is a put together DiscussionTeam that has a new non-db saved team for its team //This new team has only 1 team members (the individual we want to create a row for). //but, the TeamID is the real team ID used in the database. This is done in DiscussionAssignmentIndex.cshtml dynamic data = Builder.BuildTableForTeam(discussionTeam); data.Posts = new DynamicDictionary(); TeamMember member = discussionTeam.Team.TeamMembers.FirstOrDefault(); data.Posts.PostCount = 0; if (member != null) { data.Posts.PostCount = (from a in AllUserPosts where a.CourseUserID == member.CourseUserID && a.DiscussionTeamID == (discussionTeam as DiscussionTeam).ID && !a.IsReply select a).Count(); } data.Posts.DiscussionTeamID = (discussionTeam as DiscussionTeam).ID; data.Posts.CourseUserID = member.CourseUserID; data.Posts.AssignmentID = discussionTeam.AssignmentID; return(data); }
public override DynamicDictionary BuildTableForTeam(IAssignmentTeam discussionTeam) { dynamic data = Builder.BuildTableForTeam(discussionTeam); data.Total = new DynamicDictionary(); TeamMember member = discussionTeam.Team.TeamMembers.FirstOrDefault(); data.Total.PostCount = 0; if (member != null) { data.Total.PostCount = (from a in AllUserPosts where a.CourseUserID == member.CourseUserID && a.DiscussionTeamID == (discussionTeam as DiscussionTeam).ID && !a.IsReply select a).Count(); data.Total.PostCount += (from a in AllUserPosts where a.CourseUserID == member.CourseUserID && a.DiscussionTeamID == (discussionTeam as DiscussionTeam).ID && a.IsReply select a).Count(); } data.Total.CourseUserID = member.CourseUserID; data.Total.AssignmentID = discussionTeam.AssignmentID; data.Total.DiscussionTeamID = (discussionTeam as DiscussionTeam).ID; return(data); }
public override DynamicDictionary BuildTableForTeam(IAssignmentTeam assignmentTeam) { dynamic data = Builder.BuildTableForTeam(assignmentTeam); data.TeacherReceivedCritical = new DynamicDictionary(); data.TeacherReceivedCritical.ReviewTeams = ReviewTeams; AssignmentTeam assignTeam = assignmentTeam as AssignmentTeam; Assignment assignment = assignTeam.Assignment; Assignment previousAssignment = assignment.PreceedingAssignment; List <CourseUser> CourseUsersInReviewTeam = (from tm in assignTeam.Team.TeamMembers orderby tm.CourseUser.UserProfile.LastName, tm.CourseUser.UserProfile.FirstName select tm.CourseUser).ToList(); List <CriticalReviewsReceivedTeam> reviewers = new List <CriticalReviewsReceivedTeam>(); string submissionFolder; List <DateTime?> timeStamp = new List <DateTime?>(); foreach (CourseUser cu in CourseUsersInReviewTeam) { bool addedTimeStamp = false; AssignmentTeam previousAssignmentTeam = OSBLEController.GetAssignmentTeam(assignment.PreceedingAssignment, cu); foreach (AssignmentTeam at in assignment.AssignmentTeams) { submissionFolder = FileSystem.GetTeamUserSubmissionFolderForAuthorID(false, assignment.Course, assignment.ID, at, previousAssignmentTeam.Team); DirectoryInfo DI = new DirectoryInfo(submissionFolder); if (DI.Exists) { timeStamp.Add(DI.LastAccessTime); addedTimeStamp = true; data.TeacherReceivedCritical.IsPdfReviewAssignment = false; break; } else if (previousAssignment.HasDeliverables && previousAssignment.Deliverables[0].DeliverableType == DeliverableType.PDF) { //AC Note: I have no clue what is going on here. I'm inserting this code for Annodate-based PDF assignments. //I'm not sure if it makes the most sense for it to go here, but it works, so... data.TeacherReceivedCritical.IsPdfReviewAssignment = true; reviewers = reviewers.Union(ReviewTeams.Where(rt => rt.CourseUser.ID == cu.ID)).ToList(); //AC: stuff that was here before timeStamp.Add(DateTime.UtcNow); addedTimeStamp = true; break; } } if (addedTimeStamp == false) { timeStamp.Add(null); } } data.TeacherReceivedCritical.Reviewers = reviewers; data.TeacherReceivedCritical.TimeStampList = timeStamp; data.TeacherReceivedCritical.CourseUsers = CourseUsersInReviewTeam; data.TeacherReceivedCritical.Assignment = assignment; return(data); }
public override DynamicDictionary BuildTableForTeam(IAssignmentTeam assignmentTeam) { //discussionTeam is a put together DiscussionTeam that has a new non-db saved team for its team //This new team has only 1 team members (the individual we want to create a row for). //but, the TeamID is the real team ID used in the database. This is done in DiscussionAssignmentIndex.cshtml dynamic data = Builder.BuildTableForTeam(assignmentTeam); data.LatePenaltyPercent = OSBLEController.GetLatePenaltyAsString(assignmentTeam); return(data); }
public override DynamicDictionary BuildTableForTeam(IAssignmentTeam assignmentTeam) { dynamic data = Builder.BuildTableForTeam(assignmentTeam); data.TeacherCritical = new DynamicDictionary(); data.TeacherCritical.ReviewTeams = ReviewTeams; AssignmentTeam assignTeam = assignmentTeam as AssignmentTeam; Assignment assignment = assignTeam.Assignment; //get information to download all reviews that the team did List <ReviewTeam> authorTeams = new List <ReviewTeam>(); authorTeams = (from rt in assignment.ReviewTeams where rt.ReviewTeamID == assignTeam.TeamID select rt).ToList(); StringBuilder reviewedTeams = new StringBuilder(); DateTime lastSubmission = DateTime.MinValue; bool hasSubmission = false; int submittedCount = 0; foreach (ReviewTeam reviewTeam in authorTeams) { DateTime?thisSub = FileSystem.GetSubmissionTime(assignTeam, reviewTeam.AuthorTeam); if (thisSub != null) { reviewedTeams.Append(reviewTeam.AuthorTeam.Name).Append(", submitted on ").Append(thisSub).Append("\n"); hasSubmission = true; submittedCount++; } else { reviewedTeams.Append(reviewTeam.AuthorTeam.Name).Append("; no review submitted\n"); } } string altText = string.Format("Download {0}'s reviews of:\n{1}", assignmentTeam.Team.Name, reviewedTeams); if (assignment.PreceedingAssignment.HasDeliverables && assignment.PreceedingAssignment.Deliverables[0].DeliverableType == DeliverableType.PDF) { data.TeacherCritical.IsPdfReviewAssignment = true; } else { data.TeacherCritical.IsPdfReviewAssignment = false; } data.TeacherCritical.fractionReviewed = string.Format("{0}/{1} submitted", submittedCount.ToString(), authorTeams.Count.ToString()); data.TeacherCritical.altText = altText; data.TeacherCritical.hasSubmission = hasSubmission; data.TeacherCritical.AssignmentTeam = assignmentTeam; return(data); }
public override DynamicDictionary BuildTableForTeam(IAssignmentTeam assignmentTeam) { dynamic data = Builder.BuildTableForTeam(assignmentTeam); data.TeamEvaluationProgress = new DynamicDictionary(); data.TeamEvaluationProgress.hasSubmitted = (from te in Evaluations where assignmentTeam.Team.TeamMembers.FirstOrDefault().CourseUserID == te.EvaluatorID select te).Count() > 0; return(data); }
/// <summary> /// AC: As of 2012-02-27, we have two different team uses (AssignmentTeam, DiscussionTeam). Both inherit from /// IAssignmentTeam, but when creating new objects, I need to instantiate a concrete class. This method /// allows the programmer to convert between concrete implementations of IAssignmentTeam. /// </summary> /// <param name="genericTeam"></param> /// <param name="teamType"></param> /// <returns></returns> protected IList <IAssignmentTeam> CastTeamAsConcreteType(IList <IAssignmentTeam> genericTeam, Type teamType) { List <IAssignmentTeam> castedTeams = new List <IAssignmentTeam>(); foreach (IAssignmentTeam team in genericTeam) { IAssignmentTeam t = Activator.CreateInstance(teamType) as IAssignmentTeam; t.AssignmentID = team.AssignmentID; t.Assignment = team.Assignment; t.TeamID = team.TeamID; t.Team = team.Team; castedTeams.Add(t); } return(castedTeams); }
/// <summary> /// Returns the last submit time for a particular submission /// </summary> /// <param name="team"></param> /// <returns></returns> public static DateTime?GetSubmissionTime(IAssignmentTeam team, Team authorTeam = null) { DateTime?timeSubmitted = null; if (team != null) { DirectoryInfo submissionFolder; if (team.Assignment.Type == AssignmentTypes.CriticalReview && authorTeam != null) { submissionFolder = new DirectoryInfo (FileSystem.GetTeamUserSubmissionFolderForAuthorID (false, team.Assignment.Course, team.AssignmentID, team, authorTeam) ); } else { submissionFolder = new DirectoryInfo (FileSystem.GetTeamUserSubmissionFolder ( false, team.Assignment.Course, team.Assignment.ID, team ) ); } if (submissionFolder != null && submissionFolder.Exists && submissionFolder.GetFiles().Count() > 0) { //unfortunately LastWriteTime for a directory does not take into account it's file or //sub directories and these we need to check to see when the last file was written too. timeSubmitted = submissionFolder.LastWriteTime; foreach (FileInfo file in submissionFolder.GetFiles()) { if (file.LastWriteTime > timeSubmitted) { timeSubmitted = file.LastWriteTimeUtc; } } } } return(timeSubmitted); }
public static string GetTeamUserSubmissionFolderForAuthorID(bool createPathIfNotExists, Course course, int assignmentID, IAssignmentTeam submitterTeam, Team authorTeam) { //string path = GetTeamUserSubmissionFolder(false, course, assignmentID, submitterTeam); //path += "\\" + authorTeam.Name.ToString(); //if (!Directory.Exists(path) && createPathIfNotExists) //{ // Directory.CreateDirectory(path); //} string path = OSBLE.Models.FileSystem.Directories.GetAssignment( course.ID, assignmentID) .Review(authorTeam.ID, submitterTeam.TeamID) .GetPath(); return(path); }
/// <summary> /// This function builds the column for Rubric Grades in the instructor assignment details table. Note: This only handles non-student-evaluated rubrics. /// </summary> /// <param name="assignmentTeam"></param> /// <returns></returns> public override DynamicDictionary BuildTableForTeam(IAssignmentTeam assignmentTeam) { Assignment assignment = assignmentTeam.Assignment; dynamic data = Builder.BuildTableForTeam(assignmentTeam); data.Grade = new DynamicDictionary(); data.Grade.ActionValues = new { assignmentId = assignment.ID, cuId = assignmentTeam.Team.TeamMembers.FirstOrDefault().CourseUserID, area = "" }; RubricEvaluation rubricEvaluation = null; using (OSBLEContext db = new OSBLEContext()) { rubricEvaluation = db.RubricEvaluations.Where(re => re.RecipientID == assignmentTeam.TeamID && re.Evaluator.AbstractRole.CanGrade && re.AssignmentID == assignment.ID ).FirstOrDefault(); } data.Grade.LinkText = "Not Graded"; if (rubricEvaluation != null) { //A rubric exists, so if it is not published, it's saved as draft. If it is //published, the rubric grade should be displayed. if (rubricEvaluation.IsPublished == false) { data.Grade.LinkText = "Saved as Draft (" + RubricEvaluation.GetGradeAsPercent(rubricEvaluation.ID) + ")"; } else { data.Grade.LinkText = RubricEvaluation.GetGradeAsPercent(rubricEvaluation.ID); } } return(data); }
public abstract DynamicDictionary BuildTableForTeam(IAssignmentTeam assignmentTeam);
/// <summary> /// This gets the late penalty for a regular assignment. Will not currently work for Critical Review assignments /// Returns the late penalty as a percentage. I.e. 80% late penalty will return as 80.0 /// </summary> /// <param name="team"></param> /// <returns></returns> public static double GetLatePenalty(IAssignmentTeam team) { var latePenalty = 0.0; DateTime?submissionTime = null; var dueDate = team.Assignment.DueDate + TimeSpan.FromMinutes(1); //Need initial value to get compiler to be quiet. if (team.Assignment.HasDeliverables) { //Handle late penaly based off deliverable submission time submissionTime = FileSystem.GetSubmissionTime(team); //Adding 1 minute to dueDate. This is to keep submissions turned in at 12:00am for an assignment with a due date of 12:00am as non-late. dueDate = team.Assignment.DueDate + TimeSpan.FromMinutes(1); } else if (team.Assignment.Type == AssignmentTypes.DiscussionAssignment || team.Assignment.Type == AssignmentTypes.CriticalReviewDiscussion) { //Handle late penalty based off of initial post due date. //Note that the team sent in is a non-db saved, forged team. The teamID corrisponds to the correct team, but there is only one teammember //and that is the user we want the late penaly for. var cuID = team.Team.TeamMembers.First().CourseUserID; using (OSBLEContext db = new OSBLEContext()) { submissionTime = (from dp in db.DiscussionPosts where dp.AssignmentID == team.AssignmentID && dp.CourseUserID == cuID orderby dp.Posted select dp.Posted).FirstOrDefault(); } dueDate = team.Assignment.DiscussionSettings.InitialPostDueDate + TimeSpan.FromMinutes(1); } TimeSpan lateness; if (submissionTime != null && submissionTime != DateTime.MinValue) { lateness = (DateTime)submissionTime - dueDate; } else //if the assignment has not been submitted, use the current time to calculate late penalty. { lateness = DateTime.UtcNow - dueDate; } if (lateness.TotalHours >= team.Assignment.HoursLateWindow) { //The document (or post) is too late to be accepted. Therefor 100% late penalty latePenalty = 100; } else if (lateness.TotalHours <= 0) { //The document (or post) wasnt late at all, no late penalty latePenalty = 0; } else { //The document (or post) was late, but less than HoursLateWindow //So, to calculate the late penalty,we want integer division here to keep units whole. //Example of applying late penalty: A submission is 25hours late, HoursPerDeduction is 24 //gets 2 deductions. 1 for the (0,24] hour late range, and then another for the (24,48] hour late range. //Notice begining of ranges are non-inclusive. This was handled by adding 1 minute to dueDate above. var numberOfDeductions = 1; numberOfDeductions += ((int)lateness.TotalHours / (int)team.Assignment.HoursPerDeduction); latePenalty = numberOfDeductions * team.Assignment.DeductionPerUnit; //cannot have higher than 100% late penalty if (latePenalty > 100) { latePenalty = 100; } } return(latePenalty); }
/// <summary> /// Returns the late penalty as a string. I.e. an assignmentTeam with 80% late penalty will yield the string /// "80.00 %" /// </summary> /// <param name="team"></param> /// <returns></returns> public static string GetLatePenaltyAsString(IAssignmentTeam team) { return((GetLatePenalty(team) / 100.0).ToString("P")); }
public static string GetTeamUserSubmissionFolder(bool createPathIfNotExists, Course course, int assignmentID, IAssignmentTeam submitterTeam) { string path = GetAssignmentSubmissionFolder(course, assignmentID); path += "\\" + submitterTeam.TeamID.ToString(); if (!Directory.Exists(path) && createPathIfNotExists) { Directory.CreateDirectory(path); } return(path); }
public DynamicDictionary BuildTableForTeam(IAssignmentTeam team) { DynamicDictionary dict = new DynamicDictionary(); return(dict); }