Skip to content

Commit

Permalink
Merge branch 'develop' into feature/removable/link-preview
Browse files Browse the repository at this point in the history
  • Loading branch information
pellumbbaboci authored Oct 4, 2023
2 parents c49ad53 + a9416ff commit db894ac
Show file tree
Hide file tree
Showing 95 changed files with 1,687 additions and 535 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ plugins {
}

group = "de.tum.in.www1.artemis"
version = "6.5.4"
version = "6.6.0"
description = "Interactive Learning with Individual Feedback"

sourceCompatibility=17
Expand Down
19 changes: 19 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,25 @@
We use [Sphinx] for creating the Artemis documentation using [reStructuredText] (RST).
To get started with RST, check out the [Quickstart] or this [cheatsheet].

## Sample Data & Personas
Artemis documentation must use realistic examples and personas and must avoid the use of test data.

Using familiar information in the documentation is crucial because it simplifies the learning process for new users. Real-world scenarios demonstrate to users how to apply specific features within their own context, whereas test data can mislead and fails to reflect real use cases. Realistic examples and personas provide clarity and relevance, ensuring users can effectively understand and utilize Artemis.

Well-defined personas are vital for the development process. They not only help readers to understand the documentation, but also allow developers to better understand Artemis and its users. Many organizations use personas, the two blog posts below contain additional introduction and motivation for the topic:
- [Using Personas During Design and Documentation](https://www.uxmatters.com/mt/archives/2010/10/using-personas-during-design-and-documentation.php)
- [Customer Personas: How to Write Them and Why You Need Them in Agile Software Development](https://community.atlassian.com/t5/App-Central/Customer-Personas-How-to-Write-Them-and-Why-You-Need-Them-in/ba-p/759228)

Screenshots included in Artemis documentation **must** present realistic data. That includes but is not limited to:
- realistic user, course and exercise names
- realistic text passages, like submissions contents and problem statements

Screenshots included in Artemis documentation **must not** present any test data or server information. That includes but is not limited to:
- `Test Server` and `Development` labels
- test user, course and exercise names
- _Lorem ipsum_ and mock text passages, like submissions contents and problem statements
- test server and `localhost` domains

## Documentation Hosting

[Read the Docs] (RtD) hosts the [Artemis documentation] for the `develop` (latest) branch, as well as for
Expand Down
11 changes: 8 additions & 3 deletions docs/user/plagiarism-check.rst
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ We visualized the process in the following diagram.

1. Open the plagiarism cases via:

a. For course exercises: Course Management → Course → Plagiarism Cases.
a. For course exercises: Course Management → Course → Assessment → Plagiarism Cases.
b. For exam exercises: Course Management → Course → Exams → Exam → Plagiarism Cases.

|plagiarism-cases-navigation|
Expand All @@ -145,13 +145,16 @@ We visualized the process in the following diagram.

6. Make a final verdict by selecting one of 3 available options. The final verdict must be approved by clicking 'Confirm' in the dialog.

|verdict-dialog|

a. No plagiarism. The instructor can deem the accusation invalid and resolve the plagiarism case.
b. Warning. The instructor can write a warning message to the student and confirm the verdict in the dialog.
c. Point deduction in % (minimum value 0, maximum 100). Deduct exercise points and confirm the verdict in the dialog.
d. Plagiarism. If a grading key exists, the student receives the :doc:`plagiarism special grade <grading>` for the exam or course that the corresponding exercise belongs to. The next steps must be made manually by contacting responsible persons in the university to mark the student's grade as "Unterschleif".


|verdict-select|

|verdict-dialog|

Students
^^^^^^^^
After the student got a notification that the instructor asked for the statement, he or she has one week to respond. 
Expand Down Expand Up @@ -179,6 +182,8 @@ The process is visualized in the following diagram.
:width: 1000
.. |selected-confirmed-case| image:: plagiarism-check/instructor/selected-confirmed-case.png
:width: 1000
.. |verdict-select| image:: plagiarism-check/instructor/verdict-select.png
:width: 1000
.. |verdict-dialog| image:: plagiarism-check/instructor/point-deduction-verdict.png
:width: 500
.. |student-notification| image:: plagiarism-check/instructor/student-notification.png
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/user/plagiarism-check/instructor/student-notification.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/user/plagiarism-check/results/run-results.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "artemis",
"version": "6.5.4",
"version": "6.6.0",
"description": "Interactive Learning with Individual Feedback",
"private": true,
"license": "MIT",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -249,8 +249,7 @@ private Channel createTutorialGroupChannel(TutorialGroup tutorialGroup) {
private String determineUniqueTutorialGroupChannelName(TutorialGroup tutorialGroup) {
Function<TutorialGroup, String> determineInitialTutorialGroupChannelName = (TutorialGroup tg) -> {
var cleanedTitle = tg.getTitle().replaceAll("\\s", "-").toLowerCase();
// we use $ as prefix to make sure that the channel name is unique (users not allowed to start channel names with $)
return "$" + cleanedTitle.substring(0, Math.min(cleanedTitle.length(), 19));
return "tutorgroup-" + cleanedTitle.substring(0, Math.min(cleanedTitle.length(), 18));
};

var channelName = determineInitialTutorialGroupChannelName.apply(tutorialGroup);
Expand All @@ -260,14 +259,14 @@ private String determineUniqueTutorialGroupChannelName(TutorialGroup tutorialGro

// try to make it unique by adding a random number to the end of the channel name
// if already max length remove the last 3 characters to get some space to try to make it unique
if (channelName.length() == 20) {
channelName = channelName.substring(0, 17);
if (channelName.length() == 30) {
channelName = channelName.substring(0, 27);
}
while (!channelRepository.findChannelByCourseIdAndName(tutorialGroup.getCourse().getId(), channelName).isEmpty() && channelName.length() <= 20) {
while (!channelRepository.findChannelByCourseIdAndName(tutorialGroup.getCourse().getId(), channelName).isEmpty() && channelName.length() <= 30) {
channelName += ThreadLocalRandom.current().nextInt(0, 10);
}

if (channelName.length() > 20) {
if (channelName.length() > 30) {
// very unlikely to happen
throw new IllegalStateException("Could not create a unique channel name for tutorial group with id " + tutorialGroup.getId());
}
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

10 changes: 6 additions & 4 deletions src/main/webapp/app/assessment/assessment-shared.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,17 @@ import { AssessmentHeaderComponent } from './assessment-header/assessment-header
import { AssessmentLayoutComponent } from './assessment-layout/assessment-layout.component';
import { AssessmentComplaintAlertComponent } from './assessment-complaint-alert/assessment-complaint-alert.component';
import { ScoreDisplayComponent } from '../shared/score-display/score-display.component';
import { AssessmentDetailComponent } from './assessment-detail/assessment-detail.component';
import { UnreferencedFeedbackDetailComponent } from 'app/assessment/unreferenced-feedback-detail/unreferenced-feedback-detail.component';
import { ArtemisSharedComponentModule } from 'app/shared/components/shared-component.module';
import { ArtemisComplaintsForTutorModule } from 'app/complaints/complaints-for-tutor/complaints-for-tutor.module';
import { AssessmentLocksComponent } from 'app/assessment/assessment-locks/assessment-locks.component';
import { RouterModule } from '@angular/router';
import { assessmentLocksRoute } from 'app/assessment/assessment-locks/assessment-locks.route';
import { UnreferencedFeedbackComponent } from 'app/exercises/shared/unreferenced-feedback/unreferenced-feedback.component';
import { ArtemisMarkdownModule } from 'app/shared/markdown.module';
import { AssessmentCorrectionRoundBadgeComponent } from 'app/assessment/assessment-detail/assessment-correction-round-badge/assessment-correction-round-badge.component';
import { AssessmentCorrectionRoundBadgeComponent } from 'app/assessment/unreferenced-feedback-detail/assessment-correction-round-badge/assessment-correction-round-badge.component';
import { ArtemisGradingInstructionLinkIconModule } from 'app/shared/grading-instruction-link-icon/grading-instruction-link-icon.module';
import { ArtemisFeedbackModule } from 'app/exercises/shared/feedback/feedback.module';

const ENTITY_STATES = [...assessmentLocksRoute];

Expand All @@ -25,21 +26,22 @@ const ENTITY_STATES = [...assessmentLocksRoute];
RouterModule.forChild(ENTITY_STATES),
ArtemisMarkdownModule,
ArtemisGradingInstructionLinkIconModule,
ArtemisFeedbackModule,
],
declarations: [
AssessmentHeaderComponent,
AssessmentLayoutComponent,
AssessmentComplaintAlertComponent,
ScoreDisplayComponent,
AssessmentDetailComponent,
UnreferencedFeedbackDetailComponent,
AssessmentLocksComponent,
UnreferencedFeedbackComponent,
AssessmentCorrectionRoundBadgeComponent,
],
exports: [
AssessmentLayoutComponent,
ScoreDisplayComponent,
AssessmentDetailComponent,
UnreferencedFeedbackDetailComponent,
AssessmentLocksComponent,
UnreferencedFeedbackComponent,
AssessmentCorrectionRoundBadgeComponent,
Expand Down
22 changes: 19 additions & 3 deletions src/main/webapp/app/assessment/athena.service.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { Injectable } from '@angular/core';
import { HttpClient, HttpResponse } from '@angular/common/http';
import { Observable, of, switchMap } from 'rxjs';
import { TextBlockRef } from 'app/entities/text-block-ref.model';
import { ProfileService } from 'app/shared/layouts/profiles/profile.service';
import { Feedback } from 'app/entities/feedback.model';
import { TextBlockRef } from 'app/entities/text-block-ref.model';

@Injectable({ providedIn: 'root' })
export class AthenaService {
Expand All @@ -13,13 +14,28 @@ export class AthenaService {
private profileService: ProfileService,
) {}

// TODO: The following two functions will be merged in a future PR

/**
* Get feedback suggestions for the given submission from Athena - for programming exercises
* Currently, this is separate for programming and text exercises (will be changed)
*
* @param exerciseId the id of the exercise
* @param submissionId the id of the submission
*/
// eslint-disable-next-line @typescript-eslint/no-unused-vars
getFeedbackSuggestionsForProgramming(exerciseId: number, submissionId: number): Observable<Feedback[]> {
return of([]); // Will be fetched in a future PR
}

/**
* Get feedback suggestions for the given submission from Athena
* Get feedback suggestions for the given submission from Athena - for text exercises
* Currently, this is separate for programming and text exercises (will be changed)
*
* @param exerciseId the id of the exercise
* @param submissionId the id of the submission
*/
getFeedbackSuggestions(exerciseId: number, submissionId: number): Observable<TextBlockRef[]> {
getFeedbackSuggestionsForText(exerciseId: number, submissionId: number): Observable<TextBlockRef[]> {
return this.profileService.getProfileInfo().pipe(
switchMap((profileInfo) => {
if (!profileInfo.activeProfiles.includes('athena')) {
Expand Down
Loading

0 comments on commit db894ac

Please sign in to comment.