Completed
Push — main ( 39501b...4a0798 )
by Jochen
05:29
created

view()   A

Complexity

Conditions 3

Size

Total Lines 28
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 3.1707

Importance

Changes 0
Metric Value
cc 3
eloc 21
nop 0
dl 0
loc 28
ccs 11
cts 15
cp 0.7332
crap 3.1707
rs 9.376
c 0
b 0
f 0
1
"""
2
byceps.blueprints.common.user.settings.views
3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
5
:Copyright: 2006-2020 Jochen Kupperschmidt
6
:License: Modified BSD, see LICENSE for details.
7
"""
8
9 1
from flask import abort, g, request
10
11 1
from .....config import get_app_mode
12 1
from .....services.country import service as country_service
13 1
from .....services.newsletter import service as newsletter_service
14 1
from .....services.user import command_service as user_command_service
15 1
from .....services.user import service as user_service
16 1
from .....signals import user as user_signals
17 1
from .....util.framework.blueprint import create_blueprint
18 1
from .....util.framework.flash import flash_success
19 1
from .....util.framework.templating import templated
20 1
from .....util.views import redirect_to
21
22 1
from ...authentication.decorators import login_required
23
24 1
from ..creation.views import _find_newsletter_list_for_brand
25
26 1
from .forms import DetailsForm, ChangeScreenNameForm
27
28
29 1
blueprint = create_blueprint('user_settings', __name__)
30
31
32 1
@blueprint.route('')
33 1
@login_required
34 1
@templated
35
def view():
36
    """Show the current user's internal profile."""
37 1
    current_user = g.current_user
38
39 1
    user = user_service.find_active_db_user(current_user.id)
40 1
    if user is None:
41
        abort(404)
42
43 1
    if get_app_mode().is_site():
44 1
        newsletter_list_id = _find_newsletter_list_for_brand()
45 1
        newsletter_offered = newsletter_list_id is not None
46
47 1
        subscribed_to_newsletter = newsletter_service.is_subscribed(
48
            user.id, newsletter_list_id
49
        )
50
    else:
51
        newsletter_list_id = None
52
        newsletter_offered = False
53
        subscribed_to_newsletter = None
54
55 1
    return {
56
        'user': user,
57
        'newsletter_offered': newsletter_offered,
58
        'newsletter_list_id': newsletter_list_id,
59
        'subscribed_to_newsletter': subscribed_to_newsletter,
60
    }
61
62
63 1
@blueprint.route('/screen_name')
64 1
@templated
65 1
def change_screen_name_form(erroneous_form=None):
66
    """Show a form to change the current user's screen name."""
67
    _get_current_user_or_404()
68
69
    form = erroneous_form if erroneous_form else ChangeScreenNameForm()
70
71
    return {
72
        'form': form,
73
    }
74
75
76 1
@blueprint.route('/screen_name', methods=['POST'])
77
def change_screen_name():
78
    """Change the current user's screen name."""
79
    current_user = _get_current_user_or_404()
80
81
    form = ChangeScreenNameForm(request.form)
82
    if not form.validate():
83
        return change_screen_name_form(form)
84
85
    old_screen_name = current_user.screen_name
86
    new_screen_name = form.screen_name.data.strip()
87
    initiator_id = current_user.id
88
89
    event = user_command_service.change_screen_name(
90
        current_user.id, new_screen_name, initiator_id
91
    )
92
93
    user_signals.screen_name_changed.send(None, event=event)
94
95
    flash_success(f'Dein Benutzername wurde zu "{new_screen_name}" geändert.')
96
97
    return redirect_to('.view')
98
99
100 1
@blueprint.route('/details')
101 1
@templated
102 1
def details_update_form(erroneous_form=None):
103
    """Show a form to update the current user's details."""
104
    current_user = _get_current_user_or_404()
105
    user = user_service.find_user_with_details(current_user.id)
106
107
    form = erroneous_form if erroneous_form else DetailsForm(obj=user.detail)
108
    country_names = country_service.get_country_names()
109
110
    return {
111
        'form': form,
112
        'country_names': country_names,
113
    }
114
115
116 1
@blueprint.route('/details', methods=['POST'])
117
def details_update():
118
    """Update the current user's details."""
119
    current_user = _get_current_user_or_404()
120
121
    form = DetailsForm(request.form)
122
123
    if not form.validate():
124
        return details_update_form(form)
125
126
    first_names = form.first_names.data.strip()
127
    last_name = form.last_name.data.strip()
128
    date_of_birth = form.date_of_birth.data
129
    country = form.country.data.strip()
130
    zip_code = form.zip_code.data.strip()
131
    city = form.city.data.strip()
132
    street = form.street.data.strip()
133
    phone_number = form.phone_number.data.strip()
134
135
    event = user_command_service.update_user_details(
136
        current_user.id,
137
        first_names,
138
        last_name,
139
        date_of_birth,
140
        country,
141
        zip_code,
142
        city,
143
        street,
144
        phone_number,
145
        current_user.id,  # initiator_id
146
    )
147
148
    flash_success('Deine Daten wurden gespeichert.')
149
150
    user_signals.details_updated.send(None, event=event)
151
152
    return redirect_to('.view')
153
154
155 1
def _get_current_user_or_404():
156
    user = g.current_user
157
    if not user.is_active:
158
        abort(404)
159
160
    return user
161