Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Exam mode: Notify instructors about changes in the test repository for exam exercise #9242

Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
public enum NotificationType {
EXERCISE_SUBMISSION_ASSESSED, ATTACHMENT_CHANGE, EXERCISE_RELEASED, EXERCISE_PRACTICE, QUIZ_EXERCISE_STARTED, EXERCISE_UPDATED, NEW_REPLY_FOR_EXERCISE_POST,
NEW_REPLY_FOR_LECTURE_POST, NEW_REPLY_FOR_COURSE_POST, NEW_REPLY_FOR_EXAM_POST, NEW_EXERCISE_POST, NEW_LECTURE_POST, NEW_COURSE_POST, NEW_ANNOUNCEMENT_POST, NEW_EXAM_POST,
FILE_SUBMISSION_SUCCESSFUL, COURSE_ARCHIVE_STARTED, COURSE_ARCHIVE_FINISHED, COURSE_ARCHIVE_FAILED, PROGRAMMING_TEST_CASES_CHANGED, DUPLICATE_TEST_CASE, EXAM_ARCHIVE_STARTED,
EXAM_ARCHIVE_FINISHED, EXAM_ARCHIVE_FAILED, ILLEGAL_SUBMISSION, NEW_PLAGIARISM_CASE_STUDENT, NEW_CPC_PLAGIARISM_CASE_STUDENT, PLAGIARISM_CASE_VERDICT_STUDENT,
NEW_MANUAL_FEEDBACK_REQUEST, TUTORIAL_GROUP_REGISTRATION_STUDENT, TUTORIAL_GROUP_DEREGISTRATION_STUDENT, TUTORIAL_GROUP_REGISTRATION_TUTOR,
FILE_SUBMISSION_SUCCESSFUL, COURSE_ARCHIVE_STARTED, COURSE_ARCHIVE_FINISHED, COURSE_ARCHIVE_FAILED, PROGRAMMING_TEST_CASES_CHANGED, PROGRAMMING_EXAM_TEST_CASES_CHANGED,
DUPLICATE_TEST_CASE, EXAM_ARCHIVE_STARTED, EXAM_ARCHIVE_FINISHED, EXAM_ARCHIVE_FAILED, ILLEGAL_SUBMISSION, NEW_PLAGIARISM_CASE_STUDENT, NEW_CPC_PLAGIARISM_CASE_STUDENT,
PLAGIARISM_CASE_VERDICT_STUDENT, NEW_MANUAL_FEEDBACK_REQUEST, TUTORIAL_GROUP_REGISTRATION_STUDENT, TUTORIAL_GROUP_DEREGISTRATION_STUDENT, TUTORIAL_GROUP_REGISTRATION_TUTOR,
TUTORIAL_GROUP_MULTIPLE_REGISTRATION_TUTOR, TUTORIAL_GROUP_DEREGISTRATION_TUTOR, TUTORIAL_GROUP_DELETED, TUTORIAL_GROUP_UPDATED, TUTORIAL_GROUP_ASSIGNED,
TUTORIAL_GROUP_UNASSIGNED, CONVERSATION_NEW_MESSAGE, CONVERSATION_NEW_REPLY_MESSAGE, CONVERSATION_USER_MENTIONED, CONVERSATION_CREATE_ONE_TO_ONE_CHAT,
CONVERSATION_CREATE_GROUP_CHAT, CONVERSATION_ADD_USER_GROUP_CHAT, CONVERSATION_ADD_USER_CHANNEL, CONVERSATION_REMOVE_USER_GROUP_CHAT, CONVERSATION_REMOVE_USER_CHANNEL,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import static de.tum.in.www1.artemis.domain.enumeration.NotificationType.NEW_ANNOUNCEMENT_POST;
import static de.tum.in.www1.artemis.domain.enumeration.NotificationType.NEW_MANUAL_FEEDBACK_REQUEST;
import static de.tum.in.www1.artemis.domain.enumeration.NotificationType.PROGRAMMING_BUILD_RUN_UPDATE;
import static de.tum.in.www1.artemis.domain.enumeration.NotificationType.PROGRAMMING_EXAM_TEST_CASES_CHANGED;
import static de.tum.in.www1.artemis.domain.enumeration.NotificationType.PROGRAMMING_REPOSITORY_LOCKS;
import static de.tum.in.www1.artemis.domain.enumeration.NotificationType.PROGRAMMING_TEST_CASES_CHANGED;
import static de.tum.in.www1.artemis.domain.enumeration.NotificationType.QUIZ_EXERCISE_STARTED;
Expand Down Expand Up @@ -120,7 +121,13 @@ public static GroupNotification createNotification(Exercise exercise, User autho
String title;
String text;
boolean textIsPlaceholder;
String[] placeholderValues = createPlaceholderExerciseNotification(exercise.getCourseViaExerciseGroupOrCourseMember().getTitle(), exercise.getTitle());
String[] placeholderValues;
if (exercise.isExamExercise()) {
placeholderValues = createPlaceholderExamExerciseNotification(exercise.getExam().getTitle(), exercise.getTitle());
}
else {
placeholderValues = createPlaceholderExerciseNotification(exercise.getCourseViaExerciseGroupOrCourseMember().getTitle(), exercise.getTitle());
}
NotificationPriority priority = MEDIUM;

switch (notificationType) {
Expand Down Expand Up @@ -155,6 +162,12 @@ public static GroupNotification createNotification(Exercise exercise, User autho
text = NotificationConstants.PROGRAMMING_TEST_CASES_CHANGED_TEXT;
textIsPlaceholder = true;
}
case PROGRAMMING_EXAM_TEST_CASES_CHANGED -> {
title = NotificationConstants.PROGRAMMING_EXAM_TEST_CASES_CHANGED_TITLE;
text = NotificationConstants.PROGRAMMING_EXAM_TEST_CASES_CHANGED_TEXT;
textIsPlaceholder = true;
priority = HIGH;
}
case NEW_MANUAL_FEEDBACK_REQUEST -> {
title = NotificationConstants.NEW_MANUAL_FEEDBACK_REQUEST_TITLE;
text = NotificationConstants.NEW_MANUAL_FEEDBACK_REQUEST_TEXT;
Expand Down Expand Up @@ -203,6 +216,7 @@ public static GroupNotification createNotification(Exercise exercise, User autho
notification.setTransientAndStringTarget(createExamExerciseTargetWithExerciseUpdate(exercise));
notification.setPriority(HIGH);
}

else if (exercise instanceof ProgrammingExercise programmingExercise) {
notification.setTransientAndStringTarget(createExamProgrammingExerciseOrTestCaseTarget(programmingExercise, NotificationTargetFactory.EXERCISE_UPDATED_TEXT));
}
Expand All @@ -221,11 +235,17 @@ else if (notificationType == DUPLICATE_TEST_CASE) {
}

@NotificationPlaceholderCreator(values = { EXERCISE_RELEASED, EXERCISE_PRACTICE, QUIZ_EXERCISE_STARTED, EXERCISE_UPDATED, PROGRAMMING_TEST_CASES_CHANGED,
NEW_MANUAL_FEEDBACK_REQUEST, DUPLICATE_TEST_CASE, PROGRAMMING_REPOSITORY_LOCKS, PROGRAMMING_BUILD_RUN_UPDATE, ILLEGAL_SUBMISSION })
PROGRAMMING_EXAM_TEST_CASES_CHANGED, NEW_MANUAL_FEEDBACK_REQUEST, DUPLICATE_TEST_CASE, PROGRAMMING_REPOSITORY_LOCKS, PROGRAMMING_BUILD_RUN_UPDATE, ILLEGAL_SUBMISSION })
public static String[] createPlaceholderExerciseNotification(String courseTitle, String exerciseTitle) {
return new String[] { courseTitle, exerciseTitle };
}

@NotificationPlaceholderCreator(values = { EXERCISE_RELEASED, EXERCISE_PRACTICE, QUIZ_EXERCISE_STARTED, EXERCISE_UPDATED, PROGRAMMING_TEST_CASES_CHANGED,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this list and the one above the same? And will they also stay the same?
If so, please move them into a common array and use it for these two occurrences

PROGRAMMING_EXAM_TEST_CASES_CHANGED, NEW_MANUAL_FEEDBACK_REQUEST, DUPLICATE_TEST_CASE, PROGRAMMING_REPOSITORY_LOCKS, PROGRAMMING_BUILD_RUN_UPDATE, ILLEGAL_SUBMISSION })
public static String[] createPlaceholderExamExerciseNotification(String examTitle, String exerciseTitle) {
return new String[] { examTitle, exerciseTitle };
}

/**
* Creates an instance of GroupNotification based on the passed parameters.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import static de.tum.in.www1.artemis.domain.enumeration.NotificationType.NEW_REPLY_FOR_LECTURE_POST;
import static de.tum.in.www1.artemis.domain.enumeration.NotificationType.PLAGIARISM_CASE_VERDICT_STUDENT;
import static de.tum.in.www1.artemis.domain.enumeration.NotificationType.PROGRAMMING_BUILD_RUN_UPDATE;
import static de.tum.in.www1.artemis.domain.enumeration.NotificationType.PROGRAMMING_EXAM_TEST_CASES_CHANGED;
import static de.tum.in.www1.artemis.domain.enumeration.NotificationType.PROGRAMMING_REPOSITORY_LOCKS;
import static de.tum.in.www1.artemis.domain.enumeration.NotificationType.PROGRAMMING_TEST_CASES_CHANGED;
import static de.tum.in.www1.artemis.domain.enumeration.NotificationType.QUIZ_EXERCISE_STARTED;
Expand Down Expand Up @@ -117,6 +118,8 @@ public class NotificationConstants {

public static final String PROGRAMMING_TEST_CASES_CHANGED_TITLE = "artemisApp.groupNotification.title.programmingTestCasesChanged";

public static final String PROGRAMMING_EXAM_TEST_CASES_CHANGED_TITLE = "artemisApp.groupNotification.title.programmingExamTestCasesChanged";

public static final String NEW_MANUAL_FEEDBACK_REQUEST_TITLE = "artemisApp.groupNotification.title.newManualFeedbackRequest";

public static final String PROGRAMMING_REPOSITORY_LOCKS_TITLE = "artemisApp.groupNotification.title.repositoryLocks";
Expand Down Expand Up @@ -210,6 +213,8 @@ public class NotificationConstants {

public static final String PROGRAMMING_TEST_CASES_CHANGED_TEXT = "artemisApp.groupNotification.text.programmingTestCasesChanged";

public static final String PROGRAMMING_EXAM_TEST_CASES_CHANGED_TEXT = "artemisApp.groupNotification.text.programmingExamTestCasesChanged";

public static final String NEW_MANUAL_FEEDBACK_REQUEST_TEXT = "artemisApp.groupNotification.text.newManualFeedbackRequest";

public static final String NEW_PLAGIARISM_CASE_STUDENT_TEXT = "artemisApp.singleUserNotification.text.newPlagiarismCaseStudent";
Expand Down Expand Up @@ -292,9 +297,9 @@ public class NotificationConstants {
.put(NEW_ANNOUNCEMENT_POST, NEW_ANNOUNCEMENT_POST_TITLE).put(COURSE_ARCHIVE_FINISHED, COURSE_ARCHIVE_FINISHED_TITLE)
.put(COURSE_ARCHIVE_FAILED, COURSE_ARCHIVE_FAILED_TITLE).put(EXAM_ARCHIVE_STARTED, EXAM_ARCHIVE_STARTED_TITLE).put(EXAM_ARCHIVE_FAILED, EXAM_ARCHIVE_FAILED_TITLE)
.put(EXAM_ARCHIVE_FINISHED, EXAM_ARCHIVE_FINISHED_TITLE).put(PROGRAMMING_TEST_CASES_CHANGED, PROGRAMMING_TEST_CASES_CHANGED_TITLE)
.put(NEW_MANUAL_FEEDBACK_REQUEST, NEW_MANUAL_FEEDBACK_REQUEST_TITLE).put(NEW_PLAGIARISM_CASE_STUDENT, NEW_PLAGIARISM_CASE_STUDENT_TITLE)
.put(NEW_CPC_PLAGIARISM_CASE_STUDENT, NEW_CPC_PLAGIARISM_CASE_STUDENT_TITLE).put(PLAGIARISM_CASE_VERDICT_STUDENT, PLAGIARISM_CASE_VERDICT_STUDENT_TITLE)
.put(TUTORIAL_GROUP_REGISTRATION_STUDENT, TUTORIAL_GROUP_REGISTRATION_STUDENT_TITLE)
.put(PROGRAMMING_EXAM_TEST_CASES_CHANGED, PROGRAMMING_EXAM_TEST_CASES_CHANGED_TITLE).put(NEW_MANUAL_FEEDBACK_REQUEST, NEW_MANUAL_FEEDBACK_REQUEST_TITLE)
.put(NEW_PLAGIARISM_CASE_STUDENT, NEW_PLAGIARISM_CASE_STUDENT_TITLE).put(NEW_CPC_PLAGIARISM_CASE_STUDENT, NEW_CPC_PLAGIARISM_CASE_STUDENT_TITLE)
.put(PLAGIARISM_CASE_VERDICT_STUDENT, PLAGIARISM_CASE_VERDICT_STUDENT_TITLE).put(TUTORIAL_GROUP_REGISTRATION_STUDENT, TUTORIAL_GROUP_REGISTRATION_STUDENT_TITLE)
.put(TUTORIAL_GROUP_DEREGISTRATION_STUDENT, TUTORIAL_GROUP_DEREGISTRATION_STUDENT_TITLE).put(TUTORIAL_GROUP_REGISTRATION_TUTOR, TUTORIAL_GROUP_REGISTRATION_TUTOR_TITLE)
.put(TUTORIAL_GROUP_DEREGISTRATION_TUTOR, TUTORIAL_GROUP_DEREGISTRATION_TUTOR_TITLE).put(TUTORIAL_GROUP_DELETED, TUTORIAL_GROUP_DELETED_TITLE)
.put(TUTORIAL_GROUP_UPDATED, TUTORIAL_GROUP_UPDATED_TITLE).put(TUTORIAL_GROUP_MULTIPLE_REGISTRATION_TUTOR, TUTORIAL_GROUP_REGISTRATION_MULTIPLE_TUTOR_TITLE)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import static de.tum.in.www1.artemis.domain.enumeration.NotificationType.NEW_ANNOUNCEMENT_POST;
import static de.tum.in.www1.artemis.domain.enumeration.NotificationType.NEW_MANUAL_FEEDBACK_REQUEST;
import static de.tum.in.www1.artemis.domain.enumeration.NotificationType.PROGRAMMING_BUILD_RUN_UPDATE;
import static de.tum.in.www1.artemis.domain.enumeration.NotificationType.PROGRAMMING_EXAM_TEST_CASES_CHANGED;
import static de.tum.in.www1.artemis.domain.enumeration.NotificationType.PROGRAMMING_REPOSITORY_LOCKS;
import static de.tum.in.www1.artemis.domain.enumeration.NotificationType.PROGRAMMING_TEST_CASES_CHANGED;
import static de.tum.in.www1.artemis.domain.enumeration.NotificationType.QUIZ_EXERCISE_STARTED;
Expand Down Expand Up @@ -137,7 +138,7 @@ private void notifyGroupsWithNotificationType(GroupNotificationType[] groups, No
case EXAM_ARCHIVE_STARTED, EXAM_ARCHIVE_FINISHED, EXAM_ARCHIVE_FAILED ->
createNotification((Exam) notificationSubject, author, group, notificationType, (List<String>) typeSpecificInformation);
// Critical Types
case DUPLICATE_TEST_CASE, ILLEGAL_SUBMISSION, PROGRAMMING_REPOSITORY_LOCKS, PROGRAMMING_BUILD_RUN_UPDATE ->
case DUPLICATE_TEST_CASE, ILLEGAL_SUBMISSION, PROGRAMMING_REPOSITORY_LOCKS, PROGRAMMING_BUILD_RUN_UPDATE, PROGRAMMING_EXAM_TEST_CASES_CHANGED ->
createNotification((Exercise) notificationSubject, author, group, notificationType, (String) typeSpecificInformation);
// Additional Types
case PROGRAMMING_TEST_CASES_CHANGED, NEW_MANUAL_FEEDBACK_REQUEST ->
Expand Down Expand Up @@ -226,6 +227,15 @@ public void notifyEditorAndInstructorGroupsAboutChangedTestCasesForProgrammingEx
notifyGroupsWithNotificationType(new GroupNotificationType[] { EDITOR, INSTRUCTOR }, PROGRAMMING_TEST_CASES_CHANGED, exercise, null, null);
}

/**
* Notify editor and instructor groups about changed test cases for an exam programming exercise.
*
* @param exercise that has been updated
*/
public void notifyEditorInstructorGroupsAboutChangedTestCasesForExamProgrammingExercise(ProgrammingExercise exercise) {
notifyGroupsWithNotificationType(new GroupNotificationType[] { EDITOR, INSTRUCTOR }, PROGRAMMING_EXAM_TEST_CASES_CHANGED, exercise, null, null);
}

/**
* Notify editor and instructor groups about a finished repository permission change and the amount of failed updated.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,8 @@ public class NotificationSettingsService {
// editor notification setting group
public static final String NOTIFICATION__EDITOR_NOTIFICATION__PROGRAMMING_TEST_CASES_CHANGED = "notification.editor-notification.programming-test-cases-changed";

public static final String NOTIFICATION__EDITOR_NOTIFICATION__PROGRAMMING_EXAM_TEST_CASES_CHANGED = "notification.editor-notification.programming-exam-test-cases-changed";

// instructor notification setting group
public static final String NOTIFICATION__INSTRUCTOR_NOTIFICATION__COURSE_AND_EXAM_ARCHIVING_STARTED = "notification.instructor-notification.course-and-exam-archiving-started";

Expand Down Expand Up @@ -165,6 +167,7 @@ public class NotificationSettingsService {
new NotificationSetting(true, false, true, NOTIFICATION__TUTOR_NOTIFICATION__TUTORIAL_GROUP_REGISTRATION),
// editor notification setting group
new NotificationSetting(true, false, true, NOTIFICATION__EDITOR_NOTIFICATION__PROGRAMMING_TEST_CASES_CHANGED),
new NotificationSetting(true, false, true, NOTIFICATION__EDITOR_NOTIFICATION__PROGRAMMING_EXAM_TEST_CASES_CHANGED),
// instructor notification setting group
new NotificationSetting(true, false, true, NOTIFICATION__INSTRUCTOR_NOTIFICATION__COURSE_AND_EXAM_ARCHIVING_STARTED),
new NotificationSetting(true, false, true, NOTIFICATION__TUTOR_NOTIFICATION__TUTORIAL_GROUP_ASSIGN_UNASSIGN),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,12 @@ public void notifyUserAboutTestCaseChanged(boolean testCasesChanged, Programming
websocketMessagingService.sendMessage(getProgrammingExerciseTestCaseChangedTopic(updatedProgrammingExercise.getId()), testCasesChanged);
// Send a notification to the client to inform the instructor about the test case update.
if (testCasesChanged) {
groupNotificationService.notifyEditorAndInstructorGroupsAboutChangedTestCasesForProgrammingExercise(updatedProgrammingExercise);
if (updatedProgrammingExercise.isExamExercise()) {
groupNotificationService.notifyEditorInstructorGroupsAboutChangedTestCasesForExamProgrammingExercise(updatedProgrammingExercise);
}
else {
groupNotificationService.notifyEditorAndInstructorGroupsAboutChangedTestCasesForProgrammingExercise(updatedProgrammingExercise);
}
}
else {
groupNotificationService.notifyEditorAndInstructorGroupAboutExerciseUpdate(updatedProgrammingExercise, TEST_CASES_CHANGED_RUN_COMPLETED_NOTIFICATION);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ private void setTestCasesChanged(ProgrammingExercise programmingExercise, boolea
if (testCasesChanged == programmingExercise.getTestCasesChanged() || (!resultsExist && testCasesChanged)) {
return;
}

programmingExercise.setTestCasesChanged(testCasesChanged);
ProgrammingExercise updatedProgrammingExercise = programmingExerciseRepository.save(programmingExercise);
// Send a websocket message about the new state to the client.
Expand Down
2 changes: 2 additions & 0 deletions src/main/webapp/app/entities/notification.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,8 @@ export const EXAM_ARCHIVE_FAILED_TITLE = 'artemisApp.groupNotification.title.exa

export const PROGRAMMING_TEST_CASES_CHANGED_TITLE = 'artemisApp.groupNotification.title.programmingTestCasesChanged';

export const PROGRAMMING_EXAM_TEST_CASES_CHANGED_TITLE = 'artemisApp.groupNotification.title.programmingExamTestCasesChanged';

export const NEW_MANUAL_FEEDBACK_REQUEST_TITLE = 'artemisApp.groupNotification.title.newManualFeedbackRequest';

export const NEW_PLAGIARISM_CASE_STUDENT_TITLE = 'artemisApp.singleUserNotification.title.newPlagiarismCaseStudent';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ export enum SettingId {

// editor notification setting group
NOTIFICATION__EDITOR_NOTIFICATION__PROGRAMMING_TEST_CASES_CHANGED = 'notification.editor-notification.programming-test-cases-changed',
NOTIFICATION__EDITOR_NOTIFICATION__PROGRAMMING_EXAM_TEST_CASES_CHANGED = 'notification.editor-notification.programming-exam-test-cases-changed',

// instructor notification setting group
NOTIFICATION__INSTRUCTOR_NOTIFICATION__COURSE_AND_EXAM_ARCHIVING_STARTED = 'notification.instructor-notification.course-and-exam-archiving-started',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
NEW_REPLY_FOR_LECTURE_POST_TITLE,
NEW_REPLY_MESSAGE_TITLE,
Notification,
PROGRAMMING_EXAM_TEST_CASES_CHANGED_TITLE,
QUIZ_EXERCISE_STARTED_TITLE,
} from 'app/entities/notification.model';
import { GroupNotification } from 'app/entities/group-notification.model';
Expand All @@ -38,6 +39,7 @@ const conversationMessageNotificationTitles = [
NEW_REPLY_FOR_LECTURE_POST_TITLE,
NEW_REPLY_FOR_EXAM_POST_TITLE,
NEW_REPLY_FOR_COURSE_POST_TITLE,
PROGRAMMING_EXAM_TEST_CASES_CHANGED_TITLE,
];

@Component({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,11 @@ export const notificationSettingsStructure: UserSettingsStructure<NotificationSe
descriptionKey: 'programmingTestCasesChangedDescription',
settingId: SettingId.NOTIFICATION__EDITOR_NOTIFICATION__PROGRAMMING_TEST_CASES_CHANGED,
},
{
key: 'programmingExamTestCasesChanged',
descriptionKey: 'programmingExamTestCasesChangedDescription',
settingId: SettingId.NOTIFICATION__EDITOR_NOTIFICATION__PROGRAMMING_EXAM_TEST_CASES_CHANGED,
},
],
},
{
Expand Down
2 changes: 2 additions & 0 deletions src/main/webapp/i18n/de/notification.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
"liveExamExerciseUpdate": "Klausuraufgabe aktualisiert",
"exerciseUpdated": "Aufgabe aktualisiert",
"programmingTestCasesChanged": "Testfälle für Programmieraufgaben geändert",
"programmingExamTestCasesChanged": "Die Testfälle für Klausurprogrammieraufgaben wurden geändert.",
"newManualFeedbackRequest": "Eine neue Anfrage zu manuellem Feedback wurde eingereicht",
"duplicateTestCase": "Doppelte Testfälle wurden gefunden.",
"repositoryLocks": "Repository-Berechtigungen aktualisiert",
Expand Down Expand Up @@ -79,6 +80,7 @@
"liveExamExerciseUpdate": "Die Klausuraufgabe \"{{ placeholderValues.1 }}\" wurde aktualisiert.",
"exerciseUpdated": "Die Aufgabe \"{{ placeholderValues.1 }}\" im Kurs \"{{ placeholderValues.0 }}\" wurde aktualisiert.",
"programmingTestCasesChanged": "Die Testfälle der Programmieraufgabe \"{{ placeholderValues.1 }}\" im Kurs \"{{ placeholderValues.0 }}\" wurden aktualisiert. Die Abgaben der Studenten sollten erneut gebaut und getestet werden, um neue Ergebnisse zu erstellen.",
"programmingExamTestCasesChanged": "Die Testfälle der Programmieraufgabe \"{{ placeholderValues.1 }}\" in der Klausur \"{{ placeholderValues.0 }}\" wurden aktualisiert. Die Abgaben der Studenten sollten erneut gebaut und getestet werden, um neue Ergebnisse zu erstellen.",
"newManualFeedbackRequest": "Die Programmieraufgabe \"{{ placeholderValues.1 }}\" im Kurs \"{{ placeholderValues.0 }}\" hat eine neue manuelle Feedbackanfrage. Bitte bewerte das Feedback vor der Einreichungsfrist.",
"illegalSubmission": "Die Aufgabe \"{{ placeholderValues.1 }}\" im Kurs \"{{ placeholderValues.0 }}\" hat illegale Abgaben von Studenten.",
"newExercisePost": "Die Aufgabe \"{{ placeholderValues.5 }}\" im Kurs \"{{ placeholderValues.0 }}\" hat einen neuen Beitrag: \"{{ placeholderValues.2 }}\"",
Expand Down
Loading
Loading