fork download
  1. from dataclasses import dataclass, field
  2. from datetime import date, datetime
  3. from enum import Enum
  4. from typing import List, Optional
  5.  
  6. class Level(Enum): JUNIOR="начинающий"; MIDDLE="средний"; SENIOR="продвинутый"
  7. class Role(Enum): DEVELOPER="разработчик"; TESTER="тестировщик"; ANALYST="аналитик"; MANAGER="менеджер"
  8. class Complexity(Enum): LOW="низкая"; MEDIUM="средняя"; HIGH="высокая"
  9. class Priority(Enum): LOW="низкий"; MEDIUM="средний"; HIGH="высокий"
  10.  
  11. @dataclass
  12. class Employee:
  13. fio: str; role: Role; level: Level
  14. def __str__(self): return f"Сотрудник: {self.fio} | роль: {self.role.value} | категория: {self.level.value}"
  15.  
  16. @dataclass
  17. class Task:
  18. description: str; start: date; finish: date; complexity: Complexity; priority: Priority
  19. assignee: Optional[Employee]=None; project_name: Optional[str]=None
  20. def __post_init__(self):
  21. if self.finish < self.start: raise ValueError("Дата окончания задачи не может быть раньше даты начала.")
  22. def __str__(self):
  23. who = self.assignee.fio if self.assignee else "не назначен"
  24. return (f"Задача: {self.description} ({self.start} → {self.finish}) | "
  25. f"сложность: {self.complexity.value} | приоритет: {self.priority.value} | исполнитель: {who}")
  26.  
  27. @dataclass
  28. class Project:
  29. name: str; start: date; finish: date; tasks: List[Task]=field(default_factory=list)
  30. def add_task(self, task: Task):
  31. if task.start < self.start or task.finish > self.finish:
  32. raise ValueError(f"Сроки задачи {task.start}–{task.finish} вне диапазона проекта {self.start}–{self.finish}.")
  33. task.project_name=self.name; self.tasks.append(task)
  34. def tasks_in_execution_order(self):
  35. pr = {Priority.HIGH:0, Priority.MEDIUM:1, Priority.LOW:2}
  36. return sorted(self.tasks, key=lambda t:(t.start, pr[t.priority]))
  37. def __str__(self): return f"Проект: {self.name} ({self.start} → {self.finish}) | задач: {len(self.tasks)}"
  38.  
  39. d = lambda s: datetime.strptime(s,"%Y-%m-%d").date()
  40.  
  41. print("=== 1) Создание проекта ===")
  42. project = Project("CRM-платформа", d("2025-01-10"), d("2025-03-31"))
  43. print(project, "\n")
  44.  
  45. print("=== 2) Добавление сотрудников ===")
  46. e1 = Employee("Иванов И.И.", Role.DEVELOPER, Level.MIDDLE)
  47. e2 = Employee("Петров П.П.", Role.TESTER, Level.JUNIOR)
  48. print(e1); print(e2, "\n")
  49.  
  50. print("=== 3) Добавление задач ===")
  51. t1 = Task("API авторизации", d("2025-01-15"), d("2025-01-31"), Complexity.MEDIUM, Priority.HIGH, e1)
  52. t2 = Task("Тесты для авторизации", d("2025-02-01"), d("2025-02-07"), Complexity.LOW, Priority.MEDIUM, e2)
  53. project.add_task(t1); project.add_task(t2)
  54. print(t1); print(t2, "\n")
  55.  
  56. print("=== 4) Вывод задач в порядке выполнения ===")
  57. for t in project.tasks_in_execution_order(): print(" -", t)
  58. print()
  59.  
  60. print("=== 5) Негативный сценарий ===")
  61. try:
  62. bad = Task("Отчетность", d("2025-04-01"), d("2025-04-05"), Complexity.LOW, Priority.LOW, e2)
  63. project.add_task(bad)
  64. except ValueError as ex:
  65. print("ОЖИДАЕМАЯ ОШИБКА:", ex)
Success #stdin #stdout 0.27s 19280KB
stdin
Standard input is empty
stdout
=== 1) Создание проекта ===
Проект: CRM-платформа (2025-01-10 → 2025-03-31) | задач: 0 

=== 2) Добавление сотрудников ===
Сотрудник: Иванов И.И. | роль: разработчик | категория: средний
Сотрудник: Петров П.П. | роль: тестировщик | категория: начинающий 

=== 3) Добавление задач ===
Задача: API авторизации (2025-01-15 → 2025-01-31) | сложность: средняя | приоритет: высокий | исполнитель: Иванов И.И.
Задача: Тесты для авторизации (2025-02-01 → 2025-02-07) | сложность: низкая | приоритет: средний | исполнитель: Петров П.П. 

=== 4) Вывод задач в порядке выполнения ===
 - Задача: API авторизации (2025-01-15 → 2025-01-31) | сложность: средняя | приоритет: высокий | исполнитель: Иванов И.И.
 - Задача: Тесты для авторизации (2025-02-01 → 2025-02-07) | сложность: низкая | приоритет: средний | исполнитель: Петров П.П.

=== 5) Негативный сценарий ===
ОЖИДАЕМАЯ ОШИБКА: Сроки задачи 2025-04-01–2025-04-05 вне диапазона проекта 2025-01-10–2025-03-31.