From e400e4636063b250369c84ff3a45aace57aeaf0e Mon Sep 17 00:00:00 2001 From: ITQ Date: Tue, 4 Mar 2025 02:04:11 +0300 Subject: [PATCH 01/27] (scope): [body] [footer(s)] --- ...alter_competitiontaskattachment_bind_at.py | 19 +++++++++++++++++++ services/backend/scripts/initdb | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 services/backend/apps/task/migrations/0004_alter_competitiontaskattachment_bind_at.py diff --git a/services/backend/apps/task/migrations/0004_alter_competitiontaskattachment_bind_at.py b/services/backend/apps/task/migrations/0004_alter_competitiontaskattachment_bind_at.py new file mode 100644 index 0000000..70dea88 --- /dev/null +++ b/services/backend/apps/task/migrations/0004_alter_competitiontaskattachment_bind_at.py @@ -0,0 +1,19 @@ +# Generated by Django 5.1.6 on 2025-03-03 23:02 + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('task', '0003_alter_competitiontaskattachment_task'), + ] + + operations = [ + migrations.AlterField( + model_name='competitiontaskattachment', + name='bind_at', + field=models.CharField(max_length=255, validators=[django.core.validators.RegexValidator('^(?:[a-zA-Z]:\\\\(?:[^<>:\\"\\/\\\\|?*]*\\\\)*|/(?:[^<>:\\"\\/\\\\|?*]+/?)*)$', message='Введите абсолютный путь до папки')], verbose_name='путь сохранения'), + ), + ] diff --git a/services/backend/scripts/initdb b/services/backend/scripts/initdb index 146732a..7714b7c 100755 --- a/services/backend/scripts/initdb +++ b/services/backend/scripts/initdb @@ -10,4 +10,4 @@ if [ "$DJANGO_CREATE_SUPERUSER" = "True" ]; then python manage.py createsuperuser --noinput --username "$DJANGO_SUPERUSER_USERNAME" --email "$DJANGO_SUPERUSER_EMAIL" || true fi -python manage.py init_achievments \ No newline at end of file +python manage.py init_achievments From 2c6c0d2dc050a212bf0ee845e8cad2bcd402f825 Mon Sep 17 00:00:00 2001 From: ITQ Date: Tue, 4 Mar 2025 02:09:04 +0300 Subject: [PATCH 02/27] (scope): [body] [footer(s)] --- services/backend/apps/task/tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/backend/apps/task/tasks.py b/services/backend/apps/task/tasks.py index 98d3842..522bf3a 100644 --- a/services/backend/apps/task/tasks.py +++ b/services/backend/apps/task/tasks.py @@ -35,7 +35,7 @@ def analyze_data_task(self, submission_id): "code": base64.b64encode(code).decode("utf-8"), "answer_file_path": submission.task.answer_file_path, "expected_hash": hashlib.sha256( - submission.task.correct_answer_file.read().decode("utf-8") + submission.task.correct_answer_file.read() ).hexdigest(), }, timeout=30, From 0f856060bb0d6c751517da19303da8ac86b59e1b Mon Sep 17 00:00:00 2001 From: Timur Date: Tue, 4 Mar 2025 02:21:03 +0300 Subject: [PATCH 03/27] add position field to competition results --- services/backend/api/v1/task/schemas.py | 1 + services/backend/api/v1/task/views.py | 1 + 2 files changed, 2 insertions(+) diff --git a/services/backend/api/v1/task/schemas.py b/services/backend/api/v1/task/schemas.py index 95f2fb4..ec8d80a 100644 --- a/services/backend/api/v1/task/schemas.py +++ b/services/backend/api/v1/task/schemas.py @@ -68,3 +68,4 @@ class TaskStatusSchema(Schema): task_name: str result: int max_points: int + position: int diff --git a/services/backend/api/v1/task/views.py b/services/backend/api/v1/task/views.py index a0ce64c..6cf535d 100644 --- a/services/backend/api/v1/task/views.py +++ b/services/backend/api/v1/task/views.py @@ -210,6 +210,7 @@ def get_competition_results(request, competition_id: UUID): task_name=task.title, result=result, max_points=task.points, + position=task.in_competition_positions )) return status.OK, data From 82349859b546b32db30f2c3f7b025b2f7b527ef7 Mon Sep 17 00:00:00 2001 From: rngsurrounded Date: Tue, 4 Mar 2025 08:22:06 +0900 Subject: [PATCH 04/27] minor fixes --- .../CompetitionResultModal/index.tsx | 26 +++++++------- .../components/CodeSolution/index.tsx | 34 +++++++++---------- .../modules/TaskSolution/index.tsx | 4 +-- 3 files changed, 33 insertions(+), 31 deletions(-) diff --git a/services/frontend/src/pages/Competition/components/CompetitionResultModal/index.tsx b/services/frontend/src/pages/Competition/components/CompetitionResultModal/index.tsx index b691e77..080d9d6 100644 --- a/services/frontend/src/pages/Competition/components/CompetitionResultModal/index.tsx +++ b/services/frontend/src/pages/Competition/components/CompetitionResultModal/index.tsx @@ -1,4 +1,3 @@ -// src/components/competition/CompetitionResultsModal.tsx import React from 'react'; import { Dialog, @@ -12,7 +11,8 @@ import { Loader2 } from 'lucide-react'; export interface CompetitionResult { task_name: string; result: number; - max_points: number + max_points: number; + position: number; } interface CompetitionResultsModalProps { @@ -111,17 +111,19 @@ export const CompetitionResultsModal: React.FC = ( Произошла ошибка при загрузке результатов ) : results && results.length > 0 ? ( - results.map((result, index) => ( -
-
{result.task_name}
-
- {renderResultValue(result.result, result.max_points)} + [...results] + .sort((a, b) => a.position - b.position) + .map((result, index) => ( +
+
{result.task_name}
+
+ {renderResultValue(result.result, result.max_points)} +
-
- )) + )) ) : (
Нет доступных результатов diff --git a/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/components/CodeSolution/index.tsx b/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/components/CodeSolution/index.tsx index 0b386d2..906d2ac 100644 --- a/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/components/CodeSolution/index.tsx +++ b/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/components/CodeSolution/index.tsx @@ -116,29 +116,29 @@ const CodeSolution: React.FC = ({
-

Ограничения

+

Ограничение ресурсов

  • -
    -
    +
    +
    Максимум 1 посылка в 10 секунд
  • -
    -
    +
    +
    Максимальный размер решения 4MB
  • -
    -
    +
    +
    Максимальное время работы программы 1 минута
  • -
    -
    +
    +
    Выделяется 512MB на решение
  • @@ -146,35 +146,35 @@ const CodeSolution: React.FC = ({
-

Доступные библиотеки

+

Доступные библиотеки

- pandas + pandas 2.2.3
- numpy + numpy 2.2.3
- matplotlib + matplotlib 3.10.1
- scipy + scipy 1.15.2
- scikit-learn + scikit-learn 1.6.1
- seaborn + seaborn 0.13.2
- statsmodels + statsmodels 0.14.4
diff --git a/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/index.tsx b/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/index.tsx index 946939f..919da36 100644 --- a/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/index.tsx +++ b/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/index.tsx @@ -155,10 +155,10 @@ const TaskSolution: React.FC = ({ ? 'bg-blue-50 text-blue-700' : 'bg-red-50 text-red-700'}`} > - {hasSubmissionsLeft ? ( + {maxAttempts === -1 || hasSubmissionsLeft ? ( <> - Осталось посылок: {submissionsLeft === Infinity ? '∞' : submissionsLeft} + Осталось посылок: {maxAttempts === -1 ? '∞' : submissionsLeft} {maxAttempts !== -1 && ( From 7f61bfdfcf74ac12777b21fb8c35f863a70c3493 Mon Sep 17 00:00:00 2001 From: ITQ Date: Tue, 4 Mar 2025 02:25:31 +0300 Subject: [PATCH 05/27] (scope): [body] [footer(s)] --- services/backend/apps/task/tasks.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/backend/apps/task/tasks.py b/services/backend/apps/task/tasks.py index 522bf3a..713a75a 100644 --- a/services/backend/apps/task/tasks.py +++ b/services/backend/apps/task/tasks.py @@ -46,12 +46,12 @@ def analyze_data_task(self, submission_id): submission.stdout.save("output.txt", ContentFile(result["output"])) submission.result = { - "correct": result["correct"], + "correct": result["hash_match"], "hash_match": result["hash_match"], "error": result.get("error"), } submission.earned_points = ( - submission.task.points if result["correct"] else 0 + submission.task.points if result["hash_match"] else 0 ) submission.status = CompetitionTaskSubmission.StatusChoices.CHECKED From db5ffbefbd86fd49d99685e34386e45dbee9c054 Mon Sep 17 00:00:00 2001 From: Timur Date: Tue, 4 Mar 2025 02:27:19 +0300 Subject: [PATCH 06/27] fix results --- services/backend/api/v1/task/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/backend/api/v1/task/views.py b/services/backend/api/v1/task/views.py index 6cf535d..00aa38d 100644 --- a/services/backend/api/v1/task/views.py +++ b/services/backend/api/v1/task/views.py @@ -210,7 +210,7 @@ def get_competition_results(request, competition_id: UUID): task_name=task.title, result=result, max_points=task.points, - position=task.in_competition_positions + position=task.in_competition_position )) return status.OK, data From dfedee35d75e3f95cf26197efbbfe000fef5b216 Mon Sep 17 00:00:00 2001 From: moolcoov Date: Tue, 4 Mar 2025 02:25:45 +0300 Subject: [PATCH 07/27] fix: build --- .../frontend/src/components/layout/header.tsx | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/services/frontend/src/components/layout/header.tsx b/services/frontend/src/components/layout/header.tsx index 3bc9470..fa81356 100644 --- a/services/frontend/src/components/layout/header.tsx +++ b/services/frontend/src/components/layout/header.tsx @@ -28,16 +28,17 @@ export const Header = () => { - +
- Материалы - - + +
); -}; \ No newline at end of file +}; From f13bc03277602ee8a9c74dcb26a9f785577461a6 Mon Sep 17 00:00:00 2001 From: rngsurrounded Date: Tue, 4 Mar 2025 08:33:57 +0900 Subject: [PATCH 08/27] please dont change --- .../frontend/src/components/layout/header.tsx | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/services/frontend/src/components/layout/header.tsx b/services/frontend/src/components/layout/header.tsx index fa81356..3bc9470 100644 --- a/services/frontend/src/components/layout/header.tsx +++ b/services/frontend/src/components/layout/header.tsx @@ -28,17 +28,16 @@ export const Header = () => { - +
- Материалы - - + +
); -}; +}; \ No newline at end of file From 3760180a5e3e462b5d08a93bc856bc03d3abcf07 Mon Sep 17 00:00:00 2001 From: rngsurrounded Date: Tue, 4 Mar 2025 08:36:33 +0900 Subject: [PATCH 09/27] fix --- services/frontend/src/components/layout/header.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/services/frontend/src/components/layout/header.tsx b/services/frontend/src/components/layout/header.tsx index 3bc9470..290d3a3 100644 --- a/services/frontend/src/components/layout/header.tsx +++ b/services/frontend/src/components/layout/header.tsx @@ -30,6 +30,7 @@ export const Header = () => {
+ {/* это переход на ваще другой сервис поэтому не надо линк */} Date: Tue, 4 Mar 2025 08:37:54 +0900 Subject: [PATCH 10/27] fix --- services/frontend/src/components/layout/header.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/frontend/src/components/layout/header.tsx b/services/frontend/src/components/layout/header.tsx index 290d3a3..9638266 100644 --- a/services/frontend/src/components/layout/header.tsx +++ b/services/frontend/src/components/layout/header.tsx @@ -54,11 +54,11 @@ export const Header = () => { From a1ab5ff2382714784610d4f1b2b0bbedc70358a8 Mon Sep 17 00:00:00 2001 From: moolcoov Date: Tue, 4 Mar 2025 02:38:03 +0300 Subject: [PATCH 11/27] feat: jdskdjskd --- services/frontend/src/components/layout/header.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/frontend/src/components/layout/header.tsx b/services/frontend/src/components/layout/header.tsx index fa81356..f5cc631 100644 --- a/services/frontend/src/components/layout/header.tsx +++ b/services/frontend/src/components/layout/header.tsx @@ -54,7 +54,7 @@ export const Header = () => {
- + Материалы From 61053d3681c5ab53c7e5161cd7fe1c7b3961ca40 Mon Sep 17 00:00:00 2001 From: rngsurrounded Date: Tue, 4 Mar 2025 08:45:29 +0900 Subject: [PATCH 12/27] minor fixes --- services/frontend/src/components/layout/header.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/services/frontend/src/components/layout/header.tsx b/services/frontend/src/components/layout/header.tsx index 9638266..fd6d5af 100644 --- a/services/frontend/src/components/layout/header.tsx +++ b/services/frontend/src/components/layout/header.tsx @@ -30,14 +30,14 @@ export const Header = () => {
- {/* это переход на ваще другой сервис поэтому не надо линк */} - Материалы - + @@ -54,11 +54,11 @@ export const Header = () => { From aec550ac9ea53a65cef2cebc3e102ec77e6ce058 Mon Sep 17 00:00:00 2001 From: moolcoov Date: Tue, 4 Mar 2025 03:00:18 +0300 Subject: [PATCH 13/27] =?UTF-8?q?=D0=B0=D1=83=D1=84=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- services/frontend/public/lottie.png | Bin 0 -> 33729 bytes .../src/pages/Profile/widgets/user-info.tsx | 17 ++++++++--------- 2 files changed, 8 insertions(+), 9 deletions(-) create mode 100644 services/frontend/public/lottie.png diff --git a/services/frontend/public/lottie.png b/services/frontend/public/lottie.png new file mode 100644 index 0000000000000000000000000000000000000000..e2f59b6b18d6d87c2a56a098f6a776e417b1758a GIT binary patch literal 33729 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 Qco=}d)78&qol`;+03*ICM*si- literal 0 HcmV?d00001 diff --git a/services/frontend/src/pages/Profile/widgets/user-info.tsx b/services/frontend/src/pages/Profile/widgets/user-info.tsx index e0ddc94..3e025fd 100644 --- a/services/frontend/src/pages/Profile/widgets/user-info.tsx +++ b/services/frontend/src/pages/Profile/widgets/user-info.tsx @@ -3,15 +3,14 @@ import { User } from "@/shared/types/user"; export const UserInfo = ({ user }: { user: User }) => { return (
- {user.avatar && ( -
- {user.username} -
- )} +
+ {user.username} +
+

{user.username}

{user.email}

From e591a08a4e2480a6caf9cce11ed6efcefe0da25b Mon Sep 17 00:00:00 2001 From: rngsurrounded Date: Tue, 4 Mar 2025 09:00:52 +0900 Subject: [PATCH 14/27] cool and easy filename fix --- .../modules/TaskSolution/components/FileSolution/index.tsx | 6 +++++- .../frontend/src/pages/Review/modules/review-dialog.tsx | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/components/FileSolution/index.tsx b/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/components/FileSolution/index.tsx index 992f117..0e9db9e 100644 --- a/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/components/FileSolution/index.tsx +++ b/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/components/FileSolution/index.tsx @@ -60,11 +60,15 @@ const FileSolution: React.FC = ({ }; - const fileName = selectedFile + const fullFileName = selectedFile ? selectedFile.name : existingFileUrl ? existingFileUrl.split('/').pop() || 'file' : ''; + + const fileName = fullFileName.length > 20 + ? fullFileName.substring(0, 20) + '...' + : fullFileName; const hasFile = !!selectedFile || !!existingFileUrl; diff --git a/services/frontend/src/pages/Review/modules/review-dialog.tsx b/services/frontend/src/pages/Review/modules/review-dialog.tsx index 59e7402..9ef4c42 100644 --- a/services/frontend/src/pages/Review/modules/review-dialog.tsx +++ b/services/frontend/src/pages/Review/modules/review-dialog.tsx @@ -148,7 +148,12 @@ const ReviewDescription = ({ review }: { review: Review }) => { const ReviewContent = ({ review }: { review: Review }) => { const extension = review.content.split(".").at(-1); - const filename = review.content.split("/").at(-1); + const fullFilename = review.content.split("/").at(-1); + + const filename = fullFilename ? + (fullFilename.length > 20 ? fullFilename.substring(0, 20) + '...' : fullFilename) + : ''; + const { data: content, isLoading } = useQuery({ queryKey: ["review-file", review.id], From 19e82cb9ca5d3070e437b0260bc688a2eff34fad Mon Sep 17 00:00:00 2001 From: ITQ Date: Tue, 4 Mar 2025 03:12:11 +0300 Subject: [PATCH 15/27] (scope): [body] [footer(s)] --- services/backend/apps/task/tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/backend/apps/task/tasks.py b/services/backend/apps/task/tasks.py index 713a75a..9d8ad4c 100644 --- a/services/backend/apps/task/tasks.py +++ b/services/backend/apps/task/tasks.py @@ -32,7 +32,7 @@ def analyze_data_task(self, submission_id): f"{settings.CHECKER_API_ENDPOINT}/execute", json={ "files": files, - "code": base64.b64encode(code).decode("utf-8"), + "code": base64.b64encode(code.encode("utf-8")).decode("utf-8"), "answer_file_path": submission.task.answer_file_path, "expected_hash": hashlib.sha256( submission.task.correct_answer_file.read() From afccac6928d97b43b3c3064d20582cfe0dc7ab2f Mon Sep 17 00:00:00 2001 From: ITQ Date: Tue, 4 Mar 2025 03:25:51 +0300 Subject: [PATCH 16/27] (scope): [body] [footer(s)] --- services/backend/apps/task/tasks.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/services/backend/apps/task/tasks.py b/services/backend/apps/task/tasks.py index 9d8ad4c..a0aaf5b 100644 --- a/services/backend/apps/task/tasks.py +++ b/services/backend/apps/task/tasks.py @@ -28,11 +28,16 @@ def analyze_data_task(self, submission_id): ) ] + print( + hashlib.sha256( + submission.task.correct_answer_file.read() + ).hexdigest() + ) response = httpx.post( f"{settings.CHECKER_API_ENDPOINT}/execute", json={ "files": files, - "code": base64.b64encode(code.encode("utf-8")).decode("utf-8"), + "code": base64.b64encode(code).decode("utf-8"), "answer_file_path": submission.task.answer_file_path, "expected_hash": hashlib.sha256( submission.task.correct_answer_file.read() From 7aca5b7bd10baec4e42cfad1551748abc73951e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20=D0=A1=D1=83=D0=BC?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Tue, 4 Mar 2025 00:36:36 +0000 Subject: [PATCH 17/27] Update file CREDENTIALS.md --- CREDENTIALS.md | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 CREDENTIALS.md diff --git a/CREDENTIALS.md b/CREDENTIALS.md new file mode 100644 index 0000000..1a78f99 --- /dev/null +++ b/CREDENTIALS.md @@ -0,0 +1,79 @@ +# Креды для DATARUSH + +Найдите номер набора на вашей карточке(слева вверху) +#### Администратор + - Логин: `admin` + - Пароль: `prooooooood` + - Ссылка: clck.ru/3GkMoo +### Набор 1 +#### Участник +- Почта: germanivanov1984@gmail.com +- Пароль: `password123!` +#### Ревьювер +Ссылка: clck.ru/3Gjrtg +### Набор 2 +#### Участник +- Почта: dreamonovich@gmail.com +- Пароль: `password123!` +#### Ревьювер +Ссылка: clck.ru/3Gjs9y +### Набор 3 +#### Участник +- Почта: alisa.kuznetsova@gmail.com +- Пароль: `password123!` +#### Ревьювер +Ссылка: clck.ru/3GjsDq +### Набор 4 +#### Участник +- Почта: ivan.petrov@gmail.com +- Пароль: `password123!` +#### Ревьювер +Ссылка: clck.ru/3GjsK3 +### Набор 5 +#### Участник +- Почта: olga.sidorova@gmail.com +- Пароль: `password123!` +#### Ревьювер +Ссылка: clck.ru/3Gjrtg +### Набор 6 +#### Участник +- Почта: karim@gmail.com +- Пароль: `password123!` +#### Ревьювер +Ссылка: clck.ru/3Gjsa3 +### Набор 7 +#### Участник +- Почта: noble@gmail.com +- Пароль: `password123!` +#### Ревьювер +Ссылка: clck.ru/3Gjsq2 +### Набор 8 +#### Участник +- Почта: koller@gmail.com +- Пароль: `password123!` +#### Ревьювер +Ссылка: clck.ru/3Gjt7n +### Набор 9 +#### Участник +- Почта: gold_checker@gmail.com +- Пароль: `password123!` +#### Ревьювер +Ссылка: clck.ru/3GjtBp +### Набор 10 +#### Участник +- Почта: looka@gmail.com +- Пароль: `password123!` +#### Ревьювер +Ссылка: clck.ru/3GjtLv +### Набор 11 +#### Участник +- Почта: danil_malikov@gmail.com +- Пароль: `password123!` +#### Ревьювер +Ссылка: clck.ru/3GjtMh +### Набор 12 +#### Участник +- Почта: marina-looks@gmail.com +- Пароль: `password123!` +#### Ревьювер +Ссылка: clck.ru/3GjtNP \ No newline at end of file From 32c0d3b620004e3bfb212f5ca6bcdef0ecf30a8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20=D0=A1=D1=83=D0=BC?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Tue, 4 Mar 2025 00:38:49 +0000 Subject: [PATCH 18/27] added protocol to creds --- CREDENTIALS.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/CREDENTIALS.md b/CREDENTIALS.md index 1a78f99..5426f6d 100644 --- a/CREDENTIALS.md +++ b/CREDENTIALS.md @@ -4,76 +4,76 @@ #### Администратор - Логин: `admin` - Пароль: `prooooooood` - - Ссылка: clck.ru/3GkMoo + - Ссылка: https://clck.ru/3GkMoo ### Набор 1 #### Участник - Почта: germanivanov1984@gmail.com - Пароль: `password123!` #### Ревьювер -Ссылка: clck.ru/3Gjrtg +Ссылка: https://clck.ru/3Gjrtg ### Набор 2 #### Участник - Почта: dreamonovich@gmail.com - Пароль: `password123!` #### Ревьювер -Ссылка: clck.ru/3Gjs9y +Ссылка: https://clck.ru/3Gjs9y ### Набор 3 #### Участник - Почта: alisa.kuznetsova@gmail.com - Пароль: `password123!` #### Ревьювер -Ссылка: clck.ru/3GjsDq +Ссылка: https://clck.ru/3GjsDq ### Набор 4 #### Участник - Почта: ivan.petrov@gmail.com - Пароль: `password123!` #### Ревьювер -Ссылка: clck.ru/3GjsK3 +Ссылка: https://clck.ru/3GjsK3 ### Набор 5 #### Участник - Почта: olga.sidorova@gmail.com - Пароль: `password123!` #### Ревьювер -Ссылка: clck.ru/3Gjrtg +Ссылка: https://clck.ru/3Gjrtg ### Набор 6 #### Участник - Почта: karim@gmail.com - Пароль: `password123!` #### Ревьювер -Ссылка: clck.ru/3Gjsa3 +Ссылка: https://clck.ru/3Gjsa3 ### Набор 7 #### Участник - Почта: noble@gmail.com - Пароль: `password123!` #### Ревьювер -Ссылка: clck.ru/3Gjsq2 +Ссылка: https://clck.ru/3Gjsq2 ### Набор 8 #### Участник - Почта: koller@gmail.com - Пароль: `password123!` #### Ревьювер -Ссылка: clck.ru/3Gjt7n +Ссылка: https://clck.ru/3Gjt7n ### Набор 9 #### Участник - Почта: gold_checker@gmail.com - Пароль: `password123!` #### Ревьювер -Ссылка: clck.ru/3GjtBp +Ссылка: https://clck.ru/3GjtBp ### Набор 10 #### Участник - Почта: looka@gmail.com - Пароль: `password123!` #### Ревьювер -Ссылка: clck.ru/3GjtLv +Ссылка: https://clck.ru/3GjtLv ### Набор 11 #### Участник - Почта: danil_malikov@gmail.com - Пароль: `password123!` #### Ревьювер -Ссылка: clck.ru/3GjtMh +Ссылка: https://clck.ru/3GjtMh ### Набор 12 #### Участник - Почта: marina-looks@gmail.com - Пароль: `password123!` #### Ревьювер -Ссылка: clck.ru/3GjtNP \ No newline at end of file +Ссылка: https://clck.ru/3GjtNP \ No newline at end of file From 6621babd5e543c06dbcbf7714a563fb10ad3d7ed Mon Sep 17 00:00:00 2001 From: rngsurrounded Date: Tue, 4 Mar 2025 09:40:55 +0900 Subject: [PATCH 19/27] minor fixes --- .../CompetitionSession/components/TaskContent/index.tsx | 6 +++++- .../modules/TaskSolution/components/ActionButtons/index.tsx | 2 +- .../pages/CompetitionSession/modules/TaskSolution/index.tsx | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/services/frontend/src/pages/CompetitionSession/components/TaskContent/index.tsx b/services/frontend/src/pages/CompetitionSession/components/TaskContent/index.tsx index 7909578..bd68954 100644 --- a/services/frontend/src/pages/CompetitionSession/components/TaskContent/index.tsx +++ b/services/frontend/src/pages/CompetitionSession/components/TaskContent/index.tsx @@ -74,7 +74,11 @@ const TaskContent: React.FC = ({ task }) => { const getFileNameFromUrl = (url: string): string => { try { const parts = url.split('/'); - return parts[parts.length - 1]; + const fullFileName = parts[parts.length - 1] + const fileName = fullFileName.length > 20 + ? fullFileName.substring(0, 20) + '...' + : fullFileName; + return fileName; } catch (e) { return 'Файл'; } diff --git a/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/components/ActionButtons/index.tsx b/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/components/ActionButtons/index.tsx index 03eda32..eb0d280 100644 --- a/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/components/ActionButtons/index.tsx +++ b/services/frontend/src/pages/CompetitionSession/modules/TaskSolution/components/ActionButtons/index.tsx @@ -35,7 +35,7 @@ const ActionButtons: React.FC = ({ > Задача сдана! - ) : hasSubmissionsLeft ? ( + ) : hasSubmissionsLeft? (