display whether a domain is premium

This commit is contained in:
Son NK 2020-10-20 16:44:22 +02:00
parent 03521b5a84
commit 8482a55df6
3 changed files with 73 additions and 11 deletions

View file

@ -43,12 +43,22 @@
<div class="col-sm-6 p-1">
<select class="form-control" name="suffix">
{% for suffix in suffixes %}
<option value="{{ suffix[2] }}">
{% if suffix[0] %}
{{ suffix[1] }} (your domain)
{% for suffix_info in suffixes %}
<option value="{{ suffix_info.signed_suffix }}"
{% if suffix_info.is_premium %}
title="Only available to Premium accounts"
{% elif not suffix_info.is_custom and at_least_a_premium_domain %}
title="Available to all accounts"
{% endif %}
>
{% if suffix_info.is_custom %}
{{ suffix_info.suffix }} (your domain)
{% else %}
{{ suffix[1] }}
{% if suffix_info.is_premium %}
{{ suffix_info.suffix }} (Premium domain)
{% else %}
{{ suffix_info.suffix }} (Public domain)
{% endif %}
{% endif %}
</option>
{% endfor %}

View file

@ -1,3 +1,5 @@
from dataclasses import dataclass
from flask import render_template, redirect, url_for, flash, request
from flask_login import login_required, current_user
from itsdangerous import TimestampSigner, SignatureExpired
@ -47,6 +49,50 @@ def available_suffixes(user: User) -> [bool, str, str]:
return suffixes
@dataclass
class SuffixInfo:
is_custom: bool
suffix: str
signed_suffix: str
is_premium: bool
def available_suffixes_more_info(user: User) -> [SuffixInfo]:
"""
Similar to as available_suffixes() but also return whether the suffix comes from a premium domain
Note that is-premium-domain is only relevant for SL domain
"""
user_custom_domains = user.verified_custom_domains()
suffixes: [SuffixInfo] = []
# put custom domain first
# for each user domain, generate both the domain and a random suffix version
for alias_domain in user_custom_domains:
suffix = "@" + alias_domain.domain
suffixes.append(SuffixInfo(True, suffix, signer.sign(suffix).decode(), False))
if alias_domain.random_prefix_generation:
suffix = "." + random_word() + "@" + alias_domain.domain
suffixes.append(
SuffixInfo(True, suffix, signer.sign(suffix).decode(), False)
)
# then SimpleLogin domain
for sl_domain in user.get_sl_domains():
suffix = (
("" if DISABLE_ALIAS_SUFFIX else "." + random_word())
+ "@"
+ sl_domain.domain
)
suffixes.append(
SuffixInfo(
False, suffix, signer.sign(suffix).decode(), sl_domain.premium_only
)
)
return suffixes
@dashboard_bp.route("/custom_alias", methods=["GET", "POST"])
@login_required
def custom_alias():
@ -60,8 +106,12 @@ def custom_alias():
return redirect(url_for("dashboard.index"))
user_custom_domains = [cd.domain for cd in current_user.verified_custom_domains()]
# List of (is_custom_domain, alias-suffix, time-signed alias-suffix)
suffixes = available_suffixes(current_user)
suffixes = available_suffixes_more_info(current_user)
at_least_a_premium_domain = False
for suffix in suffixes:
if not suffix.is_custom and suffix.is_premium:
at_least_a_premium_domain = True
break
mailboxes = current_user.mailboxes()
@ -180,6 +230,7 @@ def custom_alias():
"dashboard/custom_alias.html",
user_custom_domains=user_custom_domains,
suffixes=suffixes,
at_least_a_premium_domain=at_least_a_premium_domain,
mailboxes=mailboxes,
)

View file

@ -560,14 +560,15 @@ class User(db.Model, ModelMixin, UserMixin):
- SimpleLogin public domains, available for all users (ALIAS_DOMAIN)
- SimpleLogin premium domains, only available for Premium accounts (PREMIUM_ALIAS_DOMAIN)
"""
return [sl_domain.domain for sl_domain in self.get_sl_domains()]
def get_sl_domains(self) -> ["SLDomain"]:
if self.is_premium():
query = SLDomain.query.all()
query = SLDomain.query
else:
query = SLDomain.filter_by(premium_only=False)
domains = [sl_domain.domain for sl_domain in query]
return domains
return query.all()
def available_alias_domains(self) -> [str]:
"""return all domains that user can use when creating a new alias, including: