Property changes on: . ___________________________________________________________________ Modified: svn:mergeinfo Merged /gradebook/trunk:r74777 Index: app/ui/src/java/org/sakaiproject/tool/gradebook/ui/RosterBean.java =================================================================== --- app/ui/src/java/org/sakaiproject/tool/gradebook/ui/RosterBean.java (revision 75121) +++ app/ui/src/java/org/sakaiproject/tool/gradebook/ui/RosterBean.java (working copy) @@ -66,6 +66,7 @@ import org.sakaiproject.tool.gradebook.jsf.AssignmentPointsConverter; import org.sakaiproject.tool.gradebook.jsf.CategoryPointsConverter; import org.sakaiproject.tool.gradebook.jsf.FacesUtil; +import org.sakaiproject.util.ResourceLoader; /** * Backing bean for the visible list of assignments in the gradebook. @@ -686,6 +687,14 @@ return letterGrade; } + public void exportXlsNoCourseGrade(ActionEvent event){ + if(logger.isInfoEnabled()) logger.info("exporting gradebook " + getGradebookUid() + " as Excel"); + getGradebookBean().getEventTrackingService().postEvent("gradebook.downloadRoster","/gradebook/"+getGradebookId()+"/"+getAuthzLevel()); + SpreadsheetUtil.downloadSpreadsheetData(getSpreadsheetData(false), + getDownloadFileName(getLocalizedString("export_gradebook_prefix")), + new SpreadsheetDataFileWriterXls()); + } + public void exportCsvNoCourseGrade(ActionEvent event){ if(logger.isInfoEnabled()) logger.info("exporting gradebook " + getGradebookUid() + " as CSV"); getGradebookBean().getEventTrackingService().postEvent("gradebook.downloadRoster","/gradebook/"+getGradebookId()+"/"+getAuthzLevel()); @@ -843,6 +852,7 @@ boolean includeCourseGrade) { List> spreadsheetData = new ArrayList>(); + NumberFormat nf = NumberFormat.getInstance(new ResourceLoader().getLocale()); // Build column headers and points possible rows. List headerRow = new ArrayList(); List pointsPossibleRow = new ArrayList(); @@ -856,7 +866,7 @@ if (gradableObject instanceof Assignment) { ptsPossible = new Double(((Assignment) gradableObject).getPointsPossible()); - colName = ((Assignment)gradableObject).getName() + " [" + ptsPossible.toString() + "]"; + colName = ((Assignment)gradableObject).getName() + " [" + nf.format(ptsPossible) + "]"; } else if (gradableObject instanceof CourseGrade && includeCourseGrade) { colName = getLocalizedString("roster_course_grade_column_name"); } @@ -897,8 +907,10 @@ } } } - if (score != null && score instanceof Double) + if (score != null && score instanceof Double) { score = new Double(FacesUtil.getRoundDown(((Double)score).doubleValue(), 2)); + score = nf.format(score); + } row.add(score); } Index: app/ui/src/java/org/sakaiproject/tool/gradebook/ui/SpreadsheetUploadBean.java =================================================================== --- app/ui/src/java/org/sakaiproject/tool/gradebook/ui/SpreadsheetUploadBean.java (revision 75121) +++ app/ui/src/java/org/sakaiproject/tool/gradebook/ui/SpreadsheetUploadBean.java (working copy) @@ -22,6 +22,8 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.Serializable; +import java.text.NumberFormat; +import java.text.ParseException; import java.util.ArrayList; import java.util.Collections; import java.util.Date; @@ -40,6 +42,11 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.myfaces.custom.fileupload.UploadedFile; +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFRow; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.sakaiproject.component.cover.ServerConfigurationService; import org.sakaiproject.jsf.spreadsheet.SpreadsheetDataFileWriterCsv; import org.sakaiproject.jsf.spreadsheet.SpreadsheetDataFileWriterXls; import org.sakaiproject.jsf.spreadsheet.SpreadsheetUtil; @@ -57,6 +64,7 @@ import org.sakaiproject.tool.gradebook.Gradebook; import org.sakaiproject.tool.gradebook.jsf.FacesUtil; import org.sakaiproject.tool.gradebook.LetterGradePercentMapping; +import org.sakaiproject.util.ResourceLoader; public class SpreadsheetUploadBean extends GradebookDependentBean implements Serializable { @@ -85,6 +93,8 @@ private String selectedCategory; private Gradebook localGradebook; private StringBuilder externallyMaintainedImportMsg; + private String csvDelimiter; + private NumberFormat numberFormat; // Used for bulk upload of gradebook items // Holds list of unknown user ids @@ -515,9 +525,15 @@ if(logger.isDebugEnabled()){ logger.debug("file size " + upFile.getSize() + "file name " + upFile.getName() + "file Content Type " + upFile.getContentType() + ""); } + + boolean isXlsImport = false; - if(logger.isDebugEnabled()) logger.debug("check that the file is csv file"); - if(!upFile.getName().endsWith("csv")){ + if(logger.isDebugEnabled()) logger.debug("check that the file type is allowed"); + if(upFile.getName().endsWith("csv")){ + isXlsImport = false; + } else if (upFile.getName().endsWith("xls")) { + isXlsImport = true; + } else { FacesUtil.addErrorMessage(getLocalizedString("import_entire_filetype_error",new String[] {upFile.getName()})); return null; } @@ -529,7 +545,12 @@ // process file to set up objects InputStream inputStream = new BufferedInputStream(upFile.getInputStream()); List contents; - contents = csvtoArray(inputStream); + if (isXlsImport) { + contents = excelToArray(inputStream); + } else { + contents = csvtoArray(inputStream); + } + spreadsheet = new Spreadsheet(); spreadsheet.setDate(new Date()); spreadsheet.setTitle(this.getTitle()); @@ -639,16 +660,26 @@ if(logger.isDebugEnabled()){ logger.debug("file size " + upFile.getSize() + "file name " + upFile.getName() + "file Content Type " + upFile.getContentType() + ""); } - - if(logger.isDebugEnabled()) logger.debug("check that the file is csv file"); - if(!upFile.getName().endsWith("csv")){ + + boolean isXlsImport = false; + + if(logger.isDebugEnabled()) logger.debug("check that the file is csv or xls"); + if(upFile.getName().endsWith("csv")){ + isXlsImport = false; + } else if (upFile.getName().endsWith("xls")) { + isXlsImport = true; + } else { FacesUtil.addErrorMessage(getLocalizedString("upload_view_filetype_error",new String[] {upFile.getName()})); return null; } InputStream inputStream = new BufferedInputStream(upFile.getInputStream()); List contents; - contents = csvtoArray(inputStream); + if (isXlsImport) { + contents = excelToArray(inputStream); + } else { + contents = csvtoArray(inputStream); + } spreadsheet = new Spreadsheet(); spreadsheet.setDate(new Date()); spreadsheet.setTitle(this.getTitle()); @@ -887,17 +918,20 @@ String [] parsedAssignmentName = assignmentName.split(" \\["); assignmentName = parsedAssignmentName[0].trim(); + Double pointsPossible = null; if (parsedAssignmentName.length > 1) { - String [] parsedPointsPossible = parsedAssignmentName[1].split("\\]"); - pointsPossibleAsString = parsedPointsPossible[0].trim(); - try{ - Double ppaS = new Double(pointsPossibleAsString); - ppaS = new Double(FacesUtil.getRoundDown(ppaS.doubleValue(), 2)); - if(ppaS <= 0) - pointsPossibleAsString = null; - }catch(Exception e){ - pointsPossibleAsString = null; - } + String [] parsedPointsPossible = parsedAssignmentName[1].split("\\]"); + if (parsedPointsPossible.length > 0) { + pointsPossibleAsString = parsedPointsPossible[0].trim(); + try{ + pointsPossible = convertStringToDouble(pointsPossibleAsString); + pointsPossible = new Double(FacesUtil.getRoundDown(pointsPossible.doubleValue(), 2)); + if(pointsPossible <= 0) + pointsPossibleAsString = null; + }catch(ParseException e){ + pointsPossibleAsString = null; + } + } } // probably last column but not sure, so continue @@ -915,11 +949,7 @@ // if exists, need find those that are changed and only apply those if (assignment == null) { - if (pointsPossibleAsString != null) { - Double pointsPossible = new Double(pointsPossibleAsString); - if (pointsPossible != null) - pointsPossible = new Double(FacesUtil.getRoundDown(pointsPossible.doubleValue(), 2)); - + if (pointsPossible != null) { // params: gradebook id, name of assignment, points possible, due date, NOT counted, is released assignmentId = getGradebookManager().createAssignment(getGradebookId(), assignmentName, pointsPossible, null, Boolean.FALSE, Boolean.TRUE); assignment = getGradebookManager().getAssignment(assignmentId); @@ -960,26 +990,29 @@ if (inputScore != null && inputScore.trim().length() > 0) { Double scoreAsDouble = null; String scoreAsString = inputScore.trim(); - - // truncate input points/% to 2 decimal places - if (getGradeEntryByPoints() || getGradeEntryByPercent()) { - scoreAsDouble = new Double(FacesUtil.getRoundDown((new Double(inputScore)).doubleValue(), 2)); - } else if (getGradeEntryByLetter()){ - scoreAsString = (String)inputScore; - } + + AssignmentGradeRecord asnGradeRecord = new AssignmentGradeRecord(assignment,userid, null); - if(logger.isDebugEnabled())logger.debug("user "+user + " userid " + userid +" score "+inputScore.toString()); - - AssignmentGradeRecord asnGradeRecord = new AssignmentGradeRecord(assignment,userid, null); - - if (getGradeEntryByLetter()) { - asnGradeRecord.setLetterEarned(scoreAsString.trim()); - gradeRecords.add(asnGradeRecord); - } else { - asnGradeRecord.setPercentEarned(scoreAsDouble); - asnGradeRecord.setPointsEarned(scoreAsDouble); - gradeRecords.add(asnGradeRecord); - } + // truncate input points/% to 2 decimal places + if (getGradeEntryByPoints() || getGradeEntryByPercent()) { + try { + scoreAsDouble = convertStringToDouble(scoreAsString); + scoreAsDouble = new Double(FacesUtil.getRoundDown(scoreAsDouble.doubleValue(), 2)); + asnGradeRecord.setPercentEarned(scoreAsDouble); + asnGradeRecord.setPointsEarned(scoreAsDouble); + gradeRecords.add(asnGradeRecord); + if(logger.isDebugEnabled())logger.debug("user "+user + " userid " + userid +" score "+inputScore.toString()); + } catch (ParseException pe) { + // this should have been caught during validation, so there is a problem + logger.error("ParseException encountered parsing " + scoreAsString); + } + } else if (getGradeEntryByLetter()){ + scoreAsString = (String)inputScore; + + asnGradeRecord.setLetterEarned(scoreAsString.trim()); + gradeRecords.add(asnGradeRecord); + if(logger.isDebugEnabled())logger.debug("user "+user + " userid " + userid +" score "+inputScore.toString()); + } } } @@ -989,12 +1022,12 @@ gbUpdated = true; } else { - if (! assignment.getPointsPossible().toString().equals(pointsPossibleAsString)) { + if (! assignment.getPointsPossible().equals(pointsPossible)) { if (assignment.isExternallyMaintained()) { externallyMaintainedImportMsg.append(getLocalizedString("import_assignment_externally_maintained_settings", new String[] {assignment.getName(), assignment.getExternalAppName()}) + "
"); - } else if (pointsPossibleAsString != null) { - assignment.setPointsPossible(new Double(pointsPossibleAsString)); + } else if (pointsPossible != null) { + assignment.setPointsPossible(pointsPossible); getGradebookManager().updateAssignment(assignment); gbUpdated = true; } @@ -1073,8 +1106,7 @@ try { if(logger.isDebugEnabled()) logger.debug("checking if " +scoreAsString +" is a numeric value"); - scoreAsDouble = new Double(scoreAsString.trim()); - + scoreAsDouble = convertStringToDouble(scoreAsString); // check for negative values if (scoreAsDouble.doubleValue() < 0) { if(logger.isDebugEnabled()) logger.debug(scoreAsString + " is not a positive value"); @@ -1082,8 +1114,7 @@ return false; } - - } catch(NumberFormatException e){ + } catch(ParseException e){ if(logger.isDebugEnabled()) logger.debug(scoreAsString + " is not a numeric value"); FacesUtil.addErrorMessage(getLocalizedString(IMPORT_ASSIGNMENT_NOTSUPPORTED)); @@ -1132,7 +1163,7 @@ List line = row.getRowcontent(); String userid = ""; - final String user = (String)line.get(0); + final String user = ((String)line.get(0)).toLowerCase(); try { userid = ((User)rosterMap.get(user)).getUserUid(); @@ -1172,51 +1203,62 @@ if (getGradeEntryByPercent() || getGradeEntryByPoints()) { Double scoreEarned = null; + boolean updateScore = true; if (score != null && !"".equals(score)) { - scoreEarned = new Double(score); + try { + scoreEarned = convertStringToDouble(score); + } catch (ParseException pe) { + // this should have already been validated at this point, so there is + // something wrong if we made it here + logger.error("ParseException encountered while checking for grade updates with score: " + score); + updateScore = false; + } + // truncate to 2 decimal places if (scoreEarned != null) scoreEarned = new Double(FacesUtil.getRoundDown(scoreEarned.doubleValue(), 2)); } - if (gr == null) { - if (scoreEarned != null) { - if (!assignment.isExternallyMaintained()) { - gr = new AssignmentGradeRecord(assignment,userid,scoreEarned); - gr.setPercentEarned(scoreEarned); // manager will handle if % vs point grading - updatedGradeRecords.add(gr); - } else { - updatingExternalGrade = true; - } - } + if (updateScore) { + if (gr == null) { + if (scoreEarned != null) { + if (!assignment.isExternallyMaintained()) { + gr = new AssignmentGradeRecord(assignment,userid,scoreEarned); + gr.setPercentEarned(scoreEarned); // manager will handle if % vs point grading + updatedGradeRecords.add(gr); + } else { + updatingExternalGrade = true; + } + } + } + else { + // we need to truncate points earned to 2 decimal places to more accurately + // see if it was changed - scores that are entered as % can be stored with + // unlimited decimal places in db + Double gbScoreEarned = null; + if (getGradeEntryByPercent()) + gbScoreEarned = gr.getPercentEarned(); + else + gbScoreEarned = gr.getPointsEarned(); + + if (gbScoreEarned != null) + gbScoreEarned = new Double(FacesUtil.getRoundDown(gbScoreEarned.doubleValue(), 2)); + + // 3 ways points earned different: 1 null other not (both ways) or actual + // values different + if ((gbScoreEarned == null && scoreEarned != null) || + (gbScoreEarned != null && scoreEarned == null) || + (gbScoreEarned != null && scoreEarned != null && gbScoreEarned.doubleValue() != scoreEarned.doubleValue())) { + + gr.setPointsEarned(scoreEarned); //manager will use correct field depending on grade entry method + gr.setPercentEarned(scoreEarned); + if (!assignment.isExternallyMaintained()) + updatedGradeRecords.add(gr); + else + updatingExternalGrade = true; + } + } } - else { - // we need to truncate points earned to 2 decimal places to more accurately - // see if it was changed - scores that are entered as % can be stored with - // unlimited decimal places in db - Double gbScoreEarned = null; - if (getGradeEntryByPercent()) - gbScoreEarned = gr.getPercentEarned(); - else - gbScoreEarned = gr.getPointsEarned(); - - if (gbScoreEarned != null) - gbScoreEarned = new Double(FacesUtil.getRoundDown(gbScoreEarned.doubleValue(), 2)); - - // 3 ways points earned different: 1 null other not (both ways) or actual - // values different - if ((gbScoreEarned == null && scoreEarned != null) || - (gbScoreEarned != null && scoreEarned == null) || - (gbScoreEarned != null && scoreEarned != null && gbScoreEarned.doubleValue() != scoreEarned.doubleValue())) { - - gr.setPointsEarned(scoreEarned); //manager will use correct field depending on grade entry method - gr.setPercentEarned(scoreEarned); - if (!assignment.isExternallyMaintained()) - updatedGradeRecords.add(gr); - else - updatingExternalGrade = true; - } - } } else if (getGradeEntryByLetter()) { if (lgpm == null || lgpm.getGradeMap() == null) return null; @@ -1339,14 +1381,14 @@ try{ if(logger.isDebugEnabled()) logger.debug("checking if " +points +" is a numeric value"); - double score = Double.parseDouble(points); + double score = convertStringToDouble(points); if (score < 0) { FacesUtil.addErrorMessage(getLocalizedString("import_assignment_negative")); return "spreadsheetPreview"; } - }catch(NumberFormatException e){ + }catch(ParseException e){ if(logger.isDebugEnabled()) logger.debug(points + " is not a numeric value"); FacesUtil.addErrorMessage(getLocalizedString("import_assignment_notsupported")); @@ -1400,14 +1442,20 @@ String scoreAsString = (String) entry.getValue(); if (scoreAsString != null && scoreAsString.trim().length() > 0) { if (getGradeEntryByPercent() || getGradeEntryByPoints()) { - Double scoreAsDouble; - scoreAsDouble = new Double(scoreAsString); - if (scoreAsDouble != null) - scoreAsDouble = new Double(FacesUtil.getRoundDown(scoreAsDouble.doubleValue(), 2)); - AssignmentGradeRecord asnGradeRecord = new AssignmentGradeRecord(assignment,uid,scoreAsDouble); - asnGradeRecord.setPercentEarned(scoreAsDouble); // in case gb entry by % - sorted out in manager - gradeRecords.add(asnGradeRecord); - if(logger.isDebugEnabled())logger.debug("added grades for " + uid + " - score " + scoreAsString); + try { + Double scoreAsDouble; + scoreAsDouble = convertStringToDouble(scoreAsString); + if (scoreAsDouble != null) + scoreAsDouble = new Double(FacesUtil.getRoundDown(scoreAsDouble.doubleValue(), 2)); + AssignmentGradeRecord asnGradeRecord = new AssignmentGradeRecord(assignment,uid,scoreAsDouble); + asnGradeRecord.setPercentEarned(scoreAsDouble); // in case gb entry by % - sorted out in manager + gradeRecords.add(asnGradeRecord); + if(logger.isDebugEnabled())logger.debug("added grades for " + uid + " - score " + scoreAsString); + } catch (ParseException pe) { + // the score should have already been validated at this point, so + // there is something wrong + logger.error("ParseException encountered while parsing value: " + scoreAsString + " Score was not updated."); + } } else if (getGradeEntryByLetter()) { AssignmentGradeRecord asnGradeRecord = new AssignmentGradeRecord(assignment,uid,null); asnGradeRecord.setLetterEarned(lgpm.standardizeInputGrade(scoreAsString)); @@ -1869,6 +1917,91 @@ } } } + + //************************ EXCEL file parsing ***************************** + /** + * method converts an input stream to an List consisting of strings + * representing a line. The input stream must be for an xls file. + * + * @param inputStream + * @return contents + */ + private List excelToArray(InputStream inputStreams) throws IOException { + HSSFWorkbook wb = new HSSFWorkbook(inputStreams); + + //Convert an Excel file to csv + HSSFSheet sheet = wb.getSheetAt(0); + List array = new ArrayList(); + Iterator it = sheet.rowIterator(); + while (it.hasNext()){ + HSSFRow row = (HSSFRow) it.next(); + String rowAsString = fromHSSFRowtoCSV(row); + if (rowAsString.replaceAll(",", "").replaceAll("\"", "").equals("")) { + continue; + } + array.add(fromHSSFRowtoCSV(row)); + } + return array; + } + + private String fromHSSFRowtoCSV(HSSFRow row){ + String csvRow = ""; + int l = row.getLastCellNum(); + for (int i=0;i [si esto no es correcto, pulse en el bot\u00F3n Cancelar y seleccione otra] import_preview_assignment_selection_failure=Por favor, seleccione una tarea a importar @@ -351,7 +354,7 @@ javax.faces.validator.LengthValidator.MINIMUM=Debe tener por lo menos {0} caracteres. loading_dock_delete_failure=Imposible borrar hoja de c\u00E1lculo loading_dock_delete_success=La hoja de c\u00E1lculo {0} se ha borrado con \u00E9xito -loading_dock_instructions=Abajo se muestra el Muelle de Carga, un lugar en el que puede subir sus hojas de c\u00E1lculo (en formato .csv) desde su disco duro local.
Una vez que han sido cargadas aqu\u00ED, los datos de la hoja de c\u00E1lculo podr\u00E1n importarse parcial o completamente en Calificaciones. +loading_dock_instructions=Abajo se muestra el Muelle de Carga, un lugar en el que puede subir sus hojas de c\u00E1lculo (en formato CSV o XLS) desde su disco duro local.
Una vez que han sido cargadas aqu\u00ED, los datos de la hoja de c\u00E1lculo podr\u00E1n importarse parcial o completamente en Calificaciones. loading_dock_page_title=Subir/Importar loading_dock_table_creator=Creador loading_dock_table_datecreated=Fecha de creaci\u00F3n @@ -361,7 +364,7 @@ loading_dock_table_modifiedby=Modificado por loading_dock_table_title=T\u00EDtulo loading_dock_table_view=Importar -loading_dock_upload_link_text=Subir una hoja de c\u00E1lculo (en formato csv) al Muelle de Carga +loading_dock_upload_link_text=Subir una hoja de c\u00E1lculo (en formato CSV o XLS) al Muelle de Carga. El fichero CSV debe utilizar la coma (",") como separador de campos y las comillas como delimitador de texto. needed_total=Total necesario opt_categories_and_weighting=Categor\u00EDas y pesos opt_categories_only=Solo categor\u00EDas @@ -493,11 +496,11 @@ upload_view_choose_file=Elija de un t\u00EDtulo * upload_view_config_error=configuraci\u00F3n de subida err\u00F3nea upload_view_failure=fichero no subido. Por favor, comprueba su configuraci\u00F3n o contacte su administrador del sistema -upload_view_filecontent_error=Una columna de su fichero .csv debe contener nombres de usuario. La primera fila indica las cabeceras de las columnas. +upload_view_filecontent_error=Una columna de su fichero debe contener nombres de usuario. La primera fila indica las cabeceras de las columnas. upload_view_filetype_error=El fichero "{0}" que acaba de subir no es de un tipo v\u00E1lido upload_view_instructions=Instrucciones\: -upload_view_instructions_text=Su hoja de c\u00E1lculo debe estar guardada en formato .csv.
Una columna de su fichero .csv debe contener nombre de usuario individuales.
La primera fila indica las cabeceras de las columnas. -upload_view_page_title=Subir una hoja de c\u00E1lculo (formato csv) al Muelle de Carga +upload_view_instructions_text=Su hoja de c\u00E1lculo debe estar guardada en formato csv o xls.
Una columna de su fichero debe contener nombre de usuario individuales.
La primera fila indica las cabeceras de las columnas. +upload_view_page_title=Subir una hoja de c\u00E1lculo (formato csv o xls) al Muelle de Carga upload_view_save=Guardar upload_view_title=T\u00EDtulo * validation_messages_present=Ha habido problemas con tu \u00FAltimo env\u00EDo. Por favor, mire los detalles abajo. Index: app/ui/src/bundle/org/sakaiproject/tool/gradebook/bundle/Messages.properties =================================================================== --- app/ui/src/bundle/org/sakaiproject/tool/gradebook/bundle/Messages.properties (revision 75121) +++ app/ui/src/bundle/org/sakaiproject/tool/gradebook/bundle/Messages.properties (working copy) @@ -170,7 +170,8 @@ course_grade_details_no_enrollments=No students to display course_grade_details_export_excel=Export for Excel course_grade_details_export_csv=Export CSV -course_grade_details_export_course_grades=Export Course Grades +course_grade_details_export_course_grades=Export Course Grades as CSV +course_grade_details_export_course_grades_excel=Export Course Grades for Excel course_grade_details_course_grade_column_name=Course Grade course_grade_details_log=Log course_grade_details_log_type=Grade @@ -202,7 +203,7 @@ roster_student_id=Student ID roster_average_category=Average Category Grade roster_course_grade_column_name=Course Grade -roster_export_csv=Export Gradebook +roster_export_csv=Export as CSV roster_export_excel=Export for Excel roster_footnote_symbol1=* roster_footnote_symbol2=** @@ -399,22 +400,22 @@ groupbox_main=Gradebook Groupbox (Main) #messages for upload view -upload_view_page_title = Upload a spreadsheet (csv format) to Loading Dock +upload_view_page_title = Upload a spreadsheet (csv or xls format) to Loading Dock upload_view_instructions = Instructions: -upload_view_instructions_text = Your Spreadsheet file must be saved in csv format.
One column of your csv file must contain individual's usernames.
The first row of your csv must contain headings for the columns. +upload_view_instructions_text = Your Spreadsheet file must be saved in csv or xls format.
One column of your file must contain individual's usernames.
The first row of your file must contain headings for the columns. upload_view_title = Title * upload_view_choose_file = Choose a file * upload_view_save = Save upload_view_cancel = Cancel -upload_view_filetype_error = The file "{0}" that you uploaded is not a valid file type. Only "csv" files are valid for uploading. +upload_view_filetype_error = The file "{0}" that you uploaded is not a valid file type. Only "csv" or "xls" files are valid for uploading. upload_view_failure= file not uploaded, please check your configuration or contact your system administrator upload_view_config_error = upload configuration error -upload_view_filecontent_error = One column of your csv file must contain individual's usernames. The first row of your csv must contain headings for the columns. +upload_view_filecontent_error = One column of your file must contain individual's usernames. The first row of your file must contain headings for the columns. #messages for loading dock view loading_dock_page_title = Import Gradebook Item -loading_dock_instructions = Below is the loading dock, a holding place for spreadsheets (csv format) that have been uploaded from your local computer.
Once loaded here, the data in the spreadsheet can be imported in part or whole into your gradebook. -loading_dock_upload_link_text = Upload spreadsheet (csv format) to Loading Dock +loading_dock_instructions = Below is the loading dock, a holding place for spreadsheets (csv or xls format) that have been uploaded from your local computer.
Once loaded here, the data in the spreadsheet can be imported in part or whole into your gradebook. +loading_dock_upload_link_text = Upload spreadsheet (csv or xls format) to Loading Dock loading_dock_table_header = Loading Dock loading_dock_table_title = Title loading_dock_table_creator = Creator @@ -428,7 +429,7 @@ #messages for upload preview upload_preview_page_title = Verify Upload -upload_preview_instructions = You are uploading a spreadsheet file (csv format) to the loading dock: +upload_preview_instructions = You are uploading a spreadsheet file (xls or csv format) to the loading dock: upload_preview_column_count =
  • Spreadsheet file has {0} gradebook items
  • upload_preview_row_count =
  • Spreadsheet file contains {0} students
  • upload_preview_additional_text = Below is a display of the contents of your spreadsheet.
    [if it is not correct, click the back button, make changes to your file, and upload it again.] @@ -476,10 +477,13 @@ import_entire_main_title=Import Grades import_entire_instructions=If you would like to edit your grades in a spreadsheet application (e.g., Excel) and import the grades into the gradebook, then follow the steps below: import_entire_template=Download Spreadsheet Template +import_entire_template_csv=Download Spreadsheet Template as CSV +import_entire_template_excel=Download Spreadsheet Template for Excel +import_entire_template_or=-or- import_entire_template_prefix=1. import_entire_edit=Edit Spreadsheet import_entire_edit_prefix=2. -import_entire_edit_inst=Edit the spreadsheet in your favorite spreadsheet application, such as Excel, and save it as a csv file. +import_entire_edit_inst=Edit the spreadsheet in your favorite spreadsheet application, such as Excel, and save it as a csv or xls file. import_entire_import=Import Spreadsheet import_entire_import_prefix=3. import_entire_import_inst=Click Browse... and open the file you saved in step 2. Then click Import Spreadsheet. Index: app/ui/src/webapp/courseGradeDetails.jsp =================================================================== --- app/ui/src/webapp/courseGradeDetails.jsp (revision 75121) +++ app/ui/src/webapp/courseGradeDetails.jsp (working copy) @@ -176,7 +176,13 @@ value="#{msgs.course_grade_details_export_course_grades}" actionListener="#{courseGradeDetailsBean.exportCsv}" rendered="#{!courseGradeDetailsBean.emptyEnrollments}" + style="margin-left: 5em;" /> +

    Index: app/ui/src/webapp/roster.jsp =================================================================== --- app/ui/src/webapp/roster.jsp (revision 75121) +++ app/ui/src/webapp/roster.jsp (working copy) @@ -13,6 +13,13 @@

    +


    - - - + + + + + + + + + + <%-- End of download csv file form --%> @@ -55,7 +62,7 @@ - + Property changes on: service ___________________________________________________________________ Modified: svn:mergeinfo Merged /gradebook/trunk/service:r74777