5
5
6
6
from pydantic import JsonValue
7
7
8
- from questionpy import Attempt , Question
8
+ from questionpy import Question
9
+ from questionpy ._attempt import AttemptProtocol , AttemptScoredProtocol
9
10
from questionpy_common .api .attempt import AttemptModel , AttemptScoredModel , AttemptStartedModel , AttemptUi
10
11
from questionpy_common .api .question import QuestionInterface , QuestionModel
11
12
from questionpy_common .environment import get_qpy_environment
@@ -43,10 +44,10 @@ def _export_question(question: Question) -> QuestionModel:
43
44
)
44
45
45
46
46
- def _export_attempt (attempt : Attempt ) -> dict :
47
+ def _export_attempt (attempt : AttemptProtocol ) -> dict :
47
48
return {
48
49
"lang" : _get_output_lang (),
49
- "variant" : attempt .attempt_state . variant ,
50
+ "variant" : attempt .variant ,
50
51
"ui" : AttemptUi (
51
52
formulation = attempt .formulation ,
52
53
general_feedback = attempt .general_feedback ,
@@ -60,7 +61,7 @@ def _export_attempt(attempt: Attempt) -> dict:
60
61
}
61
62
62
63
63
- def _export_score (attempt : Attempt ) -> dict :
64
+ def _export_score (attempt : AttemptScoredProtocol ) -> dict :
64
65
plain_scoring_state = attempt .to_plain_scoring_state ()
65
66
return {
66
67
"scoring_state" : None if plain_scoring_state is None else json .dumps (plain_scoring_state ),
@@ -81,23 +82,16 @@ def start_attempt(self, variant: int) -> AttemptStartedModel:
81
82
plain_attempt_state = attempt .to_plain_attempt_state ()
82
83
return AttemptStartedModel (** _export_attempt (attempt ), attempt_state = json .dumps (plain_attempt_state ))
83
84
84
- def _get_attempt_internal (
85
- self ,
86
- attempt_state : str ,
87
- scoring_state : str | None = None ,
88
- response : dict [str , JsonValue ] | None = None ,
89
- ) -> Attempt :
90
- plain_attempt_state = json .loads (attempt_state )
91
- plain_scoring_state = None
92
- if scoring_state :
93
- plain_scoring_state = json .loads (scoring_state )
94
-
95
- return self ._question .get_attempt (plain_attempt_state , plain_scoring_state , response )
96
-
97
85
def get_attempt (
98
86
self , attempt_state : str , scoring_state : str | None = None , response : dict [str , JsonValue ] | None = None
99
87
) -> AttemptModel :
100
- return AttemptModel (** _export_attempt (self ._get_attempt_internal (attempt_state , scoring_state , response )))
88
+ parsed_attempt_state = json .loads (attempt_state )
89
+ parsed_scoring_state = None
90
+ if scoring_state :
91
+ parsed_scoring_state = json .loads (scoring_state )
92
+
93
+ attempt = self ._question .get_attempt (parsed_attempt_state , parsed_scoring_state , response )
94
+ return AttemptModel (** _export_attempt (attempt ))
101
95
102
96
def score_attempt (
103
97
self ,
@@ -108,8 +102,18 @@ def score_attempt(
108
102
try_scoring_with_countback : bool = False ,
109
103
try_giving_hint : bool = False ,
110
104
) -> AttemptScoredModel :
111
- attempt = self ._get_attempt_internal (attempt_state , scoring_state , response )
112
- attempt .score_response (try_scoring_with_countback = try_scoring_with_countback , try_giving_hint = try_giving_hint )
105
+ parsed_attempt_state = json .loads (attempt_state )
106
+ parsed_scoring_state = None
107
+ if scoring_state :
108
+ parsed_scoring_state = json .loads (scoring_state )
109
+
110
+ attempt = self ._question .score_attempt (
111
+ parsed_attempt_state ,
112
+ parsed_scoring_state ,
113
+ response ,
114
+ try_scoring_with_countback = try_scoring_with_countback ,
115
+ try_giving_hint = try_giving_hint ,
116
+ )
113
117
return AttemptScoredModel (** _export_attempt (attempt ), ** _export_score (attempt ))
114
118
115
119
def export_question_state (self ) -> str :
0 commit comments