Skip to content

Commit dc892ef

Browse files
renzonrenzon
authored andcommitted
Implemented promotion on seventh week
close #1317
1 parent ef9789d commit dc892ef

File tree

4 files changed

+72
-3
lines changed

4 files changed

+72
-3
lines changed

Pipfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ responses = "*"
2424
newrelic = "*"
2525
pagarme-python = {editable = true,git = "https://github.com/renzon/pagarme-python.git",ref = "master"}
2626
sentry-sdk = "*"
27+
python-dateutil = "*"
2728

2829
[dev-packages]
2930
faker = "*"

Pipfile.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pythonpro/payments/facade.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1+
from datetime import datetime
2+
from typing import Tuple
3+
14
import pagarme as _pagarme
5+
from dateutil.relativedelta import MO, TH, relativedelta
26
from django.conf import settings
7+
from django.utils.timezone import now
38

49
_pagarme.authentication_key(settings.PAGARME_API_KEY)
510
PYTOOLS_PRICE = 9999
@@ -33,3 +38,26 @@ def extract_transaction(notification: dict, raw_post: str, expected_signature):
3338
if notification['object'] != 'transaction' or notification['current_status'] != 'paid':
3439
raise PagarmeNotPaidTransaction()
3540
return _pagarme.transaction.find_by_id(notification['transaction[id]'])
41+
42+
43+
def calculate_pytools_promotion_interval() -> Tuple[datetime, datetime]:
44+
"""
45+
calculate promotion interval for this week based on time. Promotion will begin on monday and stop on Thursday
46+
:return:
47+
"""
48+
now_dt = now()
49+
this_week_monday = now_dt + relativedelta(weekday=MO(-1), hour=0, minute=0, second=0)
50+
this_week_thursday = this_week_monday + relativedelta(weekday=TH, hour=23, minute=59, second=59)
51+
return this_week_monday, this_week_thursday
52+
53+
54+
def is_on_pytools_promotion_season(creation: datetime) -> bool:
55+
"""
56+
Calculate if is period of promotion which is 7 weeks after creation
57+
:param creation: datetime of creation
58+
:return: boolean indication if its os promotion period or not
59+
"""
60+
promotion_begin, _ = calculate_pytools_promotion_interval()
61+
creation_begin = promotion_begin + relativedelta(weekday=MO(-8))
62+
creation_end = creation_begin + relativedelta(days=6, hour=23, minute=59, second=59)
63+
return creation_begin <= creation <= creation_end
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from datetime import datetime
2+
3+
import pytest
4+
import pytz
5+
from freezegun import freeze_time
6+
7+
from pythonpro.payments.facade import calculate_pytools_promotion_interval, is_on_pytools_promotion_season
8+
9+
10+
@pytest.mark.parametrize(
11+
'now', ['2019-07-{}'.format(day) for day in range(22, 29)]
12+
)
13+
def test_promotion_interval(now):
14+
with freeze_time(now):
15+
begin, end = datetime(2019, 7, 22, 0, 0, 0, tzinfo=pytz.utc), datetime(2019, 7, 25, 23, 59, 59, tzinfo=pytz.utc)
16+
assert (begin, end) == calculate_pytools_promotion_interval()
17+
18+
19+
@pytest.mark.parametrize(
20+
'creation', [datetime(2019, 6, day, tzinfo=pytz.utc) for day in range(3, 10)] # 7 weeks before now
21+
)
22+
def test_in_promotion_period(creation: datetime):
23+
with freeze_time('2019-07-22'):
24+
assert is_on_pytools_promotion_season(creation)
25+
26+
27+
@pytest.mark.parametrize(
28+
'creation', [datetime(2019, 6, day, tzinfo=pytz.utc) for day in range(1, 2)] # 8 weeks before now
29+
)
30+
def test_before_promotion_period(creation: datetime):
31+
with freeze_time('2019-07-22'):
32+
assert not is_on_pytools_promotion_season(creation)
33+
34+
35+
@pytest.mark.parametrize(
36+
'creation', [datetime(2019, 6, day, tzinfo=pytz.utc) for day in range(10, 20)] # 6 weeks before now
37+
)
38+
def test_after_promotion_period(creation: datetime):
39+
with freeze_time('2019-07-22'):
40+
assert not is_on_pytools_promotion_season(creation)

0 commit comments

Comments
 (0)