add coupon
This commit is contained in:
parent
7a8b5d80ed
commit
601385a0c1
|
@ -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 %}
|
|
@ -7,9 +7,9 @@
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block default_content %}
|
{% block default_content %}
|
||||||
<div class="row">
|
<div class="card">
|
||||||
<div class="col">
|
<div class="card-body">
|
||||||
<h1 class="h3">Lifetime Licence</h1>
|
<h1 class="h2">Lifetime Licence</h1>
|
||||||
|
|
||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
If you have a lifetime licence, please paste it here. <br>
|
If you have a lifetime licence, please paste it here. <br>
|
||||||
|
|
|
@ -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)
|
Loading…
Reference in New Issue