Skip to content

Commit

Permalink
Do not use flask.cli.with_appcontext decorator in scripts
Browse files Browse the repository at this point in the history
Doesn't work, unfortunately. Application context is not made available
in argument validation callback functions.

This reverts commit d1fdf6d.
  • Loading branch information
homeworkprod committed Mar 10, 2022
1 parent 4ebf285 commit 2312e0a
Show file tree
Hide file tree
Showing 13 changed files with 60 additions and 36 deletions.
30 changes: 30 additions & 0 deletions scripts/_util.py
@@ -0,0 +1,30 @@
"""
byceps.scripts.util
~~~~~~~~~~~~~~~~~~~
Utilities for scripts
:Copyright: 2006-2022 Jochen Kupperschmidt
:License: Revised BSD (see `LICENSE` file for details)
"""

from contextlib import contextmanager
from typing import Callable

from byceps.application import create_app


@contextmanager
def app_context():
"""Provide a context in which the application is available with the
specified configuration.
"""
app = create_app()
with app.app_context():
yield app


def call_with_app_context(func: Callable) -> None:
"""Call a callable inside of an application context."""
with app_context():
func()
5 changes: 2 additions & 3 deletions scripts/add_archived_attendance.py
Expand Up @@ -7,18 +7,17 @@
"""

import click
from flask.cli import with_appcontext

from byceps.services.ticketing import attendance_service
from byceps.services.user import service as user_service

from _util import call_with_app_context
from _validators import validate_party, validate_user_id


@click.command()
@click.argument('user', callback=validate_user_id)
@click.argument('party', callback=validate_party)
@with_appcontext
def execute(user, party) -> None:
click.echo(
f'Adding attendance of user "{user.screen_name}" '
Expand All @@ -32,4 +31,4 @@ def execute(user, party) -> None:


if __name__ == '__main__':
execute()
call_with_app_context(execute)
6 changes: 3 additions & 3 deletions scripts/announce_orga_birthdays.py
Expand Up @@ -11,13 +11,14 @@
from uuid import UUID

import click
from flask.cli import with_appcontext

from byceps.announce.helpers import call_webhook
from byceps.services.orga import birthday_service
from byceps.services.webhooks import service as webhook_service
from byceps.services.webhooks.transfer.models import OutgoingWebhook, WebhookID

from _util import call_with_app_context


def validate_webhook_id(ctx, param, webhook_id_value: str) -> OutgoingWebhook:
try:
Expand All @@ -37,7 +38,6 @@ def validate_webhook_id(ctx, param, webhook_id_value: str) -> OutgoingWebhook:

@click.command()
@click.argument('webhook', callback=validate_webhook_id)
@with_appcontext
def execute(webhook: OutgoingWebhook) -> None:
users = birthday_service.get_orgas_with_birthday_today()

Expand All @@ -49,4 +49,4 @@ def execute(webhook: OutgoingWebhook) -> None:


if __name__ == '__main__':
execute()
call_with_app_context(execute)
6 changes: 3 additions & 3 deletions scripts/clean_up_after_deleted_users.py
Expand Up @@ -10,7 +10,6 @@
from typing import Callable

import click
from flask.cli import with_appcontext

from byceps.database import db
from byceps.services.authentication.password.dbmodels import Credential
Expand Down Expand Up @@ -41,6 +40,8 @@
)
from byceps.typing import UserID

from _util import call_with_app_context


@click.command()
@click.option(
Expand All @@ -49,7 +50,6 @@
help='determine but do not delete affected records',
)
@click.argument('user_ids', nargs=-1, required=True)
@with_appcontext
def execute(dry_run, user_ids) -> None:
user_ids = set(user_ids)

Expand Down Expand Up @@ -172,4 +172,4 @@ def _execute_delete_for_users_query(model, user_ids: set[UserID]) -> int:


if __name__ == '__main__':
execute()
call_with_app_context(execute)
5 changes: 2 additions & 3 deletions scripts/copy_snippets.py
Expand Up @@ -7,12 +7,12 @@
"""

import click
from flask.cli import with_appcontext

from byceps.services.snippet.dbmodels.snippet import SnippetVersion
from byceps.services.snippet import service as snippet_service
from byceps.services.snippet.transfer.models import Scope, SnippetType

from _util import call_with_app_context
from _validators import validate_site


Expand All @@ -21,7 +21,6 @@
@click.argument('source_site', callback=validate_site)
@click.argument('target_site', callback=validate_site)
@click.argument('snippet_names', nargs=-1, required=True)
@with_appcontext
def execute(ctx, source_site, target_site, snippet_names) -> None:
source_scope = Scope.for_site(source_site.id)
target_scope = Scope.for_site(target_site.id)
Expand Down Expand Up @@ -101,4 +100,4 @@ def scope_as_string(scope: Scope) -> str:


if __name__ == '__main__':
execute()
call_with_app_context(execute)
6 changes: 3 additions & 3 deletions scripts/delete_old_user_login_log_entries.py
Expand Up @@ -9,14 +9,14 @@
from datetime import datetime, timedelta

import click
from flask.cli import with_appcontext

from byceps.services.user import log_service as user_log_service

from _util import call_with_app_context


@click.command()
@click.argument('minimum_age_in_days', type=int)
@with_appcontext
def execute(minimum_age_in_days) -> None:
now = datetime.utcnow()
occurred_before = now - timedelta(days=minimum_age_in_days)
Expand All @@ -35,4 +35,4 @@ def execute(minimum_age_in_days) -> None:


if __name__ == '__main__':
execute()
call_with_app_context(execute)
5 changes: 2 additions & 3 deletions scripts/export_ticket_user_email_addresses.py
Expand Up @@ -9,18 +9,17 @@
from typing import Iterator

