def manual_upgrade(way: str, ids: [int], is_giveaway: bool): query = User.query.filter(User.id.in_(ids)) for user in query.all(): manual_sub: ManualSubscription = ManualSubscription.get_by( user_id=user.id) if manual_sub: # renew existing subscription if manual_sub.end_at > arrow.now(): manual_sub.end_at = manual_sub.end_at.shift(years=1) else: manual_sub.end_at = arrow.now().shift(years=1, days=1) db.session.commit() flash(f"Subscription extended to {manual_sub.end_at.humanize()}", "success") continue # user can have manual subscription applied if their current subscription is canceled if (user.is_premium() and not user.in_trial() and not user.subscription_cancelled): flash(f"User {user} is already premium", "warning") continue ManualSubscription.create( user_id=user.id, end_at=arrow.now().shift(years=1, days=1), comment=way, is_giveaway=is_giveaway, commit=True, ) flash(f"New {way} manual subscription for {user} is created", "success")
def upgrade(way: str, ids: [int], is_giveaway: bool): query = User.query.filter(User.id.in_(ids)) for user in query.all(): if user.is_premium() and not user.in_trial(): continue ManualSubscription.create( user_id=user.id, end_at=arrow.now().shift(years=1, days=1), comment=way, is_giveaway=is_giveaway, commit=True, ) flash(f"{user} is {way} upgraded")
def action_cash_upgrade(self, ids): query = User.query.filter(User.id.in_(ids)) for user in query.all(): if user.is_premium() and not user.in_trial(): continue ManualSubscription.create( user_id=user.id, end_at=arrow.now().shift(years=1, days=1), comment="Cash", is_giveaway=False, commit=True, ) flash(f"{user} is cash upgraded")
def manual_upgrade(way: str, ids: [int], is_giveaway: bool): for user in User.filter(User.id.in_(ids)).all(): if user.lifetime: flash(f"user {user} already has a lifetime license", "warning") continue sub: Subscription = user.get_subscription() if sub and not sub.cancelled: flash( f"user {user} already has a Paddle license, they have to cancel it first", "warning", ) continue apple_sub: AppleSubscription = AppleSubscription.get_by( user_id=user.id) if apple_sub and apple_sub.is_valid(): flash( f"user {user} already has a Apple subscription, they have to cancel it first", "warning", ) continue manual_sub: ManualSubscription = ManualSubscription.get_by( user_id=user.id) if manual_sub: # renew existing subscription if manual_sub.end_at > arrow.now(): manual_sub.end_at = manual_sub.end_at.shift(years=1) else: manual_sub.end_at = arrow.now().shift(years=1, days=1) Session.commit() flash(f"Subscription extended to {manual_sub.end_at.humanize()}", "success") continue ManualSubscription.create( user_id=user.id, end_at=arrow.now().shift(years=1, days=1), comment=way, is_giveaway=is_giveaway, commit=True, ) flash(f"New {way} manual subscription for {user} is created", "success")
def fake_data(): LOG.d("create fake data") # Remove db if exist if os.path.exists("db.sqlite"): LOG.d("remove existing db file") os.remove("db.sqlite") # Create all tables db.create_all() # Create a user user = User.create( email="*****@*****.**", name="John Wick", password="******", activated=True, is_admin=True, # enable_otp=True, otp_secret="base32secret3232", intro_shown=True, fido_uuid=None, ) user.trial_end = None db.session.commit() # add a profile picture file_path = "profile_pic.svg" s3.upload_from_bytesio( file_path, open(os.path.join(ROOT_DIR, "static", "default-icon.svg"), "rb"), content_type="image/svg", ) file = File.create(user_id=user.id, path=file_path, commit=True) user.profile_picture_id = file.id db.session.commit() # create a bounced email alias = Alias.create_new_random(user) db.session.commit() bounce_email_file_path = "bounce.eml" s3.upload_email_from_bytesio( bounce_email_file_path, open(os.path.join(ROOT_DIR, "local_data", "email_tests", "2.eml"), "rb"), "download.eml", ) refused_email = RefusedEmail.create( path=bounce_email_file_path, full_report_path=bounce_email_file_path, user_id=user.id, commit=True, ) contact = Contact.create( user_id=user.id, alias_id=alias.id, website_email="*****@*****.**", reply_email="*****@*****.**", commit=True, ) EmailLog.create( user_id=user.id, contact_id=contact.id, refused_email_id=refused_email.id, bounced=True, commit=True, ) LifetimeCoupon.create(code="coupon", nb_used=10, commit=True) # Create a subscription for user Subscription.create( user_id=user.id, cancel_url="https://checkout.paddle.com/subscription/cancel?user=1234", update_url="https://checkout.paddle.com/subscription/update?user=1234", subscription_id="123", event_time=arrow.now(), next_bill_date=arrow.now().shift(days=10).date(), plan=PlanEnum.monthly, commit=True, ) CoinbaseSubscription.create( user_id=user.id, end_at=arrow.now().shift(days=10), commit=True ) api_key = ApiKey.create(user_id=user.id, name="Chrome") api_key.code = "code" api_key = ApiKey.create(user_id=user.id, name="Firefox") api_key.code = "codeFF" pgp_public_key = open(get_abs_path("local_data/public-pgp.asc")).read() m1 = Mailbox.create( user_id=user.id, email="*****@*****.**", verified=True, pgp_public_key=pgp_public_key, ) m1.pgp_finger_print = load_public_key(pgp_public_key) db.session.commit() for i in range(3): if i % 2 == 0: a = Alias.create( email=f"e{i}@{FIRST_ALIAS_DOMAIN}", user_id=user.id, mailbox_id=m1.id ) else: a = Alias.create( email=f"e{i}@{FIRST_ALIAS_DOMAIN}", user_id=user.id, mailbox_id=user.default_mailbox_id, ) db.session.commit() if i % 5 == 0: if i % 2 == 0: AliasMailbox.create(alias_id=a.id, mailbox_id=user.default_mailbox_id) else: AliasMailbox.create(alias_id=a.id, mailbox_id=m1.id) db.session.commit() # some aliases don't have any activity # if i % 3 != 0: # contact = Contact.create( # user_id=user.id, # alias_id=a.id, # website_email=f"contact{i}@example.com", # reply_email=f"rep{i}@sl.local", # ) # db.session.commit() # for _ in range(3): # EmailLog.create(user_id=user.id, contact_id=contact.id) # db.session.commit() # have some disabled alias if i % 5 == 0: a.enabled = False db.session.commit() CustomDomain.create(user_id=user.id, domain="ab.cd", verified=True) CustomDomain.create( user_id=user.id, domain="very-long-domain.com.net.org", verified=True ) db.session.commit() Directory.create(user_id=user.id, name="abcd") Directory.create(user_id=user.id, name="xyzt") db.session.commit() # Create a client client1 = Client.create_new(name="Demo", user_id=user.id) client1.oauth_client_id = "client-id" client1.oauth_client_secret = "client-secret" client1.published = True db.session.commit() RedirectUri.create(client_id=client1.id, uri="https://ab.com") client2 = Client.create_new(name="Demo 2", user_id=user.id) client2.oauth_client_id = "client-id2" client2.oauth_client_secret = "client-secret2" client2.published = True db.session.commit() ClientUser.create(user_id=user.id, client_id=client1.id, name="Fake Name") referral = Referral.create(user_id=user.id, code="REFCODE", name="First referral") db.session.commit() for i in range(6): Notification.create(user_id=user.id, message=f"""Hey hey <b>{i}</b> """ * 10) db.session.commit() user2 = User.create( email="*****@*****.**", password="******", activated=True, referral_id=referral.id, ) Mailbox.create(user_id=user2.id, email="*****@*****.**", verified=True) db.session.commit() ManualSubscription.create( user_id=user2.id, end_at=arrow.now().shift(years=1, days=1), commit=True )
def coupon_route(): coupon_form = CouponForm() if coupon_form.validate_on_submit(): code = coupon_form.code.data if LifetimeCoupon.get_by(code=code): LOG.d("redirect %s to lifetime page instead", current_user) flash("Redirect to the lifetime coupon page instead", "success") return redirect(url_for("dashboard.lifetime_licence")) # handle case user already has an active subscription via another channel (Paddle, Apple, etc) can_use_coupon = True if current_user.lifetime: can_use_coupon = False sub: Subscription = current_user.get_subscription() if sub: can_use_coupon = False apple_sub: AppleSubscription = AppleSubscription.get_by( user_id=current_user.id) if apple_sub and apple_sub.is_valid(): can_use_coupon = False coinbase_subscription: CoinbaseSubscription = CoinbaseSubscription.get_by( user_id=current_user.id) if coinbase_subscription and coinbase_subscription.is_active(): can_use_coupon = False if coupon_form.validate_on_submit(): code = coupon_form.code.data coupon: Coupon = Coupon.get_by(code=code) if coupon and not coupon.used: if coupon.expires_date and coupon.expires_date < arrow.now(): flash( f"The coupon was expired on {coupon.expires_date.humanize()}", "error", ) return redirect(request.url) coupon.used_by_user_id = current_user.id coupon.used = True Session.commit() manual_sub: ManualSubscription = ManualSubscription.get_by( user_id=current_user.id) if manual_sub: # renew existing subscription if manual_sub.end_at > arrow.now(): manual_sub.end_at = manual_sub.end_at.shift( years=coupon.nb_year) else: manual_sub.end_at = arrow.now().shift(years=coupon.nb_year, days=1) Session.commit() flash( f"Your current subscription is extended to {manual_sub.end_at.humanize()}", "success", ) else: ManualSubscription.create( user_id=current_user.id, end_at=arrow.now().shift(years=coupon.nb_year, days=1), comment="using coupon code", is_giveaway=coupon.is_giveaway, commit=True, ) flash( f"Your account has been upgraded to Premium, thanks for your support!", "success", ) # notify admin if coupon.is_giveaway: subject = f"User {current_user} applies a (free) coupon" else: subject = f"User {current_user} applies a (paid, {coupon.comment or ''}) coupon" send_email( ADMIN_EMAIL, subject=subject, plaintext="", html="", ) return redirect(url_for("dashboard.index")) else: flash(f"Code *{code}* expired or invalid", "warning") return render_template( "dashboard/coupon.html", coupon_form=coupon_form, PADDLE_VENDOR_ID=PADDLE_VENDOR_ID, PADDLE_COUPON_ID=PADDLE_COUPON_ID, can_use_coupon=can_use_coupon, # a coupon is only valid until this date # this is to avoid using the coupon to renew an account forever max_coupon_date=arrow.now().shift(years=1, days=-1), )
def coupon_route(): if current_user.lifetime: flash("You already have a lifetime licence", "warning") return redirect(url_for("dashboard.index")) # handle case user already has an active subscription via another channel (Paddle, Apple, etc) if current_user._lifetime_or_active_subscription(): manual_sub: ManualSubscription = ManualSubscription.get_by( user_id=current_user.id) # user has an non-manual subscription if not manual_sub or not manual_sub.is_active(): flash("You already have another subscription.", "warning") return redirect(url_for("dashboard.index")) coupon_form = CouponForm() if coupon_form.validate_on_submit(): code = coupon_form.code.data coupon: Coupon = Coupon.get_by(code=code) if coupon and not coupon.used: coupon.used_by_user_id = current_user.id coupon.used = True db.session.commit() manual_sub: ManualSubscription = ManualSubscription.get_by( user_id=current_user.id) if manual_sub: # renew existing subscription if manual_sub.end_at > arrow.now(): manual_sub.end_at = manual_sub.end_at.shift( years=coupon.nb_year) else: manual_sub.end_at = arrow.now().shift(years=coupon.nb_year, days=1) db.session.commit() flash( f"Your current subscription is extended to {manual_sub.end_at.humanize()}", "success", ) else: ManualSubscription.create( user_id=current_user.id, end_at=arrow.now().shift(years=coupon.nb_year, days=1), comment="using coupon code", is_giveaway=False, commit=True, ) flash( f"Your account has been upgraded to Premium, thanks for your support!", "success", ) # notify admin send_email( ADMIN_EMAIL, subject=f"User {current_user} applies the coupon", plaintext="", html="", ) return redirect(url_for("dashboard.index")) else: flash(f"Code *{code}* expired or invalid", "warning") return render_template("dashboard/coupon.html", coupon_form=coupon_form)
def fake_data(): LOG.d("create fake data") # Create a user user = User.create( email="*****@*****.**", name="John Wick", password="******", activated=True, is_admin=True, # enable_otp=True, otp_secret="base32secret3232", intro_shown=True, fido_uuid=None, ) user.trial_end = None Session.commit() # add a profile picture file_path = "profile_pic.svg" s3.upload_from_bytesio( file_path, open(os.path.join(ROOT_DIR, "static", "default-icon.svg"), "rb"), content_type="image/svg", ) file = File.create(user_id=user.id, path=file_path, commit=True) user.profile_picture_id = file.id Session.commit() # create a bounced email alias = Alias.create_new_random(user) Session.commit() bounce_email_file_path = "bounce.eml" s3.upload_email_from_bytesio( bounce_email_file_path, open(os.path.join(ROOT_DIR, "local_data", "email_tests", "2.eml"), "rb"), "download.eml", ) refused_email = RefusedEmail.create( path=bounce_email_file_path, full_report_path=bounce_email_file_path, user_id=user.id, commit=True, ) contact = Contact.create( user_id=user.id, alias_id=alias.id, website_email="*****@*****.**", reply_email="*****@*****.**", commit=True, ) EmailLog.create( user_id=user.id, contact_id=contact.id, alias_id=contact.alias_id, refused_email_id=refused_email.id, bounced=True, commit=True, ) LifetimeCoupon.create(code="lifetime-coupon", nb_used=10, commit=True) Coupon.create(code="coupon", commit=True) # Create a subscription for user Subscription.create( user_id=user.id, cancel_url="https://checkout.paddle.com/subscription/cancel?user=1234", update_url="https://checkout.paddle.com/subscription/update?user=1234", subscription_id="123", event_time=arrow.now(), next_bill_date=arrow.now().shift(days=10).date(), plan=PlanEnum.monthly, commit=True, ) CoinbaseSubscription.create(user_id=user.id, end_at=arrow.now().shift(days=10), commit=True) api_key = ApiKey.create(user_id=user.id, name="Chrome") api_key.code = "code" api_key = ApiKey.create(user_id=user.id, name="Firefox") api_key.code = "codeFF" pgp_public_key = open(get_abs_path("local_data/public-pgp.asc")).read() m1 = Mailbox.create( user_id=user.id, email="*****@*****.**", verified=True, pgp_public_key=pgp_public_key, ) m1.pgp_finger_print = load_public_key(pgp_public_key) Session.commit() # [email protected] is in a LOT of data breaches Alias.create(email="*****@*****.**", user_id=user.id, mailbox_id=m1.id) for i in range(3): if i % 2 == 0: a = Alias.create(email=f"e{i}@{FIRST_ALIAS_DOMAIN}", user_id=user.id, mailbox_id=m1.id) else: a = Alias.create( email=f"e{i}@{FIRST_ALIAS_DOMAIN}", user_id=user.id, mailbox_id=user.default_mailbox_id, ) Session.commit() if i % 5 == 0: if i % 2 == 0: AliasMailbox.create(alias_id=a.id, mailbox_id=user.default_mailbox_id) else: AliasMailbox.create(alias_id=a.id, mailbox_id=m1.id) Session.commit() # some aliases don't have any activity # if i % 3 != 0: # contact = Contact.create( # user_id=user.id, # alias_id=a.id, # website_email=f"contact{i}@example.com", # reply_email=f"rep{i}@sl.local", # ) # Session.commit() # for _ in range(3): # EmailLog.create(user_id=user.id, contact_id=contact.id, alias_id=contact.alias_id) # Session.commit() # have some disabled alias if i % 5 == 0: a.enabled = False Session.commit() custom_domain1 = CustomDomain.create(user_id=user.id, domain="ab.cd", verified=True) Session.commit() Alias.create( user_id=user.id, email="*****@*****.**", mailbox_id=user.default_mailbox_id, custom_domain_id=custom_domain1.id, commit=True, ) Alias.create( user_id=user.id, email="*****@*****.**", mailbox_id=user.default_mailbox_id, custom_domain_id=custom_domain1.id, commit=True, ) Directory.create(user_id=user.id, name="abcd") Directory.create(user_id=user.id, name="xyzt") Session.commit() # Create a client client1 = Client.create_new(name="Demo", user_id=user.id) client1.oauth_client_id = "client-id" client1.oauth_client_secret = "client-secret" Session.commit() RedirectUri.create(client_id=client1.id, uri="https://your-website.com/oauth-callback") client2 = Client.create_new(name="Demo 2", user_id=user.id) client2.oauth_client_id = "client-id2" client2.oauth_client_secret = "client-secret2" Session.commit() ClientUser.create(user_id=user.id, client_id=client1.id, name="Fake Name") referral = Referral.create(user_id=user.id, code="Website", name="First referral") Referral.create(user_id=user.id, code="Podcast", name="First referral") Payout.create(user_id=user.id, amount=1000, number_upgraded_account=100, payment_method="BTC") Payout.create( user_id=user.id, amount=5000, number_upgraded_account=200, payment_method="PayPal", ) Session.commit() for i in range(6): Notification.create(user_id=user.id, message=f"""Hey hey <b>{i}</b> """ * 10) Session.commit() user2 = User.create( email="*****@*****.**", password="******", activated=True, referral_id=referral.id, ) Mailbox.create(user_id=user2.id, email="*****@*****.**", verified=True) Session.commit() ManualSubscription.create( user_id=user2.id, end_at=arrow.now().shift(years=1, days=1), comment="Local manual", commit=True, ) SLDomain.create(domain="premium.com", premium_only=True, commit=True) hibp1 = Hibp.create(name="first breach", description="breach description", commit=True) hibp2 = Hibp.create(name="second breach", description="breach description", commit=True) breached_alias1 = Alias.create(email="*****@*****.**", user_id=user.id, mailbox_id=m1.id, commit=True) breached_alias2 = Alias.create(email="*****@*****.**", user_id=user.id, mailbox_id=m1.id, commit=True) AliasHibp.create(hibp_id=hibp1.id, alias_id=breached_alias1.id) AliasHibp.create(hibp_id=hibp2.id, alias_id=breached_alias2.id) # old domain will have ownership_verified=True CustomDomain.create(user_id=user.id, domain="old.com", verified=True, ownership_verified=True)