Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 12 additions & 7 deletions problem_builder/instructor_tool.py
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@ def _delete_export(self):
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)

Expand All @@ -295,12 +295,17 @@ def start_export(self, data, suffix=''):
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
Expand All @@ -317,7 +322,7 @@ def start_export(self, data, suffix=''):
unicode(getattr(self.runtime, 'course_id', 'course_id')),
root_block_id,
block_types,
user_id,
user_ids,
match_string,
)
if async_result.ready():
Expand Down
4 changes: 2 additions & 2 deletions problem_builder/public/js/instructor_tool.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');

Expand Down Expand Up @@ -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);
Expand Down
11 changes: 8 additions & 3 deletions problem_builder/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@


@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.
"""
Expand Down Expand Up @@ -64,8 +64,13 @@ def scan_for_blocks(block):

# 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)))
Expand Down
4 changes: 2 additions & 2 deletions problem_builder/templates/html/instructor_tool.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ <h3>{% trans "Filters" %}</h3>
<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>
Expand Down