mumuki-laboratory 9.0.1 → 9.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/mumuki_laboratory/application/certificate.js +17 -0
  3. data/app/assets/javascripts/mumuki_laboratory/application/faqs.js +80 -0
  4. data/app/assets/stylesheets/mumuki_laboratory/application/_modules.scss +2 -0
  5. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_certificate.scss +33 -0
  6. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_faqs.scss +62 -0
  7. data/app/controllers/certificates_controller.rb +28 -0
  8. data/app/controllers/concerns/with_certificate_render.rb +25 -0
  9. data/app/controllers/faqs_controller.rb +6 -0
  10. data/app/controllers/users_controller.rb +4 -0
  11. data/app/helpers/certificate_helper.rb +13 -0
  12. data/app/helpers/links_helper.rb +8 -0
  13. data/app/helpers/menu_bar_helper.rb +14 -10
  14. data/app/helpers/user_menu_helper.rb +4 -0
  15. data/app/mailers/application_mailer.rb +0 -1
  16. data/app/mailers/user_mailer.rb +9 -0
  17. data/app/views/certificates/_certificate.html.erb +44 -0
  18. data/app/views/certificates/_download.html.erb +20 -0
  19. data/app/views/certificates/verify.html.erb +40 -0
  20. data/app/views/faqs/index.html.erb +16 -0
  21. data/app/views/layouts/_user_menu.html.erb +4 -0
  22. data/app/views/layouts/application.html.erb +6 -1
  23. data/app/views/layouts/exercise_inputs/editors/_code.html.erb +2 -1
  24. data/app/views/user_mailer/certificate.html.erb +339 -0
  25. data/app/views/user_mailer/certificate.text.erb +10 -0
  26. data/app/views/users/certificates.html.erb +32 -0
  27. data/config/routes.rb +6 -0
  28. data/lib/mumuki/laboratory/locales/en.yml +7 -0
  29. data/lib/mumuki/laboratory/locales/es-CL.yml +7 -0
  30. data/lib/mumuki/laboratory/locales/es.yml +7 -0
  31. data/lib/mumuki/laboratory/locales/pt.yml +7 -0
  32. data/lib/mumuki/laboratory/version.rb +1 -1
  33. data/spec/controllers/certificates_controller_spec.rb +15 -0
  34. data/spec/dummy/db/schema.rb +2 -1
  35. data/spec/features/certificate_programs_flow_spec.rb +17 -0
  36. data/spec/features/menu_bar_spec.rb +20 -0
  37. data/spec/features/profile_flow_spec.rb +12 -0
  38. data/spec/helpers/certificate_helper_spec.rb +15 -0
  39. metadata +67 -4
@@ -0,0 +1,10 @@
1
+ <%= t :new_certificate_mailer_title %>
2
+
3
+ <%= t :new_certificate_mailer_p1 %>
4
+ <%= t :new_certificate_mailer_p2 %>
5
+
6
+
7
+ © Copyright 2015-<%= DateTime.now.year %> Mumuki.
8
+
9
+ <%= t :stop_emails? %>
10
+ <%= t :cancel_subscription %>
@@ -0,0 +1,32 @@
1
+ <%= content_for :breadcrumbs do %>
2
+ <%= breadcrumbs_for_my_account %>
3
+ <% end %>
4
+
5
+ <%= render partial: 'layouts/user_menu' %>
6
+
7
+ <div class="mu-user-header">
8
+ <h1><%= t(:certificates) %></h1>
9
+ </div>
10
+ <% if @certificates.empty? %>
11
+ <div class="mu-tab-body">
12
+ <%= t :certificates_will_be_here %>
13
+ </div>
14
+ <% else %>
15
+ <div class="col-md-9 mu-tab-body">
16
+ <div class="col-md-12">
17
+ <div class="mu-list-group">
18
+ <% @certificates.each do |certificate| %>
19
+ <span class="mu-list-group-item">
20
+ <a href="<%= download_certificate_path certificate.code %>" target="_blank"><i class="fas fa-fw fa-download"></i></a>
21
+ <span class="mu-divider-vertical"></span>
22
+ <a href="<%= linkedin_post_url certificate %>" target="_blank"><i class="fab fa-fw fa-linkedin"></i></a>
23
+ <span class="mu-divider-vertical"></span>
24
+ <a href="<%= verify_certificate_path certificate.code %>" target="_blank">
25
+ <span class="mu-text-capitalize"><%= certificate.title %> - <%= certificate.description %></span>
26
+ </a>
27
+ </span>
28
+ <% end %>
29
+ </div>
30
+ </div>
31
+ </div>
32
+ <% end %>
data/config/routes.rb CHANGED
@@ -65,11 +65,17 @@ Rails.application.routes.draw do
65
65
 
