mumuki-laboratory 9.20.0 → 9.23.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +11 -0
  3. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_discussion.scss +1 -3
  4. data/app/controllers/appendixes_controller.rb +7 -0
  5. data/app/controllers/application_controller.rb +6 -3
  6. data/app/controllers/complements_controller.rb +13 -0
  7. data/app/controllers/login_controller.rb +11 -3
  8. data/app/controllers/users_controller.rb +11 -4
  9. data/app/helpers/application_helper.rb +3 -1
  10. data/app/helpers/discussions_helper.rb +41 -26
  11. data/app/helpers/mailer_helper.rb +5 -0
  12. data/app/helpers/user_menu_helper.rb +7 -3
  13. data/app/mailers/application_mailer.rb +1 -0
  14. data/app/mailers/user_mailer.rb +6 -1
  15. data/app/views/book/show.html.erb +21 -18
  16. data/app/views/chapters/show.html.erb +1 -1
  17. data/app/views/discussions/_description_message.html.erb +6 -4
  18. data/app/views/discussions/_message.html.erb +10 -8
  19. data/app/views/discussions/show.html.erb +1 -1
  20. data/app/views/errors/forbidden.html.erb +1 -3
  21. data/app/views/errors/gone.html.erb +1 -2
  22. data/app/views/errors/not_found.html.erb +1 -1
  23. data/app/views/guides/_guide.html.erb +9 -5
  24. data/app/views/layouts/_discussions.html.erb +1 -3
  25. data/app/views/layouts/_organization_chooser.html.erb +2 -2
  26. data/app/views/layouts/_user_menu.html.erb +2 -0
  27. data/app/views/user_mailer/delete_account.html.erb +7 -0
  28. data/app/views/users/_user_delete_confirmation.erb +17 -0
  29. data/app/views/users/_user_delete_modal.html.erb +35 -0
  30. data/app/views/users/delete_account.html.erb +27 -0
  31. data/app/views/users/delete_confirmation_invalid.html.erb +22 -0
  32. data/app/views/users/delete_request.html.erb +1 -0
  33. data/config/routes.rb +6 -3
  34. data/lib/mumuki/laboratory/controllers/dynamic_errors.rb +6 -6
  35. data/lib/mumuki/laboratory/controllers/validate_access_mode.rb +5 -1
  36. data/lib/mumuki/laboratory/locales/en.yml +19 -2
  37. data/lib/mumuki/laboratory/locales/es-CL.yml +20 -3
  38. data/lib/mumuki/laboratory/locales/es.yml +21 -3
  39. data/lib/mumuki/laboratory/locales/pt.yml +20 -4
  40. data/lib/mumuki/laboratory/version.rb +1 -1
  41. data/spec/capybara_helper.rb +10 -10
  42. data/spec/controllers/discussions_messages_controller_spec.rb +5 -5
  43. data/spec/controllers/messages_controller_spec.rb +3 -3
  44. data/spec/controllers/users_controller_spec.rb +20 -1
  45. data/spec/dummy/config/environments/development.rb +8 -2
  46. data/spec/dummy/config/environments/test.rb +4 -1
  47. data/spec/dummy/db/schema.rb +5 -2
  48. data/spec/features/discussion_flow_spec.rb +2 -2
  49. data/spec/features/dynamic_exam_spec.rb +4 -2
  50. data/spec/features/guides_flow_spec.rb +29 -7
  51. data/spec/features/immersive_redirection_spec.rb +2 -2
  52. data/spec/features/not_found_public_flow_spec.rb +8 -1
  53. data/spec/features/profile_flow_spec.rb +3 -1
  54. data/spec/features/read_only_flow_spec.rb +72 -1
  55. data/spec/mailers/previews/user_mailer_preview.rb +4 -0
  56. data/spec/mailers/user_mailer_spec.rb +10 -3
  57. metadata +133 -108
  58. data/spec/features/disable_user_flow_spec.rb +0 -32
@@ -0,0 +1,35 @@
1
+ <div class="modal fade" id="user-delete-account-modal" tabindex="-1" role="dialog">
2
+ <div class="modal-dialog modal-lg d-table">
3
+ <div class="modal-content">
4
+ <div class="modal-header">
5
+ <h3 class="modal-title"><%= t :delete_account %></h4>
6
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
7
+ </div>
8
+ <div class="modal-body">
9
+ <div class="container-fluid">
10
+ <div class="row">
11
+ <p><%= t :delete_account_modal_explain_html, user_email: @user.email %></p>
12
+ </div>
13
+ <% if @user.student_granted_organizations.present? %>
14
+ <div class="row">
15
+ <p><%= t :delete_account_modal_lost_permissions %></p>
16
+ </div>
17
+ <div class="row">
18
+ <% @user.student_granted_organizations.each do |organization| %>
19
+ <div class="col-md-4 text-center">
20
+ <%= image_tag(organization.banner_url, width: '100%', class: 'pull-left') %>
21
+ <p><%= organization.name %></p>
22
+ </div>
23
+ <% end %>
24
+ </div>
25
+ <% end %>
26
+ <div class="row">
27
+ <%= form_with class: 'mu-form', url: delete_request_user_path do |f| %>
28
+ <%= f.submit t(:delete_account_agree), class: 'btn btn-danger w-100', id: 'delete-account-button' %>
29
+ <% end %>
30
+ </div>
31
+ </div>
32
+ </div>
33
+ </div>
34
+ </div>
35
+ </div>
@@ -0,0 +1,27 @@
1
+ <%= content_for :breadcrumbs do %>
2
+ <%= breadcrumbs_for_my_account %>
3
+ <% end %>
4
+
5
+ <div class="row">
6
+ <%= render partial: 'layouts/user_menu' %>
7
+
8
+ <div class="col-md-9 mu-tab-body">
9
+ <h3 class="text-danger"><%= t :delete_account %></h3>
10
+ <div class="row">
11
+ <div class="col-md-8">
12
+ <p><%= t :delete_account_explain %></p>
13
+ </div>
14
+ <div class="col-md-4">
15
+ <div class="pull-right">
16
+ <button type="button" class="btn btn-danger" data-bs-toggle="modal" data-bs-target="#user-delete-account-modal">
17
+ <%= t :delete_account %>
18
+ </button>
19
+ </div>
20
+ </div>
21
+ </div>
22
+ </div>
23
+ </div>
24
+
25
+ <%= content_for :no_container do %>
26
+ <%= render partial: 'user_delete_modal' %>
27
+ <% end %>
@@ -0,0 +1,22 @@
1
+ <%= content_for :breadcrumbs do %>
2
+ <%= breadcrumbs @user %>
3
+ <% end %>
4
+
5
+ <div class="row">
6
+ <div class="mu-inline-block-left">
7
+ <h1>
8
+ <%= t :delete_account %>
9
+ </h1>
10
+ </div>
11
+ </div>
12
+
13
+ <div class="row">
14
+ <div class="col-md-12">
15
+ <p>
16
+ <%= t :delete_account_invalid_token %>
17
+ </p>
18
+ <p>
19
+ <%= t :delete_account_try_again_html, profile_url: user_path %>
20
+ </p>
21
+ </div>
22
+ </div>
@@ -0,0 +1 @@
1
+ <%= render partial: 'user_delete_confirmation' %>
data/config/routes.rb CHANGED
@@ -63,9 +63,6 @@ Rails.application.routes.draw do
63
63
  get :terms
64
64
  post :terms, to: 'users#accept_profile_terms'
65
65
 
66
- # Notification subscriptions
67
- get :unsubscribe
68
-
69
66
  get :messages
70
67
  get :discussions
71
68
  get :activity
@@ -76,6 +73,12 @@ Rails.application.routes.draw do
76
73
  post 'notifications/:id/toggle_read', action: :toggle_read
77
74
  get 'notifications/manage', action: :show_manage_notifications
78
75
  post 'notifications/manage', action: :manage_notifications
76
+
77
+ get :delete_account
78
+ get :delete_request
79
+ post :delete_request, to: 'users#send_delete_confirmation_email'
80
+ get :delete_confirmation_invalid
81
+ get :delete_confirmation
79
82
  end
80
83
 
81
84
  resources :faqs, only: [:index]
@@ -41,27 +41,27 @@ module Mumuki::Laboratory::Controllers::DynamicErrors
41
41
  def forbidden
42
42
  message = "The operation on organization #{Organization.current} was forbidden to user #{current_user.uid} with permissions #{current_user.permissions}"
43
43
  Rails.logger.info message
44
- render_error 'forbidden', 403, locals: { explanation: :forbidden_explanation }, error_message: message
44
+ render_error 'forbidden', 403, locals: { error_code: :forbidden, explanation: :forbidden_explanation }, error_message: message
45
45
  end
46
46
 
47
47
  def disabled
48
- render_error 'forbidden', 403, locals: { explanation: :disabled_explanation }
48
+ render_error 'forbidden', 403, locals: { error_code: :disabled, explanation: :disabled_explanation }
49
49
  end
50
50
 
51
51
  def blocked_forum
52
- render_error 'forbidden', 403, locals: { explanation: :blocked_forum_explanation }
52
+ render_error 'forbidden', 403, locals: { error_code: :blocked_forum, explanation: :blocked_forum_explanation }
53
53
  end
54
54
 
55
55
  def gone
56
- render_error 'gone', 410, locals: { explanation: :gone_explanation }
56
+ render_error 'gone', 410, locals: { error_code: :gone, explanation: :gone_explanation }
57
57
  end
58
58
 
59
59
  def unprepared_organization
60
- render_error 'forbidden', 403, locals: { explanation: :unprepared_organization_explanation }
60
+ render_error 'forbidden', 403, locals: { error_code: :unprepared_organization, explanation: :unprepared_organization_explanation }
61
61
  end
62
62
 
63
63
  def disabled_organization
64
- render_error 'gone', 410, locals: { explanation: :disabled_organization_explanation }
64
+ render_error 'gone', 410, locals: { error_code: :disabled_organization, explanation: :disabled_organization_explanation }
65
65
  end
66
66
 
67
67
  def render_error(template, status, options={})
@@ -6,7 +6,7 @@ module Mumuki::Laboratory::Controllers::ValidateAccessMode
6
6
  end
7
7
 
8
8
  def validate_accessible!
9
- current_access_mode.validate_content_here! subject_container
9
+ current_access_mode.validate_content_here! subject_container unless contentless_subject?
10
10
  super
11
11
  end
12
12
 
@@ -14,6 +14,10 @@ module Mumuki::Laboratory::Controllers::ValidateAccessMode
14
14
  subject
15
15
  end
16
16
 
17
+ def contentless_subject?
18
+ false
19
+ end
20
+
17
21
  def accessible_subject
18
22
  nil
19
23
  end
@@ -74,8 +74,19 @@ en:
74
74
  created_at: Created at
75
75
  date: Date
76
76
  date_and_time: Date and time
77
+ delete_account: Delete account
78
+ delete_account_agree: I understand the consequences and want to delete my account
79
+ delete_account_confirmation_email_explain_html: <p>We've sent you an email to <strong>%{user_email}</strong> to continue with the removal process. </p><p> Please, check your inbox. If you have not received it, please contact us at <a href="mailto:%{disable_email}">%{disable_email}</a>.</p>
80
+ delete_account_confirmation_request: To confirm this action, please write
81
+ delete_account_explain: Upon deleting your account, you will lose access to your progress as well as your personal data.
82
+ delete_account_invalid_token: We are sorry, the link you followed here has expired or is invalid.
83
+ delete_account_modal_explain_html: To keep your account safe, we'll send you an email to <strong>%{user_email}</strong> to continue the deletion process.
84
+ delete_account_modal_lost_permissions: 'By deleting your account, you will lose access to the following courses:'
85
+ delete_account_mumuki: Delete your Mumuki account
86
+ delete_account_try_again_html: If you still want to delete your account, start the process again from <a href="%{profile_url}">your profile</a>.
77
87
  deleted_by: Deleted by %{deleter}
78
88
  deleted_message_warning: If you repeateadly violate these or other rules, you may be prohibited from accessing the forum or you may suffer more severe consequences, such as being expulsed from the course.
89
+ deleted_user: Deleted User
79
90
  deletion_motive:
80
91
  inappropriate_content:
81
92
  present: Includes inappropriate content
@@ -106,6 +117,7 @@ en:
106
117
  edit_profile: Edit profile
107
118
  editor_placeholder: "write your solution here..."
108
119
  email: Email
120
+ email_sent: Email sent
109
121
  error:
110
122
  title:
111
123
  forbidden: You are not allowed to see this content
@@ -199,23 +211,27 @@ en:
199
211
  locked_content: 'This content will be unlocked when you finish previous chapters'
200
212
  mailer:
201
213
  title:
214
+ custom: You have a new notification!
215
+ delete_account: Confirm account deletion
202
216
  exam_authorization_request_updated: There are updates in your exam registration
203
217
  exam_authorization_request_rejected: Exam registration rejected
204
218
  exam_registration: Exam registrations open
205
- custom: You have a new notification!
206
219
  subtitle:
220
+ delete_account: You've requested to delete your Mumuki account
207
221
  exam_authorization_request_approved: Your registration request to the exam has been approved.
208
222
  exam_authorization_request_rejected: Your registration request to the exam has been rejected because the requirements weren't met.
209
223
  exam_registration: ¡You can register for the exam!
210
224
  text:
225
+ delete_account: Once your account is deleted, your progress and personal data will be deleted as well and you will not be able to access this account again or request the restoration of the deleted information. <br><br> This is irreversible and permanent. <br><br> Do you understand the consequences and still want to delete your account?
211
226
  exam_authorization_request_approved: You can sit for the exam on %{exam_start_date} by going into the platform. ¡Good luck!
212
227
  exam_authorization_request_rejected: ¡Don't be upset! You did a great job and we hope you'll keep learning programming.
213
228
  exam_registration: You have until %{exam_registration_deadline} to sign up. In order to be approved, you must meet the requirements.
214
229
  button:
230
+ custom: My notifications
231
+ delete_account: Delete Account
215
232
  exam_registration: Sign up for the exam
216
233
  exam_authorization_request_approved: Go to the platform
217
234
  exam_authorization_request_rejected: My exams
218
- custom: My notifications
219
235
  male: Male
220
236
  manage_notification_subscriptions: Manage your notification subscriptions
221
237
  manage_notifications: Manage notifications
@@ -389,6 +405,7 @@ en:
389
405
  upvotes_count_asc: Least voted
390
406
  user: User
391
407
  user_data_updated: Your data was updated successfully
408
+ user_deleted_successfully: Your account was successfully deleted
392
409
  username: Username
393
410
  verified_full_name: Verified name
394
411
  verified_full_name_notice: Your verified name was provided by %{organization}. If there's a mistake, please send an email to %{contact}.
@@ -74,8 +74,19 @@ es-CL:
74
74
  created_guides: Lecciones Creadas
75
75
  date: Fecha
