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.
- checksums.yaml +4 -4
- data/README.md +11 -0
- data/app/assets/stylesheets/mumuki_laboratory/application/modules/_discussion.scss +1 -3
- data/app/controllers/appendixes_controller.rb +7 -0
- data/app/controllers/application_controller.rb +6 -3
- data/app/controllers/complements_controller.rb +13 -0
- data/app/controllers/login_controller.rb +11 -3
- data/app/controllers/users_controller.rb +11 -4
- data/app/helpers/application_helper.rb +3 -1
- data/app/helpers/discussions_helper.rb +41 -26
- data/app/helpers/mailer_helper.rb +5 -0
- data/app/helpers/user_menu_helper.rb +7 -3
- data/app/mailers/application_mailer.rb +1 -0
- data/app/mailers/user_mailer.rb +6 -1
- data/app/views/book/show.html.erb +21 -18
- data/app/views/chapters/show.html.erb +1 -1
- data/app/views/discussions/_description_message.html.erb +6 -4
- data/app/views/discussions/_message.html.erb +10 -8
- data/app/views/discussions/show.html.erb +1 -1
- data/app/views/errors/forbidden.html.erb +1 -3
- data/app/views/errors/gone.html.erb +1 -2
- data/app/views/errors/not_found.html.erb +1 -1
- data/app/views/guides/_guide.html.erb +9 -5
- data/app/views/layouts/_discussions.html.erb +1 -3
- data/app/views/layouts/_organization_chooser.html.erb +2 -2
- data/app/views/layouts/_user_menu.html.erb +2 -0
- data/app/views/user_mailer/delete_account.html.erb +7 -0
- data/app/views/users/_user_delete_confirmation.erb +17 -0
- data/app/views/users/_user_delete_modal.html.erb +35 -0
- data/app/views/users/delete_account.html.erb +27 -0
- data/app/views/users/delete_confirmation_invalid.html.erb +22 -0
- data/app/views/users/delete_request.html.erb +1 -0
- data/config/routes.rb +6 -3
- data/lib/mumuki/laboratory/controllers/dynamic_errors.rb +6 -6
- data/lib/mumuki/laboratory/controllers/validate_access_mode.rb +5 -1
- data/lib/mumuki/laboratory/locales/en.yml +19 -2
- data/lib/mumuki/laboratory/locales/es-CL.yml +20 -3
- data/lib/mumuki/laboratory/locales/es.yml +21 -3
- data/lib/mumuki/laboratory/locales/pt.yml +20 -4
- data/lib/mumuki/laboratory/version.rb +1 -1
- data/spec/capybara_helper.rb +10 -10
- data/spec/controllers/discussions_messages_controller_spec.rb +5 -5
- data/spec/controllers/messages_controller_spec.rb +3 -3
- data/spec/controllers/users_controller_spec.rb +20 -1
- data/spec/dummy/config/environments/development.rb +8 -2
- data/spec/dummy/config/environments/test.rb +4 -1
- data/spec/dummy/db/schema.rb +5 -2
- data/spec/features/discussion_flow_spec.rb +2 -2
- data/spec/features/dynamic_exam_spec.rb +4 -2
- data/spec/features/guides_flow_spec.rb +29 -7
- data/spec/features/immersive_redirection_spec.rb +2 -2
- data/spec/features/not_found_public_flow_spec.rb +8 -1
- data/spec/features/profile_flow_spec.rb +3 -1
- data/spec/features/read_only_flow_spec.rb +72 -1
- data/spec/mailers/previews/user_mailer_preview.rb +4 -0
- data/spec/mailers/user_mailer_spec.rb +10 -3
- metadata +133 -108
- 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
|
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
|
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
|
-
|
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.
|
data/spec/capybara_helper.rb
CHANGED
@@ -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
|
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
|
-
|
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 #{
|
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
|
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
|
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
|
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
|
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
|
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.
|
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.
|
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.
|
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
|
-
|
30
|
-
config.
|
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 = '
|
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
|