/// <summary> /// Returns all the ScoreUnits associated with the given WorkItem /// </summary> /// <param name="workItem">WorkItem for which to return ScoreUnits</param> /// <returns>Creates new ScoreUnits for all students who have none</returns> public async Task<IEnumerable<ScoreUnit>> GetScoreUnits(WorkItem workItem) { ClassManager classManager = new ClassManager(_db, _userManager); var students = await classManager.GetAcceptedStudents(workItem.Class); var newScoreUnits = new List<ScoreUnit>(); var scoreUnits = await _db.ScoreUnits .Include(su => su.Student) .Where(su => su.WorkItem.Id == workItem.Id).ToDictionaryAsync(su => su.Student.Id); // Create new ScoreUnits for those who don't have one foreach(var student in students) { if(!scoreUnits.ContainsKey(student.Id)) { var newScoreUnit = new ScoreUnit(); newScoreUnit.WorkItem = workItem; newScoreUnit.Student = student; newScoreUnit.Grade = null; newScoreUnits.Add(newScoreUnit); } } var addedScoreUnits = _db.ScoreUnits.AddRange(newScoreUnits); await _db.SaveChangesAsync(); // Convert dictionary to list and add new ScoreUnits var result = scoreUnits.Select(kvp => kvp.Value).ToList(); result.AddRange(addedScoreUnits); return result; }
/// <summary> /// Creates a new WorkItem from the given model /// </summary> /// <param name="cwvm">Model containing the detail of the WorkItem to create</param> /// <returns>Null if the class or teacher is not found, Otherwise, returns the WorkItem created</returns> public async Task<WorkItem> CreateWorkItem(CreateWorkItemViewModel cwvm) { var @class = await Db.Classes.FindAsync(cwvm.ClassId); if(@class == null) { return null; } WorkItem workItem = new WorkItem { Title = cwvm.Title, Description = cwvm.Description, DueDate = cwvm.DueDate, MaxPoints = cwvm.MaxPoints, Type = cwvm.Type, Class = @class }; Db.WorkItems.Add(workItem); await Db.SaveChangesAsync(); return workItem; }
/// <summary> /// Returns a students ScoreUnit for a WorkItem /// </summary> /// <param name="workItem">WorkItem to return the ScoreUnit for</param> /// <param name="student">Student to return the ScorreUnit for</param> /// <returns></returns> public async Task<ScoreUnit> GetStudentScoreUnit(WorkItem workItem, ApplicationUser student) { return await _db.ScoreUnits.Where(su => su.WorkItem.Id == workItem.Id && su.Student.Id == student.Id).FirstOrDefaultAsync(); }
/// <summary> /// Creates a view-model for the given WorkItem /// </summary> /// <param name="workItem">Model after which the view-model is created</param> public WorkItemViewModel(WorkItem workItem) { if(workItem != null) { Id = workItem.Id; Title = workItem.Title; Description = workItem.Description; DueDate = workItem.DueDate; MaxPoints = workItem.MaxPoints; Type = workItem.Type; Class = new ClassViewModel(workItem.Class); } }