76
76
  date_and_time: Fecha y hora
77
+ delete_account: Eliminar cuenta
78
+ delete_account_agree: Enviar mail para eliminar cuenta
79
+ delete_account_confirmation_email_explain_html: <p>Te enviamos un correo electrónico a <strong>%{user_email}</strong> para continuar con el proceso de eliminación. </p><p> Por favor, revisá tu casilla. Si no lo recibiste, escríbenos a <a href="mailto:%{disable_email}">%{disable_email}</a>.</p>
80
+ delete_account_confirmation_request: Para confirmar esta acción, escribí
81
+ delete_account_explain: Al eliminar tu cuenta se eliminarán también tu progreso y todos tus datos personales.
82
+ delete_account_invalid_token: Lo sentimos, el enlace que utilizaste ha expirado o es inválido.
83
+ delete_account_modal_explain_html: Por cuestiones de seguridad, para eliminar tu cuenta te enviaremos un mail a tu casilla <strong>%{user_email}</strong>.
84
+ delete_account_modal_lost_permissions: 'Al eliminar tu cuenta perderás el acceso a los siguientes cursos:'
85
+ delete_account_mumuki: Eliminar tu cuenta de Mumuki
86
+ delete_account_try_again_html: Si todavía quieres eliminar tu cuenta, vuelve a iniciar el proceso desde <a href="%{profile_url}">tu perfil</a>.
77
87
  deleted_by: Eliminado por %{deleter}
78
88
  deleted_message_warning: Si infringes reiteradamente estas u otras reglas del Espacio de Consultas, se te puede prohibir el acceso al mismo o podrás sufrir consecuencias más severas, como la expulsión del curso.
89
+ deleted_user: Cuenta Eliminada
79
90
  deletion_motive:
80
91
  inappropriate_content:
81
92
  present: Incluye contenido inapropiado
@@ -107,6 +118,7 @@ es-CL:
107
118
  edit_message: Editar mensaje
108
119
  editor_placeholder: "...escribe tu solución acá..."
109
120
  email: Email
121
+ email_sent: Email enviado
110
122
  error_description: Esto es lo que se conoce como <span class="error-link">%{error}</span>.
111
123
  error_401: error 401
112
124
  error_403: error 403
@@ -203,23 +215,27 @@ es-CL:
203
215
  locked_content: 'Éste contenido se desbloqueará cuando termines los capítulos anteriores'
204
216
  mailer:
205
217
  title:
218
+ custom: ¡Tenés una nueva notificación!
219
+ delete_account: Confirmar eliminación de cuenta
206
220
  exam_authorization_request_updated: Tenés cambios en tu inscripción al examen
207
221
  exam_authorization_request_rejected: Inscripción rechazada
208
222
  exam_registration: Apertura de inscripciones
209
- custom: ¡Tenés una nueva notificación!
210
223
  subtitle:
224
+ delete_account: Solicitaste eliminar tu cuenta de Mumuki
211
225
  exam_authorization_request_approved: Tu solicitud de inscripción al examen fue aprobada.
212
226
  exam_authorization_request_rejected: Tu solicitud de inscripción al examen fue rechazada ya que no se cumplieron los requisitos.
213
227
  exam_registration: ¡Ya podés inscribirte al examen!
214
228
  text:
229
+ delete_account: Una vez que se elimine tu cuenta se eliminarán también tu progreso y todos tus datos personales y no podrás volver a acceder a esta cuenta ni pedir la restitución futura de la información. <br><br> Esta acción es irreversible y permanente. <br><br> ¿Entiendes las consecuencias y aún así quieres eliminar tu cuenta?
215
230
  exam_authorization_request_approved: Podrás rendir el examen el día %{exam_start_date} ingresando a la plataforma. ¡Éxitos!
216
231
  exam_authorization_request_rejected: ¡No te desanimes! Hiciste un gran esfuerzo y esperamos que continúes aprendiendo programación.
217
232
  exam_registration: Tenés tiempo de inscribirte hasta el %{exam_registration_deadline}. Para que tu inscripción sea aceptada debés cumplir con los requisitos.
218
233
  button:
234
+ custom: Mis notificaciones
235
+ delete_account: Eliminar Cuenta
219
236
  exam_registration: Inscribirme al Examen
220
237
  exam_authorization_request_approved: Ir a la plataforma
221
238
  exam_authorization_request_rejected: Mis exámenes
222
- custom: Mis notificaciones
223
239
  male: Hombre
224
240
  manage_notification_subscriptions: Administrá tus notificaciones
225
241
  manage_notifications: Administrar notificaciones
@@ -291,7 +307,7 @@ es-CL:
291
307
  one: '1 abierta'
292
308
  other: '%{count} abiertas'
293
309
  organizations: Organizaciones
294
- organization_read_only_legend: 'Estás en modo lectura. Solo podrás acceder a los ejercicios que realizaste previamente y no podrás enviar nuevas soluciones'
310
+ organization_read_only_legend: 'Estás en Modo Lectura: como el curso ya finalizó no podrás enviar soluciones'
295
311
  other: Otro