import click
from flask.cli import with_appcontext

from byceps.services.ticketing import ticket_service
from byceps.services.user import service as user_service
from byceps.typing import PartyID

from _util import call_with_app_context
from _validators import validate_party


@click.command()
@click.argument('party', callback=validate_party)
@with_appcontext
def execute(party) -> None:
email_addresses = list(_get_email_addresses(party.id))

Expand All @@ -41,4 +40,4 @@ def _get_email_addresses(party_id: PartyID) -> Iterator[str]:


if __name__ == '__main__':
execute()
call_with_app_context(execute)
6 changes: 3 additions & 3 deletions scripts/find_logins_for_ipaddress.py
Expand Up @@ -10,7 +10,6 @@
from datetime import datetime

import click
from flask.cli import with_appcontext
from sqlalchemy import select

from byceps.database import db
Expand All @@ -19,10 +18,11 @@
from byceps.services.user.transfer.models import User
from byceps.typing import PartyID, UserID

from _util import call_with_app_context


@click.command()
@click.argument('ip_address')
@with_appcontext
def execute(ip_address: str) -> None:
occurred_at_and_user_ids = find_log_entries(ip_address)

Expand Down Expand Up @@ -57,4 +57,4 @@ def get_users_by_id(


if __name__ == '__main__':
execute()
call_with_app_context(execute)
5 changes: 2 additions & 3 deletions scripts/generate_sql_to_delete_user.py
Expand Up @@ -15,11 +15,11 @@
from typing import Iterable, Iterator

import click
from flask.cli import with_appcontext

from byceps.services.user import service as user_service
from byceps.typing import UserID

from _util import call_with_app_context
from _validators import validate_user_id_format


Expand All @@ -33,7 +33,6 @@ def _validate() -> Iterator[UserID]:

@click.command()
@click.argument('user_ids', callback=validate_user_ids, nargs=-1, required=True)
@with_appcontext
def execute(user_ids) -> None:
statements = generate_delete_statements_for_users(user_ids)
for statement in statements:
Expand Down Expand Up @@ -72,4 +71,4 @@ def generate_delete_statements_for_user(user_id: UserID) -> Iterator[str]:


if __name__ == '__main__':
execute()
call_with_app_context(execute)
5 changes: 2 additions & 3 deletions scripts/grant_board_access.py
Expand Up @@ -7,11 +7,11 @@
"""

import click
from flask.cli import with_appcontext

from byceps.services.board import access_control_service, board_service
from byceps.services.board.transfer.models import Board, BoardID

from _util import call_with_app_context
from _validators import validate_user_screen_name


Expand All @@ -29,7 +29,6 @@ def validate_board(ctx, param, board_id_value: str) -> Board:
@click.argument(
'user', metavar='USER_SCREEN_NAME', callback=validate_user_screen_name
)
@with_appcontext
def execute(board, user) -> None:
if access_control_service.has_user_access_to_board(user.id, board.id):
click.secho(
Expand All @@ -49,4 +48,4 @@ def execute(board, user) -> None:


if __name__ == '__main__':
execute()
call_with_app_context(execute)
6 changes: 3 additions & 3 deletions scripts/occupy_seat_group.py
Expand Up @@ -9,7 +9,6 @@
from uuid import UUID

import click
from flask.cli import with_appcontext

from byceps.services.seating.dbmodels.seat_group import SeatGroup as DbSeatGroup
from byceps.services.seating import seat_group_service
Expand All @@ -18,6 +17,8 @@
from byceps.services.ticketing import ticket_bundle_service
from byceps.services.ticketing.transfer.models import TicketBundleID

from _util import call_with_app_context


def validate_seat_group(ctx, param, seat_group_id_value: str) -> DbSeatGroup:
try:
Expand Down Expand Up @@ -58,12 +59,11 @@ def validate_ticket_bundle(
@click.command()
@click.argument('seat_group', callback=validate_seat_group)
@click.argument('ticket_bundle', callback=validate_ticket_bundle)
@with_appcontext
def execute(seat_group, ticket_bundle) -> None:
seat_group_service.occupy_seat_group(seat_group, ticket_bundle)

click.secho('Done.', fg='green')


if __name__ == '__main__':
execute()
call_with_app_context(execute)
6 changes: 3 additions & 3 deletions scripts/remove_user_sessions.py
Expand Up @@ -13,13 +13,13 @@
"""

import click
from flask.cli import with_appcontext

from byceps.services.authentication.session import service as session_service

from _util import call_with_app_context


@click.command()
@with_appcontext
def execute() -> None:
click.secho('Removing all user sessions ... ', nl=False)

Expand All @@ -28,4 +28,4 @@ def execute() -> None:


if __name__ == '__main__':
execute()
call_with_app_context(execute)
5 changes: 2 additions & 3 deletions scripts/search_snippets.py
Expand Up @@ -9,12 +9,12 @@
from typing import Optional

import click
from flask.cli import with_appcontext

from byceps.services.snippet import service as snippet_service
from byceps.services.snippet.transfer.models import Scope
from byceps.services.site.transfer.models import Site

from _util import call_with_app_context
from _validators import validate_site


Expand All @@ -30,7 +30,6 @@ def validate_site_if_given(ctx, param, site_id_value: str) -> Site:
@click.argument('search_term')
@click.option('--site', callback=validate_site_if_given)
@click.option('-v', '--verbose', is_flag=True)
@with_appcontext
def execute(ctx, search_term, site, verbose) -> None:
scope = None
if site is not None:
Expand Down Expand Up @@ -76,4 +75,4 @@ def format_scope(scope: Scope) -> str:


if __name__ == '__main__':
execute()
call_with_app_context(execute)

0 comments on commit 2312e0a

Please sign in to comment.