mumuki-laboratory 9.0.1 → 9.0.2

Sign up to get free protection for your applications and to get access to all the features.
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