66
66
  get :messages
67
67
  get :discussions
68
+ get :certificates
68
69
  end
69
70
 
71
+ resources :faqs, only: [:index]
72
+
70
73
  resources :messages, only: [:index, :create]
71
74
  get '/messages/errors' => 'messages#errors'
72
75
 
76
+ get 'certificates/verify/:code', to: 'certificates#verify', as: :verify_certificate
77
+ get 'certificates/download/:code', to: 'certificates#download', as: :download_certificate
78
+
73
79
  # Routes by slug
74
80
  get '/guides/:organization/:repository' => 'guides#show_transparently', as: :transparent_guide
75
81
  get '/topics/:organization/:repository' => 'topics#show_transparently', as: :transparent_topic
@@ -33,6 +33,10 @@ en:
33
33
  blocked_forum_explanation: Are you in the middle of an exam right now?
34
34
  cancel: Cancel
35
35
  cancel_subscription: Cancel your subscription.
36
+ certificate: Certificate
37
+ certificates: Certificates
38
+ certificates_will_be_here: Your certificates in the organization will appear here.
39
+ certificate_verified_legend: "<strong>%{full_name}</strong>'s account is verified. Mumuki certifies their successful completion of <strong>%{description}</strong>."
36
40
  chapter: Chapter
37
41
  chapters: Chapters
38
42
  chapter_finished_html: You have finished %{chapter}!
@@ -45,6 +49,7 @@ en:
45
49
  created_at_asc: Oldest
46
50
  created_at_desc: Newest
47
51
  comment: Comment
52
+ completed_by: Completed by
48
53
  confirm: Confirm
49
54
  confirm_reset: You are about to restart your exercise. Do you want to proceed?
50
55
  confirm_restart: You are about to delete your progress for this guide. Do you want to proceed?
@@ -110,6 +115,7 @@ en:
110
115
  expected_state: Expected board
111
116
  explain_redirect: You have registered in another organization
112
117
  failed: Oops, something went wrong
118
+ faqs: FAQs
113
119
  feedback: Feedback
114
120
  female: Female
115
121
  file_exceeds_max_size: "File size should not exceed %{size_kb}kb. Please select another file."
@@ -155,6 +161,7 @@ en:
155
161
  let_us_know: please let us know!
156
162
  level: Level
157
163
  level_up: Level up!
164
+ linkedin_profile_button_locale: en_US
158
165
  listen_statement: Listen to the statement
159
166
  loading: Loading
160
167
  load_solution_into_console: Load your solution into the console
@@ -29,6 +29,10 @@ es-CL:
29
29
  birthdate: Fecha de nacimiento
30
30
  blocked_forum_explanation: ¿Puede que estés en medio de un examen?
31
31
  cancel_subscription: Cancela tu subscripción.
32
+ certificate: Certificado
33
+ certificates: Certificados
34
+ certificates_will_be_here: Tus certificados en esta organización aparecerán aquí
35
+ certificate_verified_legend: "La cuenta de <strong>%{full_name}</strong> ha sido verificada. Mumuki certifica que completó el curso de <strong>%{description}.</strong>"
32
36
  chapter: Capítulo
33
37
  chapters: Capítulos
34
38
  chapter_finished_html: ¡Terminaste %{chapter}! ¡Felicitaciones!
@@ -42,6 +46,7 @@ es-CL:
42
46
  created_at_asc: Antiguas
43
47
  created_at_desc: Nuevas
44
48
  comment: Comentar
49
+ completed_by: Completado por
45
50
  confirm: Confirmar
46
51
  confirm_reset: Estás por reiniciar tu ejercicio. ¿Quieres continuar?
