10
10
from xblock .core import XBlock , XBlockAside
11
11
12
12
from ai_aside .config_api .api import is_summary_enabled
13
+ from ai_aside .constants import ATTR_KEY_USER_ID , ATTR_KEY_USER_ROLE
13
14
from ai_aside .platform_imports import get_block , get_text_transcript
14
15
from ai_aside .text_utils import html_to_text
15
16
from ai_aside .waffle import summaries_configuration_enabled as ff_is_summary_config_enabled
33
34
data-content-id="{{data_content_id}}"
34
35
data-handler-url="{{data_handler_url}}"
35
36
data-last-updated="{{data_last_updated}}"
37
+ data-user-role="{{data_user_role}}"
36
38
>
37
39
</div>
38
40
</div>
@@ -133,7 +135,7 @@ def _check_summarizable(block):
133
135
return False
134
136
135
137
136
- def _render_hook_fragment (handler_url , block , summary_items ):
138
+ def _render_hook_fragment (user_role_string , handler_url , block , summary_items ):
137
139
"""
138
140
Create hook Fragment from block and summarized children.
139
141
@@ -142,6 +144,9 @@ def _render_hook_fragment(handler_url, block, summary_items):
142
144
"""
143
145
last_published = getattr (block , 'published_on' , None )
144
146
last_edited = getattr (block , 'edited_on' , None )
147
+ usage_id = block .scope_ids .usage_id
148
+ course_key = usage_id .course_key
149
+
145
150
for item in summary_items :
146
151
published = item ['published_on' ]
147
152
edited = item ['edited_on' ]
@@ -155,24 +160,25 @@ def _render_hook_fragment(handler_url, block, summary_items):
155
160
if last_edited > last_published :
156
161
last_updated = last_edited
157
162
158
- usage_id = block .scope_ids .usage_id
159
-
160
163
fragment = Fragment ('' )
161
164
fragment .add_content (
162
165
_render_summary (
163
166
{
164
167
'data_url_api' : settings .SUMMARY_HOOK_HOST ,
165
- 'data_course_id' : usage_id . course_key ,
168
+ 'data_course_id' : course_key ,
166
169
'data_content_id' : usage_id ,
167
170
'data_handler_url' : handler_url ,
168
171
'data_last_updated' : _format_date (last_updated ),
172
+ 'data_user_role' : user_role_string ,
169
173
'js_url' : settings .SUMMARY_HOOK_HOST + settings .SUMMARY_HOOK_JS_PATH ,
170
174
}
171
175
)
172
176
)
173
177
return fragment
174
178
175
179
180
+ @XBlock .needs ('user' )
181
+ @XBlock .needs ('credit' )
176
182
class SummaryHookAside (XBlockAside ):
177
183
"""
178
184
XBlock aside that injects AI summary javascript.
@@ -254,7 +260,11 @@ def _student_view_can_throw(self, block):
254
260
usage_id = block .scope_ids .usage_id
255
261
log .info (f'Summary hook injecting into { usage_id } ' )
256
262
257
- return _render_hook_fragment (self ._summary_handler_url (), block , items )
263
+ return _render_hook_fragment (
264
+ self ._user_role_string (usage_id .course_key ),
265
+ self ._summary_handler_url (),
266
+ block ,
267
+ items )
258
268
259
269
def _summary_handler_url (self ):
260
270
"""
@@ -274,6 +284,31 @@ def _summary_handler_url(self):
274
284
handler_url = handler_url .replace ('localhost' , aispot_lms_name )
275
285
return handler_url
276
286
287
+ def _user_role_string (self , course_key ):
288
+ return self ._user_role_string_from_services (
289
+ self .runtime .service (self , 'user' ),
290
+ self .runtime .service (self , 'credit' ),
291
+ course_key )
292
+
293
+ @classmethod
294
+ def _user_role_string_from_services (cls , user_service , credit_service , course_key ):
295
+ """
296
+ Determine and construct the user_role string that gets injected into the block.
297
+ """
298
+ user_role = 'unknown'
299
+ user = user_service .get_current_user ()
300
+ if user is not None :
301
+ user_role = user .opt_attrs .get (ATTR_KEY_USER_ROLE )
302
+ user_enrollment = credit_service .get_credit_state (
303
+ user .opt_attrs .get (ATTR_KEY_USER_ID ), course_key )
304
+
305
+ if user_enrollment .get ('enrollment_mode' ):
306
+ user_role = user_role + " " + user_enrollment .get ('enrollment_mode' )
307
+ else :
308
+ user_role = 'unknown'
309
+
310
+ return user_role
311
+
277
312
@classmethod
278
313
def should_apply_to_block (cls , block ):
279
314
"""
0 commit comments