/// <summary> /// Download a submission /// </summary> public void DownloadSubmission(string userid, int submissionId) { var user = _db.AspNetUsers.SingleOrDefault(x => x.Id == userid); if (user != null) { var submission = _db.Submissions.SingleOrDefault(x => x.Id == submissionId); if (submission != null) { var collaborators = new List <CollaboratorViewModel>(); bool isTeacher = submission.Assignment.CourseInstance.Teachers.Any(x => x.AspNetUser == user); if (!isTeacher) { collaborators = _studentService.GetCollaborators(submission.AssignmentId, userid); } if (collaborators.Count != 0 || isTeacher) // check if user is related to the submission group { var path = GetSubmissionsPath() + submission.AssignmentId + "\\" + submission.ProblemId + "\\" + submission.Id + "\\" + submission.Id + submission.Problem.Filetype; DownloadFile(path, submission.OriginalFileName); } } } }
/// <summary> /// Used to calculate new total grade for assignment based on one submissionId, called right after grading that submission in the teacher controller. /// Updates the totalGrade for all collaborators in the AssignmentGroups table. /// </summary> public bool UpdateAssignmentGradeBySubmissionId(int submissionId) { // Get the initial submission var initialSubmission = _db.Submissions.SingleOrDefault(x => x.Id == submissionId); if (initialSubmission != null) { //Gets all collaborators in the assignment var studentService = new StudentService(); var collaborators = studentService.GetCollaborators(initialSubmission.AssignmentId, initialSubmission.StudentId); // Gets all problems in the assignment var problemsInAssignemnt = _db.AssignmentProblems.Where(x => x.AssignmentId == initialSubmission.AssignmentId); // Initializes the totalGrade to 0.0 var totalGrade = 0.0; if (collaborators != null && problemsInAssignemnt != null) { foreach (var problem in problemsInAssignemnt) { var problemWeight = problem.Weight / 100; var problemGrade = 0.0; foreach (var student in collaborators) { var submission = _db.Submissions.Where(x => x.StudentId == student.Id && x.AssignmentId == initialSubmission.AssignmentId && x.ProblemId == initialSubmission.ProblemId).OrderByDescending(y => y.SubmissionGrade.Grade).FirstOrDefault(); // Checks if the best submission from the student is the best amongst his collaborators. If it is it is assigned to the problemGrade variable if (submission != null && submission.SubmissionGrade != null && submission.SubmissionGrade.Grade.Value * problemWeight > problemGrade) { problemGrade = submission.SubmissionGrade.Grade.Value * problemWeight; } } // Update totalGrade with the best problemGrade totalGrade += problemGrade; } } // The database update is made here, assigning the totalGrade to all groupMembers in the assignment var group = initialSubmission.Assignment.AssignmentGroups.SingleOrDefault(x => x.AssignmentId == initialSubmission.AssignmentId && x.UserId == initialSubmission.StudentId); if (group != null) { var groupMembers = _db.AssignmentGroups.Where(x => x.AssignmentId == initialSubmission.AssignmentId && x.GroupNumber == group.GroupNumber); foreach (var member in groupMembers) { member.AssignmentGrade = totalGrade; } } } try { _db.SaveChanges(); return(true); } catch (Exception e) { return(false); } }