296
312
  out_of_attempts: Te quedaste sin intentos. ¡Sigue al próximo ejercicio!
297
313
  output: Salida
@@ -403,6 +419,7 @@ es-CL:
403
419
  upvotes_count_desc: Más útiles
404
420
  upvotes_count_asc: Menos útiles
405
421
  user_data_updated: Tus datos se actualizaron correctamente
422
+ user_deleted_successfully: Tu cuenta fue eliminada exitosamente
406
423
  user: Usuario
407
424
  username: Nombre de usuario
408
425
  verified_full_name: Nombre verificado
@@ -79,8 +79,19 @@ es:
79
79
  created_guides: Lecciones Creadas
80
80
  date: Fecha
81
81
  date_and_time: Fecha y hora
82
+ delete_account: Eliminar cuenta
83
+ delete_account_agree: Enviar mail para eliminar cuenta
84
+ delete_account_confirmation_email_explain_html: <p>Te enviamos un correo electrónico a <strong>%{user_email}</strong> para continuar con el proceso de eliminación. </p><p> Por favor, revisá tu casilla. Si no lo recibiste, escribinos a <a href="mailto:%{disable_email}">%{disable_email}</a>.</p>
85
+ delete_account_confirmation_request: Para confirmar esta acción, escribí
86
+ delete_account_explain: Al eliminar tu cuenta se eliminarán también tu progreso y todos tus datos personales.
87
+ delete_account_invalid_token: Lo sentimos, el enlace que utilizaste ha expirado o es inválido.
88
+ delete_account_modal_explain_html: Por cuestiones de seguridad, para eliminar tu cuenta te enviaremos un mail a tu casilla <strong>%{user_email}</strong>.
89
+ delete_account_modal_lost_permissions: 'Al eliminar tu cuenta perderás el acceso a los siguientes cursos:'
90
+ delete_account_mumuki: Eliminar tu cuenta de Mumuki
91
+ delete_account_try_again_html: Si todavía querés eliminar tu cuenta, volvé a iniciar el proceso desde <a href="%{profile_url}">tu perfil</a>.
82
92
  deleted_by: Eliminado por %{deleter}
83
93
  deleted_message_warning: Si infringís reiteradamente estas u otras reglas del Espacio de Consultas, se te puede prohibir el acceso al mismo o podrás sufrir consecuencias más severas, como la expulsión del curso.
94
+ deleted_user: Cuenta Eliminada
84
95
  deletion_motive:
85
96
  inappropriate_content:
86
97
  present: Incluye contenido inapropiado
@@ -93,6 +104,7 @@ es:
93
104
  past: Divulgaba información personal
94
105
  day: Día
95
106
  days: Días
107
+ delete_account: Eliminar Cuenta
96
108
  description: Descripción
97
109
  destroy_message: eliminar el mensaje
98
110
  destroy: Eliminar
@@ -114,6 +126,7 @@ es:
114
126
  edit_profile: Editar perfil
115
127
  editor_placeholder: "...escribí tu solución acá..."
116
128
  email: Email
129
+ email_sent: Email enviado
117
130
  error_description: Esto es lo que se conoce como <span class="error-link">%{error}</span>.
118
131
  error_401: error 401
119
132
  error_403: error 403
@@ -212,23 +225,27 @@ es:
212
225
  locked_content: 'Este contenido se desbloqueará cuando termines los capítulos anteriores'
213
226
  mailer:
214
227
  title:
228
+ custom: ¡Tenés una nueva notificación!
229
+ delete_account: Confirmar eliminación de cuenta
215
230
  exam_authorization_request_updated: Tenés cambios en tu inscripción al examen
216
231
  exam_authorization_request_rejected: Inscripción rechazada
217
232
  exam_registration: Apertura de inscripciones
218
- custom: ¡Tenés una nueva notificación!
219
233
  subtitle:
234
+ delete_account: Solicitaste eliminar tu cuenta de Mumuki
220
235
  exam_authorization_request_approved: Tu solicitud de inscripción al examen fue aprobada.
221
236
  exam_authorization_request_rejected: Tu solicitud de inscripción al examen fue rechazada ya que no se cumplieron los requisitos.
222
237
  exam_registration: ¡Ya podés inscribirte al examen!
223
238
  text:
239
+ delete_account: Una vez que se elimine tu cuenta se eliminarán también tu progreso y todos tus datos personales y no podrás volver a acceder a esta cuenta ni pedir la restitución futura de la información. <br><br> Esta acción es irreversible y permanente. <br><br> ¿Entendés las consecuencias y aún así querés eliminar tu cuenta?
224
240
  exam_authorization_request_approved: Podrás rendir el examen el día %{exam_start_date} ingresando a la plataforma. ¡Éxitos!
225
241
  exam_authorization_request_rejected: ¡No te desanimes! Hiciste un gran esfuerzo y esperamos que continúes aprendiendo programación.
226
242
  exam_registration: Tenés tiempo de inscribirte hasta el %{exam_registration_deadline}. Para que tu inscripción sea aceptada debés cumplir con los requisitos.
227
243
  button:
244
+ custom: Mis notificaciones
245
+ delete_account: Eliminar cuenta
228
246
  exam_registration: Inscribirme al Examen
229
247
  exam_authorization_request_approved: Ir a la plataforma
230
248
  exam_authorization_request_rejected: Mis exámenes
231
- custom: Mis notificaciones
232
249
  male: Hombre
233
250
  manage_notification_subscriptions: Administrá tus notificaciones
234
251
  manage_notifications: Administrar notificaciones
@@ -300,7 +317,7 @@ es:
300
317
  one: '1 abierta'
301
318
  other: '%{count} abiertas'
302
319
  organizations: Organizaciones
303
- organization_read_only_legend: 'Estás en modo lectura. Solo podrás acceder a los ejercicios que realizaste previamente y no podrás enviar nuevas soluciones'
320
+ organization_read_only_legend: 'Estás en Modo Lectura: como el curso ya finalizó no podrás enviar soluciones'
304
321
  other: Otro
305
322
  out_of_attempts: Te quedaste sin intentos. ¡Seguí al proximo ejercicio!
306
323
  output: Salida
@@ -417,6 +434,7 @@ es:
417
434
  upvotes_count_desc: Más útiles
418
435
  upvotes_count_asc: Menos útiles
419
436
  user_data_updated: Tus datos se actualizaron correctamente
437
+ user_deleted_successfully: Tu cuenta fue eliminada exitosamente
420
438
  user: Usuario
421
439
  username: Nombre de usuario
422
440
  verified_full_name: Nombre verificado
@@ -75,8 +75,19 @@ pt:
75
75
  created_guides: Lições criadas
76
76
  date: Data
77
77
  date_and_time: Data e hora
78
- deleted_by: Removido pelo
78
+ delete_account: Deletar conta
79
+ delete_account_agree: Eu entendo as consequências e quero excluir minha conta
80
+ delete_account_confirmation_email_explain_html: <p> Enviamos a você um e-mail para <strong>%{user_email}</strong> para continuar com o processo de exclusão. </p><p> Por favor, verifique sua caixa. Se você não o recebeu, escreva para <a href="mailto:%{disable_email}">%{disable_email}</a>.</p>
81
+ delete_account_confirmation_request: Para confirmar esta ação, por favor escreva
82
+ delete_account_explain: Excluir sua conta também excluirá seu progresso e todos os seus dados pessoais.
83
+ delete_account_invalid_token: Desculpe, o link que você usou expirou ou é inválido.
84
+ delete_account_modal_explain_html: Por razões de segurança, para excluir sua conta, enviaremos um e-mail para seu e-mail <strong>%{user_email}</strong>.
85
+ delete_account_modal_lost_permissions: 'Ao deletar sua conta você perderá acesso aos seguintes cursos:'
86
+ delete_account_mumuki: Exclua sua conta Mumuki
87
+ delete_account_try_again_html: Se você ainda deseja excluir sua conta, inicie o processo novamente a partir de <a href="%{profile_url}">seu perfil</a>.
88
+ deleted_by: Removido pelo %{deleter}
79
89
  deleted_message_warning: Se você violar repetidamente essas ou outras regras da Área de Consulta, seu acesso a ela pode ser proibido ou você pode sofrer consequências mais graves, como a expulsão do curso.
90
+ deleted_user: Conta excluída
80
91
  deletion_motive:
81
92
  inappropriate_content:
82
93
  present: Inclui conteúdo impróprio
@@ -109,6 +120,7 @@ pt:
109
120
  edit_profile: Editar perfil
110
121
  editor_placeholder: ... Escreva sua solução aqui ...
111
122
  email: E-mail
123
+ email_sent: Email enviado
112
124
  error:
113
125
  title:
114
126
  forbidden: Você não tem autorização para ver esse conteúdo
@@ -203,23 +215,27 @@ pt:
203
215
  locked_content: 'Este conteúdo será desbloqueado quando você terminar os capítulos anteriores'
204
216
  mailer:
205
217
  title:
218
+ custom: Você tem uma nova notificação!
219
+ delete_account: Confirme a exclusão da conta
206
220
  exam_authorization_request_updated: Você tem alterações no registro do seu exame
207
221
  exam_authorization_request_rejected: Inscrição rejeitada
208
222
  exam_registration: Abertura de inscrições
209
- custom: Você tem uma nova notificação!
210
223
  subtitle:
224
+ delete_account: Você solicitou a exclusão de sua conta Mumuki
211
225
  exam_authorization_request_approved: Seu pedido de inscrição para o exame foi aprovado.
212
226
  exam_authorization_request_rejected: Sua inscrição para o exame foi rejeitada porque os requisitos não foram atendidos.
213
227
  exam_registration: Agora você pode se inscrever para o exame!
214
228
  text:
229
+ delete_account: Assim que sua conta for excluída, seu progresso e todos os seus dados pessoais também serão excluídos e você não poderá acessar esta conta novamente ou solicitar a restauração futura das informações. <br><br> Esta ação é irreversível e permanente. <br><br> Você entende as consequências e ainda deseja excluir sua conta?
215
230
  exam_authorization_request_approved: Você poderá fazer o exame em %{exam_start_date} ao entrar na plataforma. Êxitos!
