Commit cd2304e1 by Tim Krones

Merge pull request #57 from open-craft/instructor-tool-multiple-usernames

Instructor Tool: Support searching for answers from multiple users
parents a9f7743d 7460c775
...@@ -282,7 +282,7 @@ class InstructorToolBlock(XBlock): ...@@ -282,7 +282,7 @@ class InstructorToolBlock(XBlock):
def start_export(self, data, suffix=''): def start_export(self, data, suffix=''):
""" Start a new asynchronous export """ """ Start a new asynchronous export """
block_types = data.get('block_types', None) block_types = data.get('block_types', None)
username = data.get('username', None) usernames = data.get('usernames', None)
root_block_id = data.get('root_block_id', None) root_block_id = data.get('root_block_id', None)
match_string = data.get('match_string', None) match_string = data.get('match_string', None)
...@@ -295,12 +295,17 @@ class InstructorToolBlock(XBlock): ...@@ -295,12 +295,17 @@ class InstructorToolBlock(XBlock):
user_service = self.runtime.service(self, 'user') user_service = self.runtime.service(self, 'user')
if not self.user_is_staff(): if not self.user_is_staff():
return {'error': 'permission denied'} return {'error': 'permission denied'}
if not username: if not usernames:
user_id = None user_ids = None
else: else:
user_id = user_service.get_anonymous_user_id(username, unicode(self.runtime.course_id)) user_ids = []
if user_id is None: for username in usernames.split(','):
self.raise_error(404, _("Could not find the specified username.")) username = username.strip()
user_id = user_service.get_anonymous_user_id(username, unicode(self.runtime.course_id))
if user_id:
user_ids.append(user_id)
if not user_ids:
self.raise_error(404, _("Could not find any of the specified usernames."))
if not root_block_id: if not root_block_id:
root_block_id = self.scope_ids.usage_id root_block_id = self.scope_ids.usage_id
...@@ -317,7 +322,7 @@ class InstructorToolBlock(XBlock): ...@@ -317,7 +322,7 @@ class InstructorToolBlock(XBlock):
unicode(getattr(self.runtime, 'course_id', 'course_id')), unicode(getattr(self.runtime, 'course_id', 'course_id')),
root_block_id, root_block_id,
block_types, block_types,
user_id, user_ids,
match_string, match_string,
) )
if async_result.ready(): if async_result.ready():
......
...@@ -225,7 +225,7 @@ function InstructorToolBlock(runtime, element) { ...@@ -225,7 +225,7 @@ function InstructorToolBlock(runtime, element) {
var $deleteButton = $element.find('.data-export-delete'); var $deleteButton = $element.find('.data-export-delete');
var $blockTypes = $element.find("select[name='block_types']"); var $blockTypes = $element.find("select[name='block_types']");
var $rootBlockId = $element.find("select[name='root_block_id']"); var $rootBlockId = $element.find("select[name='root_block_id']");
var $username = $element.find("input[name='username']"); var $usernames = $element.find("input[name='usernames']");
var $matchString = $element.find("input[name='match_string']"); var $matchString = $element.find("input[name='match_string']");
var $resultTable = $element.find('.data-export-results'); var $resultTable = $element.find('.data-export-results');
...@@ -335,7 +335,7 @@ function InstructorToolBlock(runtime, element) { ...@@ -335,7 +335,7 @@ function InstructorToolBlock(runtime, element) {
data = { data = {
block_types: $blockTypes.val(), block_types: $blockTypes.val(),
root_block_id: $rootBlockId.val(), root_block_id: $rootBlockId.val(),
username: $username.val(), usernames: $usernames.val(),
match_string: $matchString.val() match_string: $matchString.val()
}; };
data = JSON.stringify(data); data = JSON.stringify(data);
......
...@@ -20,7 +20,7 @@ logger = get_task_logger(__name__) ...@@ -20,7 +20,7 @@ logger = get_task_logger(__name__)
@task() @task()
def export_data(course_id, source_block_id_str, block_types, user_id, match_string): def export_data(course_id, source_block_id_str, block_types, user_ids, match_string):
""" """
Exports student answers to all MCQ questions to a CSV file. Exports student answers to all MCQ questions to a CSV file.
""" """
...@@ -64,8 +64,13 @@ def export_data(course_id, source_block_id_str, block_types, user_id, match_stri ...@@ -64,8 +64,13 @@ def export_data(course_id, source_block_id_str, block_types, user_id, match_stri
# Collect results for each block in blocks_to_include # Collect results for each block in blocks_to_include
for block in blocks_to_include: for block in blocks_to_include:
results = _extract_data(course_key_str, block, user_id, match_string) if not user_ids:
rows += results results = _extract_data(course_key_str, block, None, match_string)
rows += results
else:
for user_id in user_ids:
results = _extract_data(course_key_str, block, user_id, match_string)
rows += results
# Generate the CSV: # Generate the CSV:
filename = u"pb-data-export-{}.csv".format(time.strftime("%Y-%m-%d-%H%M%S", time.gmtime(start_timestamp))) filename = u"pb-data-export-{}.csv".format(time.strftime("%Y-%m-%d-%H%M%S", time.gmtime(start_timestamp)))
......
...@@ -9,8 +9,8 @@ ...@@ -9,8 +9,8 @@
<div class="data-export-field-container"> <div class="data-export-field-container">
<div class="data-export-field"> <div class="data-export-field">
<label> <label>
<span>{% trans "Username:" %}</span> <span>{% trans "Username[s]:" %}</span>
<input type="text" name="username" /> <input type="text" name="usernames" title="Enter one or more usernames, comma separated." />
</label> </label>
</div> </div>
</div> </div>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment