add new sender formats: NAME_ONLY, AT_ONLY, NO_NAME

This commit is contained in:
Son 2021-12-28 10:49:37 +01:00
parent 922fa4925e
commit fc42db43ca
3 changed files with 136 additions and 41 deletions

View File

@ -189,6 +189,9 @@ class PlanEnum(EnumE):
class SenderFormatEnum(EnumE):
AT = 0 # John Wick - john at wick.com
A = 2 # John Wick - john(a)wick.com
NAME_ONLY = 5 # John Wick
AT_ONLY = 6 # john at wick.com
NO_NAME = 7
class AliasGeneratorEnum(EnumE):
@ -1555,28 +1558,37 @@ class Contact(Base, ModelMixin):
def new_addr(self):
"""
Replace original email by reply_email. Possible formats:
- first@example.com via SimpleLogin <reply_email> OR
- First Last - first at example.com <reply_email> OR
- First Last - first(a)example.com <reply_email> OR
- First Last - first@example.com <reply_email> OR
- First Last <reply_email>
- first at example.com <reply_email>
- reply_email
And return new address with RFC 2047 format
`new_email` is a special reply address
"""
user = self.user
sender_format = user.sender_format if user else SenderFormatEnum.AT.value
if sender_format == SenderFormatEnum.AT.value:
formatted_email = self.website_email.replace("@", " at ").strip()
else:
formatted_email = self.website_email.replace("@", "(a)").strip()
if sender_format == SenderFormatEnum.NO_NAME.value:
return self.reply_email
# Prefix name to formatted email if available
new_name = (
(self.name + " - " + formatted_email)
if self.name and self.name != self.website_email.strip()
else formatted_email
)
if sender_format == SenderFormatEnum.NAME_ONLY.value:
new_name = self.name
elif sender_format == SenderFormatEnum.AT_ONLY.value:
new_name = self.website_email.replace("@", " at ").strip()
elif sender_format == SenderFormatEnum.AT.value:
formatted_email = self.website_email.replace("@", " at ").strip()
new_name = (
(self.name + " - " + formatted_email)
if self.name and self.name != self.website_email.strip()
else formatted_email
)
else: # SenderFormatEnum.A.value
formatted_email = self.website_email.replace("@", "(a)").strip()
new_name = (
(self.name + " - " + formatted_email)
if self.name and self.name != self.website_email.strip()
else formatted_email
)
new_addr = formataddr((new_name, self.reply_email)).strip()
return new_addr.strip()

View File

@ -303,6 +303,21 @@
John Wick - john(a)wick.com
</option>
<option value="{{ SenderFormatEnum.NAME_ONLY.value }}"
{% if current_user.sender_format == SenderFormatEnum.NAME_ONLY.value %} selected {% endif %}>
John Wick
</option>
<option value="{{ SenderFormatEnum.AT_ONLY.value }}"
{% if current_user.sender_format == SenderFormatEnum.AT_ONLY.value %} selected {% endif %}>
john at wick.com
</option>
<option value="{{ SenderFormatEnum.NO_NAME.value }}"
{% if current_user.sender_format == SenderFormatEnum.NO_NAME.value %} selected {% endif %}>
No Name (i.e. only reverse-alias)
</option>
</select>
<button class="btn btn-outline-primary mt-3">Update</button>

View File

@ -14,6 +14,7 @@ from app.models import (
SenderFormatEnum,
EnumE,
)
from tests.utils import login
def test_generate_email(flask_client):
@ -111,21 +112,11 @@ def test_website_send_to(flask_client):
assert c1.website_send_to() == '"Nhơn Nguyễn | abcd at example.com" <rep@SL>'
def test_new_addr(flask_client):
user = User.create(
email="a@b.c",
password="password",
name="Test User",
activated=True,
commit=True,
sender_format=1,
)
def test_new_addr_default_sender_format(flask_client):
user = login(flask_client)
alias = Alias.first()
alias = Alias.create_new_random(user)
Session.commit()
# default sender_format is 'via'
c1 = Contact.create(
contact = Contact.create(
user_id=user.id,
alias_id=alias.id,
website_email="abcd@example.com",
@ -133,29 +124,106 @@ def test_new_addr(flask_client):
name="First Last",
commit=True,
)
assert c1.new_addr() == '"First Last - abcd(a)example.com" <rep@SL>'
assert contact.new_addr() == '"First Last - abcd at example.com" <rep@SL>'
# Make sure email isn't duplicated if sender name equals email
c1.name = "abcd@example.com"
Session.commit()
assert c1.new_addr() == '"abcd(a)example.com" <rep@SL>'
contact.name = "abcd@example.com"
assert contact.new_addr() == '"abcd at example.com" <rep@SL>'
# set sender_format = AT
user.sender_format = SenderFormatEnum.AT.value
c1.name = "First Last"
Session.commit()
assert c1.new_addr() == '"First Last - abcd at example.com" <rep@SL>'
# unicode name
c1.name = "Nhơn Nguyễn"
def test_new_addr_a_sender_format(flask_client):
user = login(flask_client)
user.sender_format = SenderFormatEnum.A.value
Session.commit()
alias = Alias.first()
contact = Contact.create(
user_id=user.id,
alias_id=alias.id,
website_email="abcd@example.com",
reply_email="rep@SL",
name="First Last",
commit=True,
)
assert contact.new_addr() == '"First Last - abcd(a)example.com" <rep@SL>'
def test_new_addr_no_name_sender_format(flask_client):
user = login(flask_client)
user.sender_format = SenderFormatEnum.NO_NAME.value
Session.commit()
alias = Alias.first()
contact = Contact.create(
user_id=user.id,
alias_id=alias.id,
website_email="abcd@example.com",
reply_email="rep@SL",
name="First Last",
commit=True,
)
assert contact.new_addr() == "rep@SL"
def test_new_addr_name_only_sender_format(flask_client):
user = login(flask_client)
user.sender_format = SenderFormatEnum.NAME_ONLY.value
Session.commit()
alias = Alias.first()
contact = Contact.create(
user_id=user.id,
alias_id=alias.id,
website_email="abcd@example.com",
reply_email="rep@SL",
name="First Last",
commit=True,
)
assert contact.new_addr() == "First Last <rep@SL>"
def test_new_addr_at_only_sender_format(flask_client):
user = login(flask_client)
user.sender_format = SenderFormatEnum.AT_ONLY.value
Session.commit()
alias = Alias.first()
contact = Contact.create(
user_id=user.id,
alias_id=alias.id,
website_email="abcd@example.com",
reply_email="rep@SL",
name="First Last",
commit=True,
)
assert contact.new_addr() == '"abcd at example.com" <rep@SL>'
def test_new_addr_unicode(flask_client):
user = login(flask_client)
alias = Alias.first()
contact = Contact.create(
user_id=user.id,
alias_id=alias.id,
website_email="abcd@example.com",
reply_email="rep@SL",
name="Nhơn Nguyễn",
commit=True,
)
assert (
c1.new_addr()
contact.new_addr()
== "=?utf-8?q?Nh=C6=A1n_Nguy=E1=BB=85n_-_abcd_at_example=2Ecom?= <rep@SL>"
)
# sanity check
assert parse_full_address(c1.new_addr()) == (
assert parse_full_address(contact.new_addr()) == (
"Nhơn Nguyễn - abcd at example.com",
"rep@sl",
)