1
1
from builtins import Exception
2
- from datetime import timedelta
3
2
from itertools import count
4
3
from logging import Logger
5
4
from typing import List
6
5
7
6
from celery import shared_task
7
+ from django .db import transaction
8
8
from django .utils import timezone
9
+ from requests import HTTPError
9
10
10
11
from pythonpro .memberkit import api
11
12
from pythonpro .memberkit .models import SubscriptionType , Subscription , YEAR_IN_DAYS , UserSubscriptionsSummary
@@ -62,25 +63,34 @@ def create_new_subscription(payment, observation: str = '') -> Subscription:
62
63
63
64
def activate (subscription , responsible = None , observation = '' ):
64
65
user = subscription .subscriber
65
- if subscription .status == Subscription .Status .INACTIVE or subscription .activated_at is None :
66
+ if subscription .activated_at is None :
67
+ # Faz extensão da anualidade se for a primeira ativação
66
68
subscription .activated_at = timezone .now ()
67
- for subscription_type in subscription .subscription_types .all ():
68
- expires_at = subscription .activated_at + timedelta (days = subscription_type .days_of_access )
69
- if subscription_type .id in IDS_COMUNIDADE_SUBSCRIPTION :
70
- active_comunidade_subscriptions = Subscription .objects .filter (
71
- subscriber_id = user .id ,
72
- status = Subscription .Status .ACTIVE ,
73
- subscription_types__in = IDS_COMUNIDADE_SUBSCRIPTION
74
- )
69
+ for subscription_type in subscription .subscription_types .all ():
70
+ if subscription_type .id in IDS_COMUNIDADE_SUBSCRIPTION :
71
+ active_comunidade_subscriptions = Subscription .objects .filter (
72
+ subscriber_id = user .id ,
73
+ status = Subscription .Status .ACTIVE ,
74
+ subscription_types__in = IDS_COMUNIDADE_SUBSCRIPTION
75
+ )
75
76
76
- max_remaining_days = max (s .remaining_days for s in active_comunidade_subscriptions )
77
- expires_at += timedelta (days = max_remaining_days )
78
- subscription .days_of_access += max_remaining_days
77
+ max_remaining_days = max (
78
+ (s .remaining_days for s in active_comunidade_subscriptions ),
79
+ default = 0
80
+ )
81
+ subscription .days_of_access += max_remaining_days
79
82
80
- response_json = api .activate_user (
81
- user .get_full_name (), user .email , subscription_type .id , expires_at
82
- )
83
- subscription .memberkit_user_id = response_json ['id' ]
83
+ response_json = api .activate_user (
84
+ user .get_full_name (), user .email , subscription_type .id , subscription .expires_at
85
+ )
86
+ subscription .memberkit_user_id = response_json ['id' ]
87
+ else :
88
+ # Se for a segunda, só usa os dados já calculados
89
+ for subscription_type in subscription .subscription_types .all ():
90
+ response_json = api .activate_user (
91
+ user .get_full_name (), user .email , subscription_type .id , subscription .expires_at
92
+ )
93
+ subscription .memberkit_user_id = response_json ['id' ]
84
94
subscription .status = Subscription .Status .ACTIVE
85
95
if subscription .observation :
86
96
subscription .observation += f'\n \n { observation } '
@@ -96,15 +106,14 @@ def inactivate(subscription, responsible=None, observation=''):
96
106
for subscription_type in subscription .subscription_types .all ().only ('id' ):
97
107
api .inactivate_user (subscription .memberkit_user_id , subscription_type .id )
98
108
subscription .status = Subscription .Status .INACTIVE
99
- subscription .activated_at = None
100
109
if responsible is not None :
101
110
subscription .responsible = responsible
102
111
if subscription .observation :
103
112
subscription .observation += f'\n \n { observation } '
104
113
else :
105
114
subscription .observation = observation
106
115
subscription .save (update_fields = [
107
- 'status' , 'activated_at' , ' responsible' , 'observation'
116
+ 'status' , 'responsible' , 'observation'
108
117
])
109
118
return subscription
110
119
@@ -169,25 +178,37 @@ def process_expired_subscriptions(user_id):
169
178
for subscription in active_subscriptions :
170
179
if subscription .expires_at < now :
171
180
subscription .status = Subscription .Status .INACTIVE
172
- subscription .save ()
173
181
inactive_subscriptions = [s for s in active_subscriptions if s .status == Subscription .Status .INACTIVE ]
174
182
active_subscriptions = [s for s in active_subscriptions if s .status == Subscription .Status .ACTIVE ]
175
183
if len (active_subscriptions ) == 0 :
176
184
for memberkit_user_id in summary .memberkit_user_ids ():
177
185
_logger .info (f'Deleted memberkit account for user_id: { user_id } ' )
178
- api .delete_user (memberkit_user_id )
186
+ try :
187
+ api .delete_user (memberkit_user_id )
188
+ except HTTPError as e :
189
+ if e .response .status_code != 404 :
190
+ raise e
191
+
192
+ with transaction .atomic ():
193
+ for subscription in inactive_subscriptions :
194
+ subscription .save ()
179
195
else :
180
- for inactive_subscription in inactive_subscriptions :
181
- _logger .info (f'Inactivated { inactive_subscription .name } for user_id: { user_id } ' )
182
- inactivate (inactive_subscription , observation = 'Inativada por processo de inativação' )
183
196
for active_subscription in active_subscriptions :
184
- for subscription_type in active_subscription .subscription_types .all ().only ('id' ):
197
+ for subscription_type_id in active_subscription .subscription_types .all ().values_list ('id' , flat = True ):
185
198
_logger .info (f'Activated { active_subscription .name } for user_id: { user_id } ' )
186
199
api .update_user_subscription (
187
200
active_subscription .memberkit_user_id ,
188
- subscription_type ,
189
- 'activate'
201
+ subscription_type_id ,
202
+ 'active' ,
203
+ active_subscription .expires_at .date ()
190
204
)
205
+ for inactive_subscription in inactive_subscriptions :
206
+ _logger .info (f'Inactivated { inactive_subscription .name } for user_id: { user_id } ' )
207
+ try :
208
+ inactivate (inactive_subscription , observation = 'Inativada por data de experição7' )
209
+ except HTTPError as e :
210
+ if e .response .status_code != 404 :
211
+ raise e
191
212
192
213
193
214
def inactivate_expired_subscriptions ():
0 commit comments