mumuki-laboratory 5.5.0 → 5.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/application/discussions.js +43 -0
  3. data/app/assets/stylesheets/application/_modules.scss +2 -0
  4. data/app/assets/stylesheets/application/modules/_checkboxes.scss +21 -8
  5. data/app/assets/stylesheets/application/modules/_discussion.scss +339 -0
  6. data/app/assets/stylesheets/application/modules/_pagination.scss +10 -0
  7. data/app/controllers/application_controller.rb +4 -9
  8. data/app/controllers/book_discussions_controller.rb +7 -0
  9. data/app/controllers/chapters_controller.rb +2 -0
  10. data/app/controllers/discussions_controller.rb +65 -0
  11. data/app/controllers/discussions_messages_controller.rb +25 -0
  12. data/app/controllers/exercises_controller.rb +1 -0
  13. data/app/controllers/guide_container_controller.rb +1 -0
  14. data/app/controllers/messages_controller.rb +1 -1
  15. data/app/controllers/users_controller.rb +1 -0
  16. data/app/helpers/application_helper.rb +7 -0
  17. data/app/helpers/assignment_result_helper.rb +10 -30
  18. data/app/helpers/breadcrumbs_helper.rb +7 -3
  19. data/app/helpers/contextualization_result_helper.rb +31 -0
  20. data/app/helpers/discussions_helper.rb +163 -0
  21. data/app/helpers/exercise_input_helper.rb +33 -5
  22. data/app/helpers/icons_helper.rb +20 -3
  23. data/app/helpers/messages_helper.rb +4 -0
  24. data/app/helpers/status_helper.rb +2 -2
  25. data/app/models/assignment.rb +31 -47
  26. data/app/models/book.rb +3 -0
  27. data/app/models/chapter.rb +2 -0
  28. data/app/models/concerns/contextualization.rb +85 -0
  29. data/app/models/concerns/submittable/solvable.rb +1 -0
  30. data/app/models/concerns/with_assignments.rb +1 -1
  31. data/app/models/concerns/with_discussion_creation.rb +9 -0
  32. data/app/models/concerns/with_discussion_creation/subscription.rb +33 -0
  33. data/app/models/concerns/with_discussion_creation/upvote.rb +28 -0
  34. data/app/models/concerns/with_discussion_status.rb +11 -0
  35. data/app/models/concerns/with_discussions.rb +23 -0
  36. data/app/models/concerns/with_randomizations.rb +34 -0
  37. data/app/models/concerns/with_scoped_queries.rb +47 -0
  38. data/app/models/concerns/with_scoped_queries/filter.rb +15 -0
  39. data/app/models/concerns/with_scoped_queries/page.rb +10 -0
  40. data/app/models/concerns/with_scoped_queries/sort.rb +47 -0
  41. data/app/models/discussion.rb +128 -0
  42. data/app/models/exercise.rb +10 -1
  43. data/app/models/guide.rb +1 -1
  44. data/app/models/message.rb +24 -3
  45. data/app/models/organization.rb +4 -0
  46. data/app/models/submission/confirmation.rb +1 -1
  47. data/app/models/submission/console_submission.rb +1 -1
  48. data/app/models/submission/submission.rb +13 -0
  49. data/app/models/subscription.rb +12 -0
  50. data/app/models/topic.rb +1 -1
  51. data/app/models/upvote.rb +4 -0
  52. data/app/models/user.rb +3 -2
  53. data/app/views/book_discussions/index.html.erb +23 -0
  54. data/app/views/chapters/show.html.erb +0 -1
  55. data/app/views/discussions/_message.html.erb +22 -0
  56. data/app/views/discussions/_message_container.html.erb +8 -0
  57. data/app/views/discussions/_new_message.html.erb +19 -0
  58. data/app/views/discussions/index.html.erb +30 -0
  59. data/app/views/discussions/show.html.erb +76 -0
  60. data/app/views/exercise_solutions/_contextualization_results.html.erb +21 -0
  61. data/app/views/exercise_solutions/_contextualization_results_container.html.erb +4 -0
  62. data/app/views/exercise_solutions/_expectations.html.erb +9 -3
  63. data/app/views/exercise_solutions/_kids_results.html.erb +1 -1
  64. data/app/views/exercise_solutions/_results.html.erb +21 -55
  65. data/app/views/exercise_solutions/_results_title.html.erb +2 -2
  66. data/app/views/exercises/_exercise_assignment.html.erb +20 -0
  67. data/app/views/exercises/_read_only.html.erb +104 -0
  68. data/app/views/exercises/show.html.erb +4 -20
  69. data/app/views/layouts/_discussions.html.erb +68 -0
  70. data/app/views/layouts/_kids.html.erb +9 -6
  71. data/app/views/layouts/_messages.html.erb +1 -1
  72. data/app/views/layouts/_result.html.erb +2 -2
  73. data/app/views/layouts/_test_results.html.erb +6 -6
  74. data/app/views/layouts/application.html.erb +10 -9
  75. data/app/views/layouts/exercise_inputs/forms/_form.html.erb +5 -6
  76. data/app/views/layouts/exercise_inputs/forms/_interactive_form.html.erb +5 -5
  77. data/app/views/layouts/exercise_inputs/forms/_kids_form.html.erb +9 -17
  78. data/app/views/layouts/exercise_inputs/forms/_playground_form.html.erb +5 -5
  79. data/app/views/layouts/exercise_inputs/forms/_problem_form.html.erb +11 -11
  80. data/app/views/layouts/exercise_inputs/forms/_reading_form.html.erb +1 -1
  81. data/app/views/layouts/exercise_inputs/layouts/_input_bottom.html.erb +1 -1
  82. data/app/views/layouts/exercise_inputs/layouts/_input_kids.html.erb +7 -7
  83. data/app/views/layouts/exercise_inputs/layouts/_input_right.html.erb +1 -1
  84. data/app/views/layouts/exercise_inputs/read_only_editors/_code.html.erb +3 -0
  85. data/app/views/layouts/exercise_inputs/read_only_editors/_custom.html.erb +6 -0
  86. data/app/views/layouts/exercise_inputs/read_only_editors/_multiple_choice.html.erb +8 -0
  87. data/app/views/layouts/exercise_inputs/read_only_editors/_single_choice.html.erb +8 -0
  88. data/app/views/layouts/modals/_kids_context.html.erb +2 -2
  89. data/app/views/layouts/modals/_new_discussion.html.erb +27 -0
  90. data/app/views/users/show.html.erb +23 -3
  91. data/config/routes.rb +21 -1
  92. data/db/migrate/20180504173548_create_discussions.rb +12 -0
  93. data/db/migrate/20180504185845_add_discussion_id_to_message.rb +5 -0
  94. data/db/migrate/20180605143727_add_submission_to_discussion.rb +16 -0
  95. data/db/migrate/20180619182555_create_subscriptions.rb +9 -0
  96. data/db/migrate/20180702153442_create_upvotes.rb +8 -0
  97. data/db/migrate/20180702175220_add_upvotes_count_to_discussions.rb +5 -0
  98. data/db/migrate/20180704150839_rename_assignment_status_to_submission_status.rb +5 -0
  99. data/lib/mumuki/laboratory.rb +2 -0
  100. data/lib/mumuki/laboratory/controllers.rb +2 -1
  101. data/lib/mumuki/laboratory/controllers/content.rb +12 -0
  102. data/lib/mumuki/laboratory/controllers/notifications.rb +31 -0
  103. data/lib/mumuki/laboratory/controllers/results_rendering.rb +1 -1
  104. data/lib/mumuki/laboratory/engine.rb +0 -2
  105. data/lib/mumuki/laboratory/evaluation/manual.rb +1 -1
  106. data/lib/mumuki/laboratory/locales/en.yml +37 -1
  107. data/lib/mumuki/laboratory/locales/es.yml +42 -1
  108. data/lib/mumuki/laboratory/locales/pt.yml +33 -1
  109. data/lib/mumuki/laboratory/status.rb +51 -44
  110. data/lib/mumuki/laboratory/status/discussion/closed.rb +15 -0
  111. data/lib/mumuki/laboratory/status/discussion/discussion.rb +56 -0
  112. data/lib/mumuki/laboratory/status/discussion/opened.rb +27 -0
  113. data/lib/mumuki/laboratory/status/discussion/pending_review.rb +15 -0
  114. data/lib/mumuki/laboratory/status/discussion/solved.rb +19 -0
  115. data/lib/mumuki/laboratory/status/submission/aborted.rb +11 -0
  116. data/lib/mumuki/laboratory/status/submission/errored.rb +15 -0
  117. data/lib/mumuki/laboratory/status/{failed.rb → submission/failed.rb} +2 -2
  118. data/lib/mumuki/laboratory/status/submission/manual_evaluation_pending.rb +15 -0
  119. data/lib/mumuki/laboratory/status/{passed.rb → submission/passed.rb} +2 -2
  120. data/lib/mumuki/laboratory/status/{passed_with_warnings.rb → submission/passed_with_warnings.rb} +2 -2
  121. data/lib/mumuki/laboratory/status/submission/pending.rb +11 -0
  122. data/lib/mumuki/laboratory/status/submission/running.rb +11 -0
  123. data/lib/mumuki/laboratory/status/submission/submission.rb +49 -0
  124. data/lib/mumuki/laboratory/status/{unknown.rb → submission/unknown.rb} +2 -2
  125. data/lib/mumuki/laboratory/version.rb +1 -1
  126. data/spec/controllers/chapters_controller_spec.rb +17 -0
  127. data/spec/controllers/discussions_controller_spec.rb +19 -0
  128. data/spec/dummy/config/environments/development.rb +0 -2
  129. data/spec/dummy/config/environments/test.rb +0 -2
  130. data/spec/dummy/db/schema.rb +42 -2
  131. data/spec/evaluation_helper.rb +1 -1
  132. data/spec/factories/discussion_factory.rb +8 -0
  133. data/spec/features/dynamic_exam_spec.rb +1 -1
  134. data/spec/helpers/exercise_input_helper_spec.rb +25 -0
  135. data/spec/helpers/test_results_rendering_spec.rb +7 -7
  136. data/spec/models/assignment_spec.rb +17 -2
  137. data/spec/models/discussion_spec.rb +153 -0
  138. metadata +108 -27
  139. data/app/models/concerns/with_status.rb +0 -43
  140. data/app/models/status_rendering_verbosity.rb +0 -40
  141. data/lib/mumuki/laboratory/controllers/messages.rb +0 -9
  142. data/lib/mumuki/laboratory/status/aborted.rb +0 -7
  143. data/lib/mumuki/laboratory/status/base.rb +0 -47
  144. data/lib/mumuki/laboratory/status/errored.rb +0 -15
  145. data/lib/mumuki/laboratory/status/manual_evaluation_pending.rb +0 -15
  146. data/lib/mumuki/laboratory/status/pending.rb +0 -11
  147. data/lib/mumuki/laboratory/status/running.rb +0 -11
  148. data/spec/models/randomizer_spec.rb +0 -18
  149. data/spec/models/verbosity_spec.rb +0 -24
