Skip to content

Commit 90d6521

Browse files
authored
Merge pull request #7295 from donny-wong/v2.5.3
V2.5.3
2 parents bf88ab7 + 8f84639 commit 90d6521

File tree

11 files changed

+134
-12
lines changed

11 files changed

+134
-12
lines changed

Changelog.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Changelog
22

3+
## [v2.5.3]
4+
5+
### 🐛 Bug fixes
6+
7+
- Fix Marks Spreadsheet csv bug of showing incorrect marks (#7257)
8+
- Fix incorrect inclusion of course parameter in LtiSyncJob (#7258)
9+
- Fix Google Colab Jupyter Notebooks rendering by excluding widgets (#7271)
10+
311
## [v2.5.2]
412

513
### ✨ New features and improvements

Gemfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ GEM
472472
addressable (>= 2.8.0)
473473
crack (>= 0.3.2)
474474
hashdiff (>= 0.4.0, < 2.0.0)
475-
webrick (1.8.1)
475+
webrick (1.8.2)
476476
websocket (1.2.11)
477477
websocket-driver (0.7.6)
478478
websocket-extensions (>= 0.1.0)

app/MARKUS_VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
VERSION=v2.5.2,PATCH_LEVEL=DEV
1+
VERSION=v2.5.3,PATCH_LEVEL=DEV

app/controllers/assignments_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -628,7 +628,7 @@ def upload_config_files
628628
def create_lti_grades
629629
assessment = record
630630
lti_deployments = LtiDeployment.where(course: assessment.course, id: params[:lti_deployments])
631-
@current_job = LtiSyncJob.perform_later(lti_deployments.to_a, assessment, current_course,
631+
@current_job = LtiSyncJob.perform_later(lti_deployments.to_a, assessment,
632632
can_create_users: allowed_to?(:lti_manage?, with: UserPolicy),
633633
can_create_roles: allowed_to?(:manage?, with: RolePolicy))
634634
session[:job_id] = @current_job.job_id

app/controllers/submissions_controller.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
require 'json'
2+
13
class SubmissionsController < ApplicationController
24
include SubmissionsHelper
35
include RepositoryHelper
@@ -937,6 +939,11 @@ def notebook_to_html(file_contents, unique_path, type)
937939
'--template', 'markus-html-template'
938940
]
939941
end
942+
file_contents = JSON.parse(file_contents)
943+
if file_contents['metadata'].key?('widgets')
944+
file_contents['metadata'].delete('widgets')
945+
end
946+
file_contents = JSON.generate(file_contents)
940947
_stdout, stderr, status = Open3.capture3(*args, stdin_data: file_contents)
941948
return "#{I18n.t('submissions.cannot_display')}<br/><br/>#{stderr.lines.last}" unless status.exitstatus.zero?
942949

app/jobs/lti_sync_job.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ def self.completed_message(_status)
99
I18n.t('lti.grade_sync_complete')
1010
end
1111

12-
def perform(lti_deployments, assessment, course, can_create_users: false, can_create_roles: false)
12+
def perform(lti_deployments, assessment, can_create_users: false, can_create_roles: false)
1313
if lti_deployments.empty?
1414
raise I18n.t('lti.no_platform')
1515
end
1616
lti_deployments.each do |deployment|
17-
roster_error = roster_sync(deployment, course,
17+
roster_error = roster_sync(deployment,
1818
[LtiDeployment::LTI_ROLES[:learner], LtiDeployment::LTI_ROLES[:ta]],
1919
can_create_users: can_create_users, can_create_roles: can_create_roles)
2020
if roster_error

app/models/grade_entry_form.rb

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,11 +122,10 @@ def export_as_csv(role)
122122
.group_by { |x| x[0] }
123123
num_items = self.grade_entry_items.count
124124
elsif role.ta?
125-
grade_data = role.grade_entry_students
126-
.joins(:user)
127-
.joins(:grades)
128-
.joins(:grade_entry_items)
129-
.where(grade_entry_form: self)
125+
grade_data = self.grades
126+
.joins(:grade_entry_item, grade_entry_student: :user)
127+
.joins(grade_entry_student: :grade_entry_student_tas)
128+
.where('grade_entry_student_tas.ta_id': role.id)
130129
.pluck('users.user_name', 'grade_entry_items.position', 'grades.grade')
131130
.group_by { |x| x[0] }
132131
num_items = self.grade_entry_items.count

spec/controllers/submissions_controller_spec.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1665,6 +1665,19 @@
16651665
it_behaves_like 'notebook content'
16661666
end
16671667

1668+
context 'a jupyter-notebook file with widgets',
1669+
skip: Rails.application.config.nbconvert_enabled ? false : 'nbconvert dependencies not installed' do
1670+
render_views
1671+
let(:filename) { 'example_widgets.ipynb' }
1672+
1673+
it 'renders without widgets' do
1674+
subject
1675+
expect(response.body).not_to include("KeyError: 'state'")
1676+
end
1677+
1678+
it_behaves_like 'notebook content'
1679+
end
1680+
16681681
context 'an rmarkdown file' do
16691682
let(:filename) { 'example.Rmd' }
16701683

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
{
2+
"nbformat": 4,
3+
"nbformat_minor": 0,
4+
"metadata": {
5+
"colab": {
6+
"provenance": []
7+
},
8+
"kernelspec": {
9+
"name": "python3",
10+
"display_name": "Python 3"
11+
},
12+
"language_info": {
13+
"name": "python"
14+
},
15+
"widgets": {
16+
"application/vnd.jupyter.widget-state+json": {
17+
}
18+
}
19+
},
20+
"cells": [
21+
{
22+
"cell_type": "code",
23+
"source": [
24+
],
25+
"metadata": {
26+
"id": "wekaZO6DYWz6",
27+
"colab": {
28+
"base_uri": "https://localhost:8080/",
29+
"height": 1000
30+
},
31+
"outputId": "990f2494-5ca0-442f-ba8d-f7a31bd463e4"
32+
},
33+
"execution_count": 17,
34+
"outputs": [
35+
{
36+
"output_type": "display_data",
37+
"data": {
38+
"text/plain": [
39+
"Training: 0%| | 0/1000 [00:00<?, ?it/s]"
40+
],
41+
"application/vnd.jupyter.widget-view+json": {
42+
"version_major": 2,
43+
"version_minor": 0,
44+
"model_id": "92b45d943b9e4c83b50bb2c83505e80d"
45+
}
46+
},
47+
"metadata": {}
48+
}
49+
]
50+
}
51+
]
52+
}

spec/jobs/lti_sync_job_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
end
3030

3131
context 'when running as a background job' do
32-
let(:job_args) { [[lti_deployment.id], assessment, course] }
32+
let(:job_args) { [[lti_deployment.id], assessment] }
3333

3434
include_examples 'background job'
3535
end
@@ -43,7 +43,7 @@
4343
end
4444

4545
context 'with no lti deployments' do
46-
let(:job_args) { [[], assessment, course] }
46+
let(:job_args) { [[], assessment] }
4747

4848
it 'should raise an error' do
4949
expect { LtiSyncJob.perform_now(*job_args) }.to raise_error(RuntimeError)

spec/models/grade_entry_form_spec.rb

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,4 +385,47 @@
385385
end
386386
end
387387
end
388+
389+
describe 'when TA downloads a csv file of the grades' do
390+
let(:ta) { create(:ta) }
391+
let!(:student1) { create(:student) }
392+
let!(:student2) { create(:student) }
393+
let!(:grade_entry_form_with_data) { create(:grade_entry_form_with_data) }
394+
395+
before do
396+
grade_entry_student1 = GradeEntryStudent.find_by(role: student1)
397+
grade_entry_student2 = GradeEntryStudent.find_by(role: student2)
398+
399+
GradeEntryStudentTa.create(grade_entry_student: grade_entry_student1, ta: ta)
400+
GradeEntryStudentTa.create(grade_entry_student: grade_entry_student2, ta: ta)
401+
402+
item2 = create(:grade_entry_item, name: 'Test2', position: 2, grade_entry_form: grade_entry_form_with_data)
403+
404+
grade_entry_student1.grades.create(grade: Random.rand(item2.out_of), grade_entry_item: item2)
405+
grade_entry_student1.save
406+
407+
grade_entry_student2.grades.create(grade: Random.rand(item2.out_of), grade_entry_item: item2)
408+
grade_entry_student2.save
409+
410+
grade_spreadsheet = grade_entry_form_with_data.export_as_csv(ta)
411+
results = CSV.parse(grade_spreadsheet, headers: false).drop(2)
412+
413+
@res_marks = {}
414+
results.each do |x|
415+
mark1 = x[6] == '' ? nil : x[6].to_f
416+
mark2 = x[7] == '' ? nil : x[7].to_f
417+
@res_marks[x[0]] = [mark1, mark2]
418+
end
419+
420+
@student_marks = {}
421+
@student_marks[student1.user.user_name] =
422+
[grade_entry_student1.grades.first.grade, grade_entry_student1.grades.second.grade]
423+
@student_marks[student2.user.user_name] =
424+
[grade_entry_student2.grades.first.grade, grade_entry_student2.grades.second.grade]
425+
end
426+
427+
it 'correctly displays the marks' do
428+
expect(@res_marks).to eq(@student_marks)
429+
end
430+
end
388431
end

0 commit comments

Comments
 (0)