diff --git a/app/dashboard/templates/dashboard/custom_alias.html b/app/dashboard/templates/dashboard/custom_alias.html index 4a439b85..414d4cf2 100644 --- a/app/dashboard/templates/dashboard/custom_alias.html +++ b/app/dashboard/templates/dashboard/custom_alias.html @@ -9,25 +9,25 @@ {% block default_content %}
+

Custom Alias

{% if error %}
{{ error }}
{% endif %} -
- {{ form.csrf_token }} + +
- + You can use letter, number or dash. Alias must have at least 3 characters +
- {{ form.email(class="form-control", - pattern="[0-9|A-Z|a-z|-]{3,}", - title="Only letter, number or dash can be used and alias must have at least 3 characters.", - autofocus=True) }} - {{ render_field_errors(form.email) }} +
@@ -40,6 +40,33 @@ + + {% if custom_domains %} +
+

OR with your custom domains

+ {% for custom_domain in custom_domains %} +
+ + + +
+
+ +
+
+ +

+ @{{ custom_domain.domain }} +

+
+
+ +
+
+ +
+ {% endfor %} + {% endif %}
{% endblock %} diff --git a/app/dashboard/views/custom_alias.py b/app/dashboard/views/custom_alias.py index e06ce105..56f6a14f 100644 --- a/app/dashboard/views/custom_alias.py +++ b/app/dashboard/views/custom_alias.py @@ -1,20 +1,14 @@ from flask import render_template, redirect, url_for, flash, request, session from flask_login import login_required, current_user -from flask_wtf import FlaskForm -from wtforms import StringField, validators from app.config import EMAIL_DOMAIN, HIGHLIGHT_GEN_EMAIL_ID from app.dashboard.base import dashboard_bp from app.extensions import db from app.log import LOG -from app.models import GenEmail, DeletedAlias +from app.models import GenEmail, DeletedAlias, CustomDomain from app.utils import convert_to_id, random_string -class CustomAliasForm(FlaskForm): - email = StringField("Email", validators=[validators.DataRequired()]) - - @dashboard_bp.route("/custom_alias", methods=["GET", "POST"]) @login_required def custom_alias(): @@ -25,41 +19,81 @@ def custom_alias(): flash("ony premium user can choose custom alias", "warning") return redirect(url_for("dashboard.index")) - form = CustomAliasForm() error = "" - if form.validate_on_submit(): - email = form.email.data - email = convert_to_id(email) - email_suffix = request.form.get("email-suffix") + if request.method == "POST": + if request.form.get("form-name") == "non-custom-domain-name": + email_prefix = request.form.get("email-prefix") + email_prefix = convert_to_id(email_prefix) + email_suffix = request.form.get("email-suffix") - if len(email) < 3: - error = "email must be at least 3 letters" - else: - full_email = f"{email}.{email_suffix}@{EMAIL_DOMAIN}" - # check if email already exists - if GenEmail.get_by(email=full_email) or DeletedAlias.get_by( - email=full_email - ): - error = "email already chosen, please choose another one" + if len(email_prefix) < 3: + error = "email must be at least 3 letters" else: - # create the new alias - LOG.d("create custom alias %s for user %s", full_email, current_user) + full_email = f"{email_prefix}.{email_suffix}@{EMAIL_DOMAIN}" + # check if email already exists + if GenEmail.get_by(email=full_email) or DeletedAlias.get_by( + email=full_email + ): + error = "email already chosen, please choose another one" + else: + # create the new alias + LOG.d( + "create custom alias %s for user %s", full_email, current_user + ) + gen_email = GenEmail.create( + email=full_email, user_id=current_user.id, custom=True + ) + db.session.commit() + + flash(f"Alias {full_email} has been created", "success") + session[HIGHLIGHT_GEN_EMAIL_ID] = gen_email.id + + return redirect(url_for("dashboard.index")) + elif request.form.get("form-name") == "custom-domain-name": + custom_domain_id = request.form.get("custom-domain-id") + email = request.form.get("email") + + custom_domain = CustomDomain.get(custom_domain_id) + + if not custom_domain: + flash("Unknown error. Refresh the page", "warning") + return redirect(url_for("dashboard.custom_alias")) + elif custom_domain.user_id != current_user.id: + flash("Unknown error. Refresh the page", "warning") + return redirect(url_for("dashboard.custom_alias")) + elif not custom_domain.verified: + flash("Unknown error. Refresh the page", "warning") + return redirect(url_for("dashboard.custom_alias")) + + full_email = f"{email}@{custom_domain.domain}" + + if GenEmail.get_by(email=full_email): + error = f"{full_email} already exist, please choose another one" + else: + LOG.d( + "create custom alias %s for custom domain %s", + full_email, + custom_domain.domain, + ) + # todo: add custom_id to GenEmail gen_email = GenEmail.create( - email=full_email, user_id=current_user.id, custom=True + email=full_email, + user_id=current_user.id, + custom=True, + custom_domain_id=custom_domain.id, ) db.session.commit() + flash(f"Alias {full_email} has been created", "success") - flash(f"Email alias {full_email} has been created", "success") session[HIGHLIGHT_GEN_EMAIL_ID] = gen_email.id - return redirect(url_for("dashboard.index")) email_suffix = random_string(6) return render_template( "dashboard/custom_alias.html", - form=form, error=error, email_suffix=email_suffix, EMAIL_DOMAIN=EMAIL_DOMAIN, + custom_domains=current_user.verified_custom_domains(), )