add coupon

This commit is contained in:
Son Nguyen Kim 2021-07-13 08:54:37 +02:00
parent 7a8b5d80ed
commit 601385a0c1
3 changed files with 118 additions and 3 deletions

View File

@ -0,0 +1,28 @@
{% extends 'default.html' %}
{% set active_page = "dashboard" %}
{% block title %}
Coupon
{% endblock %}
{% block default_content %}
<div class="card">
<div class="card-body">
<h1 class="h2">Coupon</h1>
<div class="mb-4">
Please enter the coupon here to upgrade your account or extend your current subscription.
</div>
<form method="post">
{{ coupon_form.csrf_token }}
{{ coupon_form.code(class="form-control", placeholder="Licence Code") }}
{{ render_field_errors(coupon_form.code) }}
<button class="btn btn-success mt-2">Apply</button>
</form>
</div>
</div>
{% endblock %}

View File

@ -7,9 +7,9 @@
{% endblock %}
{% block default_content %}
<div class="row">
<div class="col">
<h1 class="h3">Lifetime Licence</h1>
<div class="card">
<div class="card-body">
<h1 class="h2">Lifetime Licence</h1>
<div class="mb-4">
If you have a lifetime licence, please paste it here. <br>

View File

@ -0,0 +1,87 @@
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)
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)