47
52
  confirm_restart: Estás por borrar tu progreso en esta guía. ¿Quieres continuar?
@@ -108,6 +113,7 @@ es-CL:
108
113
  expected_state: Tablero esperado
109
114
  explain_redirect: Notamos que te registraste en otra organización.
110
115
  failed: Tu solución no pasó las pruebas
116
+ faqs: Preguntas Frecuentes
111
117
  feedback: Problemas que encontramos
112
118
  female: Mujer
113
119
  file_exceeds_max_size: "El tamaño de archivo no debe exceder %{size_kb}kb. Por favor selecciona otro archivo."
@@ -154,6 +160,7 @@ es-CL:
154
160
  let_us_know: ¡Por favor avísanos!
155
161
  level: Nivel
156
162
  level_up: ¡Subiste de nivel!
163
+ linkedin_profile_button_locale: es_ES
157
164
  listen_statement: Escucha la consigna
158
165
  loading: Cargando
159
166
  load_solution_into_console: Cargar la solución en la consola
@@ -34,6 +34,10 @@ es:
34
34
  blocked_forum_explanation: ¿Puede que estés en medio de un examen?
35
35
  cancel: Cancelar
36
36
  cancel_subscription: Cancelá tu subscripción.
37
+ certificate: Certificado
38
+ certificates: Certificados
39
+ certificates_will_be_here: Tus certificados en esta organización aparecerán acá
40
+ certificate_verified_legend: "La cuenta de <strong>%{full_name}</strong> está verificada. Mumuki certifica que completó el curso de <strong>%{description}.</strong>"
37
41
  chapter: Capítulo
38
42
  chapters: Capítulos
39
43
  chapter_finished_html: ¡Terminaste %{chapter}! ¡Felicitaciones!
@@ -46,6 +50,7 @@ es:
46
50
  one: 1 cerrada
47
51
  other: '%{count} cerradas'
48
52
  comment: Comentar
53
+ completed_by: Completado por
49
54
  confirm: Confirmar
50
55
  confirm_reset: Estás por reiniciar tu ejercicio. ¿Querés continuar?
51
56
  confirm_restart: Estás por borrar tu progreso en esta guía. ¿Querés continuar?
@@ -116,6 +121,7 @@ es:
116
121
  expected_state: Tablero esperado
117
122
  explain_redirect: Notamos que te registraste en otra organización.
118
123
  failed: Tu solución no pasó las pruebas
124
+ faqs: Preguntas Frecuentes
119
125
  feedback: Problemas que encontramos
120
126
  female: Mujer
121
127
  file_exceeds_max_size: "El tamaño de archivo no debe exceder %{size_kb}kb. Por favor seleccioná otro archivo."
@@ -165,6 +171,7 @@ es:
165
171
  let_us_know: ¡Por favor avisanos!
166
172
  level: Nivel
167
173
  level_up: ¡Subiste de nivel!
174
+ linkedin_profile_button_locale: es_ES
168
175
  listen_statement: Escuchá la consigna
169
176
  loading: Cargando
170
177
  load_solution_into_console: Cargar la solución en la consola
@@ -33,6 +33,10 @@ pt:
33
33
  birthdate: Fecha de nacimiento
34
34
  blocked_forum_explanation: Você está no meio de um exame agora?
35
35
  cancel: Cancelar
36
+ certificate: Certificado
37
+ certificates: Certificados
38
+ certificates_will_be_here: Seus certificados nesta organização aparecerão aqui
39
+ certificate_verified_legend: "A conta de <strong>% {full_name} </strong> foi verificada. Mumuki certifica a conclusão com sucesso de <strong>% {description} </strong>."
36
40
  chapter: Capítulo
37
41
  chapters: Capítulos
38
42
  chapter_finished_html: Você terminou %{chapter}! Parabéns!
@@ -43,6 +47,7 @@ pt:
43
47
  closed: Fechado
44
48
  closed_count: '%{count} fechado'
45
49
  comment: Comentar
50
+ completed_by: Completado por
46
51
  confirm: Confirme
47
52
  confirm_reset: Você está prestes a reiniciar seu exercício. Você quer continuar?
48
53
  confirm_restart: Você está prestes a apagar o seu progresso neste guia. Você quer continuar?
@@ -112,6 +117,7 @@ pt:
112
117
  expected_state: Tabuleiro esperado
113
118
  explain_redirect: Percebemos que você se registrou em outra organização.
114
119
  failed: Sua solução não passou as provas
120
+ faqs: Perguntas frequentes
115
121
  feedback: Problemas que encontramos
116
122
  female: Feminino
117
123
  file_exceeds_max_size: "O tamanho do arquivo não deve exceder %{size_kb}kb. Selecione outro arquivo."
@@ -159,6 +165,7 @@ pt:
159
165
  let_us_know: Por favor, avise-nos!
160
166
  level: Nível
161
167
  level_up: Você sobe de nível!
168
+ linkedin_profile_button_locale: pt_BR
162
169
  listen_statement: Ouça a declaração
163
170
  loading: Carregando
164
171
  load_solution_into_console: Carregue a solução no console
@@ -1,5 +1,5 @@
1
1
  module Mumuki
2
2
  module Laboratory
3
- VERSION = '9.0.1'
3
+ VERSION = '9.0.2'
4
4
  end
5
5
  end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe CertificatesController, type: :controller, organization_workspace: :test do
4
+ let(:user) { create(:user) }
5
+ let(:certificate) { create(:certificate, user: user) }
6
+
7
+ context 'download' do
8
+ before { set_current_user! user }
9
+ before { get :download, params: { code: certificate.code } }
10
+
11
+ it { expect(response.status).to eq 200 }
12
+ it { expect(response.body).to_not be_nil }
13
+ it { expect(response.content_type).to eq 'application/pdf' }
14
+ end
15
+ 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: 20210119190204) do
13
+ ActiveRecord::Schema.define(version: 20210302181654) do
14
14
 
15
15
  # These are extensions that must be enabled in order to support this database
16
16
  enable_extension "plpgsql"
@@ -400,6 +400,7 @@ ActiveRecord::Schema.define(version: 20210119190204) do
400
400
  t.boolean "wins_page"
401
401
  t.boolean "immersible"
402
402
  t.boolean "prevent_manual_evaluation_content"
403
+ t.text "faqs"
403
404
  t.index ["book_id"], name: "index_organizations_on_book_id"
404
405
  t.index ["name"], name: "index_organizations_on_name", unique: true
405
406
  end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ feature 'Certificate Programs flow', organization_workspace: :test do
4
+
5
+ let(:user) { create :user, first_name: 'Foo', last_name: 'Bar' }
6
+
7
+ before { set_current_user! user }
8
+
9
+ before { Organization.find_by_name('test').switch! }
10
+ before { create :certificate, user: user, code: 'abc' }
11
+
12
+ before { visit '/certificates/verify/abc' }
13
+
14
+ scenario { expect(page).to have_text('Foo Bar') }
15
+ scenario { expect(page).to have_link(href: /linkedin\.com\/profile\/add/) }
16
+ scenario { expect(page).to have_link(href: /certificates\/download\/abc/) }
17
+ end
@@ -19,6 +19,7 @@ feature 'menu bar' do
19
19
  expect(page).not_to have_text('My account')
20
20
  expect(page).not_to have_text('Classroom')
21
21
  expect(page).not_to have_text('Bibliotheca')
22
+ expect(page).not_to have_text('FAQs')
22
23
  end
23
24
  end
24
25
 
@@ -35,6 +36,7 @@ feature 'menu bar' do
35
36
  expect(page).not_to have_text('Bibliotheca')
36
37
  expect(page).not_to have_text('Solve other\'s doubts')
37
38
  expect(page).not_to have_text('My doubts')
39
+ expect(page).not_to have_text('FAQs')
38
40
  end
39
41
  end
40
42
  end
@@ -57,6 +59,7 @@ feature 'menu bar' do
57
59
  expect(page).not_to have_text('Bibliotheca')
58
60
  expect(page).not_to have_text('Solve other\'s doubts')
59
61
  expect(page).not_to have_text('My doubts')
62
+ expect(page).not_to have_text('FAQs')
60
63
  end
61
64
 
62
65
  context 'student with no discussions should' do
@@ -69,6 +72,7 @@ feature 'menu bar' do
69
72
  expect(page).not_to have_text('Bibliotheca')
70
73
  expect(page).not_to have_text('Solve other\'s doubts')
71
74
  expect(page).not_to have_text('My doubts')
75
+ expect(page).not_to have_text('FAQs')
72
76
  end
73
77
 
74
78
  scenario 'see their account and solve_other_doubts links if forum is enabled' do
@@ -81,6 +85,17 @@ feature 'menu bar' do
81
85
  expect(page).not_to have_text('Bibliotheca')
82
86
  expect(page).to have_text('Solve other\'s doubts')
83
87
  expect(page).not_to have_text('My doubts')
88
+ expect(page).not_to have_text('FAQs')
89
+ end
90
+ end
91
+
92
+ context 'organization with faqs' do
93
+ before { Organization.current.update! faqs: "Some faqs" }
94
+
95
+ scenario 'should see FAQs link' do
96
+ visit '/'
97
+
98
+ expect(page).to have_text('FAQs')
84
99
  end
85
100
  end
86
101
 
@@ -97,6 +112,7 @@ feature 'menu bar' do
97
112
  expect(page).not_to have_text('Bibliotheca')
98
113
  expect(page).not_to have_text('Solve other\'s doubts')
99
114
  expect(page).not_to have_text('My doubts')
115
+ expect(page).not_to have_text('FAQs')
100
116
  end
101
117
 
102
118
  scenario 'see all discussions links if forum is enabled' do
@@ -110,6 +126,7 @@ feature 'menu bar' do
110
126
  expect(page).not_to have_text('Bibliotheca')
111
127
  expect(page).to have_text('Solve other\'s doubts')
112
128
  expect(page).to have_text('My doubts')
129
+ expect(page).not_to have_text('FAQs')
113
130
  end
114
131
 
115
132
  scenario 'only see their account if forum is enabled in a forum_only_for_trusted organization' do
@@ -124,6 +141,7 @@ feature 'menu bar' do
124
141
  expect(page).not_to have_text('Bibliotheca')
125
142
  expect(page).not_to have_text('Solve other\'s doubts')
126
143
  expect(page).not_to have_text('My doubts')
144
+ expect(page).not_to have_text('FAQs')
127
145
  end
128
146
 
129
147
  scenario 'see all discussions links if forum is enabled in a forum_only_for_trusted organization but it is trusted' do
@@ -139,6 +157,7 @@ feature 'menu bar' do
139
157
  expect(page).not_to have_text('Bibliotheca')
140
158
  expect(page).to have_text('Solve other\'s doubts')
141
159
  expect(page).to have_text('My doubts')
160
+ expect(page).not_to have_text('FAQs')
142
161
  end
143
162
  end
144
163
 
@@ -152,6 +171,7 @@ feature 'menu bar' do
152
171
  expect(page).not_to have_text('Bibliotheca')
153
172
  expect(page).not_to have_text('Solve other\'s doubts')
154
173
  expect(page).not_to have_text('My doubts')
174
+ expect(page).not_to have_text('FAQs')
155
175
  end
156
176
 
157
177
  scenario 'writer should see their account and bibliotheca' do
@@ -121,5 +121,17 @@ feature 'Profile Flow', organization_workspace: :test do
121
121
  expect(page).to have_text(problem.name)
122
122
  end
123
123
  end
124
+
125
+ context 'visit certificates tab' do
126
+ before { Organization.find_by_name('test').switch! }
127
+ before { create :certificate, user: user, code: 'abc' }
128
+ before { visit '/user/certificates' }
129
+
130
+ scenario { expect(page).to have_text('Test - Certificate program to test') }
131
+ scenario { expect(page).to have_link(href: /certificates\/verify\/abc/) }
132
+ scenario { expect(page).to have_link(href: /linkedin.com\/profile\/add/) }
133
+ scenario { expect(page).to have_link(href: /certificates\/download\/abc/) }
134
+ end
135
+
124
136
  end
125
137
  end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe CertificateHelper, organization_workspace: :test do
4
+ helper CertificateHelper
5
+
6
+ describe '#linkedin_url_to_post' do
7
+
8
+ let(:certificate) { create :certificate, code: 'abc', created_at: Time.new(2000, 1, 1) }
9
+ let(:link) { "https://www.linkedin.com/profile/add?startTask=CERTIFICATION_NAME&name=Test&organizationId=1&issueYear=2000&issueMonth=1&certUrl=http%3A%2F%2Ftest.localmumuki.io%2Fcertificates%2Fverify%2Fabc&certId=abc" }
10
+
11
+ before { allow(ENV).to receive(:[]).with('MUMUKI_LINKEDIN_ORGANIZATION_ID').and_return '1' }
12
+ it { expect(linkedin_post_url(certificate).to_s).to eq link }
13
+ end
14
+
15
+ end
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: 9.0.1
4
+ version: 9.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Franco Bulgarelli
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-08 00:00:00.000000000 Z
11
+ date: 2021-03-09 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: 9.0.0
33
+ version: 9.0.2
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: 9.0.0
40
+ version: 9.0.2
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: mumukit-bridge
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -290,6 +290,48 @@ dependencies:
290
290
  - - "~>"
291
291
  - !ruby/object:Gem::Version
292
292
  version: '3.7'
293
+ - !ruby/object:Gem::Dependency
294
+ name: wkhtmltopdf-binary
295
+ requirement: !ruby/object:Gem::Requirement
296
+ requirements:
297
+ - - "~>"
298
+ - !ruby/object:Gem::Version
299
+ version: '0.12'
300
+ type: :runtime
301
+ prerelease: false
302
+ version_requirements: !ruby/object:Gem::Requirement
303
+ requirements:
304
+ - - "~>"
305
+ - !ruby/object:Gem::Version
306
+ version: '0.12'
307
+ - !ruby/object:Gem::Dependency
308
+ name: wicked_pdf
309
+ requirement: !ruby/object:Gem::Requirement
310
+ requirements:
311
+ - - "~>"
312
+ - !ruby/object:Gem::Version
313
+ version: '1.4'
314
+ type: :runtime
315
+ prerelease: false
316
+ version_requirements: !ruby/object:Gem::Requirement
317
+ requirements:
318
+ - - "~>"
319
+ - !ruby/object:Gem::Version
320
+ version: '1.4'
321
+ - !ruby/object:Gem::Dependency
322
+ name: rqrcode
323
+ requirement: !ruby/object:Gem::Requirement
324
+ requirements:
325
+ - - "~>"
326
+ - !ruby/object:Gem::Version
327
+ version: '1.2'
328
+ type: :runtime
329
+ prerelease: false
330
+ version_requirements: !ruby/object:Gem::Requirement
331
+ requirements:
332
+ - - "~>"
333
+ - !ruby/object:Gem::Version
334
+ version: '1.2'
293
335
  - !ruby/object:Gem::Dependency
294
336
  name: pg
295
337
  requirement: !ruby/object:Gem::Requirement
@@ -356,6 +398,7 @@ files:
356
398
  - app/assets/javascripts/mumuki_laboratory/application/assets-loader.js
357
399
  - app/assets/javascripts/mumuki_laboratory/application/bridge.js
358
400
  - app/assets/javascripts/mumuki_laboratory/application/button.js
401
+ - app/assets/javascripts/mumuki_laboratory/application/certificate.js
359
402
  - app/assets/javascripts/mumuki_laboratory/application/characters.js
360
403
  - app/assets/javascripts/mumuki_laboratory/application/codemirror-builder.js
361
404
  - app/assets/javascripts/mumuki_laboratory/application/codemirror.js
@@ -368,6 +411,7 @@ files:
368
411
  - app/assets/javascripts/mumuki_laboratory/application/elipsis.js
369
412
  - app/assets/javascripts/mumuki_laboratory/application/events.js
370
413
  - app/assets/javascripts/mumuki_laboratory/application/exercise.js
414
+ - app/assets/javascripts/mumuki_laboratory/application/faqs.js
371
415
  - app/assets/javascripts/mumuki_laboratory/application/free-form.js
372
416
  - app/assets/javascripts/mumuki_laboratory/application/gamification.js
373
417
  - app/assets/javascripts/mumuki_laboratory/application/i18n.js
