Skip to content

Commit 0d01d9b

Browse files
authored
Добавление автоматических критериев (#669)
* Add deadline criteria * Refine deadline criterion scoring * Fix homework task saving and deadline criteria UI * Fix deadline criterion arguments validation * Update deadline criterion UI * Revert "Update deadline criterion UI" This reverts commit 5517db1. * Update deadline criterion menu item * Refine deadline criterion date field * Refine deadline criteria display * Separate deadline penalty label * Refine deadline criteria rating * Refine deadline criteria comment table * Space deadline status in comment table * Update auto criterion badge styling * Refine deadline criterion penalty input * Remove auto badge from criteria list * Refine solution criteria deadline display * Improve deadline criteria comment formatting * Fix deadline criterion rating comment * Allow task points editing for auto criteria * Revert unrelated package lock changes * Disable rating until criteria are filled * Group criteria rendering by type * Remove criteria arguments startup patch
1 parent 6089dc3 commit 0d01d9b

12 files changed

Lines changed: 708 additions & 269 deletions

File tree

HwProj.Common/HwProj.Models/CoursesService/ViewModels/CriterionViewModel.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ namespace HwProj.Models.CoursesService.ViewModels
44
{
55
public enum CriterionType
66
{
7-
Free = 0
7+
Free = 0,
8+
Deadline = 1
89
}
910

1011
public class CriterionViewModel
@@ -13,5 +14,6 @@ public class CriterionViewModel
1314
public CriterionType Type { get; set; }
1415
[Required] public string Name { get; set; } = null!;
1516
[Range(0, int.MaxValue)] public int MaxPoints { get; set; }
17+
public string? Arguments { get; set; }
1618
}
1719
}

HwProj.CoursesService/HwProj.CoursesService.API/Domains/MappingExtensions.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ public static HomeworkTaskViewModel ToHomeworkTaskViewModel(this HomeworkTask ta
6464
Id = c.Id,
6565
Type = (CriterionType)c.Type,
6666
Name = c.Name,
67-
MaxPoints = c.MaxPoints
67+
MaxPoints = c.MaxPoints,
68+
Arguments = c.Arguments
6869
})
6970
.ToList(),
7071
};
@@ -120,7 +121,8 @@ public static CoursePreview ToCoursePreview(this Course course)
120121
Id = criterion.Id,
121122
Type = (Models.CriterionType)criterion.Type,
122123
Name = criterion.Name,
123-
MaxPoints = criterion.MaxPoints
124+
MaxPoints = criterion.MaxPoints,
125+
Arguments = criterion.Arguments
124126
};
125127

126128
public static HomeworkTask ToHomeworkTask(this PostTaskViewModel postTaskViewModel)

HwProj.CoursesService/HwProj.CoursesService.API/Migrations/20260427093000_CriterionArguments.Designer.cs

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using Microsoft.EntityFrameworkCore.Migrations;
2+
3+
#nullable disable
4+
5+
namespace HwProj.CoursesService.API.Migrations
6+
{
7+
public partial class CriterionArguments : Migration
8+
{
9+
protected override void Up(MigrationBuilder migrationBuilder)
10+
{
11+
migrationBuilder.AddColumn<string>(
12+
name: "Arguments",
13+
table: "Criteria",
14+
type: "nvarchar(max)",
15+
nullable: true);
16+
}
17+
18+
protected override void Down(MigrationBuilder migrationBuilder)
19+
{
20+
migrationBuilder.DropColumn(
21+
name: "Arguments",
22+
table: "Criteria");
23+
}
24+
}
25+
}

HwProj.CoursesService/HwProj.CoursesService.API/Migrations/CourseContextModelSnapshot.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,9 @@ protected override void BuildModel(ModelBuilder modelBuilder)
128128
b.Property<int>("MaxPoints")
129129
.HasColumnType("int");
130130

131+
b.Property<string>("Arguments")
132+
.HasColumnType("nvarchar(max)");
133+
131134
b.Property<string>("Name")
132135
.HasColumnType("nvarchar(max)");
133136

HwProj.CoursesService/HwProj.CoursesService.API/Models/Criterion.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ namespace HwProj.CoursesService.API.Models
55
{
66
public enum CriterionType
77
{
8-
Free = 0
8+
Free = 0,
9+
Deadline = 1
910
}
1011

1112
public class Criterion : IEntity<long>
@@ -17,5 +18,6 @@ public class Criterion : IEntity<long>
1718
public CriterionType Type { get; set; }
1819
public string Name { get; set; }
1920
public int MaxPoints { get; set; }
21+
public string? Arguments { get; set; }
2022
}
2123
}

HwProj.CoursesService/HwProj.CoursesService.API/Repositories/TasksRepository.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,11 @@ public bool Equals(Criterion? x, Criterion? y)
8989
x.TaskId == y.TaskId &&
9090
x.Type == y.Type &&
9191
x.Name == y.Name &&
92-
x.MaxPoints == y.MaxPoints;
92+
x.MaxPoints == y.MaxPoints &&
93+
x.Arguments == y.Arguments;
9394
}
9495

95-
public int GetHashCode(Criterion obj) => HashCode.Combine(obj.Id, obj.TaskId, obj.Name);
96+
public int GetHashCode(Criterion obj) => HashCode.Combine(obj.Id, obj.TaskId, obj.Name, obj.Arguments);
9697
}
9798
}
9899
}