@@ -11,8 +11,11 @@ es:
11
11
  and: y
12
12
  appendix: "Apéndice"
13
13
  appendix_teaser: ¿Querés saber más? <a href="%{link}">Consultá el apéndice de este capítulo</a>
14
+ are_you_sure: '¿Estás seguro que querés %{action}?'
15
+ ask_a_question: ¡Hacé una pregunta!
14
16
  ask_community: Preguntá a la comunidad
15
17
  ask_redirect: ¿Querés que te llevemos ahí?
18
+ ask_the_first_question: ¡Hacé la primera pregunta!
16
19
  author: Autor
17
20
  authoring: "Autores"
18
21
  authoring_note: Esta guía fue desarrollada por %{authors} y <a href="%{collaborators}" target="_blank">muchas personas más</a>, bajo los términos de la <a href="https://creativecommons.org/licenses/by-sa/4.0/" target="_blank">Licencia Creative Commons Compartir-Igual, 4.0</a>.
@@ -24,6 +27,10 @@ es:
24
27
  chapter_number: 'Capítulo %{number}'
25
28
  classroom: Aula
26
29
  clear_console: Reiniciar consola
30
+ closed: Cerrada
31
+ created_at_asc: Antiguas
32
+ created_at_desc: Nuevas
33
+ comment: Comentar
27
34
  confirm: Confirmar
