Commit 7460c775 by Tim Krones

Allow instructors to search for answers from multiple users simultaneously.

parent a9f7743d
......@@ -282,7 +282,7 @@ class InstructorToolBlock(XBlock):
def start_export(self, data, suffix=''):
""" Start a new asynchronous export """
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)
match_string = data.get('match_string', None)
......@@ -295,12 +295,17 @@ class InstructorToolBlock(XBlock):
user_service = self.runtime.service(self, 'user')
if not self.user_is_staff():
return {'error': 'permission denied'}
if not username:
user_id = None
if not usernames:
user_ids = None
else:
user_id = user_service.get_anonymous_user_id(username, unicode(self.runtime.course_id))
if user_id is None:
self.raise_error(404, _("Could not find the specified username."))
user_ids = []
for username in usernames.split(','):
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:
root_block_id = self.scope_ids.usage_id
......@@ -317,7 +322,7 @@ class InstructorToolBlock(XBlock):
unicode(getattr(self.runtime, 'course_id', 'course_id')),
root_block_id,
block_types,
user_id,
user_ids,
match_string,
)
if async_result.ready():
......
......@@ -225,7 +225,7 @@ function InstructorToolBlock(runtime, element) {
var $deleteButton = $element.find('.data-export-delete');
var $blockTypes = $element.find("select[name='block_types']");
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 $resultTable = $element.find('.data-export-results');
......@@ -335,7 +335,7 @@ function InstructorToolBlock(runtime, element) {
data = {
block_types: $blockTypes.val(),
root_block_id: $rootBlockId.val(),
username: $username.val(),
usernames: $usernames.val(),
match_string: $matchString.val()
};
data = JSON.stringify(data);
......
......@@ -20,7 +20,7 @@ logger = get_task_logger(__name__)
@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.
"""
......@@ -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
for block in blocks_to_include:
results = _extract_data(course_key_str, block, user_id, match_string)
rows += results
if not user_ids:
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:
filename = u"pb-data-export-{}.csv".format(time.strftime("%Y-%m-%d-%H%M%S", time.gmtime(start_timestamp)))
......
......@@ -9,8 +9,8 @@
<div class="data-export-field-container">
<div class="data-export-field">
<label>
<span>{% trans "Username:" %}</span>
<input type="text" name="username" />
<span>{% trans "Username[s]:" %}</span>
<input type="text" name="usernames" title="Enter one or more usernames, comma separated." />
</label>
</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