From 9ca726b71ee0dc94454cb2c1d42d5afbdbaad2be Mon Sep 17 00:00:00 2001 From: Timur Date: Sun, 2 Mar 2025 17:41:51 +0300 Subject: [PATCH 1/5] make achievement icon imagefield --- .../migrations/0005_alter_achievement_icon.py | 19 +++++++++++++++++++ services/backend/apps/achievement/models.py | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 services/backend/apps/achievement/migrations/0005_alter_achievement_icon.py diff --git a/services/backend/apps/achievement/migrations/0005_alter_achievement_icon.py b/services/backend/apps/achievement/migrations/0005_alter_achievement_icon.py new file mode 100644 index 0000000..7ed0851 --- /dev/null +++ b/services/backend/apps/achievement/migrations/0005_alter_achievement_icon.py @@ -0,0 +1,19 @@ +# Generated by Django 5.1.6 on 2025-03-02 14:03 + +import apps.achievement.models +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('achievement', '0003_remove_achievement_need_count_and_more_squashed_0004_alter_achievement_slug'), + ] + + operations = [ + migrations.AlterField( + model_name='achievement', + name='icon', + field=models.ImageField(upload_to=apps.achievement.models.Achievement.image_url_upload_to, verbose_name='иконка достижения'), + ), + ] diff --git a/services/backend/apps/achievement/models.py b/services/backend/apps/achievement/models.py index 2c7724f..292598f 100644 --- a/services/backend/apps/achievement/models.py +++ b/services/backend/apps/achievement/models.py @@ -14,7 +14,7 @@ class Achievement(BaseModel): max_length=30, verbose_name="название", unique=True ) description = models.TextField(verbose_name="описание") - icon = models.FileField( + icon = models.ImageField( verbose_name="иконка достижения", upload_to=image_url_upload_to, ) From 640f99dc80ce21a5f2c5a62252f72205e57cd291 Mon Sep 17 00:00:00 2001 From: Timur Date: Sun, 2 Mar 2025 19:18:10 +0300 Subject: [PATCH 2/5] make core path plural at competitions --- services/backend/api/v1/competition/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/backend/api/v1/competition/views.py b/services/backend/api/v1/competition/views.py index 1f7eb77..4dacad9 100644 --- a/services/backend/api/v1/competition/views.py +++ b/services/backend/api/v1/competition/views.py @@ -13,7 +13,7 @@ router = Router(tags=["competition"]) @router.get( - "competition/{competition_id}", + "competitions/{competition_id}", response={ status.OK: schemas.CompetitionOut, status.BAD_REQUEST: global_schemas.BadRequestError, From a48dc934c15037b80df237c1d4f7b43c598e3bd4 Mon Sep 17 00:00:00 2001 From: Timur Date: Sun, 2 Mar 2025 19:18:31 +0300 Subject: [PATCH 3/5] make user path names plural --- services/backend/api/v1/user/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/backend/api/v1/user/views.py b/services/backend/api/v1/user/views.py index c9fad87..2b9cdbe 100644 --- a/services/backend/api/v1/user/views.py +++ b/services/backend/api/v1/user/views.py @@ -75,7 +75,7 @@ def get_me(request): @router.get( - path="/user/{user_id}", + path="/users/{user_id}", response={ status.OK: UserSchema, status.BAD_REQUEST: BadRequestError, From d042b9c469fde35bc08ae1fd038fad96cbfdc1d2 Mon Sep 17 00:00:00 2001 From: rngsurrounded Date: Mon, 3 Mar 2025 02:12:11 +0900 Subject: [PATCH 4/5] minor fix --- services/frontend/src/shared/api/competitions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/frontend/src/shared/api/competitions.ts b/services/frontend/src/shared/api/competitions.ts index 8c47564..eea1533 100644 --- a/services/frontend/src/shared/api/competitions.ts +++ b/services/frontend/src/shared/api/competitions.ts @@ -10,7 +10,7 @@ export const getCompetitions = async (participating?: boolean) => { }; export const getCompetition = async (id: string) => { - return await userFetch(`/competition/${id}`); + return await userFetch(`/competitions/${id}`); }; export const startCompetition = async (competitionId: string) => { From 17858f1e4584de8f6a8b14b77d555454908873f3 Mon Sep 17 00:00:00 2001 From: rngsurrounded Date: Mon, 3 Mar 2025 02:28:25 +0900 Subject: [PATCH 5/5] fixed different input types --- .../modules/TaskSolution/index.tsx | 2 +- services/frontend/src/shared/api/session.ts | 22 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/index.tsx b/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/index.tsx index afe22d4..ea0c35c 100644 --- a/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/index.tsx +++ b/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/index.tsx @@ -43,7 +43,7 @@ const TaskSolution: React.FC = ({ setIsHistoryOpen(true); }; - const latestSolution = solutionHistory && solutionHistory.length > 0 ? solutionHistory[0] : null; + const latestSolution = solutionHistory && solutionHistory.length > 0 ? solutionHistory[solutionHistory.length - 1] : null; return (
diff --git a/services/frontend/src/shared/api/session.ts b/services/frontend/src/shared/api/session.ts index 6cfe8f2..4a04dc4 100644 --- a/services/frontend/src/shared/api/session.ts +++ b/services/frontend/src/shared/api/session.ts @@ -20,18 +20,18 @@ export const submitTaskSolution = async ( solution: string | File ) => { const endpoint = `/competitions/${competitionId}/tasks/${taskId}/submit`; + const formData = new FormData(); + + // туповатый костыль но для мвп сойдет if (typeof solution === 'string') { - return await userFetch(endpoint, { - method: 'POST', - body: { content: solution } - }); + const textFile = new File([solution], 'solution.txt', { type: 'text/plain' }); + formData.append('content', textFile); } else { - const formData = new FormData(); - formData.append('content', solution); - - return await userFetch(endpoint, { - method: 'POST', - body: formData - }); + formData.append('content', solution); } + + return await userFetch(endpoint, { + method: 'POST', + body: formData + }); }; \ No newline at end of file