28
35
  confirm_restart: Estás por borrar tu progreso en esta guía. ¿Querés continuar?
29
36
  console: Consola
@@ -41,8 +48,12 @@ es:
41
48
  date: Fecha
42
49
  day: Día
43
50
  days: Días
51
+ description: Descripción
44
52
  destroy: Eliminar
53
+ destroy_message: eliminar el mensaje
45
54
  details: Detalles
55
+ discussion_updated: Consulta actualizada
56
+ discussions: Consultas
46
57
  dont_leave_us: ¡No nos abandones! Aprender a programar es divertido. Sólo tenés que seguir practicando.
47
58
  download: "Descargá lo que hiciste"
48
59
  edit: Editar
@@ -102,6 +113,9 @@ es:
102
113
  let_us_know: ¡Por favor avisanos!
103
114
  load_solution_into_console: Cargar la solución en la consola
104
115
  manual_evaluation_pending: ¡Gracias por enviar tu solución! Tus docentes la corregirán pronto
116
+ message_count:
117
+ one: 1 mensaje
118
+ other: '%{count} mensajes'
105
119
  message: Mensaje
106
120
  messages: Mensajes
107
121
  messages_error: Los mensajes anteriores no están disponibles en este momento. ¡Volvé a intentar mas tarde!
@@ -119,24 +133,30 @@ es:
119
133
  never: nunca
120
134
  new: Nuevo
121
135
  new_message: ¿Tenés dudas? ¡Levantá la mano!
136
+ new_discussion: Nueva consulta
122
137
  new_message_placeholder: Escribí el mensaje para tu docente acá...
123
138
  next_exercise: Siguiente
124
139
  next_guide: 'Siguiente Lección: %{name}'
140
+ no_discussions: No encontramos consultas que coincidan con tu búsqueda.
125
141
  no_exercises: No encontramos ejercicios que coincidan con tu búsqueda.
126
142
  no_guides: No encontramos lecciones que coincidan con tu búsqueda.
127
143
  no_messages: ¡Parece que no tenés ningun mensaje todavía!
144
+ no_questions: Parece que aún no hay ninguna consulta.
128
145
  no_submissions: ¡Parece que aún no intentaste resolver este ejercicio aún!
146
+ no_useful_result: ¿No encontraste lo que estabas buscando?
129
147
  not_found: ¡La página que buscaste no existe!
130
148
  not_found_explanation: Fijate si escribiste bien la dirección. Peeeeero...
131
149
  not_in_any_organizations: ¡Parece que no estás en ninguna organización todavía!
132
- notify_problem_with_exercise: Reportá un error
150
+ notify_problem_with_exercise: Reportá un bug
133
151
  office: Secretaría
152
+ opened: Abierta
134
153
  organizations: Organizaciones
135
154
  output: Salida
136
155
  overview: Vista general
137
156
  passed: ¡Muy bien! Tu solución pasó todas las pruebas
138
157
  passed_with_warnings: Tu solución funcionó, pero hay cosas que mejorar
139
158
  pending: pendiente
159
+ pending_review: En revisión
140
160
  pending_messages: Tenés mensajes sin leer
141
161
  pending_messages_explanation: "¡Tu docente te dejó un mensaje! Revisalo antes de seguir enviando soluciones."
142
162
  permissions: Permisos
@@ -152,6 +172,7 @@ es:
152
172
  read: Leido
153
173
  read_messages: Ver mensajes
154
174
  refresh_or_wait: Si no se muestra automáticamente en unos segundos, presioná F5
175
+ reset_query: Borrar los filtros de búsqueda actuales
155
176
  restart: Reiniciar
156
177
  results: Resultados
157
178
  retry_exercise: Reintentar
@@ -165,9 +186,14 @@ es:
165
186
  sign_out: Cerrar Sesión
166
187
  sign_up_date: Usuario desde
167
188
  solution: Solución
189
+ solved: Resuelta
168
190
  solved_exercises: Ejercicios Resueltos
191
+ solve_doubts: Resolvé consultas
192
+ solve_your_doubts: Consultá tus dudas
193
+ solve_your_doubts_teaser: ¿Tenés alguna consulta?
169
194
  something_went_wrong: ¡Ups!, algo no anduvo bien...
170
195
  something_went_wrong_explanation: Algo no anduvo como se esperaba.
196
+ sort: Ordenar
171
197
  start_lesson: ¡Comenzá esta lección!
172
198
  start_practicing: ¡Empezá ahora!
173
199
  start_using_mumuki: ¡Empezá a usar Mumuki!
@@ -175,6 +201,7 @@ es:
175
201
  status: Estado
176
202
  stay_here: No, quiero quedarme acá
177
203
  stop_emails?: ¿Querés dejar de recibir estos mails?
204
+ subscribe: Recibir notificaciones
178
205
  submission: solución
179
206
  submission_date: Fecha de envío
180
207
  submission_for_exercise: Solucion para ejercicio
@@ -186,21 +213,35 @@ es:
186
213
  tell_us_if_our_error: Si pensás que es un error nuestro, %{issues}
187
214
  terms_and_conditions: Términos y condiciones
188
215
  test_results: Resultados de las pruebas
216
+ time_since: "hace %{time}"
189
217
  time_left: Te quedan
190
218
  title: Título
219
+ to_closed: Cerrar
220
+ to_opened: Reabrir
221
+ to_pending_review: Resolver
222
+ to_solved: Resolver
191
223
  try_again: ¡Ups! Algo salió mal en mumuki. Reiniciá el ejercicio, esperá unos segundos y volvé a intentar.
192
224
  unauthorized_explanation: ¡Ups! Esto es lo que se conoce como %{error}, es decir que no iniciaste sesión.
193
225
  uncategorized: No categorizado
226
+ undo_upvote: No es útil
194
227
  unknown: no resuelto
195
228
  unmeet_expectations: Objetivos que no se cumplieron
229
+ unsubscribe: Dejar de recibir notificaciones
196
230
  unsubscribed_successfully: Te desuscribiste exitosamente de los recordatorios.
197
231
  upload_solution: "Subir solución"
198
232
  uploading_solution: "Subiendo solución"
233
+ upvote: Es útil
234
+ upvotes_count_asc: Más útiles
235
+ upvotes_count_desc: Menos útiles
199
236
  user_data_updated: Tus datos se actualizaron correctamente
200
237
  user: Usuario
201
238
  username: Nombre de usuario
202
239
  want_permissions: El siguiente usuario requiere permisos
203
240
  we_miss_you: ¡Te extrañamos!
241
+ will_paginate:
242
+ previous_label: "&#8592; Anterior"
243
+ next_label: "Siguiente &#8594;"
244
+ page_gap: "&hellip;"
204
245
  working: "Procesando"
205
246
  wrong_answer: La respuesta no es correcta
206
247
  you_must_sign_in_before_submitting: Tenés que iniciar sesión antes de empezar a enviar tus soluciones
@@ -11,8 +11,11 @@ pt:
11
11
  and: e
12
12
  appendix: Apêndice
13
13
  appendix_teaser: Você quer saber mais? <a href="%{link}"> Consulte o apêndice deste capítulo </a>
14
+ are_you_sure: 'Tem certeza de que deseja %{action}?'
15
+ ask_a_question: Faça uma pergunta!
14
16
  ask_community: Pergunte à comunidade
15
17
  ask_redirect: Você quer que nós o levemos para lá?
18
+ ask_the_first_question: Faça a primeira pergunta!
16
19
  author: Autor
17
20
  authoring: Autores
18
21
  authoring_note: 'Este guia foi desenvolvido por %{authors} e <a href="%{collaborators}" target="_blank"> muitas outras pessoas </a>, nos termos do <a href = "https://creativecommons.org/licenses/by-sa/4.0/" target="_blank"> Creative Commons License Share-Equal, 4.0 </a>.'
