Skip to content

Commit 9109ef7

Browse files
moacirmodarenzon
authored andcommitted
letting lead user define password in TY page. resolves #1297
1 parent fabb9ac commit 9109ef7

6 files changed

Lines changed: 110 additions & 5 deletions

File tree

docker-compose.yml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
version: "3.3"
2+
3+
services:
4+
database:
5+
container_name: pythonpro_database
6+
image: postgres
7+
restart: always
8+
volumes:
9+
- ../pgdata:/var/lib/postgresql/data
10+
environment:
11+
- LC_ALL=C.UTF-8
12+
- POSTGRES_PASSWORD=pythonpro
13+
- POSTGRES_USER=pythonpro
14+
ports:
15+
- 5433:5432
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
{% extends 'core/base.html' %}
2+
{% load static %}
3+
{% block body %}
4+
<div class="container mt-5">
5+
<div class="row">
6+
<div class="col">
7+
<h1 class="mb-4">Cadastro realizado com Sucesso!</h1>
8+
<p>
9+
Você receberá 4 emails nas próximas 4 semanas. Seguiremos um cronograma para você aprender o básico de
10+
programação. É muito importante que você siga os passos para poder construir a carreira de seus
11+
sonhos.
12+
</p>
13+
<p>
14+
Mas se você está ansioso para começar os estudos, acesse o módulo definindo uma senha
15+
através do formulário abaixo.
16+
</p>
17+
<p>
18+
<form method="post" action="{% url 'core:lead_change_password' %}">
19+
{% csrf_token %}
20+
<div class="form-group">
21+
<label for="{{ form.new_password1.id_for_label }}">{{ form.new_password1.label_tag }}</label>
22+
<input type="password" name="{{ form.new_password1.html_name }}" class="form-control" autofocus=""
23+
maxlength="{{ form.new_password1.max_length }}" required="required"
24+
id="{{ form.new_password1.id_for_label }}">
25+
26+
{% if form.errors.new_password1 %}
27+
<div class='alert alert-danger'>{{ form.errors.new_password1}}</div>
28+
{% endif %}
29+
</div>
30+
<div class="form-group">
31+
<label for="{{ form.new_password2.id_for_label }}">{{ form.new_password2.label_tag }}</label>
32+
<input type="password" name="{{ form.new_password2.html_name }}" class="form-control" autofocus=""
33+
maxlength="{{ form.new_password2.max_length }}" required="required"
34+
id="{{ form.new_password2.id_for_label }}">
35+
36+
{% if form.errors.new_password2 %}
37+
<div class='alert alert-danger'>{{ form.errors.new_password2}}</div>
38+
{% endif %}
39+
</div>
40+
<button class="btn btn-warning">Acessar o <span class="font-weight-bold"><u>CURSO GRÁTIS</u></span>
41+
&raquo;</button>
42+
</form>
43+
44+
</p>
45+
</div>
46+
</div>
47+
</div>
48+
{% endblock body %}

pythonpro/core/templates/core/lead_thanks.html

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,10 @@ <h1 class="mb-4">Cadastro realizado com Sucesso!</h1>
1010
sonhos.
1111
</p>
1212
<p>Mas se você está ansioso para começar os estudos, acesse o módulo
13-
<a href="{% url 'modules:detail' slug='python-birds' %}">Python Birds</a>. <br/>
14-
<b>Utilize o "Esqueceu sua Senha" com o email que acabou de cadastrar para criar uma senha para sua
15-
conta.</b>
13+
<a href="{% url 'modules:detail' slug='python-birds' %}">Python Birds</a>!
1614
</p>
17-
<p>Será um prazer acompanhar você nessa incrível jornada. Muito obrigado pela confiança em nosso
15+
<p>
16+
Será um prazer acompanhar você nessa incrível jornada. Muito obrigado pela confiança em nosso
1817
trabalho!
1918
</p>
2019
<p>

pythonpro/core/tests/test_lead_landing_page.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,18 @@ def resp_lead_creation(client, db, fake: Faker, create_lead_mock):
3232
)
3333

3434

35+
@pytest.fixture
36+
def resp_lead_change_pasword(resp_lead_creation, client):
37+
client.post(
38+
reverse('core:lead_change_password'),
39+
data={
40+
'new_password1': 'senha-muito-d1f1c1l',
41+
'new_password2': 'senha-muito-d1f1c1l',
42+
},
43+
secure=True
44+
)
45+
46+
3547
def test_lead_creation(resp_lead_creation, django_user_model):
3648
assert django_user_model.objects.exists()
3749

@@ -49,3 +61,13 @@ def test_user_created_as_lead_on_mailchimp(resp_lead_creation, django_user_model
4961
def test_user_source_was_saved_from_url(resp_lead_creation, django_user_model, create_lead_mock: Mock):
5062
user = django_user_model.objects.first()
5163
assert user.source == 'facebook'
64+
65+
66+
def test_user_was_logged_in(resp_lead_creation, django_user_model, client):
67+
response = client.post(reverse('core:lead_change_password'), secure=True)
68+
assert response.status_code == 200
69+
70+
71+
def test_user_change_password_should_run_ok(resp_lead_change_pasword, django_user_model):
72+
user = django_user_model.objects.first()
73+
assert user.check_password('senha-muito-d1f1c1l')

pythonpro/core/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
path('podcast', views.podcast, name='podcast'),
1313
path('curso-de-python-gratis', views.lead_landing, name='lead_landing'),
1414
path('cadastro-python-birds', views.lead_form, name='lead_form'),
15+
path('definir-senha', views.lead_change_password, name='lead_change_password'),
1516
path('obrigado', views.thanks, name='thanks'),
1617
path('perfil', views.profile, name='profile'),
1718
path('perfil/nome', views.profile_name, name='profile_name'),

pythonpro/core/views.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
from django.shortcuts import redirect, render
55
from django.urls import reverse, reverse_lazy
66
from django.views.generic import TemplateView, UpdateView
7+
from django.contrib.auth import login
8+
from django.contrib.auth import update_session_auth_hash
9+
from django.contrib.auth.forms import SetPasswordForm
710
from django_sitemaps import Sitemap
811
from rolepermissions.roles import assign_role
912

@@ -16,10 +19,26 @@ def index(request):
1619
return render(request, 'core/index.html', {'form': UserSignupForm()})
1720

1821

22+
@login_required
1923
def thanks(request):
2024
return render(request, 'core/lead_thanks.html', {})
2125

2226

27+
@login_required
28+
def lead_change_password(request):
29+
if request.method == 'POST':
30+
form = SetPasswordForm(request.user, request.POST)
31+
if form.is_valid():
32+
user = form.save()
33+
update_session_auth_hash(request, user) # Important!
34+
return redirect(reverse('core:thanks'))
35+
else:
36+
form = SetPasswordForm(request.user)
37+
return render(request, 'core/lead_change_password.html', {
38+
'form': form
39+
})
40+
41+
2342
def teck_talks(request):
2443
return render(request, 'core/tech_talks.html', {})
2544

@@ -110,5 +129,6 @@ def lead_form(request):
110129
user = form.save(source=source)
111130
assign_role(user, 'lead')
112131
facade.create_or_update_lead(user.first_name, user.email)
113-
return redirect(reverse('core:thanks'))
132+
login(request, user)
133+
return redirect(reverse('core:lead_change_password'))
114134
return render(request, 'core/lead_form_errors.html', context={'form': form})

0 commit comments

Comments
 (0)