Merge remote-tracking branch 'origin/master'

This commit is contained in:
Timur
2025-03-01 20:35:10 +03:00
10 changed files with 20 additions and 21 deletions
+11 -2
View File
@@ -46,7 +46,7 @@ class CompetitionTask(BaseModel):
) )
# only when "review" type # only when "review" type
# todo make it more humanize # TODO make it more humanize
criteries = models.JSONField( criteries = models.JSONField(
blank=True, blank=True,
null=True, null=True,
@@ -60,10 +60,19 @@ class CompetitionTask(BaseModel):
return self.title return self.title
class Meta: class Meta:
verbose_name = "задание"
verbose_name_plural = "задания" verbose_name_plural = "задания"
class CompetitionTaskAttachment(BaseModel):
def file_upload_at(instance, filename):
return f"/attachment/{instance.id}/file"
task = models.ForeignKey(CompetitionTask, on_delete=models.CASCADE)
file = models.FileField(upload_to=file_upload_at)
bind_at = models.FilePathField()
public = models.BooleanField(default=False)
class CompetitionTaskSubmission(BaseModel): class CompetitionTaskSubmission(BaseModel):
class StatusChoices(models.TextChoices): class StatusChoices(models.TextChoices):
SENT = "sent" SENT = "sent"
@@ -52,4 +52,4 @@ const TaskContent: React.FC<TaskContentProps> = ({ task }) => {
); );
}; };
export default TaskContent; export default TaskContent;
@@ -6,7 +6,7 @@ import CompetitionHeader from "./components/CompetitionHeader";
import TaskContent from "./components/TaskContent"; import TaskContent from "./components/TaskContent";
import TaskSolution from "./modules/TaskSolution"; import TaskSolution from "./modules/TaskSolution";
const CompetitionSessionPage = () => { const CompetitionSession = () => {
const { id, taskId } = useParams<{ id: string; taskId?: string }>(); const { id, taskId } = useParams<{ id: string; taskId?: string }>();
const [tasks] = useState<Task[]>(mockTasks); const [tasks] = useState<Task[]>(mockTasks);
const [answer, setAnswer] = useState(""); const [answer, setAnswer] = useState("");
@@ -21,9 +21,6 @@ const CompetitionSessionPage = () => {
console.log("Submitting answer:", answer); console.log("Submitting answer:", answer);
}; };
const handleHistoryClick = () => {
console.log("View history");
};
return ( return (
<div className="flex flex-col min-h-screen"> <div className="flex flex-col min-h-screen">
@@ -44,7 +41,6 @@ const CompetitionSessionPage = () => {
answer={answer} answer={answer}
setAnswer={setAnswer} setAnswer={setAnswer}
onSubmit={handleSubmit} onSubmit={handleSubmit}
onHistoryClick={handleHistoryClick}
/> />
</div> </div>
) : ( ) : (
@@ -60,4 +56,4 @@ const CompetitionSessionPage = () => {
); );
}; };
export default CompetitionSessionPage; export default CompetitionSession;
@@ -5,13 +5,11 @@ import { Solution } from "@/shared/types";
import { mockSolutions } from '@/shared/mocks/mocks'; import { mockSolutions } from '@/shared/mocks/mocks';
interface ActionButtonsProps { interface ActionButtonsProps {
onHistoryClick: () => void;
onSubmit: () => void; onSubmit: () => void;
solutionHistory?: Solution[]; solutionHistory?: Solution[];
} }
const ActionButtons: React.FC<ActionButtonsProps> = ({ const ActionButtons: React.FC<ActionButtonsProps> = ({
onHistoryClick,
onSubmit, onSubmit,
solutionHistory = mockSolutions solutionHistory = mockSolutions
}) => { }) => {
@@ -19,7 +17,6 @@ const ActionButtons: React.FC<ActionButtonsProps> = ({
const handleHistoryClick = () => { const handleHistoryClick = () => {
setIsHistoryOpen(true); setIsHistoryOpen(true);
onHistoryClick();
}; };
return ( return (
@@ -1,6 +1,6 @@
import React, { useRef, useEffect, useState } from 'react'; import React, { useRef, useEffect, useState } from 'react';
import * as monaco from 'monaco-editor'; import * as monaco from 'monaco-editor';
import { Copy, Check } from 'lucide-react'; // Import Lucide React icons import { Copy, Check } from 'lucide-react';
interface CodeSolutionProps { interface CodeSolutionProps {
answer: string; answer: string;
@@ -41,4 +41,4 @@ const SolutionStatus: React.FC<SolutionStatusProps> = ({ solution }) => {
); );
}; };
export default SolutionStatus; export default SolutionStatus;
@@ -12,7 +12,7 @@ interface TaskSolutionProps {
answer: string; answer: string;
setAnswer: (value: string) => void; setAnswer: (value: string) => void;
onSubmit: () => void; onSubmit: () => void;
onHistoryClick: () => void;
} }
const TaskSolution: React.FC<TaskSolutionProps> = ({ const TaskSolution: React.FC<TaskSolutionProps> = ({
@@ -21,7 +21,6 @@ const TaskSolution: React.FC<TaskSolutionProps> = ({
answer, answer,
setAnswer, setAnswer,
onSubmit, onSubmit,
onHistoryClick,
}) => { }) => {
const [selectedFile, setSelectedFile] = useState<File | null>(null); const [selectedFile, setSelectedFile] = useState<File | null>(null);
const fileInputRef = useRef<HTMLInputElement>(null); const fileInputRef = useRef<HTMLInputElement>(null);
@@ -46,7 +45,7 @@ const TaskSolution: React.FC<TaskSolutionProps> = ({
<CodeSolution answer={answer} setAnswer={setAnswer} /> <CodeSolution answer={answer} setAnswer={setAnswer} />
)} )}
<ActionButtons onHistoryClick={onHistoryClick} onSubmit={onSubmit} /> <ActionButtons onSubmit={onSubmit} />
</div> </div>
); );
}; };
+2 -2
View File
@@ -23,8 +23,8 @@ export const authFetch = ofetch.create({
export const apiFetch = ofetch.create({ export const apiFetch = ofetch.create({
baseURL: BASE_URL, baseURL: BASE_URL,
headers: { async onRequest({ options }) {
Authorization: "Bearer " + getToken(), options.headers.set("Authorization", "Bearer " + getToken());
}, },
async onResponseError({ response }) { async onResponseError({ response }) {
if (response.status === 401) { if (response.status === 401) {
-2
View File
@@ -6,8 +6,6 @@ export const getToken = () => {
export const saveToken = (token: string) => { export const saveToken = (token: string) => {
Cookie.set("token", token, { Cookie.set("token", token, {
secure: true,
sameSite: "Strict",
expires: 30, expires: 30,
}); });
}; };