@@ -23,6 +26,8 @@ pt:
23
26
  chapter_number: Capítulo %{number}
24
27
  classroom: Sala de aula
25
28
  clear_console: Reiniciar o console
29
+ closed: Fechado
30
+ comment: Comentar
26
31
  confirm: Confirme
27
32
  confirm_restart: Você está prestes a apagar o seu progresso neste guia. Você quer continuar?
28
33
  console: Consola
@@ -35,13 +40,19 @@ pt:
35
40
  correct_answer: A resposta está correta!
36
41
  create_submission: Enviar
37
42
  created_at: Criado
43
+ created_at_asc: Antigo
44
+ created_at_desc: Novo
38
45
  created_exercises: Exercícios criados
39
46
  created_guides: Lições criadas
40
47
  date: Data
41
48
  day: Dia
42
49
  days: Dias
50
+ description: Descrição
43
51
  destroy: Excluir
52
+ destroy_message: excluir a mensagem
44
53
  details: Detalhes
54
+ discussion_updated: Consulta actualizada
55
+ discussions: Consultas
45
56
  download: Faça o download do que você fez
46
57
  edit: Editar
47
58
  editor_placeholder: ... Escreva sua solução aqui ...
@@ -54,7 +65,7 @@ pt:
54
65
  error_500: erro 500
55
66
  errored: Opa! Sua solução não pode ser executada
56
67
  exam_number: 'Revise %{number}:'
57
- exams: Exames
68
+ exams: Examesca
58
69
  exercise: Exercício
59
70
  exercise_count: exercícios
60
71
  exercise_number: Exercício %{number}
@@ -100,6 +111,9 @@ pt:
100
111
  let_us_know: Por favor, avise-nos!
101
112
  load_solution_into_console: Carregue a solução no console
102
113
  manual_evaluation_pending: Obrigado por enviar sua solução! Seus professores irão corrigi-lo em breve
114
+ message_count:
115
+ one: 1 mensagem
116
+ other: '%{count} mensagens'
103
117
  message: Mensagem
104
118
  messages: Mensagens
105
119
  messages_error: As mensagens acima não estão disponíveis no momento. Eu tentei novamente mais tarde!
@@ -120,15 +134,19 @@ pt:
120
134
  new_message_placeholder: Escreva sua mensagem para o seu professor aqui ...
121
135
  next_exercise: Em seguida
122
136
  next_guide: Próxima Lição %{nome}
137
+ no_discussions: Não encontramos consultas que correspondam à sua pesquisa.
123
138
  no_exercises: Não encontramos exercícios que correspondam à sua pesquisa.
124
139
  no_guides: Não encontramos lições que correspondam à sua pesquisa.
125
140
  no_messages: Parece que você ainda não tem uma mensagem!
141
+ no_questions: Parece que ainda não há dúvida.
126
142
  no_submissions: Parece que você ainda não tentou resolver este exercício!
143
+ no_useful_result: Didn't find what you were looking for
127
144
  not_found: A página que você pesquisou não existe!
128
145
  not_found_explanation: Olhe se você escreveu o endereço corretamente. Mas...
129
146
  not_in_any_organizations: Parece que você ainda não está em nenhuma organização!
130
147
  notify_problem_with_exercise: Relatar um erro
131
148
  office: Secretariado
149
+ opened: Aberto
132
150
  organizations: Organizações
133
151
  output: Sair
134
152
  overview: Visão global
@@ -137,6 +155,7 @@ pt:
137
155
  pending: pendente
138
156
  pending_messages: Você tem mensagens não lidas
139
157
  pending_messages_explanation: Seu professor deixou uma mensagem para você! Verifique antes de continuar a enviar soluções.
158
+ pending_review: Sendo revisto
140
159
  permissions: Permissões
141
160
  please_fill_profile_data: Preencha suas informações pessoais para continuar!
142
161
  please_validate: Você está prestes a entrar no curso. Para oferecer uma experiência melhor, valide que seus dados abaixo sejam reais e corretos.
