From 469268651bc9e1d146444bc3de7f1040454ee7c6 Mon Sep 17 00:00:00 2001 From: SimplifiedPrivacy Date: Fri, 16 Oct 2026 15:12:25 -0400 Subject: [PATCH] Subscription expiration check tools --- core/models/Result.py | 7 ++++--- .../subscriptions/subscriptions_by_protocol.py | 15 +++++++++++++++ core/utils/check_if_time_lapsed.py | 17 +++++++++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 core/utils/check_if_time_lapsed.py diff --git a/core/models/Result.py b/core/models/Result.py index fe28c4a..a86f679 100644 --- a/core/models/Result.py +++ b/core/models/Result.py @@ -20,6 +20,10 @@ class ResultError(Enum): PERMISSION = "permission" SUBSCRIPTION = "subscription" EXPIRED = "expired" # meant for invoice + UNPAID = "unpaid" + EXPIRED_SUB = "expired_sub" + ACTIVE_BILLING = "active_billing" + STATE_CONFLICT = "state_conflict" TICKET = "ticket" NO_TICKET = "no_ticket" ALREADY_EXISTS = "already_exists" @@ -40,10 +44,7 @@ class ResultError(Enum): NEED_SYNC = "need_sync" WRONG_LOCATION = "wrong_location" SERVER_SIDE = "server_side" - UNPAID = "unpaid" MTU = "mtu" - ACTIVE_BILLING = "active_billing" - STATE_CONFLICT = "state_conflict" TOR_NEEDED = "tor_needed" NAVIGATE_TO = "navigate_to" UNKNOWN = "unknown" diff --git a/core/services/subscriptions/subscriptions_by_protocol.py b/core/services/subscriptions/subscriptions_by_protocol.py index 409a09b..87cce25 100644 --- a/core/services/subscriptions/subscriptions_by_protocol.py +++ b/core/services/subscriptions/subscriptions_by_protocol.py @@ -447,6 +447,21 @@ def get_profile_subscription(profile_id: int, save_pending: Optional[bool] = Fal return profile.subscription + +def wipe_subscription(profile_id: int) -> Result: + """Wipe a given profile's subscription.""" + + profile = ProfileController.get(profile_id) + if not profile: + error_msg = f"Invalid profile id of {profile_id}" + logger.error(error_msg) + return Result(valid=False, message=error_msg, error_type=ResultError.INVALID_INPUT) + + profile.subscription = None + ProfileController.update(profile) + return Result(valid=True) + + def mark_as_paid() -> Result: """Conclude the payment phase""" diff --git a/core/utils/check_if_time_lapsed.py b/core/utils/check_if_time_lapsed.py new file mode 100644 index 0000000..dd03d4b --- /dev/null +++ b/core/utils/check_if_time_lapsed.py @@ -0,0 +1,17 @@ +from core.errors.logger import logger + +from datetime import datetime + +def check_if_time_lapsed(insert_date: datetime|str) -> bool: + logger.info(f"We are evaluating if this date is expired: {insert_date}") + + # Remove timezone awareness if present + if hasattr(insert_date, 'tzinfo') and insert_date.tzinfo is not None: + insert_date = insert_date.replace(tzinfo=None) + + # Parse string to datetime if needed + if isinstance(insert_date, str): + insert_date = datetime.fromisoformat(insert_date) + + # Compare with current time + return datetime.now() > insert_date