|
1 | 1 | from builtins import Exception |
2 | 2 | from datetime import timedelta |
| 3 | +from itertools import count |
| 4 | +from logging import Logger |
3 | 5 | from typing import List |
4 | 6 |
|
| 7 | +from celery import shared_task |
5 | 8 | from django.utils import timezone |
6 | 9 |
|
7 | 10 | from pythonpro.memberkit import api |
8 | | -from pythonpro.memberkit.models import SubscriptionType, Subscription, YEAR_IN_DAYS |
| 11 | +from pythonpro.memberkit.models import SubscriptionType, Subscription, YEAR_IN_DAYS, UserSubscriptionsSummary |
| 12 | + |
| 13 | +_logger = Logger(__file__) |
9 | 14 |
|
10 | 15 |
|
11 | 16 | def synchronize_subscription_types() -> List[SubscriptionType]: |
@@ -57,7 +62,8 @@ def create_new_subscription(payment, observation: str = '') -> Subscription: |
57 | 62 |
|
58 | 63 | def activate(subscription, responsible=None, observation=''): |
59 | 64 | user = subscription.subscriber |
60 | | - subscription.activated_at = timezone.now() |
| 65 | + if subscription.status == Subscription.Status.INACTIVE or subscription.activated_at is None: |
| 66 | + subscription.activated_at = timezone.now() |
61 | 67 | for subscription_type in subscription.subscription_types.all(): |
62 | 68 | expires_at = subscription.activated_at + timedelta(days=subscription_type.days_of_access) |
63 | 69 | if subscription_type.id in IDS_COMUNIDADE_SUBSCRIPTION: |
@@ -103,6 +109,26 @@ def inactivate(subscription, responsible=None, observation=''): |
103 | 109 | return subscription |
104 | 110 |
|
105 | 111 |
|
| 112 | +def clean_memberkit_users_up(): |
| 113 | + total = 0 |
| 114 | + for page in count(1): |
| 115 | + memberkit_users = api.list_users(page) |
| 116 | + if len(memberkit_users) == 0: |
| 117 | + break |
| 118 | + for memberkit_user in memberkit_users: |
| 119 | + total += 1 |
| 120 | + memberkit_user_id = int(memberkit_user['id']) |
| 121 | + has_active_subscription = Subscription.objects.filter( |
| 122 | + memberkit_user_id=memberkit_user_id, status=Subscription.Status.ACTIVE |
| 123 | + ).exists() |
| 124 | + if not has_active_subscription: |
| 125 | + api.delete_user(memberkit_user_id) |
| 126 | + print(f'Desativado: {memberkit_user_id} ############################################') |
| 127 | + else: |
| 128 | + print(f'Ativo: {memberkit_user_id}') |
| 129 | + return total |
| 130 | + |
| 131 | + |
106 | 132 | class InactiveUserException(Exception): |
107 | 133 | pass |
108 | 134 |
|
@@ -133,3 +159,38 @@ def migrate_when_status_active(user): |
133 | 159 | ).exclude(activated_at__isnull=False) |
134 | 160 | for subscription in status_active_but_not_activated: |
135 | 161 | activate(subscription, observation='Migrado automaticamente da plataforma antiga para nova') |
| 162 | + |
| 163 | + |
| 164 | +@shared_task |
| 165 | +def process_expired_subscriptions(user_id): |
| 166 | + now = timezone.now() |
| 167 | + summary = UserSubscriptionsSummary(user_id) |
| 168 | + active_subscriptions = list(summary.active_subscriptions()) |
| 169 | + for subscription in active_subscriptions: |
| 170 | + if subscription.expires_at < now: |
| 171 | + subscription.status = Subscription.Status.INACTIVE |
| 172 | + subscription.save() |
| 173 | + inactive_subscriptions = [s for s in active_subscriptions if s.status == Subscription.Status.INACTIVE] |
| 174 | + active_subscriptions = [s for s in active_subscriptions if s.status == Subscription.Status.ACTIVE] |
| 175 | + if len(active_subscriptions) == 0: |
| 176 | + for memberkit_user_id in summary.memberkit_user_ids(): |
| 177 | + _logger.info(f'Deleted memberkit account for user_id: {user_id}') |
| 178 | + api.delete_user(memberkit_user_id) |
| 179 | + 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 | + for active_subscription in active_subscriptions: |
| 184 | + for subscription_type in active_subscription.subscription_types.all().only('id'): |
| 185 | + _logger.info(f'Activated {active_subscription.name} for user_id: {user_id}') |
| 186 | + api.update_user_subscription( |
| 187 | + active_subscription.memberkit_user_id, |
| 188 | + subscription_type, |
| 189 | + 'activate' |
| 190 | + ) |
| 191 | + |
| 192 | + |
| 193 | +def inactivate_expired_subscriptions(): |
| 194 | + for user_id in UserSubscriptionsSummary.users_with_active_subscriptions().values_list('id', flat=True): |
| 195 | + _logger.info(f'Adding task to process subscriptions expiration for user_id: {user_id}') |
| 196 | + process_expired_subscriptions.delay(user_id) |
0 commit comments