Skip to content

Commit 591296b

Browse files
authored
Merge pull request #112 from kit-sdq/review-round
Review round support
2 parents 79d3973 + ca73837 commit 591296b

File tree

17 files changed

+805
-193
lines changed

17 files changed

+805
-193
lines changed

.idea/jarRepositories.xml

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build.gradle

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ repositories {
3434
dependencies {
3535
// Tests
3636
testImplementation 'junit:junit:' + JUNIT_VERSION
37-
testImplementation 'com.tngtech.archunit:archunit:' + ARCHUNIT_VERSION
3837
testImplementation 'com.tngtech.archunit:archunit-junit4:' + ARCHUNIT_VERSION
3938

4039
intellijPlatform {
@@ -50,7 +49,7 @@ dependencies {
5049
}
5150
}
5251

53-
implementation 'edu.kit.kastel.sdq:artemis4j:8.0.0'
52+
implementation 'edu.kit.kastel.sdq:artemis4j:8.4.0-SNAPSHOT'
5453
}
5554

5655
intellijPlatform {

src/main/java/edu/kit/kastel/sdq/intelligrade/actions/AddAnnotationPopupAction.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Licensed under EPL-2.0 2024. */
1+
/* Licensed under EPL-2.0 2024-2025. */
22
package edu.kit.kastel.sdq.intelligrade.actions;
33

44
import java.awt.event.ActionEvent;
@@ -21,6 +21,7 @@
2121
import com.intellij.ui.popup.list.ListPopupImpl;
2222
import edu.kit.kastel.sdq.artemis4j.grading.penalty.MistakeType;
2323
import edu.kit.kastel.sdq.intelligrade.state.PluginState;
24+
import edu.kit.kastel.sdq.intelligrade.utils.ArtemisUtils;
2425
import org.jetbrains.annotations.NotNull;
2526

2627
public class AddAnnotationPopupAction extends AnAction {
@@ -51,12 +52,16 @@ public void actionPerformed(@NotNull AnActionEvent e) {
5152
return;
5253
}
5354

55+
var assessment = PluginState.getInstance().getActiveAssessment().orElseThrow();
56+
57+
// in review mode, no new annotations can be created
58+
if (assessment.isReview()) {
59+
ArtemisUtils.displayInvalidReviewOperationBalloon();
60+
return;
61+
}
62+
5463
// collect all mistake types that can be annotated
55-
var mistakeTypes = PluginState.getInstance()
56-
.getActiveAssessment()
57-
.orElseThrow()
58-
.getGradingConfig()
59-
.getMistakeTypes();
64+
var mistakeTypes = assessment.getGradingConfig().getMistakeTypes();
6065

6166
var actions = new DefaultActionGroup();
6267
for (var mistakeType : mistakeTypes) {

src/main/java/edu/kit/kastel/sdq/intelligrade/extensions/guis/AnnotationsListPanel.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,21 @@ public void actionPerformed(@NotNull AnActionEvent e) {
107107
};
108108
group.addAction(deleteButton);
109109

110+
var restoreButton = new AnActionButton("Restore") {
111+
@Override
112+
public void actionPerformed(@NotNull AnActionEvent e) {
113+
table.restoreSelection();
114+
}
115+
116+
@Override
117+
public @NotNull ActionUpdateThread getActionUpdateThread() {
118+
return ActionUpdateThread.EDT;
119+
}
120+
};
121+
group.addAction(restoreButton);
122+
PluginState.getInstance()
123+
.registerAssessmentStartedListener(assessment -> restoreButton.setEnabled(assessment.isReview()));
124+
110125
// Adds a debug button to the right-click menu in the table.
111126
//
112127
// There is some data regarding the annotations that is not visible in the table,
@@ -150,6 +165,13 @@ private void showDebugDialog(Annotation annotation) {
150165
Map.entry("Path", location.filePath()),
151166
Map.entry("Start", location.start().toString()),
152167
Map.entry("End", location.end().toString()),
168+
Map.entry(
169+
"Created By",
170+
annotation.getCreatorId().map(Object::toString).orElse("?")),
171+
Map.entry("Suppressed", annotation.isSuppressed() ? "Yes" : "No"),
172+
Map.entry(
173+
"Suppressed By",
174+
annotation.getSuppressorId().map(Object::toString).orElse("?")),
153175
Map.entry("Classifiers", annotation.getClassifiers().toString()));
154176

155177
for (var entry : data) {

src/main/java/edu/kit/kastel/sdq/intelligrade/extensions/guis/AssessmentPanel.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ public void paint(Graphics g, JComponent c) {
116116

117117
button.addActionListener(a -> assessment.addAnnotationAtCaret(
118118
mistakeType, (a.getModifiers() & ActionEvent.CTRL_MASK) == ActionEvent.CTRL_MASK));
119+
120+
// All buttons are disabled in review mode
121+
button.setEnabled(!assessment.isReview());
122+
119123
this.assessmentButtons.add(new AssessmentButton(mistakeType, button, iconRenderer));
120124
}
121125

@@ -188,7 +192,8 @@ private void updateButtonIcons(Assessment assessment) {
188192
Font font = JBFont.regular();
189193

190194
if (mistakeType.getReporting().shouldScore()) {
191-
int count = assessment.getAnnotations(mistakeType).size();
195+
int count = (int)
196+
assessment.streamAllAnnotations(mistakeType, false).count();
192197
var rule = mistakeType.getRule();
193198

194199
switch (rule) {

src/main/java/edu/kit/kastel/sdq/intelligrade/extensions/guis/BacklogPanel.java

Lines changed: 46 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
/* Licensed under EPL-2.0 2024. */
1+
/* Licensed under EPL-2.0 2024-2025. */
22
package edu.kit.kastel.sdq.intelligrade.extensions.guis;
33

44
import java.awt.event.ActionEvent;
55
import java.time.ZoneId;
6-
import java.time.format.DateTimeFormatter;
76
import java.util.ArrayList;
87
import java.util.Comparator;
98
import java.util.List;
@@ -20,7 +19,8 @@
2019
import com.intellij.ui.components.JBCheckBox;
2120
import com.intellij.ui.components.JBLabel;
2221
import com.intellij.ui.components.JBPanel;
23-
import edu.kit.kastel.sdq.artemis4j.grading.ProgrammingSubmission;
22+
import edu.kit.kastel.sdq.artemis4j.grading.CorrectionRound;
23+
import edu.kit.kastel.sdq.artemis4j.grading.PackedAssessment;
2424
import edu.kit.kastel.sdq.intelligrade.state.PluginState;
2525
import edu.kit.kastel.sdq.intelligrade.utils.ArtemisUtils;
2626
import net.miginfocom.swing.MigLayout;
@@ -33,7 +33,7 @@ public class BacklogPanel extends JPanel {
3333
private final JBLabel shownSubmissionsLabel;
3434
private final JPanel backlogList;
3535

36-
private List<ProgrammingSubmission> lastFetchedSubmissions = new ArrayList<>();
36+
private List<PackedAssessment> lastFetchedAssessments = new ArrayList<>();
3737
private final List<Runnable> onBacklogUpdate = new ArrayList<>();
3838

3939
public BacklogPanel() {
@@ -83,9 +83,11 @@ public void addBacklogUpdateListener(Runnable listener) {
8383
onBacklogUpdate.add(listener);
8484
}
8585

86-
public void setSubmissions(List<ProgrammingSubmission> submissions) {
87-
this.lastFetchedSubmissions = new ArrayList<>(submissions);
88-
this.lastFetchedSubmissions.sort(Comparator.comparing(ProgrammingSubmission::getSubmissionDate));
86+
public void setAssessments(List<PackedAssessment> assessments) {
87+
this.lastFetchedAssessments = new ArrayList<>(assessments);
88+
// Sort by submission date, which matches the ordering in the Artemis backlog
89+
this.lastFetchedAssessments.sort(
90+
Comparator.comparing(a -> a.submission().getSubmissionDate()));
8991
this.updateBacklog();
9092
}
9193

@@ -97,78 +99,84 @@ public void clear() {
9799
private void updateBacklog() {
98100
backlogList.removeAll();
99101

102+
if (PluginState.getInstance().hasReviewConfig()) {
103+
shownSubmissionsLabel.setText("Disabled");
104+
backlogList.add(new JBLabel("No backlog in review mode"));
105+
this.updateUI();
106+
return;
107+
}
108+
100109
String searchText = searchField.getText();
101110
boolean firstRound = showFirstRound.isSelected();
102111
boolean secondRound = showSecondRound.isSelected();
103112

104113
int shown = 0;
105-
for (ProgrammingSubmission submission : lastFetchedSubmissions) {
106-
if (searchText != null && !submission.getParticipantIdentifier().contains(searchText)) {
114+
for (var assessment : this.lastFetchedAssessments) {
115+
if (searchText != null
116+
&& !assessment.submission().getParticipantIdentifier().contains(searchText)) {
107117
continue;
108118
}
109119

110-
if (!firstRound && submission.getCorrectionRound() == 0) {
120+
if (!firstRound && assessment.round() == CorrectionRound.FIRST) {
111121
continue;
112122
}
113123

114-
if (!secondRound && submission.getCorrectionRound() == 1) {
124+
if (!secondRound && assessment.round() == CorrectionRound.SECOND) {
115125
continue;
116126
}
117127

118128
shown++;
119129

120130
// Participant
121-
backlogList.add(new JBLabel(submission.getParticipantIdentifier()));
122-
addResultDateLabel(submission);
131+
backlogList.add(new JBLabel(assessment.submission().getParticipantIdentifier()));
132+
addResultDateLabel(assessment);
123133
// Correction Round
124-
backlogList.add(new JBLabel("Round " + (submission.getCorrectionRound() + 1)));
125-
addScoreItem(submission);
126-
addActionButton(submission);
134+
backlogList.add(new JBLabel(
135+
switch (assessment.round()) {
136+
case FIRST -> "Round 1";
137+
case SECOND -> "Round 2";
138+
case REVIEW -> "Review";
139+
}));
140+
addScoreItem(assessment);
141+
addActionButton(assessment);
127142
}
128143

129-
shownSubmissionsLabel.setText("Showing %d/%d".formatted(shown, lastFetchedSubmissions.size()));
144+
shownSubmissionsLabel.setText("Showing %d/%d".formatted(shown, lastFetchedAssessments.size()));
130145

131146
this.updateUI();
132147
}
133148

134-
private void addResultDateLabel(ProgrammingSubmission submission) {
135-
var latestResult = submission.getLatestResult();
149+
private void addResultDateLabel(PackedAssessment assessment) {
136150
String resultText = "";
137-
if (submission.isSubmitted()) {
138-
resultText = latestResult
139-
.map(resultDTO -> resultDTO
140-
.completionDate()
141-
.withZoneSameInstant(ZoneId.systemDefault())
142-
.format(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm")))
143-
.orElse("???");
151+
if (assessment.isSubmitted()) {
152+
resultText = assessment
153+
.result()
154+
.completionDate()
155+
.withZoneSameInstant(ZoneId.systemDefault())
156+
.format(ArtemisUtils.DATE_TIME_PATTERN);
144157
}
145158
backlogList.add(new JBLabel(resultText), "alignx right");
146159
}
147160

148-
private void addScoreItem(ProgrammingSubmission submission) {
161+
private void addScoreItem(PackedAssessment assessment) {
149162
// Score in percent
150-
var latestResult = submission.getLatestResult();
151163
String resultText = "";
152-
if (submission.isSubmitted()) {
153-
resultText = latestResult
154-
.map(resultDTO -> "%.0f%%".formatted(resultDTO.score()))
155-
.orElse("???");
164+
if (assessment.isSubmitted()) {
165+
resultText = "%.0f%%".formatted(assessment.result().score());
156166
}
157167
backlogList.add(new JBLabel(resultText), "alignx right");
158168
}
159169

160-
private void addActionButton(ProgrammingSubmission submission) {
170+
private void addActionButton(PackedAssessment assessment) {
161171
// Action Button
162172
JButton reopenButton;
163-
if (submission.isSubmitted()) {
173+
if (assessment.isSubmitted()) {
164174
reopenButton = new JButton("Reopen");
165-
} else if (ArtemisUtils.isSubmissionStarted(submission)) {
175+
} else {
166176
reopenButton = new JButton("Continue");
167177
reopenButton.setForeground(JBColor.ORANGE);
168-
} else {
169-
reopenButton = new JButton("Start");
170178
}
171-
reopenButton.addActionListener(a -> PluginState.getInstance().reopenAssessment(submission));
179+
reopenButton.addActionListener(a -> PluginState.getInstance().reopenAssessment(assessment));
172180
backlogList.add(reopenButton, "growx");
173181
}
174182
}

0 commit comments

Comments
 (0)