svthalia/concrexit

View on GitHub
website/mailinglists/services.py

Summary

Maintainability
A
0 mins
Test Coverage
"""The services defined by the mailinglists package."""

from django.conf import settings
from django.utils import timezone

from activemembers.models import (
    Board,
    Committee,
    MemberGroupMembership,
    Mentorship,
    Society,
)
from members.models import Member, Membership
from utils.snippets import datetime_to_lectureyear


def get_automatic_lists():
    """Return list of mailing lists that should be generated automatically."""
    current_committee_chairs = (
        MemberGroupMembership.active_objects.filter(group__board=None)
        .filter(group__society=None)
        .filter(chair=True)
        .select_related("member")
    )
    committee_chairs = _get_members_email_addresses(
        [x.member for x in current_committee_chairs]
    ) + ["internalaffairs@thalia.nu"]

    current_society_chairs = (
        MemberGroupMembership.active_objects.filter(group__board=None)
        .filter(group__committee=None)
        .filter(chair=True)
        .select_related("member")
    )
    society_chair_emails = _get_members_email_addresses(
        [x.member for x in current_society_chairs]
    ) + ["internalaffairs@thalia.nu"]

    active_committee_memberships = (
        MemberGroupMembership.active_objects.filter(group__board=None)
        .filter(group__society=None)
        .select_related("member")
    )

    active_members = _get_members_email_addresses(
        [x.member for x in active_committee_memberships]
    )

    lectureyear = datetime_to_lectureyear(timezone.now())
    # Change to next lecture year after December
    if 0 < timezone.now().month < 9:
        lectureyear += 1
    active_mentorships = Mentorship.objects.filter(year=lectureyear).prefetch_related(
        "member"
    )
    mentors = _get_members_email_addresses([x.member for x in active_mentorships])

    oldmembers = [
        m
        for m in Member.objects.filter(profile__receive_oldmembers=True)
        if (
            m.current_membership is None
            or m.current_membership.type != Membership.MEMBER
        )
    ]

    lists = [
        {
            "name": "members",
            "aliases": ["leden"],
            "description": "Automatic moderated mailinglist that can be used "
            "to send mail to all members",
            "addresses": _get_members_email_addresses(
                Member.all_with_membership(Membership.MEMBER)
            ),
            "moderated": True,
        },
        {
            "name": "benefactors",
            "aliases": ["begunstigers"],
            "description": "Automatic moderated mailinglist that can be used "
            "to send mail to all benefactors",
            "addresses": _get_members_email_addresses(
                Member.all_with_membership(Membership.BENEFACTOR)
            ),
            "moderated": True,
        },
        {
            "name": "honorary",
            "aliases": ["ereleden"],
            "description": "Automatic moderated mailinglist that can be used "
            "to send mail to all honorary members",
            "addresses": _get_members_email_addresses(
                Member.all_with_membership(Membership.HONORARY)
            ),
            "moderated": True,
        },
        {
            "name": "oldmembers",
            "description": "Automatic moderated mailinglist that can be used "
            "to send mail to all former members, including honorary members. "
            "Current members and benefactors are filtered out.",
            "addresses": _get_members_email_addresses(oldmembers),
            "moderated": True,
        },
        {
            "name": "all",
            "aliases": ["allen"],
            "description": "Automatic moderated mailinglist that can be used "
            "to send mail to all members, benefactors, honorary members",
            "addresses": _get_members_email_addresses(
                Member.all_with_membership(Membership.MEMBER)
                + Member.all_with_membership(Membership.BENEFACTOR)
                + Member.all_with_membership(Membership.HONORARY)
            ),
            "moderated": True,
        },
        {
            "name": "mentors",
            "description": "Automatic moderated mailinglist that can be used "
            "to send mail to all orientation mentors. These "
            "members should have a mentorship with the current "
            "calendar year.",
            "addresses": mentors,
            "moderated": True,
        },
        {
            "name": "activemembers",
            "description": "Automatic moderated mailinglist that can be used "
            "to send mail to all active members. These are all "
            "users that are currently a member of a committee.",
            "addresses": active_members,
            "moderated": True,
        },
        {
            "name": "committeechairs",
            "aliases": ["commissievoorzitters"],
            "description": "Automatic mailinglist that can be used to send "
            "mail to all committee chairs",
            "addresses": committee_chairs,
            "moderated": False,
        },
        {
            "name": "societychairs",
            "aliases": ["gezelschapvoorzitters"],
            "description": "Automatic mailinglist that can be used to send "
            "mail to all society chairs",
            "addresses": society_chair_emails,
            "moderated": False,
        },
        {
            "name": "optin",
            "description": "Automatic mailinglist that can be used to send "
            "mail to all members that have opted-in to receive "
            "these (mostly recruitment) emails.",
            "addresses": _get_members_email_addresses(
                Member.current_members.filter(profile__receive_optin=True)
            ),
            "moderated": True,
        },
        {
            "name": "committees",
            "description": "Automatic moderated mailinglist that is a "
            "collection of all committee lists",
            "addresses": [
                c.contact_address
                for c in Committee.objects.all().select_related("contact_mailinglist")
            ],
            "moderated": True,
        },
        {
            "name": "societies",
            "description": "Automatic moderated mailinglist that is a "
            "collection of all society lists",
            "addresses": [
                c.contact_address
                for c in Society.objects.all().select_related("contact_mailinglist")
            ],
            "moderated": True,
        },
        {
            "name": "newsletter",
            "description": "Automatic moderated mailinglist that can be used to send newsletters",
            "addresses": _get_members_email_addresses(
                Member.current_members.all().filter(profile__receive_newsletter=True)
            ),
            "moderated": True,
        },
    ]

    all_previous_board_members = []

    for board in Board.objects.filter(since__year__lte=lectureyear).order_by(
        "since__year"
    ):
        board_members = [
            board.member
            for board in MemberGroupMembership.objects.filter(
                group=board
            ).prefetch_related("member")
        ]
        all_previous_board_members += board_members
        years = str(board.since.year)[-2:] + str(board.until.year)[-2:]
        lists.append(
            {
                "name": f"board{years}",
                "aliases": [f"bestuur{years}"],
                "description": "Automatic mailinglist to send email to all board "
                f"members of {board.since.year}-{board.until.year}",
                "addresses": _get_members_email_addresses(board_members),
                "moderated": False,
            }
        )

    lists.append(
        {
            "name": "oldboards",
            "aliases": ["oudbesturen"],
            "description": "Automatic mailinglist to send "
            "email to all previous board members",
            "moderated": True,
            "addresses": _get_members_email_addresses(all_previous_board_members),
        }
    )

    return lists


def _get_members_email_addresses(members):
    return_list = []
    for member in members:
        for email in get_member_email_addresses(member):
            if email:
                return_list.append(email)
    return list(set(return_list))


def get_member_email_addresses(member):
    if member.is_staff and member.profile.email_gsuite_only:
        return [
            f"{member.username}@{settings.GSUITE_MEMBERS_DOMAIN}",
        ]
    if member.is_staff:
        return [
            member.email,
            f"{member.username}@{settings.GSUITE_MEMBERS_DOMAIN}",
        ]
    return [member.email]