Merge remote-tracking branch 'origin/develop' into develop

This commit is contained in:
Wayne Westmoreland 2024-01-16 17:21:35 +01:00
commit f447c7db11
15 changed files with 90 additions and 152 deletions

@ -348,8 +348,9 @@ public class ZipReporter implements Reporter {
.filter(this::hasAssessment)
.map(gc -> li(List.of(
strong(text(String.format("%s (%s/%d points)",
gradingReport.getProject().isReportLanguageSwedish() ? gc.getTitle() : gc.getTitleEn(),
Objects.requireNonNullElse(gc.getPoints(), "-"), gc.getMaxPoints()))), p(text(gc.getFeedback()))
gc.getTitle(gradingReport.getReportLanguage()),
Objects.requireNonNullElse(gc.getPoints(), "-"), gc.getMaxPoints()))),
p(text(gc.getFeedback()))
)))
.toList();
list.add(ul(criteria));

@ -300,8 +300,8 @@ public class Project extends DomainObject {
return false;
}
public boolean isReportLanguageSwedish() {
return language != null ? language == Language.SWEDISH : getProjectType().getDegreeType() == DegreeType.BACHELOR;
public Language getReportLanguage() {
return Objects.requireNonNullElse(language, getProjectType().getDefaultLanguage());
}
@Override

@ -7,6 +7,8 @@ import jakarta.persistence.Basic;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.MappedSuperclass;
import se.su.dsv.scipro.system.Language;
import java.io.Serializable;
import java.util.Comparator;
import java.util.Objects;
@ -48,6 +50,10 @@ public abstract class AbstractCriterion extends DomainObject {
return titleEn;
}
public String getTitle(Language language) {
return language == Language.ENGLISH ? getTitleEn() : getTitle();
}
public Integer getSortOrder() {
return this.sortOrder;
}

@ -3,6 +3,8 @@ package se.su.dsv.scipro.report;
import se.su.dsv.scipro.system.DomainObject;
import jakarta.persistence.*;
import se.su.dsv.scipro.system.Language;
import java.util.Objects;
@MappedSuperclass
@ -43,6 +45,10 @@ public abstract class AbstractGradingCriterionPoint extends DomainObject impleme
return descriptionEn;
}
public String getDescription(Language language) {
return language == Language.ENGLISH ? getDescriptionEn() : getDescription();
}
public void setId(Long id) {
this.id = id;
}

