from __future__ import annotations from typing import TYPE_CHECKING from pydantic import BaseModel from typing import List, TypeVar, Type from helpers import irt_helper from models.item import Item from models.target import Target from lib.irt.test_response_function import TestResponseFunction if TYPE_CHECKING: from models.solver_run import SolverRun _T = TypeVar("_T") class Form(BaseModel): items: List[Item] cut_score: float tif_results: List[Target] tcc_results: List[Target] status: str = 'Not Optimized' solver_variables: List[str] @classmethod def create(cls: Type[_T], items: list, solver_run: SolverRun, status: str, solver_variables: list) -> _T: return cls( items=items, cut_score=TestResponseFunction(solver_run.irt_model).calculate( items, theta=solver_run.theta_cut_score), tif_results=irt_helper.generate_tif_results(items, solver_run), tcc_results=irt_helper.generate_tcc_results(items, solver_run), status=status, solver_variables=solver_variables) def has_item(self, item: Item) -> bool: for i in self.items: if item == i: return True return False