2856 Supervisors must provide information on how the rejection comment from the examiner has been rectified.
PSAM (represented by Panos), Paul, and Jakob decided in a meeting on sep 8 2022 that supervisors must provide feedback as to how the examiners rejection comment has been rectified.
This commit is contained in:
parent
7e986ac17a
commit
20b392b964
core/src
main
java/se/su/dsv/scipro/report
GradingReportService.javaGradingReportServiceImpl.javaSubmissionError.javaSupervisorGradingReport.java
resources/db/migration
test/java/se/su/dsv/scipro/report
daisy-integration/src/main
view/src
main
java/se/su/dsv/scipro/grading
FillOutGradingReportPanel.htmlFillOutGradingReportPanel.javaGradingReportPdf.javaNoPointNoFeedbackGradingReportPdf.javaProjectCriteriaGradingReportPdf.javaReviewerFillOutGradingReportPanel.javaReviewerGradingReportPdf.javaSupervisorGradingReportPdf.java
resources
webapp/css
test/java/se/su/dsv/scipro/grading
@ -20,7 +20,9 @@ public interface GradingReportService extends GenericService<GradingReport, Long
|
||||
|
||||
void copyReport(SupervisorGradingReport to, SupervisorGradingReport from);
|
||||
|
||||
Either<List<GradingCriterion>, GradingReport> submitReport(GradingReport gradingReport);
|
||||
Either<List<GradingCriterion>, ReviewerGradingReport> submitReport(ReviewerGradingReport gradingReport);
|
||||
|
||||
Either<List<SubmissionError>, SupervisorGradingReport> submitReport(SupervisorGradingReport supervisorGradingReport);
|
||||
|
||||
boolean updateOppositionCriteria(SupervisorGradingReport report, FinalSeminarOpposition opposition);
|
||||
|
||||
|
@ -90,7 +90,7 @@ public class GradingReportServiceImpl extends AbstractServiceImpl<GradingReport,
|
||||
}
|
||||
|
||||
@Override
|
||||
public Either<List<GradingCriterion>, GradingReport> submitReport(GradingReport gradingReport) {
|
||||
public Either<List<GradingCriterion>, ReviewerGradingReport> submitReport(ReviewerGradingReport gradingReport) {
|
||||
List<GradingCriterion> notAssessed = new ArrayList<>();
|
||||
for (GradingCriterion gradingCriterion : gradingReport.getGradingCriteria()) {
|
||||
if (!gradingCriterion.isAssessed()) {
|
||||
@ -104,16 +104,41 @@ public class GradingReportServiceImpl extends AbstractServiceImpl<GradingReport,
|
||||
|
||||
gradingReport.submit();
|
||||
|
||||
if (gradingReport instanceof ReviewerGradingReport) {
|
||||
eventBus.post(new ReviewerGradingReportSubmittedEvent(gradingReport));
|
||||
} else if (gradingReport instanceof SupervisorGradingReport) {
|
||||
eventBus.post(new SupervisorGradingReportSubmittedEvent((SupervisorGradingReport) gradingReport));
|
||||
}
|
||||
eventBus.post(new ReviewerGradingReportSubmittedEvent(gradingReport));
|
||||
|
||||
save(gradingReport);
|
||||
return Either.right(gradingReport);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Either<List<SubmissionError>, SupervisorGradingReport> submitReport(SupervisorGradingReport supervisorGradingReport) {
|
||||
final ArrayList<SubmissionError> errors = new ArrayList<>();
|
||||
for (GradingCriterion gradingCriterion : supervisorGradingReport.getGradingCriteria()) {
|
||||
if (!gradingCriterion.isAssessed()) {
|
||||
errors.add(new SubmissionError.UnassessedCriterion(gradingCriterion));
|
||||
}
|
||||
}
|
||||
|
||||
if (isBlank(supervisorGradingReport.getPlagiarismFeedback())) {
|
||||
errors.add(new SubmissionError.NoPlagiarismFeedback());
|
||||
}
|
||||
|
||||
if (!isBlank(supervisorGradingReport.getRejectionComment()) && isBlank(supervisorGradingReport.getRejectionCommentFeedback())) {
|
||||
errors.add(new SubmissionError.NoRejectionCommentFeedback());
|
||||
}
|
||||
|
||||
if (!errors.isEmpty()) {
|
||||
return Either.left(errors);
|
||||
}
|
||||
|
||||
supervisorGradingReport.submit();
|
||||
|
||||
eventBus.post(new SupervisorGradingReportSubmittedEvent(supervisorGradingReport));
|
||||
|
||||
save(supervisorGradingReport);
|
||||
return Either.right(supervisorGradingReport);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Either<List<GradingCriterion>, GradingReport> initialAssessmentDone(final GradingReport gradingReport) {
|
||||
List<GradingCriterion> notAssessed = new ArrayList<>();
|
||||
@ -138,4 +163,8 @@ public class GradingReportServiceImpl extends AbstractServiceImpl<GradingReport,
|
||||
|
||||
return Either.right(gradingReport);
|
||||
}
|
||||
|
||||
private static boolean isBlank(final String str) {
|
||||
return str == null || str.isBlank();
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,44 @@
|
||||
package se.su.dsv.scipro.report;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
sealed public interface SubmissionError {
|
||||
|
||||
<A> A fold(
|
||||
Function<UnassessedCriterion, A> ifUnassessed,
|
||||
Function<NoPlagiarismFeedback, A> ifNoPlagiarismFeedback,
|
||||
Function<NoRejectionCommentFeedback, A> ifNoRejectionCommentFeedback);
|
||||
|
||||
record UnassessedCriterion(GradingCriterion gradingCriterion) implements SubmissionError {
|
||||
@Override
|
||||
public <A> A fold(
|
||||
Function<UnassessedCriterion, A> ifUnassessed,
|
||||
Function<NoPlagiarismFeedback, A> ifNoPlagiarismFeedback,
|
||||
Function<NoRejectionCommentFeedback, A> ifNoRejectionCommentFeedback)
|
||||
{
|
||||
return ifUnassessed.apply(this);
|
||||
}
|
||||
}
|
||||
|
||||
record NoPlagiarismFeedback() implements SubmissionError {
|
||||
@Override
|
||||
public <A> A fold(
|
||||
Function<UnassessedCriterion, A> ifUnassessed,
|
||||
Function<NoPlagiarismFeedback, A> ifNoPlagiarismFeedback,
|
||||
Function<NoRejectionCommentFeedback, A> ifNoRejectionCommentFeedback)
|
||||
{
|
||||
return ifNoPlagiarismFeedback.apply(this);
|
||||
}
|
||||
}
|
||||
|
||||
record NoRejectionCommentFeedback() implements SubmissionError {
|
||||
@Override
|
||||
public <A> A fold(
|
||||
Function<UnassessedCriterion, A> ifUnassessed,
|
||||
Function<NoPlagiarismFeedback, A> ifNoPlagiarismFeedback,
|
||||
Function<NoRejectionCommentFeedback, A> ifNoRejectionCommentFeedback)
|
||||
{
|
||||
return ifNoRejectionCommentFeedback.apply(this);
|
||||
}
|
||||
}
|
||||
}
|
@ -26,6 +26,14 @@ public class SupervisorGradingReport extends GradingReport {
|
||||
@Column(length = 2000)
|
||||
private String plagiarismFeedback;
|
||||
|
||||
@Basic
|
||||
@Column(name = "rejection_comment")
|
||||
private String rejectionComment;
|
||||
|
||||
@Basic
|
||||
@Column(name = "rejection_comment_feedback")
|
||||
private String rejectionCommentFeedback;
|
||||
|
||||
protected SupervisorGradingReport() {
|
||||
// JPA
|
||||
}
|
||||
@ -58,7 +66,11 @@ public class SupervisorGradingReport extends GradingReport {
|
||||
}
|
||||
|
||||
public boolean isFinished() {
|
||||
return allCriteriaAssessed() && hasPlagiarismFeedback();
|
||||
return allCriteriaAssessed() && hasPlagiarismFeedback() && hasProvidedRejectionFeedback();
|
||||
}
|
||||
|
||||
private boolean hasProvidedRejectionFeedback() {
|
||||
return rejectionComment == null || (rejectionCommentFeedback != null && !rejectionCommentFeedback.isBlank());
|
||||
}
|
||||
|
||||
private boolean allCriteriaAssessed() {
|
||||
@ -105,4 +117,20 @@ public class SupervisorGradingReport extends GradingReport {
|
||||
public void setPlagiarismFeedback(String plagiarismFeedback) {
|
||||
this.plagiarismFeedback = plagiarismFeedback;
|
||||
}
|
||||
|
||||
public String getRejectionComment() {
|
||||
return rejectionComment;
|
||||
}
|
||||
|
||||
public void setRejectionComment(String rejectionComment) {
|
||||
this.rejectionComment = rejectionComment;
|
||||
}
|
||||
|
||||
public String getRejectionCommentFeedback() {
|
||||
return rejectionCommentFeedback;
|
||||
}
|
||||
|
||||
public void setRejectionCommentFeedback(String rejectionCommentFeedback) {
|
||||
this.rejectionCommentFeedback = rejectionCommentFeedback;
|
||||
}
|
||||
}
|
||||
|
5
core/src/main/resources/db/migration/V358__require_supervisors_to_provide_rejection_comment_feedback.sql
Normal file
5
core/src/main/resources/db/migration/V358__require_supervisors_to_provide_rejection_comment_feedback.sql
Normal file
@ -0,0 +1,5 @@
|
||||
ALTER TABLE SupervisorGradingReport
|
||||
ADD COLUMN rejection_comment TEXT NULL;
|
||||
|
||||
ALTER TABLE SupervisorGradingReport
|
||||
ADD COLUMN rejection_comment_feedback TEXT NULL;
|
@ -81,13 +81,13 @@ public class GradingReportServiceImplIntegrationTest extends IntegrationTest {
|
||||
@Test
|
||||
public void submit_supervisor_grading_report_flags_report_as_submitted() {
|
||||
assessAllCriteria(gradingReport);
|
||||
Either<List<GradingCriterion>, GradingReport> result = gradingReportService.submitReport(gradingReport);
|
||||
Either<List<SubmissionError>, SupervisorGradingReport> result = gradingReportService.submitReport(gradingReport);
|
||||
assertTrue(result.isRight());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void submitting_supervisor_report_throws_exception_if_report_is_not_finished() {
|
||||
Either<List<GradingCriterion>, GradingReport> result = gradingReportService.submitReport(gradingReport);
|
||||
Either<List<SubmissionError>, SupervisorGradingReport> result = gradingReportService.submitReport(gradingReport);
|
||||
assertFalse(result.isRight());
|
||||
}
|
||||
|
||||
|
1
daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/RejectedThesisWorker.java
1
daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/RejectedThesisWorker.java
@ -52,6 +52,7 @@ public class RejectedThesisWorker extends AbstractWorker {
|
||||
if (supervisorGradingReport.getLastModified().before(rejectedDate)) {
|
||||
supervisorGradingReport.setState(GradingReport.State.INITIAL);
|
||||
supervisorGradingReport.setSubmitted(false);
|
||||
supervisorGradingReport.setRejectionComment(thesisRejection.getMessage());
|
||||
}
|
||||
}
|
||||
final FinalThesis finalThesis = finalThesisService.findByProject(project);
|
||||
|
@ -1,116 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="bachelor" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="30" bottomMargin="30" uuid="4d19f735-5851-489d-ba0e-01359fe877e4">
|
||||
<property name="ireport.zoom" value="1.5"/>
|
||||
<property name="ireport.x" value="0"/>
|
||||
<property name="ireport.y" value="0"/>
|
||||
<subDataset name="dataset1" uuid="11042a5e-8b28-4516-887c-94af6b007800">
|
||||
<field name="points" class="java.lang.Integer"/>
|
||||
<field name="title" class="java.lang.String"/>
|
||||
<field name="description" class="java.lang.String"/>
|
||||
<field name="feedback" class="java.lang.String"/>
|
||||
</subDataset>
|
||||
<field name="projectTitle" class="java.lang.String"/>
|
||||
<field name="authorNames" class="java.lang.String"/>
|
||||
<field name="supervisorName" class="java.lang.String"/>
|
||||
<field name="reviewerName" class="java.lang.String"/>
|
||||
<field name="grade" class="java.lang.String"/>
|
||||
<field name="lastModified" class="java.util.Date"/>
|
||||
<field name="gradingCriteria" class="java.util.List"/>
|
||||
<pageHeader>
|
||||
<band height="64">
|
||||
<staticText>
|
||||
<reportElement x="0" y="0" width="555" height="26" uuid="a302e6c3-5edc-416a-bece-689e619fc29a"/>
|
||||
<textElement textAlignment="Center">
|
||||
<font size="18"/>
|
||||
</textElement>
|
||||
<text><![CDATA[Betygsrapport]]></text>
|
||||
</staticText>
|
||||
</band>
|
||||
</pageHeader>
|
||||
<detail>
|
||||
<band height="249">
|
||||
<staticText>
|
||||
<reportElement x="0" y="0" width="100" height="20" uuid="7e392a1d-335e-413a-b5b4-6afcc58d4db1"/>
|
||||
<text><![CDATA[UPPSATSTITEL:]]></text>
|
||||
</staticText>
|
||||
<textField>
|
||||
<reportElement x="100" y="0" width="455" height="20" uuid="4b53c6db-e660-4809-8d3f-cf23f65c1ac5"/>
|
||||
<textFieldExpression><![CDATA[$F{projectTitle}]]></textFieldExpression>
|
||||
</textField>
|
||||
<staticText>
|
||||
<reportElement x="0" y="20" width="100" height="20" uuid="223d8b19-9b7a-4c49-ae38-c26183203a88"/>
|
||||
<text><![CDATA[FÖRFATTARE:]]></text>
|
||||
</staticText>
|
||||
<textField>
|
||||
<reportElement x="100" y="20" width="455" height="20" uuid="e61661a0-b7c8-4520-bf58-9ab97bff2c2e"/>
|
||||
<textFieldExpression><![CDATA[""+$F{authorNames}]]></textFieldExpression>
|
||||
</textField>
|
||||
<staticText>
|
||||
<reportElement x="0" y="40" width="100" height="20" uuid="76cd5505-9177-443d-a084-5e36c50a43bf"/>
|
||||
<text><![CDATA[HANDLEDARE:]]></text>
|
||||
</staticText>
|
||||
<textField>
|
||||
<reportElement x="100" y="40" width="455" height="20" uuid="59cbcf55-2302-497c-b179-835c6def7291"/>
|
||||
<textFieldExpression><![CDATA[$F{supervisorName}]]></textFieldExpression>
|
||||
</textField>
|
||||
<staticText>
|
||||
<reportElement x="0" y="60" width="100" height="20" uuid="94ea8e76-b403-404a-abe2-13bf0a55ee54"/>
|
||||
<text><![CDATA[GRANSKARE:]]></text>
|
||||
</staticText>
|
||||
<textField>
|
||||
<reportElement x="100" y="60" width="455" height="20" uuid="e47ff4ec-6bd5-45fd-9881-0991939e5698"/>
|
||||
<textFieldExpression><![CDATA[$F{reviewerName}]]></textFieldExpression>
|
||||
</textField>
|
||||
<staticText>
|
||||
<reportElement x="0" y="100" width="100" height="20" uuid="34121b7a-8863-4572-b70c-9b754c7abbf0"/>
|
||||
<text><![CDATA[BETYG:]]></text>
|
||||
</staticText>
|
||||
<textField>
|
||||
<reportElement x="100" y="100" width="455" height="20" uuid="a684e4d8-99f8-4a96-ae2c-d207e1ba39c9"/>
|
||||
<textFieldExpression><![CDATA[$F{grade}]]></textFieldExpression>
|
||||
</textField>
|
||||
<staticText>
|
||||
<reportElement x="0" y="80" width="100" height="20" uuid="dcc24e2c-4215-49f5-8df0-b73c245f1616"/>
|
||||
<text><![CDATA[DATUM:]]></text>
|
||||
</staticText>
|
||||
<textField>
|
||||
<reportElement x="100" y="80" width="455" height="20" uuid="6f798cbd-4fd3-42d7-9b7e-ea3b38432ba5"/>
|
||||
<textFieldExpression><![CDATA[new SimpleDateFormat("yyyy-MM-dd").format($F{lastModified})]]></textFieldExpression>
|
||||
</textField>
|
||||
<componentElement>
|
||||
<reportElement x="0" y="120" width="555" height="113" uuid="0de0c3bb-6e3e-46f5-8e92-16cceceaea4a"/>
|
||||
<jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">
|
||||
<datasetRun subDataset="dataset1" uuid="0df5fe97-3d1e-480a-bf8d-5a465d51b326">
|
||||
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{gradingCriteria})]]></dataSourceExpression>
|
||||
</datasetRun>
|
||||
<jr:listContents height="113" width="555">
|
||||
<staticText>
|
||||
<reportElement x="0" y="70" width="100" height="20" uuid="53ffedf3-ef7a-4887-af40-2790b1864a4d"/>
|
||||
<text><![CDATA[POÄNG:]]></text>
|
||||
</staticText>
|
||||
<textField isBlankWhenNull="true">
|
||||
<reportElement x="100" y="70" width="455" height="20" uuid="e6add15c-f645-491c-8fe7-794ada58846a"/>
|
||||
<textFieldExpression><![CDATA[$F{points}]]></textFieldExpression>
|
||||
</textField>
|
||||
<textField>
|
||||
<reportElement x="0" y="20" width="555" height="20" uuid="46623aa1-a1d3-44d8-b26b-3f5e1fd13a0b"/>
|
||||
<textFieldExpression><![CDATA[$F{title}]]></textFieldExpression>
|
||||
</textField>
|
||||
<textField textAdjust="StretchHeight">
|
||||
<reportElement x="0" y="40" width="555" height="20" uuid="42cffe52-1bf0-4f47-a842-188d980fee30"/>
|
||||
<textFieldExpression><![CDATA[$F{description}]]></textFieldExpression>
|
||||
</textField>
|
||||
<staticText>
|
||||
<reportElement positionType="Float" x="0" y="90" width="100" height="20" uuid="a630e4e3-7fb4-45b0-9c38-f007f67bf9e5"/>
|
||||
<text><![CDATA[OMDÖME:]]></text>
|
||||
</staticText>
|
||||
<textField textAdjust="StretchHeight" isBlankWhenNull="true">
|
||||
<reportElement positionType="Float" x="100" y="90" width="455" height="20" uuid="3e1d6c52-56f0-4021-bd95-33f9281dd1e3"/>
|
||||
<textFieldExpression><![CDATA[$F{feedback}]]></textFieldExpression>
|
||||
</textField>
|
||||
</jr:listContents>
|
||||
</jr:list>
|
||||
</componentElement>
|
||||
</band>
|
||||
</detail>
|
||||
</jasperReport>
|
@ -26,9 +26,21 @@
|
||||
<div wicket:id="templatePanel"></div>
|
||||
<div wicket:id="pointsPanel"></div>
|
||||
<div class="mb-3">
|
||||
<label for="plagiarismFeedback">Comment the text matching report</label> *
|
||||
<label for="plagiarismFeedback" class="form-label required">Comment the text matching report</label>
|
||||
<textarea class="form-control" wicket:id="plagiarismFeedback" id="plagiarismFeedback"></textarea>
|
||||
</div>
|
||||
<wicket:enclosure child="rejectionComment">
|
||||
<div class="mb-3">
|
||||
<h4>
|
||||
An earlier version of the grading report has been rejected
|
||||
</h4>
|
||||
<p class="maintain-formatting" wicket:id="rejectionComment"></p>
|
||||
<label class="form-label required" wicket:for="rejectionCommentFeedback">
|
||||
Please explain how the above comment has been rectified
|
||||
</label>
|
||||
<textarea class="form-control" wicket:id="rejectionCommentFeedback"></textarea>
|
||||
</div>
|
||||
</wicket:enclosure>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="btn-group">
|
||||
|
@ -8,6 +8,7 @@ import org.apache.wicket.feedback.FencedFeedbackPanel;
|
||||
import org.apache.wicket.markup.head.IHeaderResponse;
|
||||
import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
|
||||
import org.apache.wicket.markup.html.WebMarkupContainer;
|
||||
import org.apache.wicket.markup.html.basic.Label;
|
||||
import org.apache.wicket.markup.html.form.Button;
|
||||
import org.apache.wicket.markup.html.form.Form;
|
||||
import org.apache.wicket.markup.html.form.SubmitLink;
|
||||
@ -17,8 +18,16 @@ import org.apache.wicket.markup.html.link.ExternalLink;
|
||||
import org.apache.wicket.markup.html.link.ResourceLink;
|
||||
import org.apache.wicket.markup.html.list.ListItem;
|
||||
import org.apache.wicket.markup.html.list.ListView;
|
||||
import org.apache.wicket.markup.html.panel.*;
|
||||
import org.apache.wicket.model.*;
|
||||
import org.apache.wicket.markup.html.panel.ComponentFeedbackPanel;
|
||||
import org.apache.wicket.markup.html.panel.EmptyPanel;
|
||||
import org.apache.wicket.markup.html.panel.FeedbackPanel;
|
||||
import org.apache.wicket.markup.html.panel.Fragment;
|
||||
import org.apache.wicket.markup.html.panel.GenericPanel;
|
||||
import org.apache.wicket.model.IModel;
|
||||
import org.apache.wicket.model.LambdaModel;
|
||||
import org.apache.wicket.model.LoadableDetachableModel;
|
||||
import org.apache.wicket.model.Model;
|
||||
import org.apache.wicket.model.StringResourceModel;
|
||||
import org.apache.wicket.request.handler.resource.ResourceRequestHandler;
|
||||
import org.apache.wicket.request.mapper.parameter.PageParameters;
|
||||
import se.su.dsv.scipro.components.AutoSavingBehaviour;
|
||||
@ -29,7 +38,12 @@ import se.su.dsv.scipro.forum.dataobjects.ProjectThread;
|
||||
import se.su.dsv.scipro.forum.pages.threaded.SupervisorViewForumThreadPage;
|
||||
import se.su.dsv.scipro.forum.panels.unthreaded.GradingCreateForumThreadPanel;
|
||||
import se.su.dsv.scipro.project.Project;
|
||||
import se.su.dsv.scipro.report.*;
|
||||
import se.su.dsv.scipro.report.GradeCalculator;
|
||||
import se.su.dsv.scipro.report.GradeCalculatorService;
|
||||
import se.su.dsv.scipro.report.GradingCriterion;
|
||||
import se.su.dsv.scipro.report.GradingReportService;
|
||||
import se.su.dsv.scipro.report.SubmissionError;
|
||||
import se.su.dsv.scipro.report.SupervisorGradingReport;
|
||||
import se.su.dsv.scipro.session.SciProSession;
|
||||
import se.su.dsv.scipro.system.User;
|
||||
import se.su.dsv.scipro.util.Either;
|
||||
@ -38,7 +52,6 @@ import se.su.dsv.scipro.util.PageParameterKeys;
|
||||
import javax.inject.Inject;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
|
||||
public class FillOutGradingReportPanel extends GenericPanel<Project> {
|
||||
public static final String FORM = "form";
|
||||
@ -216,6 +229,32 @@ public class FillOutGradingReportPanel extends GenericPanel<Project> {
|
||||
});
|
||||
add(textArea);
|
||||
|
||||
add(new Label("rejectionComment", gradingReportIModel.map(SupervisorGradingReport::getRejectionComment)) {
|
||||
@Override
|
||||
protected void onConfigure() {
|
||||
super.onConfigure();
|
||||
setVisible(!getDefaultModelObjectAsString().isBlank());
|
||||
}
|
||||
});
|
||||
final TextArea<String> rejectionCommentFeedback = new TextArea<>(
|
||||
"rejectionCommentFeedback",
|
||||
LambdaModel.of(gradingReportIModel,
|
||||
SupervisorGradingReport::getRejectionCommentFeedback,
|
||||
SupervisorGradingReport::setRejectionCommentFeedback)) {
|
||||
@Override
|
||||
protected void onConfigure() {
|
||||
super.onConfigure();
|
||||
setEnabled(!gradingReportIModel.getObject().isSubmitted());
|
||||
}
|
||||
};
|
||||
rejectionCommentFeedback.add(new AutoSavingBehaviour() {
|
||||
@Override
|
||||
protected void onUpdate(AjaxRequestTarget target) {
|
||||
gradingReportService.save(gradingReportIModel.getObject());
|
||||
}
|
||||
});
|
||||
add(rejectionCommentFeedback);
|
||||
|
||||
add(new SubmitLink(PDF_DOWNLOAD, gradingReportIModel){
|
||||
@Override
|
||||
public void onAfterSubmit() {
|
||||
@ -261,7 +300,7 @@ public class FillOutGradingReportPanel extends GenericPanel<Project> {
|
||||
@Override
|
||||
public void onAfterSubmit() {
|
||||
try {
|
||||
Either<List<GradingCriterion>, GradingReport> result
|
||||
Either<List<SubmissionError>, SupervisorGradingReport> result
|
||||
= gradingReportService.submitReport(reportModel.getObject());
|
||||
if (result.isRight()) {
|
||||
getForm().success("Finalized grading report for " + reportModel.getObject().getUser().getFullName());
|
||||
@ -269,14 +308,24 @@ public class FillOutGradingReportPanel extends GenericPanel<Project> {
|
||||
}
|
||||
else {
|
||||
getForm().error(getString("not.finished"));
|
||||
List<GradingCriterion> notAssessed = result.fold(Function.identity(), x -> List.of());
|
||||
for (GradingCriterion gradingCriterion : notAssessed) {
|
||||
getForm().error(getString("criteria.not.assessed", Model.of(gradingCriterion),
|
||||
"The criteria \"" + gradingCriterion.getTitle() + "\" has not been assessed."));
|
||||
}
|
||||
showErrors(result.left());
|
||||
}
|
||||
} catch (IllegalStateException ignored) {
|
||||
getForm().error("Must fill in plagiarism feedback");
|
||||
getForm().error("Unknown error");
|
||||
}
|
||||
}
|
||||
|
||||
private void showErrors(final List<SubmissionError> errors) {
|
||||
for (SubmissionError submissionError : errors) {
|
||||
final String errorMessage = submissionError.fold(
|
||||
unassessed -> {
|
||||
final GradingCriterion gradingCriterion = unassessed.gradingCriterion();
|
||||
return getString("criteria.not.assessed", Model.of(gradingCriterion),
|
||||
"The criteria \"" + gradingCriterion.getTitle() + "\" has not been assessed.");
|
||||
},
|
||||
noPlagiarismFeedback -> "Must fill in plagiarism feedback",
|
||||
noRejectionCommentFeedback -> "Must fill in rejection comment feedback");
|
||||
getForm().error(errorMessage);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -18,4 +18,6 @@ public interface GradingReportPdf extends Serializable {
|
||||
Date getLastModified();
|
||||
List<GradingCriterion> getGradingCriteria();
|
||||
String getProjectTypeName();
|
||||
String getRejectionComment();
|
||||
String getRejectionCommentFeedback();
|
||||
}
|
||||
|
@ -81,4 +81,14 @@ public class NoPointNoFeedbackGradingReportPdf implements GradingReportPdf {
|
||||
public String getProjectTypeName() {
|
||||
return supervisorGradingReport.getObject().getProjectType().getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRejectionComment() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRejectionCommentFeedback() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -73,4 +73,14 @@ public class ProjectCriteriaGradingReportPdf implements GradingReportPdf {
|
||||
public String getPlagiarismFeedback() {
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRejectionComment() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRejectionCommentFeedback() {
|
||||
return null;
|
||||
}
|
||||
}
|
@ -162,7 +162,7 @@ public class ReviewerFillOutGradingReportPanel extends GenericPanel<Project> {
|
||||
add(new Button("finalize") {
|
||||
@Override
|
||||
public void onAfterSubmit() {
|
||||
Either<List<GradingCriterion>, GradingReport> result
|
||||
Either<List<GradingCriterion>, ReviewerGradingReport> result
|
||||
= gradingReportService.submitReport(reportModel.getObject());
|
||||
if (result.isRight()) {
|
||||
getForm().success("Finalized grading report");
|
||||
|
@ -85,4 +85,14 @@ public class ReviewerGradingReportPdf implements GradingReportPdf {
|
||||
public String getProjectTypeName() {
|
||||
return reviewerGradingReport.getObject().getProjectType().getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRejectionComment() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRejectionCommentFeedback() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -84,4 +84,14 @@ public class SupervisorGradingReportPdf implements GradingReportPdf {
|
||||
public String getProjectTypeName() {
|
||||
return supervisorGradingReport.getObject().getProjectType().getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRejectionComment() {
|
||||
return supervisorGradingReport.getObject().getRejectionComment();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRejectionCommentFeedback() {
|
||||
return supervisorGradingReport.getObject().getRejectionCommentFeedback();
|
||||
}
|
||||
}
|
||||
|
@ -20,6 +20,8 @@
|
||||
<field name="gradingCriteria" class="java.util.List"/>
|
||||
<field name="authorName" class="java.lang.String"/>
|
||||
<field name="plagiarismFeedback" class="java.lang.String"/>
|
||||
<field name="rejectionCommentFeedback"/>
|
||||
<field name="rejectionComment"/>
|
||||
<variable name="AUTHOR_NAME" class="java.lang.String">
|
||||
<variableExpression><![CDATA[$F{authorName}]]></variableExpression>
|
||||
</variable>
|
||||
@ -136,6 +138,27 @@
|
||||
<reportElement positionType="Float" x="0" y="243" width="555" height="17" uuid="ba4607fb-39ea-4ec4-97c4-84dd7c7fc830"/>
|
||||
<text><![CDATA[KOMMENTAR PÅ ANTIPLAGIATRAPPORT:]]></text>
|
||||
</staticText>
|
||||
|
||||
<staticText>
|
||||
<reportElement positionType="Float" x="0" y="300" width="555" height="17">
|
||||
<printWhenExpression><![CDATA[$F{rejectionComment} != null]]></printWhenExpression>
|
||||
</reportElement>
|
||||
<text>Tidigare avvisningskommentar</text>
|
||||
</staticText>
|
||||
<textField isBlankWhenNull="true" textAdjust="StretchHeight">
|
||||
<reportElement positionType="Float" x="0" y="320" width="454" height="30"/>
|
||||
<textFieldExpression><![CDATA[$F{rejectionComment}]]></textFieldExpression>
|
||||
</textField>
|
||||
<staticText>
|
||||
<reportElement positionType="Float" x="0" y="360" width="555" height="17">
|
||||
<printWhenExpression><![CDATA[$F{rejectionCommentFeedback} != null]]></printWhenExpression>
|
||||
</reportElement>
|
||||
<text><![CDATA[Feedback på avvisningskommentar]]></text>
|
||||
</staticText>
|
||||
<textField isBlankWhenNull="true" textAdjust="StretchHeight">
|
||||
<reportElement positionType="Float" x="0" y="380" width="454" height="30"/>
|
||||
<textFieldExpression><![CDATA[$F{rejectionCommentFeedback}]]></textFieldExpression>
|
||||
</textField>
|
||||
</band>
|
||||
</detail>
|
||||
</jasperReport>
|
||||
|
@ -558,3 +558,6 @@ th.wicket_orderUp, th.sorting_asc {
|
||||
.modal .select2-container {
|
||||
width: 100% !important;
|
||||
}
|
||||
.maintain-formatting {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
@ -0,0 +1,89 @@
|
||||
package se.su.dsv.scipro.grading;
|
||||
|
||||
import net.sf.jasperreports.engine.JRException;
|
||||
import net.sf.jasperreports.engine.JasperCompileManager;
|
||||
import net.sf.jasperreports.engine.JasperFillManager;
|
||||
import net.sf.jasperreports.engine.JasperPrint;
|
||||
import net.sf.jasperreports.engine.JasperReport;
|
||||
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import se.su.dsv.scipro.report.GradingCriterion;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.*;
|
||||
|
||||
public class GradingReportPdfTest {
|
||||
@Test
|
||||
public void generate_pdf() throws JRException {
|
||||
final GradingReportPdf gradingReport = new GradingReportPdf() {
|
||||
@Override
|
||||
public String getProjectTitle() {
|
||||
return "getProjectTitle()";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProjectType() {
|
||||
return "getProjectType()";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAuthorName() {
|
||||
return "getAuthorName()";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAuthorNames() {
|
||||
return "getAuthorNames()";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getSupervisorName() {
|
||||
return "getSupervisorName()";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getReviewerName() {
|
||||
return "getReviewerName()";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPlagiarismFeedback() {
|
||||
return "getPlagiarismFeedback()";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getGrade() {
|
||||
return "getGrade()";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Date getLastModified() {
|
||||
return new Date();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<GradingCriterion> getGradingCriteria() {
|
||||
return List.of();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProjectTypeName() {
|
||||
return "getProjectTypeName()";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRejectionComment() {
|
||||
return "Uppsatsen är\r\n\r\nDÅLIG!";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRejectionCommentFeedback() {
|
||||
return "Nä det är den inte :(";
|
||||
}
|
||||
};
|
||||
final InputStream stream = GradingReportPdf.class.getResourceAsStream("/template.jrxml");
|
||||
final JasperReport jasperReport = JasperCompileManager.compileReport(stream);
|
||||
JasperFillManager.fillReport(jasperReport, new HashMap<>(), new JRBeanCollectionDataSource(List.of(gradingReport)));
|
||||
}
|
||||
}
|
@ -197,7 +197,7 @@ public class ReviewerFillOutGradingReportPanelTest extends SciProTest {
|
||||
|
||||
@Test
|
||||
public void trying_to_submit_unfinished_report_should_show_error() {
|
||||
Either<List<GradingCriterion>, GradingReport> result = Either.left(reviewerGradingReport.getGradingCriteria());
|
||||
Either<List<GradingCriterion>, ReviewerGradingReport> result = Either.left(reviewerGradingReport.getGradingCriteria());
|
||||
when(gradingReportService.submitReport(reviewerGradingReport)).thenReturn(result);
|
||||
reviewerGradingReport.setState(GradingReport.State.REVIEWING);
|
||||
|
||||
@ -222,7 +222,7 @@ public class ReviewerFillOutGradingReportPanelTest extends SciProTest {
|
||||
|
||||
@Test
|
||||
public void finalize_grading_report() {
|
||||
Either<List<GradingCriterion>, GradingReport> result = Either.right(reviewerGradingReport);
|
||||
Either<List<GradingCriterion>, ReviewerGradingReport> result = Either.right(reviewerGradingReport);
|
||||
when(gradingReportService.submitReport(reviewerGradingReport)).thenReturn(result);
|
||||
assessAllCriteria(reviewerGradingReport);
|
||||
reviewerGradingReport.setState(GradingReport.State.REVIEWING);
|
||||
|
Loading…
x
Reference in New Issue
Block a user