@@ -150,6 +169,7 @@ pt:
150
169
  read: Ler
151
170
  read_messages: Ver mensagens
152
171
  refresh_or_wait: Se não mostrar automaticamente em alguns segundos, pressione F5
172
+ reset_query: Limpar filtros de pesquisa atuais
153
173
  restart: Reiniciar
154
174
  results: Resultados
155
175
  retry_exercise: Tentar novamente
@@ -163,9 +183,14 @@ pt:
163
183
  sign_out: Fechar Sessão
164
184
  sign_up_date: Usuário de
165
185
  solution: Solução
186
+ solved: Resolvido
166
187
  solved_exercises: Exercícios resolvidos
188
+ solve_doubts: Resolvi dúvidas
189
+ solve_your_doubts: Consulte suas dúvidas
190
+ solve_your_doubts_teaser: Você tem alguma dúvida?
167
191
  something_went_wrong: Oops!, Algo não estava certo ...
168
192
  something_went_wrong_explanation: Algo não foi como esperado.
193
+ sort: Ordenar
169
194
  start_lesson: Comece esta lição!
170
195
  start_practicing: Comece agora!
171
196
  stats: Seu progresso
@@ -177,18 +202,25 @@ pt:
177
202
  submissions: Soluções
178
203
  submissions_count: Soluções
179
204
  submissions_for: Soluções para %{exercise}
205
+ subscribe: se inscrever
180
206
  tag: Etiquetas
181
207
  tell_us_how: Conte-nos como isso aconteceu com você!
182
208
  tell_us_if_our_error: Se você acha que é nosso erro, %{issues}
183
209
  terms_and_conditions: Termos e Condições
184
210
  test_results: Resultados do teste
211
+ time_since: "há %{time}"
185
212
  time_left: Te deixam
186
213
  title: Título
214
+ to_closed: Fechar
215
+ to_opened: Reabrir
216
+ to_pending_review: Marcar como resolvida
217
+ to_solved: Marcar como resolvida
187
218
  try_again: Opa, algo deu errado em Mumuki. Reinicie o exercício, aguarde alguns segundos e tente novamente.
188
219
  unauthorized_explanation: Opa! Isso é o que é conhecido como %{error}, ou seja, você não fez logon.
189
220
  uncategorized: Não classificado
190
221
  unknown: não resolvido
191
222
  unmeet_expectations: Objetivos que não foram atendidos
223
+ unsubscribe: Cancelar subscrição
192
224
  upload_solution: Carregar solução
193
225
  uploading_solution: Uploading solution
194
226
  user: Usuário
@@ -1,61 +1,68 @@
1
1
  module Mumuki::Laboratory::Status
2
- def self.load(i)
3
- cast(i)
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ to_status_method_name = to_status_method
6
+ base = self
7
+ String.send :define_method, to_status_method_name, proc { to_sym.send(to_status_method_name) }
8
+ Symbol.send :define_method, to_status_method_name, proc { base.from_sym(self) }
9
+ define_method to_status_method_name, proc { self }
4
10
  end
5
11
 
6
- def self.dump(status)
7
- if status.is_a? Numeric
8
- status
9
- else
10
- status.to_mumuki_status.to_i
11
- end
12
+ def to_s
13
+ name.demodulize.underscore
12
14
  end
13
15
 
14
- def self.from_sym(status)
15
- "Mumuki::Laboratory::Status::#{status.to_s.camelize}".constantize
16
+ def to_i
17
+ parent::STATUSES.index(self)
16
18
  end
17
19
 
18
- def self.cast(i)
19
- STATUSES[i.to_i]
20
+ def to_sym
21
+ to_s.to_sym
20
22
  end
21
- end
22
23
 
23
- require_relative './status/base'
24
- require_relative './status/unknown'
25
- require_relative './status/pending'
26
- require_relative './status/running'
27
- require_relative './status/passed'
28
- require_relative './status/failed'
29
- require_relative './status/errored'
30
- require_relative './status/aborted'
31
- require_relative './status/passed_with_warnings'
32
- require_relative './status/manual_evaluation_pending'
24
+ def ==(other)
25
+ self.equal? parent.to_mumuki_status(other) rescue false
26
+ end
33
27
 
