Skip to content

Commit 8dda0a3

Browse files
renzonrenzon
authored andcommitted
Added member subscription page
close #1445
1 parent 4f62c83 commit 8dda0a3

32 files changed

+1471
-197
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ pytest pythonpro
5757
If you want run your amb dev using postgres, you can install docker and run:
5858

5959
```console
60-
docker run -p 5432:5432 --env POSTGRES_PASSWORD=pass --name pythonpro-postgres -d postgres:9
60+
docker-compose docker-compose.yml up
6161
```
6262

6363
and add to your .env

pythonpro/absolute_uri.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from django.conf import settings
2+
3+
4+
def build_absolute_uri(path: str) -> str:
5+
"""
6+
Calculate absolute url by extraction first domain from settings.ALLOWED_HOSTS
7+
:param path: string with path
8+
:return: path concatenated with domain
9+
"""
10+
first_host = settings.ALLOWED_HOSTS[0]
11+
return f'{first_host}{path}'

pythonpro/cohorts/facade.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from django.db.models import Prefetch as _Prefetch
2+
from django.urls import reverse
23

3-
from pythonpro.cohorts.models import Cohort as _Cohort, LiveClass as _LiveClass, Webinar as _Webinar
4+
from pythonpro.cohorts.models import Cohort as _Cohort, CohortStudent, LiveClass as _LiveClass, Webinar as _Webinar
45

56

67
def get_all_cohorts_desc():
@@ -23,6 +24,15 @@ def find_cohort(slug):
2324
).get()
2425

2526

27+
def find_most_recente_cohort():
28+
return _Cohort.objects.order_by('-start').first()
29+
30+
31+
def calculate_most_recent_cohort_path() -> str:
32+
slug_dct = _Cohort.objects.order_by('-start').values('slug').first()
33+
return reverse('modules:detail', kwargs=slug_dct)
34+
35+
2636
def find_webinars():
2737
"""
2838
Retrieve Webinars from database ordered by date desc
@@ -46,3 +56,9 @@ def find_live_class(pk):
4656
:return:
4757
"""
4858
return _LiveClass.objects.select_related('cohort').get(pk=pk)
59+
60+
61+
def subscribe_to_last_cohort(user):
62+
ch = CohortStudent(user=user, cohort=find_most_recente_cohort())
63+
ch.save()
64+
return ch

pythonpro/conftest.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
from model_mommy import mommy
44
from rolepermissions.roles import assign_role
55

6+
from pythonpro.cohorts.models import Cohort
7+
68

79
@pytest.fixture
810
def fake():
@@ -21,6 +23,11 @@ def logged_user(django_user_model):
2123
return logged_user
2224

2325

26+
@pytest.fixture
27+
def cohort(db):
28+
return mommy.make(Cohort)
29+
30+
2431
@pytest.fixture
2532
def client_with_lead(client, django_user_model, logged_user):
2633
assign_role(logged_user, 'lead')

pythonpro/core/admin.py

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from django.core.exceptions import PermissionDenied
1010
from django.db import router, transaction
1111
from django.http import Http404, HttpResponseRedirect
12-
from django.template.loader import render_to_string
1312
from django.template.response import TemplateResponse
1413
from django.urls import path, reverse
1514
from django.utils.decorators import method_decorator
@@ -57,16 +56,8 @@ class UserAdmin(RolePermissionsUserAdminMixin, admin.ModelAdmin):
5756

5857
def make_client(self, request, queryset):
5958
from pythonpro.domain import user_facade
60-
ty_rul = request.build_absolute_uri(reverse('payments:pytools_thanks'))
6159
for user in queryset:
62-
msg = render_to_string(
63-
'payments/pytools_email.txt',
64-
{
65-
'user': user,
66-
'ty_url': ty_rul
67-
}
68-
)
69-
user_facade.promote_client(user, msg, 'django_admin')
60+
user_facade.promote_client(user, 'django_admin')
7061

7162
def get_fieldsets(self, request, obj=None):
7263
if not obj:

pythonpro/core/facade.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,23 @@ def register_lead(first_name: str, email: str, source: str) -> User:
5252
return user
5353

5454

55+
def register_member(first_name, email, source):
56+
"""
57+
Create a new user on the system generation a random password or update existing on based on email.
58+
:param first_name: User's first name
59+
:param email: User's email
60+
:param source: source of User traffic
61+
:return: User
62+
"""
63+
try:
64+
user = User.objects.filter(email=email).get()
65+
except User.DoesNotExist:
66+
form = validate_user(first_name, email, source)
67+
user = form.save()
68+
promote_to_member(user, source)
69+
return user
70+
71+
5572
def register_client(first_name: str, email: str, source: str) -> User:
5673
"""
5774
Create a new user on the system generation a random password or update existing on based on email.
@@ -69,6 +86,19 @@ def register_client(first_name: str, email: str, source: str) -> User:
6986
return user
7087

7188

89+
def promote_to_member(user: User, source: str) -> None:
90+
"""
91+
Promote a user do member. Raises exception in case user is a member
92+
:param user:
93+
"""
94+
if has_role(user, 'member'):
95+
raise UserRoleException('User is already a member')
96+
UserInteraction(category=UserInteraction.BECOME_MEMBER, source=source, user=user).save()
97+
assign_role(user, 'member')
98+
remove_role(user, 'lead')
99+
remove_role(user, 'client')
100+
101+
72102
def promote_to_client(user: User, source: str) -> None:
73103
"""
74104
Promote a lead to user. Raises exception in case user is a member
@@ -121,9 +151,21 @@ def client_checkout(user: User, source: str) -> None:
121151
return UserInteraction(category=UserInteraction.CLIENT_CHECKOUT, source=source, user=user).save()
122152