hwproj.front/src/api/api.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -655,7 +655,8 @@ export interface CreateHomeworkViewModel {
655655
* @enum {string}
656656
*/
657657
export enum CriterionType {
658-
NUMBER_0 = <any> 0
658+
NUMBER_0 = <any> 0,
659+
NUMBER_1 = <any> 1
659660
}
660661
/**
661662
*
@@ -687,6 +688,12 @@ export interface CriterionViewModel {
687688
* @memberof CriterionViewModel
688689
*/
689690
maxPoints?: number;
691+
/**
692+
*
693+
* @type {string}
694+
* @memberof CriterionViewModel
695+
*/
696+
arguments?: string;
690697
}
691698
/**
692699
*

hwproj.front/src/components/Homeworks/CourseHomeworkExperimental.tsx

Lines changed: 50 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ import {FilesHandler} from "@/components/Files/FilesHandler";
4343
import GroupSelector from "../Common/GroupSelector";
4444
import GroupIcon from '@mui/icons-material/Group';
4545
import AssignmentIcon from '@mui/icons-material/Assignment';
46+
import ErrorsHandler from "@/components/Utils/ErrorsHandler";
47+
import {enqueueSnackbar} from "notistack";
4648

4749
export interface HomeworkAndFilesInfo {
4850
homework: HomeworkViewModel & { isModified?: boolean },
@@ -243,43 +245,54 @@ const CourseHomeworkEditor: FC<{
243245
e.preventDefault()
244246
setHandleSubmitLoading(true)
245247

246-
const update = {
247-
homeworkId: homeworkId,
248-
title: title!,
249-
description: description,
250-
tags: tags,
251-
hasDeadline: metadata.hasDeadline,
252-
deadlineDate: metadata.deadlineDate,
253-
isDeadlineStrict: metadata.isDeadlineStrict,
254-
publicationDate: metadata.publicationDate,
255-
groupId: selectedGroupId,
256-
actionOptions: editOptions,
257-
tasks: isNewHomework ? homework.tasks!.map(t => {
258-
const task: PostTaskViewModel = {
259-
...t,
260-
title: t.title!,
261-
maxRating: t.maxRating!
262-
}
263-
return task
264-
}) : []
265-
}
248+
try {
249+
const update = {
250+
homeworkId: homeworkId,
251+
title: title!,
252+
description: description,
253+
tags: tags,
254+
hasDeadline: metadata.hasDeadline,
255+
deadlineDate: metadata.deadlineDate,
256+
isDeadlineStrict: metadata.isDeadlineStrict,
257+
publicationDate: metadata.publicationDate,
258+
groupId: selectedGroupId,
259+
actionOptions: editOptions,
260+
tasks: isNewHomework ? homework.tasks!.map(t => {
261+
const task: PostTaskViewModel = {
262+
...t,
263+
title: t.title!,
264+
maxRating: t.maxRating!,
265+
criteria: t.criteria || []
266+
}
267+
return task
268+
}) : []
269+
}
266270

267-
const updatedHomework = isNewHomework
268-
? await ApiSingleton.homeworksApi.homeworksAddHomework(courseId!, update)
269-
: await ApiSingleton.homeworksApi.homeworksUpdateHomework(+homeworkId!, update)
270-
271-
const updatedHomeworkId = updatedHomework.value!.id!
272-
await handleFilesChange(
273-
courseId, CourseUnitType.Homework, updatedHomeworkId,
274-
props.onStartProcessing,
275-
() => {
276-
if (isNewHomework) props.onUpdate({
277-
homework: update,
278-
isDeleted: true
279-
}) // remove fake homework
280-
props.onUpdate({homework: updatedHomework.value!, isSaved: true});
281-
},
282-
);
271+
const updatedHomework = isNewHomework
272+
? await ApiSingleton.homeworksApi.homeworksAddHomework(courseId!, update)
273+
: await ApiSingleton.homeworksApi.homeworksUpdateHomework(+homeworkId!, update)
274+
275+
const updatedHomeworkId = updatedHomework.value!.id!
276+
await handleFilesChange(
277+
courseId, CourseUnitType.Homework, updatedHomeworkId,
278+
props.onStartProcessing,
279+
() => {
280+
if (isNewHomework) props.onUpdate({
281+
homework: update,
282+
isDeleted: true
283+
}) // remove fake homework
284+
props.onUpdate({homework: updatedHomework.value!, isSaved: true});
285+
},
286+
);
287+
} catch (error) {
288+
const errors = await ErrorsHandler.getErrorMessages(error as Response, "errors");
289+
enqueueSnackbar(errors[0] || "Не удалось сохранить задание", {
290+
variant: "error",
291+
autoHideDuration: 4000,
292+
});
293+
} finally {
294+
setHandleSubmitLoading(false)
295+
}
283296
}
284297

285298
const isDisabled = hasErrors || !isLoaded || taskHasErrors
@@ -569,4 +582,4 @@ const CourseHomeworkExperimental: FC<{
569582
}
570583
</CardContent>
571584
}
572-
export default CourseHomeworkExperimental;
585+
export default CourseHomeworkExperimental;

0 commit comments

Comments
 (0)