216
231
  exam_authorization_request_rejected: Não te desanimes! Você fez um grande esforço e esperamos que continue aprendendo programação.
217
232
  exam_registration: Você tem tempo para se registrar até o exam_registration_deadline. Para que seu registro seja aceito, você deve atender aos requisitos.
218
233
  button:
234
+ custom: Minhas notificações
235
+ delete_account: Deletar conta
219
236
  exam_registration: Assinar o exame
220
237
  exam_authorization_request_approved: Vá para a plataforma
221
238
  exam_authorization_request_rejected: Meus exames
222
- custom: Minhas notificações
223
239
  male: Masculino
224
240
  manage_notification_subscriptions: Gerenciar suas notificações
225
241
  manage_notifications: Gerenciar notificações
@@ -228,7 +244,6 @@ pt:
228
244
  message: Mensagem
229
245
  message_deleted: Esta mensagem foi excluída porque %{motive}, o que viola as %{forum_terms}.
230
246
  messages: Mensagens
231
- mais tarde!
232
247
  messages_pluralized:
233
248
  one: Mensagem
234
249
  other: Mensagens
@@ -388,6 +403,7 @@ pt:
388
403
  to_solved: Marcar como resolvida
389
404
  toggle_read: "Marcar como lido / não lido"
390
405
  unauthorized_explanation: Opa! Isso é o que é conhecido como %{error}, ou seja, você não fez logon.
406
+ user_deleted_successfully: Sua conta foi excluída com sucesso
391
407
  total: Total
392
408
  uncategorized: Não classificado
393
409
  unlocked_medal_as_avatar: Você ganhou essa medalha! Agora você pode escolhê-la como avatar.
@@ -1,5 +1,5 @@
1
1
  module Mumuki
2
2
  module Laboratory
3
- VERSION = '9.20.0'
3
+ VERSION = '9.23.0'
4
4
  end
5
5
  end
@@ -37,13 +37,11 @@ def selected_driver
37
37
  :selenium_headless
38
38
  when 'safari'
39
39
  :selenium_safari
40
- else
41
- :rack_test
42
40
  end
43
41
  end
44
42
 
45
43
  def run_with_selenium?
46
- selected_driver.to_s.start_with? 'selenium'
44
+ selected_driver
47
45
  end
48
46
 
49
47
  def register_safari_driver!
@@ -97,10 +95,15 @@ def exclude_selenium_failing_tests!
97
95
  end
98
96
  end
99
97
 
100
- # Configuration
101
-
102
98
  register_safari_driver! if selected_driver == :selenium_safari
103
- Capybara.default_driver = selected_driver
99
+
100
+ # If no driver is selected, it will use RackTest (fastest) except for tests that explicitly require JS support.
101
+ # See https://github.com/teamcapybara/capybara#using-capybara-with-rspec for more details about this behavior.
102
+ Capybara.default_driver = selected_driver || :rack_test
103
+ Capybara.javascript_driver = selected_driver || :selenium_headless
104
+
105
+ # Include port on the URL, so we don't need to forward it via nginx or so.
106
+ Capybara.always_include_port = true
104
107
 
105
108
  # TODO: fix the tests that depend on hidden elements and remove this
106
109
  Capybara.ignore_hidden_elements = false
@@ -108,9 +111,6 @@ Capybara.ignore_hidden_elements = false
108
111
  if run_with_selenium?
109
112
  register_request_headers_workaround!
110
113
  exclude_selenium_failing_tests!
111
-
112
- # Include port on the URL, so we don't need to forward it via nginx or so
113
- Capybara.always_include_port = true
114
114
  end
115
115
 
116
- puts "Running Capybara tests with #{selected_driver}, #{Capybara.ignore_hidden_elements ? '' : 'not '}ignoring hidden elements"
116
+ puts "Running Capybara tests with #{Capybara.default_driver}, #{Capybara.ignore_hidden_elements ? '' : 'not '}ignoring hidden elements"
@@ -32,7 +32,7 @@ describe DiscussionsMessagesController, type: :controller, organization_workspac
32
32
  end
33
33
 
34
34
  describe 'delete' do
35
- let(:message) { create(:message, discussion: discussion, sender: student.uid) }
35
+ let(:message) { create(:message, discussion: discussion, sender: student) }
36
36
 
37
37
  describe 'for student' do
38
38
  before { set_current_user! student }
@@ -64,7 +64,7 @@ describe DiscussionsMessagesController, type: :controller, organization_workspac
64
64
  end
65
65
 
66
66
  describe 'someone else\'s message' do
67
- let(:message) { create(:message, discussion: discussion, sender: moderator.uid) }
67
+ let(:message) { create(:message, discussion: discussion, sender: moderator) }
68
68
  before do
69
69
  delete :destroy, params: {id: message.id, discussion_id: discussion.id, motive: :self_deleted}
70
70
  message.reload
@@ -94,7 +94,7 @@ describe DiscussionsMessagesController, type: :controller, organization_workspac
94
94
  end
