def parse_active_membership(user_data: dict) -> Optional[Membership]: if not user_data or not user_data.get("data") or not user_data.get( "included"): return None if user_data["data"]["id"] in settings.PATREON_GOD_IDS: return Membership( platform=Platform.patreon, user_id=user_data["data"]["id"], full_name=user_data["data"]["attributes"]["full_name"], email=user_data["data"]["attributes"]["email"], image=user_data["data"]["attributes"]["image_url"], started_at=datetime.utcnow(), charged_at=None, expires_at=datetime.utcnow() + timedelta(days=100 * 365), lifetime_support_cents=-1, currently_entitled_amount_cents=0) log.info(f"Patreon active membership: {user_data}") for membership in user_data["included"]: if membership["attributes"]["patron_status"] == "active_patron" \ and membership["attributes"]["last_charge_status"] == "Paid": now = datetime.utcnow() membership_started_at = datetime.strptime( str(membership["attributes"] ["pledge_relationship_start"])[:10], "%Y-%m-%d" ) if membership["attributes"]["pledge_relationship_start"] else now last_charged_at = None if membership["attributes"]["last_charge_date"]: last_charged_at = datetime.strptime( str(membership["attributes"]["last_charge_date"])[:10], "%Y-%m-%d") if last_charged_at: membership_expires_at = last_charged_at + timedelta(days=45) else: membership_expires_at = first_day_of_next_month( now) + timedelta(days=15) return Membership( platform=Platform.patreon, user_id=user_data["data"]["id"], full_name=user_data["data"]["attributes"]["full_name"], email=user_data["data"]["attributes"]["email"], image=None, # user_data["data"]["attributes"]["image_url"], started_at=membership_started_at, charged_at=last_charged_at, expires_at=membership_expires_at, lifetime_support_cents=int( membership["attributes"]["lifetime_support_cents"] or 0), currently_entitled_amount_cents=int( membership["attributes"]["currently_entitled_amount_cents"] or 0), ) return None
def setUp(self): self.client = HelperClient() self.stub_patreon_response_oauth_token = { "access_token": "xxx-access-token", "refresh_token": "xxx-refresh-token", "expires_in": (datetime.utcnow() + timedelta(minutes=5)).microsecond, "scope": "scope??", "token_type": "Bearer" } self.stub_patreon_response_oauth_identity = None # doesn't need for now self.stub_parse_membership = Membership( platform=Platform.patreon, user_id=str(uuid.uuid4()), full_name="PatreonMember FullName", email="*****@*****.**", image="http://xxx.url", started_at=datetime.utcnow(), charged_at=None, expires_at=datetime.utcnow() + timedelta(days=100 * 365), lifetime_support_cents=400, currently_entitled_amount_cents=0 )