/**********************************************************************************
*
* $Id: CourseGradesToSpreadsheetConverterSample.java 111275 2012-08-13 18:14:06Z savithap@umich.edu $
*
***********************************************************************************
*
* Copyright (c) 2007, 2008 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**********************************************************************************/
package org.sakaiproject.gradebooksample;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.coursemanagement.api.CourseManagementService;
import org.sakaiproject.coursemanagement.api.Enrollment;
import org.sakaiproject.coursemanagement.api.EnrollmentSet;
import org.sakaiproject.coursemanagement.api.Section;
import org.sakaiproject.section.api.coursemanagement.CourseSection;
import org.sakaiproject.section.api.coursemanagement.EnrollmentRecord;
import org.sakaiproject.section.api.coursemanagement.LearningContext;
import org.sakaiproject.section.api.coursemanagement.User;
import org.sakaiproject.tool.gradebook.CourseGrade;
import org.sakaiproject.tool.gradebook.CourseGradeRecord;
import org.sakaiproject.tool.gradebook.CourseGradesToSpreadsheetConverter;
/**
* Sample customization of course grade spreadsheet downloads. This changes
* the default behavior in the following ways:
*
* <ul>
* <li> The student name column is dropped.
* <li> Another column is added to hold "Comments".
* <li> The Course Management service is used to look up each student's
* grading scheme.
* <li> If the grading scheme is "Pass/Fail" or "Satisfactory/Unsatisfactory",
* then the Gradebook's letter grade is converted to "P", "NP", "S", or "U"
* based on a string translation table. The converted value is put into the
* "Grade" column and the original letter grade is put into the "Comments" column.
* </ul>
*
* Once this has been deployed as a Sakai component, it can be plugged into
* the Gradebook application by adding the following line to "sakai.properties":
* <p>
* gradebook.coursegrades.converter=org.sakaiproject.gradebooksample.CourseGradesToSpreadsheetConverterSample
*/
public class CourseGradesToSpreadsheetConverterSample implements CourseGradesToSpreadsheetConverter {
private static final Log log = LogFactory.getLog(CourseGradesToSpreadsheetConverterSample.class);
private CourseManagementService courseManagementService;
private String letterGradingSchemeName;
private String passGradingSchemeName;
private String satisfactoryGradingSchemeName;
private Map<String, String> letterToPassMap;
private Map<String, String> letterToSatisfactoryMap;
/**
* @see org.sakaiproject.tool.gradebook.CourseGradesToSpreadsheetConverter#getSpreadsheetData(java.util.List,
* org.sakaiproject.tool.gradebook.CourseGrade, java.util.Map)
*/
public List<List<Object>> getSpreadsheetData(List<EnrollmentRecord> enrollments, CourseGrade courseGrade, Map<String, CourseGradeRecord> gradesMap, List<String> fields) {
List<List<Object>> spreadsheetData = new ArrayList<List<Object>>();
// Build column headers.
List<Object> headerRow = new ArrayList<Object>();
headerRow.add("STUDENT ID NUMBER");
headerRow.add("GRADE");
headerRow.add("COMMENTS");
spreadsheetData.add(headerRow);
// Build student grade rows.
for (EnrollmentRecord enrollment : enrollments) {
User student = enrollment.getUser();
String studentUid = student.getUserUid();
Map studentMap = (Map)gradesMap.get(studentUid);
List<Object> row = new ArrayList<Object>();
row.add(student.getDisplayId());
String grade = null;
if (studentMap != null) {
CourseGradeRecord gradeRecord = (CourseGradeRecord)studentMap.get(courseGrade.getId());
if (gradeRecord != null) {
grade = gradeRecord.getDisplayGrade();
if (log.isDebugEnabled()) log.debug("student UID=" + studentUid + ", displayID=" + student.getDisplayId() + ", displayGrade=" + grade);
addGradeColumns(row, enrollment, grade);
}
}
spreadsheetData.add(row);
}
return spreadsheetData;
}
private void addGradeColumns(List<Object> row, EnrollmentRecord sectionAwarenessEnrollment, String originalGrade) {
String gradeColumn = originalGrade;
String commentColumn = null;
LearningContext lc = sectionAwarenessEnrollment.getLearningContext();
if (log.isDebugEnabled()) log.debug("lc=" + lc);
if (lc instanceof CourseSection) {
CourseSection courseSection = (CourseSection)lc;
String courseManagementEid = courseSection.getEid();
if (log.isDebugEnabled()) log.debug("courseManagementEid=" + courseManagementEid);
if (courseManagementEid != null) {
// Translate from Section Awareness view to Course Management data.
Section cmSection = courseManagementService.getSection(courseManagementEid);
if (cmSection != null) {
EnrollmentSet enrollmentSet = cmSection.getEnrollmentSet();
if (log.isDebugEnabled()) log.debug("enrollmentSet=" + enrollmentSet);
if (enrollmentSet != null) {
Enrollment cmEnrollment = courseManagementService.findEnrollment(sectionAwarenessEnrollment.getUser().getDisplayId(), enrollmentSet.getEid());
if (cmEnrollment != null) {
String gradingScheme = cmEnrollment.getGradingScheme();
if (log.isDebugEnabled()) log.debug("gradingScheme=" + gradingScheme);
if ((gradingScheme != null) && (!gradingScheme.equals(letterGradingSchemeName))) {
if (gradingScheme.equals(passGradingSchemeName)) {
gradeColumn = letterToPassMap.get(originalGrade);
commentColumn = originalGrade;
} else if (gradingScheme.equals(satisfactoryGradingSchemeName)) {
gradeColumn = letterToSatisfactoryMap.get(originalGrade);
commentColumn = originalGrade;
}
}
}
}
}
}
}
if (log.isDebugEnabled()) log.debug("gradeColumn=" + gradeColumn + ", commentColumn=" + commentColumn);
row.add(gradeColumn);
row.add(commentColumn);
}
public CourseManagementService getCourseManagementService() {
return courseManagementService;
}
public void setCourseManagementService(CourseManagementService courseManagementService) {
this.courseManagementService = courseManagementService;
}
public String getLetterGradingSchemeName() {
return letterGradingSchemeName;
}
public void setLetterGradingSchemeName(String letterGradingSchemeName) {
this.letterGradingSchemeName = letterGradingSchemeName;
}
public Map<String, String> getLetterToPassMap() {
return letterToPassMap;
}
public void setLetterToPassMap(Map<String, String> letterToPassMap) {
this.letterToPassMap = letterToPassMap;
}
public Map<String, String> getLetterToSatisfactoryMap() {
return letterToSatisfactoryMap;
}
public void setLetterToSatisfactoryMap(
Map<String, String> letterToSatisfactoryMap) {
this.letterToSatisfactoryMap = letterToSatisfactoryMap;
}
public String getPassGradingSchemeName() {
return passGradingSchemeName;
}
public void setPassGradingSchemeName(String passGradingSchemeName) {
this.passGradingSchemeName = passGradingSchemeName;
}
public String getSatisfactoryGradingSchemeName() {
return satisfactoryGradingSchemeName;
}
public void setSatisfactoryGradingSchemeName(
String satisfactoryGradingSchemeName) {
this.satisfactoryGradingSchemeName = satisfactoryGradingSchemeName;
}
}