@@ -414,6 +458,7 @@ files:
414
458
  - app/assets/stylesheets/mumuki_laboratory/application/modules/_avatar.scss
415
459
  - app/assets/stylesheets/mumuki_laboratory/application/modules/_book_header.scss
416
460
  - app/assets/stylesheets/mumuki_laboratory/application/modules/_breadcrumb.scss
461
+ - app/assets/stylesheets/mumuki_laboratory/application/modules/_certificate.scss
417
462
  - app/assets/stylesheets/mumuki_laboratory/application/modules/_checkboxes.scss
418
463
  - app/assets/stylesheets/mumuki_laboratory/application/modules/_console.scss
419
464
  - app/assets/stylesheets/mumuki_laboratory/application/modules/_content_show.scss
@@ -423,6 +468,7 @@ files:
423
468
  - app/assets/stylesheets/mumuki_laboratory/application/modules/_editor.scss
424
469
  - app/assets/stylesheets/mumuki_laboratory/application/modules/_exercise_assignment.scss
425
470
  - app/assets/stylesheets/mumuki_laboratory/application/modules/_exercise_results.scss
471
+ - app/assets/stylesheets/mumuki_laboratory/application/modules/_faqs.scss
426
472
  - app/assets/stylesheets/mumuki_laboratory/application/modules/_flash.scss
427
473
  - app/assets/stylesheets/mumuki_laboratory/application/modules/_gs-board.scss
428
474
  - app/assets/stylesheets/mumuki_laboratory/application/modules/_guide_corollary.scss
@@ -455,12 +501,14 @@ files:
455
501
  - app/controllers/assets_controller.rb
456
502
  - app/controllers/book_controller.rb
457
503
  - app/controllers/book_discussions_controller.rb
504
+ - app/controllers/certificates_controller.rb
458
505
  - app/controllers/chapters_controller.rb
459
506
  - app/controllers/complements_controller.rb
460
507
  - app/controllers/concerns/on_base_organization_only.rb
461
508
  - app/controllers/concerns/organizations_controller_template.rb
462
509
  - app/controllers/concerns/users_controller_template.rb
463
510
  - app/controllers/concerns/with_authorization.rb
511
+ - app/controllers/concerns/with_certificate_render.rb
464
512
  - app/controllers/concerns/with_errors_filter.rb
465
513
  - app/controllers/concerns/with_user_discussion_validation.rb
466
514
  - app/controllers/concerns/with_user_params.rb
@@ -474,6 +522,7 @@ files:
474
522
  - app/controllers/exercise_solutions_controller.rb
475
523
  - app/controllers/exercise_tries_controller.rb
476
524
  - app/controllers/exercises_controller.rb
525
+ - app/controllers/faqs_controller.rb
477
526
  - app/controllers/guide_container_controller.rb
478
527
  - app/controllers/guide_progress_controller.rb
479
528
  - app/controllers/guides_controller.rb
@@ -490,6 +539,7 @@ files:
490
539
  - app/helpers/authors_helper.rb
491
540
  - app/helpers/avatar_helper.rb
492
541
  - app/helpers/breadcrumbs_helper.rb
542
+ - app/helpers/certificate_helper.rb
493
543
  - app/helpers/choices_helper.rb
494
544
  - app/helpers/concerns/with_student_path_navigation.rb
495
545
  - app/helpers/concerns/with_student_path_navigation/continue_navigation.rb
@@ -527,6 +577,9 @@ files:
527
577
  - app/views/book/_header.html.erb
528
578
  - app/views/book/show.html.erb
529
579
  - app/views/book_discussions/index.html.erb
580
+ - app/views/certificates/_certificate.html.erb
581
+ - app/views/certificates/_download.html.erb
582
+ - app/views/certificates/verify.html.erb
530
583
  - app/views/chapters/show.html.erb
531
584
  - app/views/complements/show.html.erb
532
585
  - app/views/discussions/_description_message.html.erb
@@ -562,6 +615,7 @@ files:
562
615
  - app/views/exercises/_exercise_title_icons.html.erb
563
616
  - app/views/exercises/_read_only.html.erb
564
617
  - app/views/exercises/show.html.erb