@ -1,6 +1,8 @@
package se.su.dsv.scipro.report;
import jakarta.persistence.*;
import se.su.dsv.scipro.system.Language;
import java.util.Objects;
@Entity
@ -63,6 +65,10 @@ public class Criterion extends AbstractCriterion {
return this.descriptionEn;
}
public String getDescription(Language language) {
return language == Language.ENGLISH ? getDescriptionEn() : getDescription();
}
@Override
public boolean equals(final Object o) {
if (o == this) return true;

@ -1,6 +1,7 @@
package se.su.dsv.scipro.report;
import se.su.dsv.scipro.project.Project;
import se.su.dsv.scipro.system.Language;
import se.su.dsv.scipro.system.ProjectType;
import se.su.dsv.scipro.system.User;
@ -78,8 +79,8 @@ public abstract class GradingReport extends Report {
return project.getProjectType();
}
public boolean isSwedish() {
return project.isReportLanguageSwedish();
public Language getReportLanguage() {
return project.getReportLanguage();
}
public Grade getGrade(GradeCalculator gradeCalculator) {

@ -8,6 +8,7 @@ import se.su.dsv.scipro.grading.GradingBasis;
import se.su.dsv.scipro.grading.ThesisSubmissionHistoryService;
import se.su.dsv.scipro.project.Project;
import se.su.dsv.scipro.system.AbstractServiceImpl;
import se.su.dsv.scipro.system.Language;
import se.su.dsv.scipro.system.User;
import se.su.dsv.scipro.util.Either;
@ -61,7 +62,7 @@ public class GradingReportServiceImpl extends AbstractServiceImpl<GradingReport,
List<GradingBasis.Assessment> assessment = supervisorGradingReport.getProjectCriteria()
.stream()
.sorted(Comparator.comparing(GradingCriterion::getSortOrder))
.map(gc -> toAssessment(supervisorGradingReport.isSwedish(), gc))
.map(gc -> toAssessment(supervisorGradingReport.getReportLanguage(), gc))
.toList();
return new GradingBasis(
assessment,
@ -78,7 +79,7 @@ public class GradingReportServiceImpl extends AbstractServiceImpl<GradingReport,
for (SupervisorGradingReport supervisorGradingReport : supervisorGradingReports) {
for (GradingCriterion projectCriterion : supervisorGradingReport.getProjectCriteria()) {
for (GradingBasis.Assessment assessment : gradingBasis.criteria()) {
String title = getTitle(supervisorGradingReport.isSwedish(), projectCriterion);
String title = projectCriterion.getTitle(supervisorGradingReport.getReportLanguage());
if (Objects.equals(assessment.criterion().title(), title)) {
projectCriterion.setPoints(assessment.getPoints());
}
@ -92,27 +93,23 @@ public class GradingReportServiceImpl extends AbstractServiceImpl<GradingReport,
}
private GradingBasis.Assessment toAssessment(
boolean isSwedish,
Language language,
GradingCriterion gc) {
List<GradingBasis.Criterion.Requirement> requirements = gc.getGradingCriterionPoints()
.stream()
.sorted(Comparator.comparing(GradingCriterionPoint::getPoint))
.map(gcp -> toRequirement(isSwedish, gcp))
.map(gcp -> toRequirement(language, gcp))
.toList();
String title = getTitle(isSwedish, gc);
String title = gc.getTitle(language);
GradingBasis.Criterion criterion = new GradingBasis.Criterion(title, requirements, gc.getPointsRequiredToPass());
return new GradingBasis.Assessment(criterion, gc.getPoints());
}
private static String getTitle(boolean isSwedish, GradingCriterion gc) {
return isSwedish ? gc.getTitle() : gc.getTitleEn();
}
private GradingBasis.Criterion.Requirement toRequirement(
boolean isSwedish,
Language language,
GradingCriterionPoint gcp)
{
String description = isSwedish ? gcp.getDescription() : gcp.getDescriptionEn();
String description = gcp.getDescription(language);
return new GradingBasis.Criterion.Requirement(
gcp.getPoint(),
description);

@ -1,6 +1,7 @@
package se.su.dsv.scipro.report;
import se.su.dsv.scipro.finalseminar.FinalSeminarOpposition;
import se.su.dsv.scipro.system.Language;
import se.su.dsv.scipro.system.User;
import jakarta.persistence.*;
@ -72,8 +73,8 @@ public class OppositionReport extends AttachmentReport {
return finalSeminarOpposition.getFinalSeminar().getProjectTitle();
}
public boolean isReportLanguageSwedish() {
return finalSeminarOpposition.getFinalSeminar().getProject().isReportLanguageSwedish();
public Language getLanguage() {
return finalSeminarOpposition.getFinalSeminar().getProject().getReportLanguage();
}
public String getAuthorNames() {

@ -131,6 +131,13 @@ public class ProjectType extends LazyDeletableDomainObject {
this.reviewed = reviewed;
}
public Language getDefaultLanguage() {
return switch (degreeType) {
case BACHELOR -> Language.SWEDISH;
default -> Language.ENGLISH;
};
}
@Override
public boolean equals(final Object o) {
if (o == this) return true;

@ -35,6 +35,7 @@ import se.su.dsv.scipro.report.AbstractGradingCriterion;
import se.su.dsv.scipro.report.GradingCriterion;
import se.su.dsv.scipro.report.GradingCriterionPoint;
import se.su.dsv.scipro.report.SupervisorGradingReport;
import se.su.dsv.scipro.system.Language;
import se.su.dsv.scipro.system.User;
import se.su.dsv.scipro.util.AjaxConfirmationLink;
@ -52,8 +53,9 @@ public class CriteriaPanel extends GenericPanel<SupervisorGradingReport> {
public CriteriaPanel(String id, IModel<SupervisorGradingReport> model) {
super(id, model);
Project project = model.getObject().getProject();
boolean isSwedish = project != null && project.isReportLanguageSwedish();
IModel<Language> language = model
.map(SupervisorGradingReport::getProject)
.map(Project::getReportLanguage);
IModel<User> author = model.map(SupervisorGradingReport::getUser);
add(new ListView<>(CRITERIA, model.map(SupervisorGradingReport::getIndividualCriteria)) {
{
@ -65,7 +67,7 @@ public class CriteriaPanel extends GenericPanel<SupervisorGradingReport> {
final WebMarkupContainer grading = new WebMarkupContainer("grading");
grading.setOutputMarkupId(true);
item.add(grading);
item.add(new Label(TITLE, item.getModel().map(isSwedish ? GradingCriterion::getTitle : GradingCriterion::getTitleEn)));
item.add(new Label(TITLE, item.getModel().combineWith(language, GradingCriterion::getTitle)));
grading.add(new Label(MAX_POINTS,
new StringResourceModel(
"point_requirement",
@ -117,8 +119,7 @@ public class CriteriaPanel extends GenericPanel<SupervisorGradingReport> {
};
pf.setOutputMarkupId(true); // required for wicket:for
grading.add(pf);
grading.add(new Label("pfCriteria", item.getModel().map(gc -> isSwedish ? gc.getGradingCriterionPoints().get(1).getDescription()
: gc.getGradingCriterionPoints().get(1).getDescriptionEn())));
grading.add(new Label("pfCriteria", item.getModel().combineWith(language, (gc, lang) -> gc.getGradingCriterionPoints().get(1).getDescription(lang))));
if (item.getModelObject().getTitle().startsWith("Ö1 ")) {
grading.setEnabled(false);
@ -144,9 +145,9 @@ public class CriteriaPanel extends GenericPanel<SupervisorGradingReport> {
return new ChoiceRenderer<>() {
@Override
public Object getDisplayValue(GradingCriterionPoint object) {
String description = isSwedish ? object.getDescription() : object.getDescriptionEn();
String description = object.getDescription(language.getObject());
return object.getPoint().toString() + " p"
+ (description != null && !description.equals("") ? " - " + description : "");
+ (description != null && !description.isBlank() ? " - " + description : "");
}
@Override

@ -23,6 +23,7 @@ import se.su.dsv.scipro.report.Criterion;
import se.su.dsv.scipro.report.OppositionReport;
import se.su.dsv.scipro.report.ReportService;
import se.su.dsv.scipro.repository.panels.ViewAttachmentPanel;
import se.su.dsv.scipro.system.Language;
import se.su.dsv.scipro.util.JavascriptEventConfirmation;
import javax.inject.Inject;
@ -59,13 +60,13 @@ public class FillOutReportPanel<T extends OppositionReport> extends Border {
public ReportForm(String id, final IModel<T> model) {
super(id, model);
add(new ComponentFeedbackPanel(FEEDBACK_PANEL, this));
OppositionReport oppositionReport = model.getObject().getFinalSeminarOpposition().getOppositionReport();
boolean isSwedish = oppositionReport != null && oppositionReport.isReportLanguageSwedish();
IModel<Language> language = model
.map(OppositionReport::getLanguage);
add(new ListView<>(GRADING_CRITERIA, model.map(OppositionReport::getCriteria)) {
@Override
protected void populateItem(ListItem<Criterion> item) {
item.add(new Label(TITLE, item.getModel().map(isSwedish ? Criterion::getTitle : Criterion::getTitleEn)));
item.add(new Label(DESCRIPTION, item.getModel().map(isSwedish ? Criterion::getDescription : Criterion::getDescriptionEn)));
item.add(new Label(TITLE, item.getModel().combineWith(language, Criterion::getTitle)));
item.add(new Label(DESCRIPTION, item.getModel().combineWith(language, Criterion::getDescription)));
TextArea<String> textArea = new TextArea<>(FEEDBACK, LambdaModel.of(item.getModel(), Criterion::getFeedback, Criterion::setFeedback));
textArea.add(new AutoSavingBehaviour() {
@Override

@ -1,114 +0,0 @@
package se.su.dsv.scipro.grading;
import org.apache.wicket.model.IModel;
import se.su.dsv.scipro.report.GradingCriterion;
import se.su.dsv.scipro.report.SupervisorGradingReport;
import se.su.dsv.scipro.system.User;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
public class NoPointNoFeedbackGradingReportPdf implements GradingReportPdf {
private final IModel<SupervisorGradingReport> supervisorGradingReport;
public NoPointNoFeedbackGradingReportPdf(IModel<SupervisorGradingReport> supervisorGradingReport) {
this.supervisorGradingReport = supervisorGradingReport;
}
@Override
public String getProjectTitle() {
return supervisorGradingReport.getObject().getProject().getTitle();
}
@Override
public String getDegreeType() {
return supervisorGradingReport.getObject().getProjectType().getDegreeType().toString();
}
@Override
public boolean isSwedish() {
return supervisorGradingReport.getObject().getProject().isReportLanguageSwedish();
}
@Override
public String getAuthorName() {
return "";
}
@Override
public String getAuthorNames() {
return supervisorGradingReport.getObject().getProject()
.getProjectParticipants()
.stream()
.map(User::getFullName)
.collect(Collectors.joining(", "));
}
@Override
public String getSupervisorName() {
return supervisorGradingReport.getObject().getProject().getSupervisorName();
}
@Override
public String getReviewerName() {
return supervisorGradingReport.getObject().getProject().getReviewerName();
}
@Override
public String getPlagiarismFeedback() {
return "";
}
@Override
public Date getLastModified() {
return supervisorGradingReport.getObject().getLastModified();
}
@Override
public List<GradingCriterion> getGradingCriteria() {
List<GradingCriterion> criteria = new ArrayList<>(supervisorGradingReport.getObject().getGradingCriteria());
for (GradingCriterion criterion : criteria){
criterion.setFeedback(null);
criterion.setPoints(null);
}
return criteria;
}
@Override
public String getProjectTypeName() {
return supervisorGradingReport.getObject().getProjectType().getName();
}
@Override
public String getRejectionComment() {
return null;
}
@Override
public String getRejectionCommentFeedback() {
return null;
}
@Override
public String getReflection() {
return null;
}
@Override
public String getRoughDraftComments() {
return null;
}
@Override
public String getMotivation() {
return null;
}
@Override
public int getPointTotal() {
return 0;
}
}

@ -6,6 +6,8 @@ import se.su.dsv.scipro.report.GradingCriterion;
import se.su.dsv.scipro.report.SupervisorGradingReport;
import se.su.dsv.scipro.reviewing.Decision;
import se.su.dsv.scipro.reviewing.RoughDraftApproval;
import se.su.dsv.scipro.system.DegreeType;
import se.su.dsv.scipro.system.Language;
import se.su.dsv.scipro.system.User;
import java.text.SimpleDateFormat;
@ -41,12 +43,28 @@ public class SupervisorGradingReportPdf implements GradingReportPdf {
@Override
public String getDegreeType() {
return supervisorGradingReport.getObject().getProjectType().getDegreeType().toString();
DegreeType degreeType = supervisorGradingReport.getObject().getProjectType().getDegreeType();
if (isSwedish()) {
return switch (degreeType) {
case NONE -> "Okänd";
case BACHELOR -> "Kandidat";
case MAGISTER -> "Magister";
case MASTER -> "Master";
};
}
else {
return switch (degreeType) {
case NONE -> "Unknown";
case BACHELOR -> "Bachelor";
case MAGISTER -> "One-year-Master";
case MASTER -> "Master";
};
}
}
@Override
public boolean isSwedish() {
return supervisorGradingReport.getObject().getProject().isReportLanguageSwedish();
return supervisorGradingReport.getObject().getReportLanguage() == Language.SWEDISH;
}
@Override

@ -21,6 +21,7 @@
</style>
<subDataset name="dataset1" uuid="11042a5e-8b28-4516-887c-94af6b007800">
<parameter name="swedish" class="java.lang.Boolean"/>
<field name="points" class="java.lang.Integer"/>
<field name="title" class="java.lang.String"/>
<field name="titleEn" class="java.lang.String"/>
@ -29,6 +30,7 @@
</subDataset>
<subDataset name="dataset2">
<parameter name="swedish" class="java.lang.Boolean"/>
<field name="description" class="java.lang.String"/>
<field name="descriptionEn" class="java.lang.String"/>
<field name="gradingCriterion" class="se.su.dsv.scipro.report.GradingCriterion"/>
@ -100,8 +102,7 @@
</textField>
<textField>
<reportElement positionType="Float" style="bodyStyle" x="65" y="20" width="430" height="20" uuid="6f798cbd-1111-42d7-9b7e-ea3b38432ba5"/>
<textFieldExpression><![CDATA[$F{swedish} ? ($F{degreeType}.equals("BACHELOR") ? "Kandidat" : ($F{degreeType}.equals("MASTER") ? "Master" : ($F{degreeType}.equals("MAGISTER") ? "Magister" : "")))
: ($F{degreeType}.equals("BACHELOR") ? "Bachelor" : ($F{degreeType}.equals("MASTER") ? "Master" : ($F{degreeType}.equals("MAGISTER") ? "One-year-Master" : "")))]]></textFieldExpression>
<textFieldExpression><![CDATA[$F{degreeType}]]></textFieldExpression>
</textField>
<textField>
@ -154,13 +155,16 @@
<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">
<datasetRun subDataset="dataset1" uuid="0df5fe97-3d1e-480a-bf8d-5a465d51b326">
<datasetParameter name="swedish">
<datasetParameterExpression><![CDATA[$F{swedish}]]></datasetParameterExpression>
</datasetParameter>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{gradingCriteria})]]></dataSourceExpression>
</datasetRun>
<jr:listContents height="0" width="495">
<textField textAdjust="StretchHeight">
<reportElement style="subtitleStyle" x="0" y="0" width="495" height="0" uuid="46623aa1-a1d3-44d8-b26b-3f5e1fd13a0b"/>
<textFieldExpression><![CDATA[$F{gradingReport}.isSwedish() ? $F{title} : $F{titleEn}]]></textFieldExpression>
<textFieldExpression><![CDATA[$P{swedish} ? $F{title} : $F{titleEn}]]></textFieldExpression>
</textField>
<componentElement>
@ -168,12 +172,15 @@
<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">
<datasetRun subDataset="dataset2">
<datasetParameter name="swedish">
<datasetParameterExpression><![CDATA[$P{swedish}]]></datasetParameterExpression>
</datasetParameter>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{gradingCriterionPoints})]]></dataSourceExpression>
</datasetRun>
<jr:listContents height="16" width="495">
<textField textAdjust="StretchHeight">
<reportElement style="bodyStyle" x="0" y="0" width="495" height="0" isRemoveLineWhenBlank="true"/>
<textFieldExpression><![CDATA[($F{description} == null || $F{description}.equals("")) ? "" : ($F{gradingCriterion}.getGradingReport().isSwedish() ? $F{description} : $F{descriptionEn})]]></textFieldExpression>
<textFieldExpression><![CDATA[($F{description} == null || $F{description}.equals("")) ? "" : ($P{swedish} ? $F{description} : $F{descriptionEn})]]></textFieldExpression>
</textField>
</jr:listContents>
</jr:list>
@ -182,7 +189,7 @@
<textField textAdjust="StretchHeight">
<reportElement style="bodyStyle" positionType="Float" x="0" y="0" width="495" height="0" uuid="53ffedf3-ef7a-4887-af40-2790b1864a4d"/>
<box bottomPadding="20"/>
<textFieldExpression><![CDATA[($F{gradingReport}.isSwedish() ? "Poäng: " : "Points: ") + ($F{points} != null ? $F{points} : "")]]></textFieldExpression>
<textFieldExpression><![CDATA[($P{swedish} ? "Poäng: " : "Points: ") + ($F{points} != null ? $F{points} : "")]]></textFieldExpression>
</textField>
</jr:listContents>

@ -78,7 +78,7 @@ public class FillOutReportPanelTest extends SciProTest {
@Test
public void displays_criteria_descriptions() {
tester.assertModelValue(path(panel, FORM, GRADING_CRITERIA, 0, DESCRIPTION), oppositionReport.getCriteria().get(0).getDescriptionEn());
tester.assertModelValue(path(panel, FORM, GRADING_CRITERIA, 0, DESCRIPTION), oppositionReport.getCriteria().get(0).getDescription());
}
@Test