byceps/byceps

View on GitHub
byceps/blueprints/site/newsletter/views.py

Summary

Maintainability
A
0 mins
Test Coverage
F
45%
"""
byceps.blueprints.site.newsletter.views
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

:Copyright: 2014-2024 Jochen Kupperschmidt
:License: Revised BSD (see `LICENSE` file for details)
"""

from datetime import datetime

from flask import abort, g
from flask_babel import gettext

from byceps.services.newsletter import (
    newsletter_command_service,
    newsletter_service,
)
from byceps.signals import newsletter as newsletter_signals
from byceps.util.framework.blueprint import create_blueprint
from byceps.util.framework.flash import flash_error, flash_success
from byceps.util.views import login_required, respond_no_content


blueprint = create_blueprint('newsletter', __name__)


@blueprint.post('/lists/<list_id>/subscription')
@login_required
@respond_no_content
def subscribe(list_id):
    list_ = _get_list_or_404(list_id)
    expressed_at = datetime.utcnow()

    result = newsletter_command_service.subscribe(g.user, list_, expressed_at)

    if result.is_err():
        flash_error(result.unwrap_err())
        return

    _, event = result.unwrap()

    flash_success(
        gettext(
            'You have subscribed to newsletter "%(title)s".',
            title=list_.title,
        )
    )

    newsletter_signals.newsletter_subscribed.send(None, event=event)


@blueprint.delete('/lists/<list_id>/subscription')
@login_required
@respond_no_content
def unsubscribe(list_id):
    list_ = _get_list_or_404(list_id)
    expressed_at = datetime.utcnow()

    result = newsletter_command_service.unsubscribe(g.user, list_, expressed_at)

    if result.is_err():
        flash_error(result.unwrap_err())
        return

    _, event = result.unwrap()

    flash_success(
        gettext(
            'You have unsubscribed from newsletter "%(title)s".',
            title=list_.title,
        )
    )

    newsletter_signals.newsletter_unsubscribed.send(None, event=event)


def _get_list_or_404(list_id):
    list_ = newsletter_service.find_list(list_id)

    if list_ is None:
        abort(404)

    return list_