123153

154+
def member_checkout(user: User, source='unknown'):
155+
return UserInteraction(category=UserInteraction.MEMBER_CHECKOUT, source=source, user=user).save()
156+
157+
124158
def client_generated_boleto(user: User, source: str):
125159
return UserInteraction(category=UserInteraction.CLIENT_BOLETO, source=source, user=user).save()
126160

127161

162+
def member_generated_boleto(user, source='unknow'):
163+
return UserInteraction(category=UserInteraction.MEMBER_BOLETO, source=source, user=user).save()
164+
165+
128166
def subscribe_to_waiting_list(user: User, source: str):
129167
return UserInteraction(category=UserInteraction.WAITING_LIST, source=source, user=user).save()
168+
169+
170+
def is_client(user: User):
171+
return has_role(user, 'client')

pythonpro/core/models.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,17 +94,17 @@ class Meta:
9494
max_length=32,
9595
choices=(
9696
(
97-
(BECOME_LEAD, 'User become lead'),
97+
(BECOME_LEAD, 'User become Lead'),
9898
(ACTIVATED, 'User Watched first video class'),
9999
(CLIENT_LP, 'User visited Client Landing Page'),
100-
(CLIENT_CHECKOUT, 'User clicked on client checkout button'),
100+
(CLIENT_CHECKOUT, 'User clicked on Client checkout button'),
101101
(CLIENT_BOLETO, 'User generated a Client Boleto'),
102-
(BECOME_CLIENT, 'User become client'),
102+
(BECOME_CLIENT, 'User become Client'),
103103
(MEMBER_LP, 'User visited Member Landing Page'),
104104
(MEMBER_CHECKOUT, 'User clicked on Member checkout Button'),
105105
(MEMBER_BOLETO, 'User generate Member Boleto'),
106106
(WAITING_LIST, 'User subscribed to Waiting List'),
107-
(BECOME_MEMBER, 'User Become Client')
107+
(BECOME_MEMBER, 'User Become Member')
108108
)
109109
)
110110
)

pythonpro/core/templates/core/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ <h2 class="pythonpro-subtitle mb-4 mb-md-5">Curso Presencial Online Completo<br/
2424
<div class="row">
2525
<div class="col text-center">
2626
<h1 class="pb-3">Inscrições Abertas!</h1>
27-
<p>Aulas da turma começam em outubro. Garanta sua matrícula, vagas Limitadas!</p>
28-
<a class="btn btn-warning p-4 font-weight-bold" href="{% url 'payments:options' %}"
27+
<p>Aulas da turma começam em novembro. Garanta sua matrícula, vagas limitadas!</p>
28+
<a class="btn btn-warning p-4 font-weight-bold" href="{% url 'member_landing_page' %}"
2929
role="button">SIM! Quero Participar da Próxima TURMA &raquo;</a>
3030
</div>
3131
</div>

pythonpro/core/tests/test_view_home.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def test_payment_link_is_present(home_resp_open_subscriptions):
6161
"""
6262
Assert Payment link is present on home page when subscriptions are open
6363
"""
64-
dj_assert_contains(home_resp_open_subscriptions, reverse('payments:options'))
64+
dj_assert_contains(home_resp_open_subscriptions, reverse('member_landing_page'))
6565

6666

6767
@pytest.fixture
@@ -74,4 +74,4 @@ def test_payment_link_is_not_present(home_resp_closed_subscriptions):
7474
"""
7575
Assert Payment link is not present on home page when subscriptions are closed
7676
"""
77-
dj_assert_not_contains(home_resp_closed_subscriptions, reverse('payments:options'))
77+
dj_assert_not_contains(home_resp_closed_subscriptions, reverse('payments:member_landing_page'))

pythonpro/core/views.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
from django_sitemaps import Sitemap
1010
from rolepermissions.checkers import has_role
1111

12-
from pythonpro.domain import user_facade
1312
from pythonpro.core.forms import UserEmailForm, UserSignupForm
1413
from pythonpro.core.models import User
14+
from pythonpro.domain import user_facade
1515

1616

1717
def index(request):
@@ -57,7 +57,12 @@ def sitemap(request):
5757
map = Sitemap(build_absolute_uri=request.build_absolute_uri, )
5858

5959
named_views = [
60-
'core:index', 'core:lead_landing', 'client_landing_page', 'core:podcast', 'core:tech_talks',
60+
'core:index',
61+
'core:lead_landing',
62+
'client_landing_page',
63+
'member_landing_page',
64+
'core:podcast',
65+
'core:tech_talks',
6166
'modules:index'
6267
]
6368
for section in named_views:

0 commit comments

Comments
 (0)