2021-07-13 06:54:37 +00:00
|
|
|
import arrow
|
|
|
|
from flask import render_template, flash, redirect, url_for
|
|
|
|
from flask_login import login_required, current_user
|
|
|
|
from flask_wtf import FlaskForm
|
|
|
|
from wtforms import StringField, validators
|
|
|
|
|
|
|
|
from app.config import ADMIN_EMAIL
|
|
|
|
from app.dashboard.base import dashboard_bp
|
|
|
|
from app.email_utils import send_email
|
|
|
|
from app.extensions import db
|
|
|
|
from app.models import ManualSubscription, Coupon
|
|
|
|
|
|
|
|
|
|
|
|
class CouponForm(FlaskForm):
|
|
|
|
code = StringField("Coupon Code", validators=[validators.DataRequired()])
|
|
|
|
|
|
|
|
|
|
|
|
@dashboard_bp.route("/coupon", methods=["GET", "POST"])
|
|
|
|
@login_required
|
|
|
|
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)
|
2021-08-21 13:55:22 +00:00
|
|
|
if current_user.lifetime_or_active_subscription():
|
2021-07-13 06:54:37 +00:00
|
|
|
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)
|