Skip to content
Snippets Groups Projects
Commit 3979c895 authored by michael.minelli's avatar michael.minelli
Browse files

Merge branch 'add-missing-corrections-possibility' into v4.1.0

parents 49329120 3ed58df5
No related branches found
No related tags found
No related merge requests found
Pipeline #32312 failed
import CommanderCommand from '../../../CommanderCommand.js'; import CommanderCommand from '../../../CommanderCommand.js';
import AssignmentCorrectionLinkCommand from './subcommands/AssignmentCorrectionLinkCommand.js'; import AssignmentCorrectionLinkCommand from './subcommands/AssignmentCorrectionLinkCommand.js';
import AssignmentCorrectionUpdateCommand from './subcommands/AssignmentCorrectionUpdateCommand.js'; import AssignmentCorrectionUpdateCommand from './subcommands/AssignmentCorrectionUpdateCommand.js';
import AssignmentCorrectionUnlinkCommand from './subcommands/AssignmentCorrectionUnlinkCommand.js';
class AssignmentCorrectionCommand extends CommanderCommand { class AssignmentCorrectionCommand extends CommanderCommand {
...@@ -14,6 +15,7 @@ class AssignmentCorrectionCommand extends CommanderCommand { ...@@ -14,6 +15,7 @@ class AssignmentCorrectionCommand extends CommanderCommand {
protected defineSubCommands() { protected defineSubCommands() {
AssignmentCorrectionLinkCommand.registerOnCommand(this.command); AssignmentCorrectionLinkCommand.registerOnCommand(this.command);
AssignmentCorrectionUpdateCommand.registerOnCommand(this.command); AssignmentCorrectionUpdateCommand.registerOnCommand(this.command);
AssignmentCorrectionUnlinkCommand.registerOnCommand(this.command);
} }
protected async commandAction(): Promise<void> { protected async commandAction(): Promise<void> {
......
...@@ -14,12 +14,22 @@ abstract class AssignmentCorrectionLinkUpdateCommand extends CommanderCommand { ...@@ -14,12 +14,22 @@ abstract class AssignmentCorrectionLinkUpdateCommand extends CommanderCommand {
.description(this.isUpdate ? 'update a correction of an assignment' : 'link an exercise repo as a correction for an assignment') .description(this.isUpdate ? 'update a correction of an assignment' : 'link an exercise repo as a correction for an assignment')
.argument('<string>', 'id or url of the exercise that is the correction') .argument('<string>', 'id or url of the exercise that is the correction')
.requiredOption('-a, --assignment <string>', 'id or url of the assignment of the correction') .requiredOption('-a, --assignment <string>', 'id or url of the assignment of the correction')
.option('-c, --commit <string>', 'specific commit to link as correction (default: last commit)')
.option('-d, --description <string>', 'description of the correction (limited to 80 characters, default: empty)')
.action(this.commandAction.bind(this)); .action(this.commandAction.bind(this));
} }
protected async commandAction(exerciseIdOrUrl: string, options: { assignment: string }): Promise<void> { protected async commandAction(exerciseIdOrUrl: string, options: { assignment: string, commit?: string, description?: string }): Promise<void> {
let assignment!: Assignment | undefined; let assignment!: Assignment | undefined;
// Check requirements
{
if ( options.description && options.description.length > 80 ) {
ora('Description is limited to 80 characters').start().fail();
return;
}
}
// Check access // Check access
{ {
console.log(TextStyle.BLOCK('Please wait while we check access...')); console.log(TextStyle.BLOCK('Please wait while we check access...'));
...@@ -53,7 +63,7 @@ abstract class AssignmentCorrectionLinkUpdateCommand extends CommanderCommand { ...@@ -53,7 +63,7 @@ abstract class AssignmentCorrectionLinkUpdateCommand extends CommanderCommand {
{ {
console.log(TextStyle.BLOCK('Please wait while we link the exercise...')); console.log(TextStyle.BLOCK('Please wait while we link the exercise...'));
await DojoBackendManager.linkUpdateCorrection(exerciseIdOrUrl, assignment, this.isUpdate); await DojoBackendManager.linkUpdateCorrection(exerciseIdOrUrl, assignment, options.commit, options.description, this.isUpdate);
} }
} }
} }
......
import Assignment from '../../../../../sharedByClients/models/Assignment.js';
import ora from 'ora';
import TextStyle from '../../../../../types/TextStyle.js';
import DojoBackendManager from '../../../../../managers/DojoBackendManager.js';
import SessionManager from '../../../../../managers/SessionManager.js';
import CommanderCommand from '../../../../CommanderCommand.js';
class AssignmentCorrectionLinkCommand extends CommanderCommand {
protected commandName: string = 'unlink';
protected defineCommand() {
this.command
.description('remove a correction of an assignment')
.argument('<string>', 'id or url of the exercise that is the correction')
.requiredOption('-a, --assignment <string>', 'id or url of the assignment of the correction')
.action(this.commandAction.bind(this));
}
protected async commandAction(exerciseIdOrUrl: string, options: { assignment: string }): Promise<void> {
let assignment!: Assignment | undefined;
// Check access
{
console.log(TextStyle.BLOCK('Please wait while we check access...'));
const assignmentGetSpinner: ora.Ora = ora('Checking if assignment exists').start();
assignment = await DojoBackendManager.getAssignment(options.assignment);
if ( !assignment ) {
assignmentGetSpinner.fail(`The assignment doesn't exists`);
return;
}
assignmentGetSpinner.succeed(`The assignment exists`);
const assignmentAccessSpinner: ora.Ora = ora('Checking assignment access').start();
if ( assignment.staff.find(staff => staff.id === SessionManager.profile?.id) === undefined ) {
assignmentAccessSpinner.fail(`You are not in the staff of the assignment`);
return;
}
assignmentAccessSpinner.succeed(`You are in the staff of the assignment`);
}
// Link the exercise
{
console.log(TextStyle.BLOCK('Please wait while we unlink the exercise...'));
await DojoBackendManager.unlinkCorrection(exerciseIdOrUrl, assignment);
}
}
}
export default new AssignmentCorrectionLinkCommand();
\ No newline at end of file
...@@ -39,8 +39,10 @@ class ExerciseCorrectionCommand extends CommanderCommand { ...@@ -39,8 +39,10 @@ class ExerciseCorrectionCommand extends CommanderCommand {
private getCorrections(assignment: Assignment): Array<CorrectionResume> { private getCorrections(assignment: Assignment): Array<CorrectionResume> {
return assignment.corrections.map(correction => { return assignment.corrections.map(correction => {
const authors = correction.name.replace(correction.assignmentName, '').split('-')[2].trim();
return { return {
name : correction.name.replace(correction.assignmentName, '').split('-')[2].trim(), name : (correction.correctionDescription && correction.correctionDescription != '' ? `${ correction.correctionDescription } (${ authors })` : authors),
value: correction.correctionCommit?.web_url?.replace('/commit/', '/tree/') ?? '' value: correction.correctionCommit?.web_url?.replace('/commit/', '/tree/') ?? ''
}; };
}); });
......
...@@ -193,7 +193,7 @@ class DojoBackendManager { ...@@ -193,7 +193,7 @@ class DojoBackendManager {
} }
} }
public async linkUpdateCorrection(exerciseIdOrUrl: string, assignment: Assignment, isUpdate: boolean, verbose: boolean = true): Promise<boolean> { public async linkUpdateCorrection(exerciseIdOrUrl: string, assignment: Assignment, commit: string | undefined, description: string | undefined, isUpdate: boolean, verbose: boolean = true): Promise<boolean> {
const spinner: ora.Ora = ora(`${ isUpdate ? 'Updating' : 'Linking' } correction`); const spinner: ora.Ora = ora(`${ isUpdate ? 'Updating' : 'Linking' } correction`);
if ( verbose ) { if ( verbose ) {
...@@ -202,13 +202,15 @@ class DojoBackendManager { ...@@ -202,13 +202,15 @@ class DojoBackendManager {
try { try {
const axiosFunction = isUpdate ? axios.patch.bind(axios) : axios.post.bind(axios); const axiosFunction = isUpdate ? axios.patch.bind(axios) : axios.post.bind(axios);
const route = isUpdate ? ApiRoute.ASSIGNMENT_CORRECTION_UPDATE : ApiRoute.ASSIGNMENT_CORRECTION_LINK; const route = isUpdate ? ApiRoute.ASSIGNMENT_CORRECTION_UPDATE_DELETE : ApiRoute.ASSIGNMENT_CORRECTION_LINK;
await axiosFunction(DojoBackendHelper.getApiUrl(route, { await axiosFunction(DojoBackendHelper.getApiUrl(route, {
assignmentNameOrUrl: assignment.name, assignmentNameOrUrl: assignment.name,
exerciseIdOrUrl : exerciseIdOrUrl exerciseIdOrUrl : exerciseIdOrUrl
}), { }), {
exerciseIdOrUrl: exerciseIdOrUrl exerciseIdOrUrl: exerciseIdOrUrl,
commit : commit,
description : description
}); });
if ( verbose ) { if ( verbose ) {
...@@ -222,6 +224,31 @@ class DojoBackendManager { ...@@ -222,6 +224,31 @@ class DojoBackendManager {
return false; return false;
} }
} }
public async unlinkCorrection(exerciseIdOrUrl: string, assignment: Assignment, verbose: boolean = true): Promise<boolean> {
const spinner: ora.Ora = ora(`Unlinking correction`);
if ( verbose ) {
spinner.start();
}
try {
await axios.delete(DojoBackendHelper.getApiUrl(ApiRoute.ASSIGNMENT_CORRECTION_UPDATE_DELETE, {
assignmentNameOrUrl: assignment.name,
exerciseIdOrUrl : exerciseIdOrUrl
}));
if ( verbose ) {
spinner.succeed(`Correction unlinked`);
}
return true;
} catch ( error ) {
this.handleApiError(error, spinner, verbose, `Correction unlink error: ${ error }`);
return false;
}
}
} }
......
Subproject commit 4011aa146ae4b808da599b8eb0cca2d36e82a52c Subproject commit 5bbb2606d4aecdd9d54d91ffdd53c87a2c983916
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment