Skip to content

Commit

Permalink
Implement admin UI functionality to initialize a user account
Browse files Browse the repository at this point in the history
  • Loading branch information
homeworkprod committed Sep 23, 2019
1 parent 4018590 commit 584f3d4
Show file tree
Hide file tree
Showing 7 changed files with 125 additions and 0 deletions.
1 change: 1 addition & 0 deletions byceps/blueprints/admin/user/service.py
Expand Up @@ -233,6 +233,7 @@ def _get_additional_data(event: UserEvent, users_by_id: Dict[str, User]
'user-disabled',
'user-email-address-changed',
'user-enabled',
'user-initialized',
'user-screen-name-changed',
'user-suspended',
'user-unsuspended',
Expand Down
Expand Up @@ -10,6 +10,10 @@
{%- endif %}
{%- if g.current_user.has_permission(UserPermission.administrate) %}

{%- if not user.initialized %}
<li><a data-action="user-initialize" href="{{ url_for('.initialize_account', user_id=user.id) }}">{{ render_icon('enabled') }} Initialisieren</a></li>
{%- endif %}

{%- if not user.enabled %}
<li><a data-action="user-enable" href="{{ url_for('.set_enabled_flag', user_id=user.id) }}">{{ render_icon('enabled') }} Aktivieren</a></li>
{%- else %}
Expand Down
Expand Up @@ -132,6 +132,7 @@ <h2>Abzeichen {{ render_extra_in_heading(badges_with_awarding_quantity|length) }
enableCopyToClipboard('user-id-copy-trigger');

onDomReady(function() {
confirmed_post_on_click_then_reload('[data-action="user-initialize"]', 'Benutzerkonto initialisieren?');
confirmed_post_on_click_then_reload('[data-action="user-enable"]', 'Benutzerkonto aktivieren?');
confirmed_delete_on_click_then_reload('[data-action="user-disable"]', 'Benutzerkonto deaktivieren?');
});
Expand Down
Expand Up @@ -37,6 +37,12 @@ <h2>Ereignisse</h2>
{%- endif %}
hat das Benutzerkonto <strong>angelegt</strong>.
{%- endset %}
{%- elif event.event == 'user-initialized' %}
{%- set icon_name = 'enabled' %}
{%- set body %}
<span class="user-link">{{ render_user_avatar_20_and_link(event.initiator) }}</span>
hat das Benutzerkonto <strong>initialisiert</strong>.
{%- endset %}
{%- elif event.event == 'user-enabled' %}
{%- set icon_name = 'enabled' %}
{%- set body %}
Expand Down
14 changes: 14 additions & 0 deletions byceps/blueprints/admin/user/views.py
Expand Up @@ -205,6 +205,20 @@ def set_password(user_id):
return redirect(url_for('.view', user_id=user.id))


@blueprint.route('/<uuid:user_id>/initialize', methods=['POST'])
@permission_required(UserPermission.administrate)
@respond_no_content
def initialize_account(user_id):
"""Initialize the user account."""
user = _get_user_or_404(user_id)

initiator_id = g.current_user.id

user_command_service.initialize_account(user.id, initiator_id)

flash_success("Das Benutzerkonto '{}' wurde initialisiert.", user.screen_name)


@blueprint.route('/<uuid:user_id>/flags/enabled', methods=['POST'])
@permission_required(UserPermission.administrate)
@respond_no_content
Expand Down
20 changes: 20 additions & 0 deletions byceps/services/user/command_service.py
Expand Up @@ -19,6 +19,26 @@
from .models.user import User as DbUser


def initialize_account(user_id: UserID, initiator_id: UserID) -> None:
"""Initialize the user account.
This is meant to happen only once at most, and can not be undone.
"""
user = _get_user(user_id)

if user.initialized:
raise ValueError(f'Account is already initialized.')

user.initialized = True

event = event_service.build_event('user-initialized', user.id, {
'initiator_id': str(initiator_id),
})
db.session.add(event)

db.session.commit()


def enable_user(user_id: UserID, initiator_id: UserID) -> None:
"""Enable the user account."""
user = _get_user(user_id)
Expand Down
79 changes: 79 additions & 0 deletions tests/services/user/test_initialize.py
@@ -0,0 +1,79 @@
"""
:Copyright: 2006-2019 Jochen Kupperschmidt
:License: Modified BSD, see LICENSE for details.
"""

import pytest
from pytest import raises

from byceps.services.user import command_service as user_command_service
from byceps.services.user import event_service

from tests.helpers import create_user

from ...conftest import database_recreated


@pytest.fixture(scope='module')
def app(admin_app, db):
with admin_app.app_context():
with database_recreated(db):
_app = admin_app

admin = create_user('Administrator')
_app.admin_id = admin.id

yield _app


def test_initialize_account(app):
admin_id = app.admin_id
user_id = create_user('CreatedAtPartyCheckIn', initialized=False).id

user_before = user_command_service._get_user(user_id)
assert not user_before.initialized

events_before = event_service.get_events_for_user(user_before.id)
assert len(events_before) == 0

# -------------------------------- #

user_command_service.initialize_account(user_id, admin_id)

# -------------------------------- #

user_after = user_command_service._get_user(user_id)
assert user_after.initialized

events_after = event_service.get_events_for_user(user_after.id)
assert len(events_after) == 1

user_enabled_event = events_after[0]
assert user_enabled_event.event_type == 'user-initialized'
assert user_enabled_event.data == {
'initiator_id': str(admin_id),
}


def test_initialize_already_initialized_account(app):
admin_id = app.admin_id
user_id = create_user('AlreadyInitialized').id

user_before = user_command_service._get_user(user_id)
assert user_before.initialized

events_before = event_service.get_events_for_user(user_before.id)
assert len(events_before) == 0

# -------------------------------- #

with raises(ValueError):
user_command_service.initialize_account(user_id, admin_id)

# -------------------------------- #

user_after = user_command_service._get_user(user_id)
assert user_after.initialized # still initialized

events_after = event_service.get_events_for_user(user_after.id)
assert len(events_after) == 0 # no additional user events

0 comments on commit 584f3d4

Please sign in to comment.