1
|
|
|
""" |
2
|
|
|
byceps.blueprints.api.user_badge.views |
3
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
4
|
|
|
|
5
|
|
|
:Copyright: 2006-2019 Jochen Kupperschmidt |
6
|
|
|
:License: Modified BSD, see LICENSE for details. |
7
|
|
|
""" |
8
|
|
|
|
9
|
|
|
from flask import abort, request |
10
|
|
|
|
11
|
|
|
from ....services.user import service as user_service |
12
|
|
|
from ....services.user_badge import ( |
13
|
|
|
command_service as badge_command_service, |
14
|
|
|
service as badge_service, |
15
|
|
|
) |
16
|
|
|
from ....util.framework.blueprint import create_blueprint |
17
|
|
|
from ....util.views import respond_no_content |
18
|
|
|
|
19
|
|
|
from ..decorators import api_token_required |
20
|
|
|
|
21
|
|
|
from ...user_badge import signals |
22
|
|
|
|
23
|
|
|
from .schemas import AwardBadgeToUserRequest |
24
|
|
|
|
25
|
|
|
|
26
|
|
|
blueprint = create_blueprint('api_user_badge', __name__) |
27
|
|
|
|
28
|
|
|
|
29
|
|
|
@blueprint.route('/awardings', methods=['POST']) |
30
|
|
|
@api_token_required |
31
|
|
|
@respond_no_content |
32
|
|
|
def award_badge_to_user(): |
33
|
|
|
"""Award the badge to a user.""" |
34
|
|
|
if not request.is_json: |
35
|
|
|
abort(415) |
36
|
|
|
|
37
|
|
|
schema = AwardBadgeToUserRequest() |
38
|
|
|
try: |
39
|
|
|
req = schema.load(request.get_json()) |
40
|
|
|
except ValidationError as e: |
|
|
|
|
41
|
|
|
abort(400, str(e.normalized_messages())) |
42
|
|
|
|
43
|
|
|
badge = badge_service.find_badge_by_slug(req['badge_slug']) |
44
|
|
|
if not badge: |
45
|
|
|
abort(400, 'Badge slug unknown') |
46
|
|
|
|
47
|
|
|
user = user_service.find_user(req['user_id']) |
48
|
|
|
if not user: |
49
|
|
|
abort(400, 'User ID unknown') |
50
|
|
|
|
51
|
|
|
initiator = user_service.find_user(req['initiator_id']) |
52
|
|
|
if not initiator: |
53
|
|
|
abort(400, 'Initiator ID unknown') |
54
|
|
|
|
55
|
|
|
_, event = badge_command_service.award_badge_to_user( |
56
|
|
|
badge.id, user.id, initiator_id=initiator.id |
57
|
|
|
) |
58
|
|
|
|
59
|
|
|
signals.user_badge_awarded.send(None, event=event) |
60
|
|
|
|