618
+ - app/views/faqs/index.html.erb
565
619
  - app/views/guides/_guide.html.erb
566
620
  - app/views/guides/_guide_container.html.erb
567
621
  - app/views/guides/_guide_title_icons.html.erb
@@ -643,6 +697,8 @@ files:
643
697
  - app/views/user_mailer/2nd_reminder.text.erb
644
698
  - app/views/user_mailer/3rd_reminder.html.erb
645
699
  - app/views/user_mailer/3rd_reminder.text.erb
700
+ - app/views/user_mailer/certificate.html.erb
701
+ - app/views/user_mailer/certificate.text.erb
646
702
  - app/views/user_mailer/no_submissions_reminder.html.erb
647
703
  - app/views/user_mailer/no_submissions_reminder.text.erb
648
704
  - app/views/users/_avatar_list.html.erb
@@ -650,6 +706,7 @@ files:
650
706
  - app/views/users/_profile_fields.html.erb
651
707
  - app/views/users/_term.html.erb
652
708
  - app/views/users/_user_form.html.erb
709
+ - app/views/users/certificates.html.erb
653
710
  - app/views/users/discussions.html.erb
654
711
  - app/views/users/edit.html.erb
655
712
  - app/views/users/messages.html.erb
@@ -700,6 +757,7 @@ files:
700
757
  - spec/api_helper.rb
701
758
  - spec/capybara_helper.rb
702
759
  - spec/controllers/api_clients_controller.rb
760
+ - spec/controllers/certificates_controller_spec.rb
703
761
  - spec/controllers/chapters_controller_spec.rb
704
762
  - spec/controllers/confirmations_controller_spec.rb
705
763
  - spec/controllers/courses_api_controller_spec.rb
@@ -762,6 +820,7 @@ files:
762
820
  - spec/dummy/public/error/timeout_3.svg
763
821
  - spec/dummy/public/medal/outline.svg
764
822
  - spec/evaluation_helper.rb
823
+ - spec/features/certificate_programs_flow_spec.rb
765
824
  - spec/features/chapters_flow_spec.rb
766
825
  - spec/features/complements_flow_spec.rb
767
826
  - spec/features/disable_user_flow_spec.rb
@@ -793,6 +852,7 @@ files:
793
852
  - spec/helpers/authors_helper_spec.rb
794
853
  - spec/helpers/avatar_helper_spec.rb
795
854
  - spec/helpers/breadcrumbs_helper_spec.rb
855
+ - spec/helpers/certificate_helper_spec.rb
796
856
  - spec/helpers/email_helper_spec.rb
797
857
  - spec/helpers/exercise_input_helper_spec.rb
798
858
  - spec/helpers/icons_helper_spec.rb
@@ -902,6 +962,7 @@ test_files:
902
962
  - spec/controllers/discussions_messages_controller_spec.rb
903
963
  - spec/controllers/users_api_controller_spec.rb
904
964
  - spec/controllers/chapters_controller_spec.rb
965
+ - spec/controllers/certificates_controller_spec.rb
905
966
  - spec/controllers/organizations_api_controller_spec.rb
906
967
  - spec/controllers/users_controller_spec.rb
907
968
  - spec/evaluation_helper.rb
@@ -961,6 +1022,7 @@ test_files:
961
1022
  - spec/features/not_found_public_flow_spec.rb
962
1023
  - spec/features/home_private_flow_spec.rb
963
1024
  - spec/features/login_flow_spec.rb
1025
+ - spec/features/certificate_programs_flow_spec.rb
964
1026
  - spec/features/links_flow_spec.rb
965
1027
  - spec/features/complements_flow_spec.rb
966
1028
  - spec/features/notifications_flow_spec.rb
@@ -1008,6 +1070,7 @@ test_files:
1008
1070
  - spec/helpers/page_title_helper_spec.rb
1009
1071
  - spec/helpers/with_navigation_spec.rb
1010
1072
  - spec/helpers/authors_helper_spec.rb
1073
+ - spec/helpers/certificate_helper_spec.rb
1011
1074
  - spec/helpers/email_helper_spec.rb
1012
1075
  - spec/helpers/with_choices_spec.rb
1013
1076
  - spec/helpers/avatar_helper_spec.rb