34
- module Mumuki::Laboratory::Status
35
- STATUSES = [Pending, Running, Passed, Failed, Errored, Aborted, PassedWithWarnings, ManualEvaluationPending]
36
- end
28
+ class_methods do
29
+ def load(i)
30
+ cast(i)
31
+ end
37
32
 
33
+ def dump(status)
34
+ if status.is_a? Numeric
35
+ status
36
+ else
37
+ to_mumuki_status(status).to_i
38
+ end
39
+ end
38
40
 
39
- class Object
40
- def to_mumuki_status
41
- status.to_mumuki_status
42
- end
43
- end
41
+ def to_mumuki_status(status)
42
+ status.send(to_status_method)
43
+ end
44
44
 
45
- class String
46
- def to_mumuki_status
47
- to_sym.to_mumuki_status
48
- end
49
- end
45
+ def to_status_method
46
+ "to_#{self}_status"
47
+ end
50
48
 
51
- class Symbol
52
- def to_mumuki_status
53
- Mumuki::Laboratory::Status.from_sym(self)
54
- end
55
- end
49
+ def from_sym(status)
50
+ "Mumuki::Laboratory::Status::#{module_namespace(self)}::#{module_namespace(status)}".constantize
51
+ end
56
52
 
57
- module Mumuki::Laboratory::Status::Base
58
- def to_mumuki_status
59
- self
53
+ def module_namespace(mod)
54
+ mod.to_s.camelize
55
+ end
56
+
57
+ def cast(i)
58
+ self::STATUSES[i.to_i] if i.present?
59
+ end
60
+
61
+ def to_s
62
+ name.demodulize.underscore
63
+ end
60
64
  end
61
65
  end
66
+
67
+ require_relative './status/submission/submission'
68
+ require_relative './status/discussion/discussion'
@@ -0,0 +1,15 @@
1
+ module Mumuki::Laboratory::Status::Discussion::Closed
2
+ extend Mumuki::Laboratory::Status::Discussion
3
+
4
+ def self.closed?
5
+ true
6
+ end
7
+
8
+ def self.reachable_statuses_for_moderator(*)
9
+ [Mumuki::Laboratory::Status::Discussion::Opened, Mumuki::Laboratory::Status::Discussion::Solved]
10
+ end
11
+
12
+ def self.iconize
13
+ {class: :danger, type: 'times-circle'}
14
+ end
15
+ end
@@ -0,0 +1,56 @@
1
+ module Mumuki::Laboratory::Status::Discussion
2
+ include Mumuki::Laboratory::Status
3
+ end
4
+
5
+ require_relative './opened'
6
+ require_relative './closed'
7
+ require_relative './solved'
8
+ require_relative './pending_review'
9
+
10
+ module Mumuki::Laboratory::Status::Discussion
11
+ STATUSES = [Opened, Closed, Solved, PendingReview]
12
+
13
+ def closed?
14
+ false
15
+ end
16
+
17
+ def opened?
18
+ false
19
+ end
20
+
21
+ def solved?
22
+ false
23
+ end
24
+
25
+ def pending_review?
26
+ false
27
+ end
28
+
29
+ def allowed_for?(*)
30
+ true
31
+ end
32
+
33
+ def reachable_statuses_for_moderator(*)
34
+ []
35
+ end
36
+
37
+ def reachable_statuses_for_initiator(*)
38
+ []
39
+ end
40
+
41
+ def should_be_shown?(count, user)
42
+ count > 0 || user&.moderator?
43
+ end
44
+
45
+ def reachable_statuses_for(user, discussion)
46
+ if user.moderator?
47
+ reachable_statuses_for_moderator(discussion)
48
+ else
49
+ reachable_statuses_for_initiator(discussion)
50
+ end
51
+ end
52
+
53
+ def allowed_statuses_for(user, discussion)
54
+ STATUSES.select { |it| it.allowed_for?(user, discussion) }
55
+ end
56
+ end