Skip to content

Fix origin for complex recipients #13

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 13 additions & 15 deletions tkmail/address.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,38 +72,36 @@ def get_admin_emails():
return email_addresses


def translate_recipient(year, name, list_ids=False):
def translate_recipient(year, name):
"""Translate recipient `name` in GF year `year`.

>>> translate_recipient(2010, "K3FORM")
["mathiasrav@gmail.com"]
[("mathiasrav@...", "BESTFU2013")]

>>> translate_recipient(2010, "GFORM14")
["mathiasrav@gmail.com"]
[("mathiasrav@...", "BESTFU2013")]

>>> translate_recipient(2010, "BEST2013")
["mathiasrav@gmail.com", ...]
[("mathiasrav@...", "BESTFU2013"), ...]

>>> translate_recipient(2006, 'FUAA')
['sidse...']
[('sidse...', "BESTFU2006")]

>>> translate_recipient(2011, 'FUIØ')
['[email protected]']
[('[email protected]', "BESTFU2011")]

>>> translate_recipient(2011, 'FUIOE')
['[email protected]']
[('[email protected]', "BESTFU2011")]
"""

name = name.replace('$', 'S') # KA$$ -> KASS hack
db = tkmail.database.Database()
recipient_ids, origin = parse_recipient(name.upper(), db, year)
assert isinstance(recipient_ids, list) and isinstance(origin, list)
assert len(recipient_ids) == len(origin)
recipients = parse_recipient(name.upper(), db, year)
recipient_ids = [recipient_id for recipient_id, origin in recipients]
email_addresses = db.get_email_addresses(recipient_ids)
if list_ids:
return email_addresses, dict(zip(email_addresses, origin))
else:
return email_addresses
return [
(email_addresses[recipient_id], origin) for recipient_id, origin in recipients
]


def parse_recipient(recipient, db, current_period):
Expand Down Expand Up @@ -140,7 +138,7 @@ def parse_recipient(recipient, db, current_period):
recipient_ids = sorted(recipient_ids)
if not recipient_ids:
raise InvalidRecipient(recipient)
return recipient_ids, [origin[r] for r in recipient_ids]
return [(r, origin[r]) for r in recipient_ids]


def parse_alias_group(alias, db, current_period):
Expand Down
6 changes: 3 additions & 3 deletions tkmail/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,12 @@ def _fetchall(self, *args, **kwargs):

def get_email_addresses(self, id_list):
id_string = ','.join(str(each) for each in id_list)
return self._fetchall("""
SELECT `email` FROM `idm_profile`
return dict(self._fetchall("""
SELECT `id`, `email` FROM `idm_profile`
WHERE `id` IN (%s)
AND `allow_direct_email` = TRUE
AND `email` != ""
""", id_string, column=0)
""", id_string))

def get_admin_emails(self):
return self._fetchall("""
Expand Down
15 changes: 9 additions & 6 deletions tkmail/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -288,15 +288,18 @@ def strict_dmarc_policy(self, envelope):

def translate_recipient(self, rcptto):
name, domain = rcptto.split('@')
recipients, origin = tkmail.address.translate_recipient(
self.year, name, list_ids=True)
recipients = tkmail.address.translate_recipient(self.year, name)
if not recipients:
logger.info("%s resolved to the empty list", name)
raise InvalidRecipient(rcptto)
recipients.sort(key=lambda r: origin[r])
group_iter = itertools.groupby(recipients, key=lambda r: origin[r])
groups = [RecipientGroup(origin=o, recipients=frozenset(group))
for o, group in group_iter]
recipients.sort(key=lambda r: r[1])
group_iter = itertools.groupby(recipients, key=lambda r: r[1])
groups = []
for origin, group in group_iter:
email_addresses = [email_address for email_address, origin in group]
groups.append(
RecipientGroup(origin=origin, recipients=frozenset(email_addresses))
)
return groups

def get_group_recipients(self, group):
Expand Down