Пример #1
0
        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);
        }
Пример #4
0
        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);
        }
Пример #7
0
        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);
        }
Пример #9
0
        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);
        }
Пример #10
0
        /// <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);
        }
Пример #11
0
        /// <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);
        }
Пример #12
0
        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);
        }
Пример #13
0
        /// <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);
        }
Пример #14
0
 public abstract DynamicDictionary BuildTableForTeam(IAssignmentTeam assignmentTeam);
Пример #15
0
        /// <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);
        }
Пример #16
0
 /// <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"));
 }
Пример #17
0
        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);
        }
Пример #18
0
        public DynamicDictionary BuildTableForTeam(IAssignmentTeam team)
        {
            DynamicDictionary dict = new DynamicDictionary();

            return(dict);
        }