From 1412536e9974ee4ce5b07249cc5e83a1bc3890b9 Mon Sep 17 00:00:00 2001 From: JuanDavid102 Date: Thu, 30 May 2024 09:05:33 +0200 Subject: [PATCH 1/2] SAK-50233 Tests & Quizzes, Gradebook and Assignments: Download zip with all rubrics MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Juan Manuel Rubiales de la Cruz <91719773+jumarub@users.noreply.github.com> Co-Authored-By: Juan David Massanet Puentes <94039846+JuanDavid102@users.noreply.github.com> Co-Authored-By: manu •• --- .../assignment/api/AssignmentConstants.java | 1 + .../api/AssignmentReferenceReckoner.java | 6 +- .../api/src/resources/assignment.properties | 6 + .../src/resources/assignment_ca.properties | 6 + .../src/resources/assignment_es.properties | 9 +- .../impl/AssignmentServiceImpl.java | 57 +++++-- .../assignment/tool/AssignmentAction.java | 9 ++ assignment/tool/src/webapp/js/assignments.js | 6 +- .../chef_assignments_instructor_uploadAll.vm | 4 + .../src/main/bundle/gradebookng.properties | 3 + .../src/main/bundle/gradebookng_ca.properties | 3 + .../src/main/bundle/gradebookng_es.properties | 3 + .../actions/ExportRubricAssignmentAction.java | 40 +++++ .../tool/component/GbGradeTable.html | 4 + .../gradebookng/tool/pages/GradebookPage.html | 1 + .../gradebookng/tool/pages/GradebookPage.java | 25 +++ .../tool/panels/ExportRubricPanel.html | 18 +++ .../tool/panels/ExportRubricPanel.java | 150 ++++++++++++++++++ .../webapp/scripts/gradebook-gbgrade-table.js | 20 ++- .../bundle/EvaluationMessages.properties | 2 + .../bundle/EvaluationMessages_ca.properties | 2 + .../bundle/EvaluationMessages_es.properties | 2 + .../ui/listener/evaluation/ExportRubrics.java | 110 +++++++++++++ .../webapp/jsf/evaluation/questionScore.jsp | 4 + 24 files changed, 475 insertions(+), 16 deletions(-) create mode 100644 gradebookng/tool/src/java/org/sakaiproject/gradebookng/tool/actions/ExportRubricAssignmentAction.java create mode 100644 gradebookng/tool/src/java/org/sakaiproject/gradebookng/tool/panels/ExportRubricPanel.html create mode 100644 gradebookng/tool/src/java/org/sakaiproject/gradebookng/tool/panels/ExportRubricPanel.java create mode 100644 samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/evaluation/ExportRubrics.java diff --git a/assignment/api/src/java/org/sakaiproject/assignment/api/AssignmentConstants.java b/assignment/api/src/java/org/sakaiproject/assignment/api/AssignmentConstants.java index 632f7b256188..dca16263fd84 100644 --- a/assignment/api/src/java/org/sakaiproject/assignment/api/AssignmentConstants.java +++ b/assignment/api/src/java/org/sakaiproject/assignment/api/AssignmentConstants.java @@ -239,6 +239,7 @@ public final class AssignmentConstants { public static final String PROP_INLINE_SUBMISSION = "assignment_submission_attachment_is_inline"; public static final String ZIP_COMMENT_FILE_TYPE = ".txt"; public static final String ZIP_SUBMITTED_TEXT_FILE_TYPE = ".html"; + public static final String ZIP_PDF_FILE_TYPE = ".pdf"; public static final String NEW_ASSIGNMENT_USE_REVIEW_SERVICE = "new_assignment_use_review_service"; public static final String NEW_ASSIGNMENT_ALLOW_STUDENT_VIEW = "new_assignment_allow_student_view"; diff --git a/assignment/api/src/java/org/sakaiproject/assignment/api/AssignmentReferenceReckoner.java b/assignment/api/src/java/org/sakaiproject/assignment/api/AssignmentReferenceReckoner.java index f619ed312cc5..a8ff9d0b41a7 100644 --- a/assignment/api/src/java/org/sakaiproject/assignment/api/AssignmentReferenceReckoner.java +++ b/assignment/api/src/java/org/sakaiproject/assignment/api/AssignmentReferenceReckoner.java @@ -16,6 +16,8 @@ package org.sakaiproject.assignment.api; import static org.sakaiproject.assignment.api.AssignmentServiceConstants.REFERENCE_ROOT; +import static org.sakaiproject.assignment.api.AssignmentServiceConstants.REF_TYPE_ASSIGNMENT; +import static org.sakaiproject.assignment.api.AssignmentServiceConstants.REF_TYPE_CONTENT; import lombok.AccessLevel; import lombok.Builder; @@ -65,9 +67,9 @@ public String toString() { // peer review type reference = reference + Entity.SEPARATOR + "peer_review"; break; - case "a": + case REF_TYPE_ASSIGNMENT: // assignment type - case "c": + case REF_TYPE_CONTENT: // assignment content type // deprecated using assignment type default: diff --git a/assignment/api/src/resources/assignment.properties b/assignment/api/src/resources/assignment.properties index 1a603eb7288f..dd89d4c28fd6 100644 --- a/assignment/api/src/resources/assignment.properties +++ b/assignment/api/src/resources/assignment.properties @@ -1197,6 +1197,12 @@ option.pointsoverride=Adjust individual student scores option.hidepoints=Hide point values (feedback only) option.studentpreview=Hide Rubric from student grading_rubric=Grading Rubric +rubrics.submitter.download=Download rubrics + +zip.timestamp=timestamp +zip.feedback_text=feedbackText +zip.comments=comments +zip.rubrics=rubric # table toolbar common messages view.label=View diff --git a/assignment/api/src/resources/assignment_ca.properties b/assignment/api/src/resources/assignment_ca.properties index bf6e2fe18e59..ba0d8e484263 100644 --- a/assignment/api/src/resources/assignment_ca.properties +++ b/assignment/api/src/resources/assignment_ca.properties @@ -1169,6 +1169,12 @@ option.pointsoverride=Ajusta les puntuacions individuals dels estudiants option.hidepoints=Amaga les puntuacions (nom\u00e9s comentaris) option.studentpreview=Amaga la r\u00fabrica a l\u2019estudiant grading_rubric=R\u00fabrica per a qualificar +rubrics.submitter.download=Descarregar r\u00fabriques + +zip.timestamp=marcaDeTemps +zip.feedback_text=comentarisDeRetroalimentacio +zip.comments=comentaris +zip.rubrics=rubrica # table toolbar common messages view.label=Mostra diff --git a/assignment/api/src/resources/assignment_es.properties b/assignment/api/src/resources/assignment_es.properties index b9c494199f9f..980095673adf 100644 --- a/assignment/api/src/resources/assignment_es.properties +++ b/assignment/api/src/resources/assignment_es.properties @@ -1167,7 +1167,7 @@ settings.access.checkFailure=Comprobaci\u00f3n fallida, no hay respuesta del ser selected.group=Grupo seleccionado selected.groups=Grupo(s) seleccionado(s) -selected.groups.without.gradebook = Has seleccionado grupos sin gradebook existente, por favor revisa la configuración. +selected.groups.without.gradebook = Has seleccionado grupos sin gradebook existente, por favor revisa la configuraci�n. submission.inline=Respuesta enviada grade.type.unknown=Tipo de nota desconocido @@ -1195,8 +1195,13 @@ dont.associate.label=No utilizar r\u00fabricas para evaluar esta tarea associate.label=Utilice una de las siguientes r\u00fabricas para evaluar esta tarea option.pointsoverride=Ajustar notas individuales de estudiantes option.hidepoints=Ocultar valores de puntuaci\u00f3n (solo en feedback) -option.studentpreview=Ocultar r\u00fabrica al alumnado grading_rubric=Evaluaci\u00f3n de r\u00fabricas +rubrics.submitter.download=Descargar r\u00fabricas + +zip.timestamp=marcaDeTiempo +zip.feedback_text=comentariosAdicionales +zip.comments=comentarios +zip.rubrics=rubrica # table toolbar common messages view.label=Vista diff --git a/assignment/impl/src/java/org/sakaiproject/assignment/impl/AssignmentServiceImpl.java b/assignment/impl/src/java/org/sakaiproject/assignment/impl/AssignmentServiceImpl.java index 295368a80cd7..b34597edf7ce 100644 --- a/assignment/impl/src/java/org/sakaiproject/assignment/impl/AssignmentServiceImpl.java +++ b/assignment/impl/src/java/org/sakaiproject/assignment/impl/AssignmentServiceImpl.java @@ -20,6 +20,8 @@ import static org.sakaiproject.assignment.api.model.Assignment.Access.*; import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; + import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -89,6 +91,7 @@ import org.sakaiproject.assignment.api.model.AssignmentSubmissionSubmitter; import org.sakaiproject.assignment.api.model.AssignmentSupplementItemAttachment; import org.sakaiproject.assignment.api.model.AssignmentSupplementItemService; +import org.sakaiproject.assignment.api.model.PeerAssessmentItem; import org.sakaiproject.assignment.api.persistence.AssignmentRepository; import org.sakaiproject.assignment.api.reminder.AssignmentDueReminderService; import org.sakaiproject.assignment.api.taggable.AssignmentActivityProducer; @@ -149,6 +152,7 @@ import org.sakaiproject.messaging.api.MessageMedium; import org.sakaiproject.messaging.api.UserMessagingService; import org.sakaiproject.rubrics.api.RubricsService; +import org.sakaiproject.rubrics.api.beans.AssociationTransferBean; import org.sakaiproject.rubrics.api.model.ToolItemRubricAssociation; import org.sakaiproject.search.api.SearchService; import org.sakaiproject.site.api.Group; @@ -640,6 +644,7 @@ public HttpAccess getHttpAccess() { } else { // determine the type of download to create using the reference that was requested AssignmentReferenceReckoner.AssignmentReference refReckoner = AssignmentReferenceReckoner.reckoner().reference(ref.getReference()).reckon(); + if (REFERENCE_ROOT.equals("/" + refReckoner.getType())) { // don't process any references that are not of type assignment switch (refReckoner.getSubtype()) { @@ -2286,6 +2291,7 @@ public void getSubmissionsZip(OutputStream out, String reference, String query) boolean withFeedbackText = false; boolean withFeedbackComment = false; boolean withFeedbackAttachment = false; + boolean withRubrics = false; boolean withoutFolders = false; boolean includeNotSubmitted = false; String gradeFileFormat = "csv"; @@ -2325,6 +2331,8 @@ public void getSubmissionsZip(OutputStream out, String reference, String query) } else if (token.contains("feedbackAttachments")) { // feedback attachment withFeedbackAttachment = true; + } else if (token.contains("rubrics")) { + withRubrics = true; } else if (token.contains("withoutFolders")) { // feedback attachment withoutFolders = true; @@ -2392,6 +2400,7 @@ public void getSubmissionsZip(OutputStream out, String reference, String query) withFeedbackText, withFeedbackComment, withFeedbackAttachment, + withRubrics, gradeFileFormat, includeNotSubmitted); @@ -2433,6 +2442,7 @@ public void getSubmissionsZip(OutputStream out, String reference, String query) withFeedbackText, withFeedbackComment, withFeedbackAttachment, + withRubrics, withoutFolders, gradeFileFormat, includeNotSubmitted, @@ -3489,7 +3499,7 @@ private void removeAssociatedAnnouncementItem(AnnouncementChannel channel, Assig } // TODO zipSubmissions and zipGroupSubmissions should be combined - private void zipSubmissions(String assignmentReference, String assignmentTitle, Assignment.GradeType gradeType, Assignment.SubmissionType typeOfSubmission, Iterator submissions, OutputStream outputStream, StringBuilder exceptionMessage, boolean withStudentSubmissionText, boolean withStudentSubmissionAttachment, boolean withGradeFile, boolean withFeedbackText, boolean withFeedbackComment, boolean withFeedbackAttachment, boolean withoutFolders, String gradeFileFormat, boolean includeNotSubmitted, String siteId) { + private void zipSubmissions(String assignmentReference, String assignmentTitle, Assignment.GradeType gradeType, Assignment.SubmissionType typeOfSubmission, Iterator submissions, OutputStream outputStream, StringBuilder exceptionMessage, boolean withStudentSubmissionText, boolean withStudentSubmissionAttachment, boolean withGradeFile, boolean withFeedbackText, boolean withFeedbackComment, boolean withFeedbackAttachment, boolean withRubrics, boolean withoutFolders, String gradeFileFormat, boolean includeNotSubmitted, String siteId) { ZipOutputStream out = null; boolean isAdditionalNotesEnabled = false; @@ -3644,7 +3654,7 @@ private void zipSubmissions(String assignmentReference, String assignmentTitle, // record submission timestamp if (!withoutFolders && s.getSubmitted() && s.getDateSubmitted() != null) { - final String zipEntryName = submittersName + "timestamp.txt"; + final String zipEntryName = submittersName + resourceLoader.getString("zip.timestamp") + AssignmentConstants.ZIP_COMMENT_FILE_TYPE; final String textEntryString = s.getDateSubmitted().toString(); createTextZipEntry(out, zipEntryName, textEntryString); } @@ -3667,7 +3677,7 @@ private void zipSubmissions(String assignmentReference, String assignmentTitle, // include student submission feedback text if (withFeedbackText) { // create a feedbackText file into zip - final String zipEntryName = submittersName + "feedbackText.html"; + final String zipEntryName = submittersName + resourceLoader.getString("zip.feedback_text") + AssignmentConstants.ZIP_SUBMITTED_TEXT_FILE_TYPE; final String textEntryString = s.getFeedbackText(); createTextZipEntry(out, zipEntryName, textEntryString); } @@ -3695,7 +3705,7 @@ private void zipSubmissions(String assignmentReference, String assignmentTitle, if (withFeedbackComment) { // the comments.txt file to show instructor's comments - final String zipEntryName = submittersName + "comments" + AssignmentConstants.ZIP_COMMENT_FILE_TYPE; + final String zipEntryName = submittersName + resourceLoader.getString("zip.comments") + AssignmentConstants.ZIP_COMMENT_FILE_TYPE; final String textEntryString = formattedText.encodeUnicode(s.getFeedbackComment()); createTextZipEntry(out, zipEntryName, textEntryString); } @@ -3713,6 +3723,19 @@ private void zipSubmissions(String assignmentReference, String assignmentTitle, // add all feedback attachment folder zipAttachments(out, submittersName, feedbackSubAttachmentFolder, s.getFeedbackAttachments()); + } + + String assignmentId = s.getAssignment().getId(); + + Optional optAssociation = rubricsService.getAssociationForToolAndItem(AssignmentConstants.TOOL_ID, assignmentId, siteId); + + if (withRubrics && optAssociation.isPresent()) { + byte[] pdf = rubricsService.createPdf(siteId, optAssociation.get().getRubricId(), AssignmentServiceConstants.ASSIGNMENT_TOOL_ID, assignmentId, s.getId()); + + final ZipEntry zipEntryPdf = new ZipEntry(submittersName + resourceLoader.getString("zip.rubrics") + AssignmentConstants.ZIP_PDF_FILE_TYPE); + + out.putNextEntry(zipEntryPdf); + out.write(pdf); out.closeEntry(); } } // if @@ -3805,7 +3828,7 @@ private void zipSubmissions(String assignmentReference, String assignmentTitle, } // TODO zipSubmissions and zipGroupSubmissions should be combined - protected void zipGroupSubmissions(String assignmentReference, String assignmentTitle, String gradeTypeString, Assignment.SubmissionType typeOfSubmission, Iterator submissions, OutputStream outputStream, StringBuilder exceptionMessage, boolean withStudentSubmissionText, boolean withStudentSubmissionAttachment, boolean withGradeFile, boolean withFeedbackText, boolean withFeedbackComment, boolean withFeedbackAttachment, String gradeFileFormat, boolean includeNotSubmitted) { + protected void zipGroupSubmissions(String assignmentReference, String assignmentTitle, String gradeTypeString, Assignment.SubmissionType typeOfSubmission, Iterator submissions, OutputStream outputStream, StringBuilder exceptionMessage, boolean withStudentSubmissionText, boolean withStudentSubmissionAttachment, boolean withGradeFile, boolean withFeedbackText, boolean withFeedbackComment, boolean withFeedbackAttachment, boolean withRubrics, String gradeFileFormat, boolean includeNotSubmitted) { ZipOutputStream out = null; try { out = new ZipOutputStream(outputStream); @@ -3886,7 +3909,7 @@ protected void zipGroupSubmissions(String assignmentReference, String assignment // record submission timestamp if (s.getSubmitted() && s.getDateSubmitted() != null) { - createTextZipEntry(out, submittersName + "timestamp.txt", s.getDateSubmitted().toString()); + createTextZipEntry(out, submittersName + resourceLoader.getString("zip.timestamp") + AssignmentConstants.ZIP_COMMENT_FILE_TYPE, s.getDateSubmitted().toString()); } // create the folder structure - named after the submitter's name @@ -3901,7 +3924,7 @@ protected void zipGroupSubmissions(String assignmentReference, String assignment // include student submission feedback text if (withFeedbackText) { // create a feedbackText file into zip - createTextZipEntry(out, submittersName + "feedbackText.html", s.getFeedbackText()); + createTextZipEntry(out, submittersName + resourceLoader.getString("zip.feedback_text") + AssignmentConstants.ZIP_SUBMITTED_TEXT_FILE_TYPE, s.getFeedbackText()); } } @@ -3918,7 +3941,7 @@ protected void zipGroupSubmissions(String assignmentReference, String assignment if (withFeedbackComment) { // the comments.txt file to show instructor's comments - final String zipEntryName = submittersName + "comments" + AssignmentConstants.ZIP_COMMENT_FILE_TYPE; + final String zipEntryName = submittersName + resourceLoader.getString("zip.comments") + AssignmentConstants.ZIP_COMMENT_FILE_TYPE; final String textEntryString = formattedText.encodeUnicode(s.getFeedbackComment()); createTextZipEntry(out, zipEntryName, textEntryString); } @@ -3933,9 +3956,25 @@ protected void zipGroupSubmissions(String assignmentReference, String assignment out.closeEntry(); } + Assignment assignment = s.getAssignment(); + String assignmentId = assignment.getId(); + String siteId = assignment.getContext(); + + Optional optAssociation = rubricsService.getAssociationForToolAndItem(AssignmentConstants.TOOL_ID, assignmentId, siteId); + + if (withRubrics && optAssociation.isPresent()) { + byte[] pdf = rubricsService.createPdf(siteId, optAssociation.get().getRubricId(), AssignmentServiceConstants.ASSIGNMENT_TOOL_ID, assignmentId, s.getId()); + + final ZipEntry zipEntryPdf = new ZipEntry(submittersName + resourceLoader.getString("zip.rubrics") + AssignmentConstants.ZIP_PDF_FILE_TYPE); + + out.putNextEntry(zipEntryPdf); + out.write(pdf); + out.closeEntry(); + } + if (!submittersString.toString().trim().isEmpty()) { // the comments.txt file to show instructor's comments - final String zipEntryName = submittersName + "members" + AssignmentConstants.ZIP_COMMENT_FILE_TYPE; + final String zipEntryName = submittersName + resourceLoader.getString("zip.comments") + AssignmentConstants.ZIP_COMMENT_FILE_TYPE; final String textEntryString = formattedText.encodeUnicode(submittersString.toString()); createTextZipEntry(out, zipEntryName, textEntryString); } diff --git a/assignment/tool/src/java/org/sakaiproject/assignment/tool/AssignmentAction.java b/assignment/tool/src/java/org/sakaiproject/assignment/tool/AssignmentAction.java index 00412f50b078..143fc24d509b 100644 --- a/assignment/tool/src/java/org/sakaiproject/assignment/tool/AssignmentAction.java +++ b/assignment/tool/src/java/org/sakaiproject/assignment/tool/AssignmentAction.java @@ -124,16 +124,20 @@ import org.sakaiproject.assignment.api.model.PeerAssessmentAttachment; import org.sakaiproject.assignment.api.model.PeerAssessmentItem; import org.sakaiproject.assignment.api.reminder.AssignmentDueReminderService; +import org.sakaiproject.assignment.api.sort.AssignmentComparator; import org.sakaiproject.assignment.api.taggable.AssignmentActivityProducer; import org.sakaiproject.assignment.taggable.tool.DecoratedTaggingProvider; import org.sakaiproject.assignment.taggable.tool.DecoratedTaggingProvider.Pager; import org.sakaiproject.assignment.taggable.tool.DecoratedTaggingProvider.Sort; +import org.sakaiproject.assignment.tool.AssignmentAction.SubmitterSubmission; +import org.sakaiproject.assignment.tool.AssignmentAction.UploadGradeWrapper; import org.sakaiproject.authz.api.AuthzGroup; import org.sakaiproject.authz.api.AuthzGroupService; import org.sakaiproject.authz.api.GroupNotDefinedException; import org.sakaiproject.authz.api.Member; import org.sakaiproject.authz.api.Role; import org.sakaiproject.authz.api.SecurityAdvisor; +import org.sakaiproject.authz.api.SecurityAdvisor.SecurityAdvice; import org.sakaiproject.authz.api.SecurityService; import org.tsugi.lti.LTIUtil; import org.tsugi.lti13.LTICustomVars; @@ -5062,6 +5066,7 @@ private String build_instructor_grade_assignment_context(VelocityPortlet portlet // append the group info to the end accessPointUrl = accessPointUrl.concat(view); } + context.put("accessPointUrl", accessPointUrl); state.setAttribute(NEW_ASSIGNMENT_CHECK_ANONYMOUS_GRADING, assignmentService.assignmentUsesAnonymousGrading(assignment)); @@ -6041,7 +6046,11 @@ private String build_instructor_download_upload_all(VelocityPortlet portlet, Con String assignmentRef = (String) state.getAttribute(EXPORT_ASSIGNMENT_REF); Assignment a = getAssignment(assignmentRef, "build_instructor_download_upload_all", state); + if (a != null) { + Optional optAssociation = rubricsService.getAssociationForToolAndItem(AssignmentConstants.TOOL_ID, a.getId(), a.getContext()); + context.put("hasRubric", optAssociation.isPresent() && optAssociation.get().getRubricId() != null); + context.put("accessPointUrl", serverConfigurationService.getAccessUrl().concat(assignmentRef)); Assignment.SubmissionType submissionType = a.getTypeOfSubmission(); diff --git a/assignment/tool/src/webapp/js/assignments.js b/assignment/tool/src/webapp/js/assignments.js index 460a8c98ce4d..74ddd49742ab 100755 --- a/assignment/tool/src/webapp/js/assignments.js +++ b/assignment/tool/src/webapp/js/assignments.js @@ -622,7 +622,7 @@ ASN.handleEnterKeyPress = function(ev) ASN.invokeDownloadUrl = function(accessPointUrl, actionString, alertMessage, param0, param1, param2, param3, clickedElement) { - var extraInfoArray = []; + var extraInfoArray = []; if (document.getElementById('studentSubmissionText') && document.getElementById('studentSubmissionText').checked) { extraInfoArray[extraInfoArray.length]="studentSubmissionText=true"; @@ -653,6 +653,10 @@ ASN.invokeDownloadUrl = function(accessPointUrl, actionString, alertMessage, par { extraInfoArray[extraInfoArray.length]="feedbackAttachments=true"; } + if (document.getElementById('rubrics') && document.getElementById('rubrics').checked) + { + extraInfoArray[extraInfoArray.length]="rubrics=true"; + } if (document.getElementById('includeNotSubmitted') && document.getElementById('includeNotSubmitted').checked) { extraInfoArray[extraInfoArray.length]="includeNotSubmitted=true"; diff --git a/assignment/tool/src/webapp/vm/assignment/chef_assignments_instructor_uploadAll.vm b/assignment/tool/src/webapp/vm/assignment/chef_assignments_instructor_uploadAll.vm index 71fe06bcacd1..51291ff4b6af 100644 --- a/assignment/tool/src/webapp/vm/assignment/chef_assignments_instructor_uploadAll.vm +++ b/assignment/tool/src/webapp/vm/assignment/chef_assignments_instructor_uploadAll.vm @@ -80,6 +80,10 @@
## feedback attachments
+ ## rubrics + #if ($hasRubric) +
+ #end
## SAK-19147 output without folders #if ($!download && $enableFlatDownload) diff --git a/gradebookng/bundle/src/main/bundle/gradebookng.properties b/gradebookng/bundle/src/main/bundle/gradebookng.properties index 13f2c7579346..4e41c87f72dc 100644 --- a/gradebookng/bundle/src/main/bundle/gradebookng.properties +++ b/gradebookng/bundle/src/main/bundle/gradebookng.properties @@ -744,5 +744,8 @@ bulkedit.confirmation.cancel=Cancel sections.label.none = None label.submission-messager.title=Message Students +export.zip.template.button=Export all rubrics +export.zip.template.name=gradebook_rubric_{0} + # S2U-26 group.gradebook = Group diff --git a/gradebookng/bundle/src/main/bundle/gradebookng_ca.properties b/gradebookng/bundle/src/main/bundle/gradebookng_ca.properties index b9a946280518..e7565a4ecde8 100644 --- a/gradebookng/bundle/src/main/bundle/gradebookng_ca.properties +++ b/gradebookng/bundle/src/main/bundle/gradebookng_ca.properties @@ -729,5 +729,8 @@ bulkedit.confirmation.cancel=Cancel\u00b7la sections.label.none=Cap label.submission-messager.title=Missatge per als estudiants +export.zip.template.button=Exportar totes les r\u00fabriques +export.zip.template.name=qualificacions_r\u00fabrica_{0} + # S2U-26 group.gradebook = Grup diff --git a/gradebookng/bundle/src/main/bundle/gradebookng_es.properties b/gradebookng/bundle/src/main/bundle/gradebookng_es.properties index 1b14aa391c6c..45c97a3f305e 100644 --- a/gradebookng/bundle/src/main/bundle/gradebookng_es.properties +++ b/gradebookng/bundle/src/main/bundle/gradebookng_es.properties @@ -742,5 +742,8 @@ bulkedit.confirmation.cancel=Cancelar sections.label.none=Ninguno label.submission-messager.title=Mensajes +export.zip.template.button=Exportar todas las r\u00fabricas +export.zip.template.name=calificaciones_r\u00fabrica_{0} + # S2U-26 group.gradebook = Grupo diff --git a/gradebookng/tool/src/java/org/sakaiproject/gradebookng/tool/actions/ExportRubricAssignmentAction.java b/gradebookng/tool/src/java/org/sakaiproject/gradebookng/tool/actions/ExportRubricAssignmentAction.java new file mode 100644 index 000000000000..eccaa74f0649 --- /dev/null +++ b/gradebookng/tool/src/java/org/sakaiproject/gradebookng/tool/actions/ExportRubricAssignmentAction.java @@ -0,0 +1,40 @@ +package org.sakaiproject.gradebookng.tool.actions; + +import java.io.Serializable; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.model.Model; +import org.sakaiproject.gradebookng.tool.model.GbModalWindow; +import org.sakaiproject.gradebookng.tool.pages.GradebookPage; +import org.sakaiproject.gradebookng.tool.panels.CourseGradeBreakdownPanel; +import org.sakaiproject.gradebookng.tool.panels.ExportRubricPanel; + +import com.fasterxml.jackson.databind.JsonNode; + +public class ExportRubricAssignmentAction extends InjectableAction implements Serializable { + + private static final long serialVersionUID = 1L; + + public ExportRubricAssignmentAction() { + } + + @Override + public ActionResponse handleEvent(final JsonNode params, final AjaxRequestTarget target) { + String assignmentId = params.get("assignmentId").asText(); + + final GradebookPage gradebookPage = (GradebookPage) target.getPage(); + final GbModalWindow window = gradebookPage.getExportRubricWindow(); + + ExportRubricPanel cgbp = new ExportRubricPanel( + window.getContentId(), + Model.of(Long.valueOf(assignmentId)), + window, + params + ); + + cgbp.setCurrentGradebookAndSite(currentGradebookUid, currentSiteId); + window.setContent(cgbp); + window.show(target); + + return new EmptyOkResponse(); + } +} diff --git a/gradebookng/tool/src/java/org/sakaiproject/gradebookng/tool/component/GbGradeTable.html b/gradebookng/tool/src/java/org/sakaiproject/gradebookng/tool/component/GbGradeTable.html index 836786429897..c6b8225bdbb2 100644 --- a/gradebookng/tool/src/java/org/sakaiproject/gradebookng/tool/component/GbGradeTable.html +++ b/gradebookng/tool/src/java/org/sakaiproject/gradebookng/tool/component/GbGradeTable.html @@ -148,6 +148,9 @@
  • {/if}
  • + {if hasAssociatedRubric && !externallyMaintained} +
  • + {/if} {if settings.isUserAbleToEditAssessments}
  • @@ -369,6 +372,7 @@
    + {if settings.isStudentOrderedByLastName}
    ${lastName}, diff --git a/gradebookng/tool/src/java/org/sakaiproject/gradebookng/tool/pages/GradebookPage.html b/gradebookng/tool/src/java/org/sakaiproject/gradebookng/tool/pages/GradebookPage.html index 1ca6d793a26f..8d3914a50298 100644 --- a/gradebookng/tool/src/java/org/sakaiproject/gradebookng/tool/pages/GradebookPage.html +++ b/gradebookng/tool/src/java/org/sakaiproject/gradebookng/tool/pages/GradebookPage.html @@ -25,6 +25,7 @@
    +