95
95
 
96
96
  describe 'approve' do
97
- let(:message) { create(:message, discussion: discussion, sender: student.uid) }
97
+ let(:message) { create(:message, discussion: discussion, sender: student) }
98
98
 
99
99
  describe 'for student' do
100
100
  before { set_current_user! student }
@@ -114,7 +114,7 @@ describe DiscussionsMessagesController, type: :controller, organization_workspac
114
114
  end
115
115
 
116
116
  describe 'question' do
117
- let(:message) { create(:message, discussion: discussion, sender: student.uid) }
117
+ let(:message) { create(:message, discussion: discussion, sender: student) }
118
118
 
119
119
  describe 'for student' do
120
120
  before { set_current_user! student }
@@ -133,7 +133,7 @@ describe DiscussionsMessagesController, type: :controller, organization_workspac
133
133
  end
134
134
 
135
135
  describe 'preview' do
136
- let(:message) { create(:message, content: 'Message in **bold** and _italics_', discussion: discussion, sender: student.uid) }
136
+ let(:message) { create(:message, content: 'Message in **bold** and _italics_', discussion: discussion, sender: student) }
137
137
 
138
138
  describe 'for student' do
139
139
  before { set_current_user! student }
@@ -11,10 +11,10 @@ describe MessagesController, organization_workspace: :test do
11
11
 
12
12
  it { expect(response.status).to eq 302 }
13
13
  it { expect(user.assignments.size).to eq 1 }
14
- it { expect(user.messages.size).to eq 1 }
14
+ it { expect(user.direct_messages.size).to eq 1 }
15
15
 
16
16
  describe 'deleting exercises does delete all messages' do
17
- before { @message_id = user.messages.first.id }
17
+ before { @message_id = user.direct_messages.first.id }
18
18
  before { exercise.destroy }
19
19
 
20
20
  it { expect { Message.find(@message_id) }.to raise_exception(ActiveRecord::RecordNotFound) }
@@ -27,6 +27,6 @@ describe MessagesController, organization_workspace: :test do
27
27
 
28
28
  it { expect(response.status).to eq 302 }
29
29
  it { expect(user.assignments.size).to eq 1 }
30
- it { expect(user.messages.size).to eq 1 }
30
+ it { expect(user.direct_messages.size).to eq 1 }
31
31
  end
32
32
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe UsersController, type: :controller, organization_workspace: :test do
4
- let(:user) { create(:user) }
4
+ let(:user) { create(:user, email: 'pirulo@mail.com') }
5
5
 
6
6
  let(:user_json) do
7
7
  {
@@ -67,4 +67,23 @@ describe UsersController, type: :controller, organization_workspace: :test do
67
67
  end
68
68
  end
69
69
  end
70
+
71
+ context 'send_delete_confirmation_email' do
72
+ let(:last_email) { ActionMailer::Base.deliveries.last }
73
+ before { set_current_user! user }
74
+ before { post :send_delete_confirmation_email }
75
+
76
+ context 'sends a delete confirmation email' do
77
+ it { expect(last_email.to).to eq ['pirulo@mail.com'] }
78
+ it { expect(last_email.subject).to have_content 'Delete your Mumuki account' }
79
+ end
80
+
81
+ context 'adds a delete token to the user' do
82
+ it { expect(user.reload.delete_account_token).not_to be_nil }
83
+ end
84
+
85
+ context 'redirects to confirmation view' do
86
+ it { expect(response).to redirect_to(delete_request_user_path) }
87
+ end
88
+ end
70
89
  end
@@ -26,10 +26,16 @@ Rails.application.configure do
26
26
  config.cache_store = :null_store
27
27
  end
28
28
 
29
- # Don't care if the mailer can't send.
30
- config.action_mailer.perform_deliveries = false
29
+ config.reminder_sender_email = 'no-reply@mumuki.org'
30
+ config.support_email = 'soporte@mumuki.org'
31
+ config.disable_email = 'bajas@mumuki.org'
31
32
 
32
33
  config.action_mailer.perform_caching = false
34
+ config.action_mailer.raise_delivery_errors = false
35
+
36
+ # Settings for mailcatcher, run `mailcatcher` and go to http://localhost:1080/ to see which emails have been sent.
37
+ config.action_mailer.smtp_settings = { :address => '127.0.0.1', :port => 1025 }
38
+ config.action_mailer.delivery_method = :smtp
33
39
 
34
40
  # Print deprecation notices to the Rails logger.
35
41
  config.active_support.deprecation = :log
@@ -49,6 +49,9 @@ Rails.application.configure do
49
49
  credentials: {},
50
50
  info: {first_name: 'John', last_name: 'Doe', name: 'John Doe', nickname: 'johndoe'}
51
51
 
52
- config.reminder_sender_email = 'support@mumuki.org'
52
+ config.reminder_sender_email = 'no-reply@mumuki.org'
53
+ config.support_email = 'soporte@mumuki.org'
54
+ config.disable_email = 'bajas@mumuki.org'
55
+
53
56
  config.reminder_frequency = 7
54
57
  end