mumuki-laboratory 5.12.1 → 5.13.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ba4ab23f5ccb5fc65d34543b5957980da3c636b2ac20555562699ea141eb9c6e
4
- data.tar.gz: 06e00713fe1a2072daef342207e67299d02921544589a5996547b43daceaade6
3
+ metadata.gz: fd4028c28b28b7924786fa0459d5406df47c9931e8d52772407960e68af4d3fe
4
+ data.tar.gz: d18dfab8db95844ce5dc18ac2c563d9e2f7de725ec946cc98081b72710395906
5
5
  SHA512:
6
- metadata.gz: bee79042cbc5aa3f93fada9b322fd41f335939cf404c8f6989a20f4fac9d78d37c0748da3345ee2d4a33727c5f9925bd8bcb29402210d00cf5618e33d8b98e83
7
- data.tar.gz: ba69eda434a00296ce5fff9b457da145fcc66802fe546bb9557ad3b7f734f7935a0e27efbae23a892a7969ea031cee9981f439493df83a1837412aa456ce10b2
6
+ metadata.gz: 150db78584cac26a99017f2bb417149d278a45bb86ed7151410047c6dd83fb5d4df93d3cec966ac332d8b52812f77a4a1c52b047eb3eeb3e915985d2798cd599
7
+ data.tar.gz: 5cba88c3a2ca3117c9885398a5d1f35617509f02d8e82b43532f1cb2450ae696cd9995d9c4609eb073c86178e4a3580ff55c901d3911d53606fb75c004fb35fd
@@ -5,7 +5,10 @@ mumuki.load(function () {
5
5
  $.ajax(token.newRequest({
6
6
  method: 'POST',
7
7
  url: $(this).data('confirmation-url'),
8
- xhrFields: {withCredentials: true}
8
+ xhrFields: {withCredentials: true},
9
+ success: function(data){
10
+ mumuki.updateProgressBarAndShowModal(data);
11
+ }
9
12
  }));
10
13
 
11
14
  return true;
@@ -1,8 +1,9 @@
1
1
  class ExerciseConfirmationsController < AjaxController
2
2
  include Mumuki::Laboratory::Controllers::NestedInExercise
3
+ include Mumuki::Laboratory::Controllers::ResultsRendering
3
4
 
4
5
  def create
5
- result = @exercise.submit_confirmation! current_user
6
- render json: result
6
+ @exercise.submit_confirmation! current_user
7
+ render json: progress_json
7
8
  end
8
9
  end
@@ -52,3 +52,7 @@ module ApplicationHelper
52
52
  }.html_safe
53
53
  end
54
54
  end
55
+
56
+ def sanitized(html)
57
+ Mumukit::ContentType::Sanitizer.sanitize html
58
+ end
@@ -21,7 +21,7 @@ module BreadcrumbsHelper
21
21
  end
22
22
 
23
23
  def breadcrumb_list_item(last, item)
24
- "<li #{breadcrumb_item_class(last)}>#{item}</li>".html_safe
24
+ "<li #{breadcrumb_item_class(last)}>#{h item}</li>".html_safe
25
25
  end
26
26
 
27
27
  private
@@ -1,7 +1,8 @@
1
1
  module WithStudentPathNavigation
2
2
  def next_button(navigable)
3
3
  return unless navigable
4
- ContinueNavigation.new(self).button(navigable) || RevisitNavigation.new(self).button(navigable)
4
+ ContinueNavigation.new(self).button(navigable) || RevisitNavigation.new(self).button(navigable) || FinishNavigation.new(self).button(navigable)
5
+ #TODO Refactor this
5
6
  end
6
7
 
7
8
  def next_lesson_button(guide)
@@ -0,0 +1,12 @@
1
+ module WithStudentPathNavigation
2
+ class FinishNavigation < Navigation
3
+ def button(navigable)
4
+ return unless navigable.is_a?(Reading) && !navigable.status_for(current_user).like?(:passed)
5
+ content_tag 'a', t(:finish), merge_confirmation_classes(navigable, class: clazz)
6
+ end
7
+
8
+ def clazz
9
+ 'btn btn-success btn-block'
10
+ end
11
+ end
12
+ end
@@ -1,6 +1,6 @@
1
1
  module ContextualizationResultHelper
2
2
  def humanized_expectation_result_item(expectation_result)
3
- %Q{<li>#{status_icon(expectation_result[:result])} #{expectation_result[:explanation]}</li>}.html_safe
3
+ %Q{<li>#{status_icon(expectation_result[:result])} #{sanitized expectation_result[:explanation]}</li>}.html_safe
4
4
  end
5
5
 
6
6
  def render_feedback?(contextualization)
@@ -22,6 +22,13 @@ class ApplicationRecord < ActiveRecord::Base
22
22
  end
23
23
  end
24
24
 
25
+ def self.serialize_symbolized_hash_array(*keys)
26
+ keys.each do |field|
27
+ serialize field
28
+ define_method(field) { self[field]&.map { |it| it.symbolize_keys } }
29
+ end
30
+ end
31
+
25
32
  def save(*)
26
33
  super
27
34
  rescue => e
@@ -19,10 +19,7 @@ module Contextualization
19
19
  serialize :submission_status, Mumuki::Laboratory::Status::Submission
20
20
  validates_presence_of :submission_status
21
21
 
22
- [:expectation_results, :test_results, :query_results].each do |field|
23
- serialize field
24
- define_method(field) { self[field]&.map { |it| it.symbolize_keys } }
25
- end
22
+ serialize_symbolized_hash_array :expectation_results, :test_results, :query_results
26
23
 
27
24
  composed_of :submission, mapping: submission_mapping, constructor: :from_attributes
28
25
 
@@ -61,7 +61,9 @@ module WithReminders
61
61
 
62
62
  module ClassMethods
63
63
  def remindable
64
- where('accepts_reminders and (last_submission_date < ? or last_submission_date is null)', reminder_frequency.days.ago)
64
+ where('accepts_reminders and email is not null
65
+ and last_organization_id is not null
66
+ and (last_submission_date < ? or last_submission_date is null)', reminder_frequency.days.ago)
65
67
  end
66
68
 
67
69
  # The frequency of reminders, expressed in days
@@ -21,7 +21,7 @@
21
21
  </div>
22
22
  <div class="discussion-message-bubble-content">
23
23
  <div class="discussion-message-content">
24
- <%= sanitize message.content_html %>
24
+ <%= message.content_html %>
25
25
  </div>
26
26
  </div>
27
27
  </div>
@@ -10,7 +10,7 @@
10
10
  <%= status_icon(test_result[:status]) %>
11
11
  <strong class="example-title"><%= test_result[:title] %></strong>
12
12
  <% unless contextualization.visible_success_output? %>
13
- <a data-toggle="collapse" href="#example-result-<%= index %>" class="example-see-more">Ver detalles</a>
13
+ <a data-toggle="collapse" href="#example-result-<%= index %>" class="example-see-more"><%= t :view_details %></a>
14
14
  <% end %>
15
15
  </span>
16
16
  <% else %>
@@ -0,0 +1,5 @@
1
+ class AddUniqueIndexToOrganizationsName < ActiveRecord::Migration[5.1]
2
+ def change
3
+ add_index :organizations, :name, unique: true
4
+ end
5
+ end
@@ -8,9 +8,7 @@ module Mumuki::Laboratory::Controllers::ResultsRendering
8
8
  end
9
9
 
10
10
  def render_results_json(assignment, results = {})
11
- render json: results.merge(
12
- guide_finished_by_solution: guide_finished_by_solution?,
13
- class_for_progress_list_item: class_for_progress_list_item(@exercise, true),
11
+ render json: results.merge(progress_json).merge(
14
12
  html: render_results_html(assignment),
15
13
  title_html: render_results_title_html(assignment),
16
14
  button_html: render_results_button_html(assignment),
@@ -18,6 +16,13 @@ module Mumuki::Laboratory::Controllers::ResultsRendering
18
16
  remaining_attempts_html: remaining_attempts_text(assignment))
19
17
  end
20
18
 
19
+ def progress_json
20
+ {
21
+ guide_finished_by_solution: guide_finished_by_solution?,
22
+ class_for_progress_list_item: class_for_progress_list_item(@exercise, true)
23
+ }
24
+ end
25
+
21
26
  def render_results_html(assignment)
22
27
  render_to_string partial: results_partial(assignment),
23
28
  locals: {assignment: assignment}
@@ -79,6 +79,7 @@ en:
79
79
  explain_redirect: You have registered in another organization
80
80
  failed: Oops, something went wrong
81
81
  feedback: Feedback
82
+ finish: Finish
82
83
  first_name: First Name
83
84
  forbidden_explanation: You are not allowed to see this content.
84
85
  go_to: 'Go to %{organization}'
@@ -228,6 +229,7 @@ en:
228
229
  user: User
229
230
  user_data_updated: Your data was updated successfuly
230
231
  username: Username
232
+ view_details: View details
231
233
  want_permissions: The next user requires permissions
232
234
  we_miss_you: We miss you!
233
235
  working: "Working"
@@ -87,6 +87,7 @@ es:
87
87
  explain_redirect: Notamos que te registraste en otra organización.
88
88
  failed: Tu solución no pasó las pruebas
89
89
  feedback: Problemas que encontramos
90
+ finish: Terminar
90
91
  first_name: Nombre
91
92
  forbidden_explanation: Es decir que no tenés autorización para ver este contenido. <br> ¿Puede que hayas ingresado con una cuenta incorrecta?
92
93
  go_to: 'Ir a %{organization}'
@@ -253,6 +254,7 @@ es:
253
254
  user_data_updated: Tus datos se actualizaron correctamente
254
255
  user: Usuario
255
256
  username: Nombre de usuario
257
+ view_details: Ver detalles
256
258
  want_permissions: El siguiente usuario requiere permisos
257
259
  we_miss_you: ¡Te extrañamos!
258
260
  will_paginate:
@@ -82,6 +82,7 @@ pt:
82
82
  explain_redirect: Percebemos que você se registrou em outra organização.
83
83
  failed: Sua solução não passou as provas
84
84
  feedback: Problemas que encontramos
85
+ finish: Terminar
85
86
  first_name: Nome
86
87
  forbidden_explanation: Isso significa que você não tem autorização para ver esse conteúdo. <br> Você poderia ter entrado com uma conta incorreta?
87
88
  fullscreen: Tela completa
@@ -236,6 +237,7 @@ pt:
236
237
  user: Usuário
237
238
  user_data_updated: Os seus dados foram atualizados corretamente
238
239
  username: Nome de usuário
240
+ view_details: Ver detalhes
239
241
  want_permissions: O próximo usuário requer permissões
240
242
  working: Processamento
241
243
  wrong_answer: A resposta não é correta
@@ -1,5 +1,5 @@
1
1
  module Mumuki
2
2
  module Laboratory
3
- VERSION = '5.12.1'
3
+ VERSION = '5.13.0'
4
4
  end
5
5
  end
@@ -15,6 +15,6 @@ describe ExerciseConfirmationsController, organization_workspace: :test do
15
15
  before { post :create, params: { exercise_id: reading.id } }
16
16
 
17
17
  it { expect(response.status).to eq 200 }
18
- it { expect(response.body.parse_json).to json_like(status: :passed, result: '') }
18
+ it { expect(response.body.parse_json).to json_like(guide_finished_by_solution: true, class_for_progress_list_item: 'progress-list-item text-center success active') }
19
19
  end
20
20
  end
@@ -10,7 +10,7 @@
10
10
  #
11
11
  # It's strongly recommended that you check this file into your version control system.
12
12
 
13
- ActiveRecord::Schema.define(version: 20181014233438) do
13
+ ActiveRecord::Schema.define(version: 20181101180652) do
14
14
 
15
15
  # These are extensions that must be enabled in order to support this database
16
16
  enable_extension "plpgsql"
@@ -250,6 +250,7 @@ ActiveRecord::Schema.define(version: 20181014233438) do
250
250
  t.text "theme", default: "{}", null: false
251
251
  t.text "profile", default: "{}", null: false
252
252
  t.index ["book_id"], name: "index_organizations_on_book_id"
253
+ t.index ["name"], name: "index_organizations_on_name", unique: true
253
254
  end
254
255
 
255
256
  create_table "paths", id: :serial, force: :cascade do |t|
@@ -4,7 +4,7 @@ describe BreadcrumbsHelper, organization_workspace: :test do
4
4
 
5
5
  helper BreadcrumbsHelper
6
6
  helper LinksHelper
7
-
7
+ helper ERB::Util
8
8
 
9
9
  context 'user' do
10
10
  let(:user) { create(:user) }
@@ -35,6 +35,24 @@ RSpec.describe UserMailer, type: :mailer do
35
35
  last_submission_date: 15.minutes.ago }
36
36
  it { expect(User.remindable).to_not include user }
37
37
  end
38
+
39
+ context 'when user does not have an email' do
40
+ let(:user) { create :user,
41
+ uid: 'user',
42
+ accepts_reminders: true,
43
+ last_organization: central,
44
+ email: nil,
45
+ last_submission_date: nil }
46
+ it { expect(User.remindable).to_not include user }
47
+ end
48
+
49
+ context 'when user does not have a last organization' do
50
+ let(:user) { create :user,
51
+ uid: 'user',
52
+ accepts_reminders: true,
53
+ last_submission_date: nil }
54
+ it { expect(User.remindable).to_not include user }
55
+ end
38
56
  end
39
57
 
40
58
  describe "we_miss_you_reminder" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mumuki-laboratory
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.12.1
4
+ version: 5.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Franco Bulgarelli
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-25 00:00:00.000000000 Z
11
+ date: 2018-11-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.3'
33
+ version: '1.4'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.3'
40
+ version: '1.4'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: mumukit-auth
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -359,6 +359,7 @@ files:
359
359
  - app/helpers/choices_helper.rb
360
360
  - app/helpers/concerns/with_student_path_navigation.rb
361
361
  - app/helpers/concerns/with_student_path_navigation/continue_navigation.rb
362
+ - app/helpers/concerns/with_student_path_navigation/finish_navigation.rb
362
363
  - app/helpers/concerns/with_student_path_navigation/navigation.rb
363
364
  - app/helpers/concerns/with_student_path_navigation/revisit_navigation.rb
364
365
  - app/helpers/contextualization_result_helper.rb
@@ -803,6 +804,7 @@ files:
803
804
  - db/migrate/20180802190437_add_approved_to_messages.rb
804
805
  - db/migrate/20181004173216_add_free_form_editor_to_exercises.rb
805
806
  - db/migrate/20181014233438_remove_non_null_constraint_from_permissions.rb
807
+ - db/migrate/20181101180652_add_unique_index_to_organizations_name.rb
806
808
  - db/seeds/users.rb
807
809
  - lib/events.rb
808
810
  - lib/mumuki/laboratory.rb