import os from typing import List, Optional from pydantic import BaseModel, Field, validator class TaskCard(BaseModel): """Pydantic model representing a structured task card. Attributes ---------- title: str Short title of the task (max 10 words). subject: str Subject or topic of the task. deadline: Optional[str] Deadline string if mentioned, otherwise None. deliverable: str What needs to be submitted. requirements: List[str] List of concrete requirements extracted from the raw text. difficulty: str Difficulty level: "легко", "средне" or "сложно". grading_criteria: Optional[str] Grading criteria if present. tags: List[str] Tags describing the task. """ title: str = Field(..., description="Short title of the task (max 10 words)") subject: str = Field(..., description="Subject or topic of the task") deadline: Optional[str] = Field(None, description="Deadline if mentioned") deliverable: str = Field(..., description="What needs to be submitted") requirements: List[str] = Field(default_factory=list, description="Concrete requirements") difficulty: str = Field(..., description="Difficulty level: легко, средне, сложно") grading_criteria: Optional[str] = Field(None, description="Grading criteria if present") tags: List[str] = Field(default_factory=list, description="Tags describing the task") @validator("title") def title_word_limit(cls, v: str) -> str: if len(v.split()) > 10: raise ValueError("Title must be at most 10 words") return v def to_markdown(self) -> str: """Return a nicely formatted Markdown representation of the card.""" md = [f"## {self.title}"] md.append(f"**Предмет:** {self.subject}") if self.deadline: md.append(f"**Дедлайн:** {self.deadline}") md.append(f"**Сдать:** {self.deliverable}") if self.requirements: md.append("**Требования:**") for req in self.requirements: md.append(f"- {req}") md.append(f"**Сложность:** {self.difficulty}") if self.grading_criteria: md.append(f"**Критерии оценки:** {self.grading_criteria}") if self.tags: md.append("**Теги:** " + ", ".join(self.tags)) return "\n".join(md) # End of models.py