Passed
Push — main ( 2e04c3...4e4ece )
by Jochen
05:30
created

update_locale()   A

Complexity

Conditions 1

Size

Total Lines 11
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1.1865

Importance

Changes 0
Metric Value
cc 1
eloc 8
nop 0
dl 0
loc 11
ccs 3
cts 7
cp 0.4286
crap 1.1865
rs 10
c 0
b 0
f 0
1
"""
2
byceps.blueprints.site.user.settings.views
3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
5
:Copyright: 2006-2021 Jochen Kupperschmidt
6
:License: Revised BSD (see `LICENSE` file for details)
7
"""
8
9 1
from typing import Optional
10
11 1
from babel import Locale
12 1
from flask import abort, g, request
13 1
from flask_babel import gettext
14
15 1
from .....services.brand import settings_service as brand_settings_service
16 1
from .....services.country import service as country_service
17 1
from .....services.newsletter import service as newsletter_service
18 1
from .....services.newsletter.transfer.models import ListID as NewsletterListID
19 1
from .....services.user import (
20
    command_service as user_command_service,
21
    email_address_verification_service,
22
    service as user_service,
23
)
24 1
from .....signals import user as user_signals
25 1
from .....util.framework.blueprint import create_blueprint
26 1
from .....util.framework.flash import flash_success
27 1
from .....util.framework.templating import templated
28 1
from .....util.l10n import get_locales
29 1
from .....util.views import login_required, redirect_to, respond_no_content
30
31 1
from .forms import DetailsForm, ChangeEmailAddressForm, ChangeScreenNameForm
32
33
34 1
blueprint = create_blueprint('user_settings', __name__)
35
36
37 1
@blueprint.get('')
38 1
@login_required
39 1
@templated
40
def view():
41
    """Show the current user's internal profile."""
42 1
    user = user_service.find_active_db_user(g.user.id)
43 1
    if user is None:
44
        abort(404)
45
46 1
    user_locale = Locale.parse(user.locale) if user.locale else None
47
48 1
    newsletter_list_id = _find_newsletter_list_for_brand()
49 1
    newsletter_offered = newsletter_list_id is not None
50
51 1
    subscribed_to_newsletter = newsletter_service.is_subscribed(
52
        user.id, newsletter_list_id
53
    )
54
55 1
    return {
56
        'user': user,
57
        'user_locale': user_locale,
58
        'locales': get_locales(),
59
        'newsletter_offered': newsletter_offered,
60
        'newsletter_list_id': newsletter_list_id,
61
        'subscribed_to_newsletter': subscribed_to_newsletter,
62
    }
63
64
65 1
@blueprint.get('/email_address')
66 1
@login_required
67 1
@templated
68 1
def change_email_address_form(erroneous_form=None):
69
    """Show a form to change the current user's email address."""
70
    form = erroneous_form if erroneous_form else ChangeEmailAddressForm()
71
72
    return {
73
        'form': form,
74
    }
75
76
77 1
@login_required
78 1
@blueprint.post('/email_address')
79
def change_email_address():
80
    """Request a change of the current user's email address."""
81
    current_user = g.user
82
83
    form = ChangeEmailAddressForm(request.form)
84
    if not form.validate():
85
        return change_email_address_form(form)
86
87
    new_email_address = form.new_email_address.data.strip()
88
89
    email_address_verification_service.send_email_address_change_email(
90
        new_email_address,
91
        current_user.screen_name,
92
        current_user.id,
93
        g.site_id,
94
    )
95
96
    flash_success(
97
        gettext(
98
            'An email with a verification link has been sent to your new '
99
            'address. The email address of your account will be changed '
100
            'to the new address once you visit the link to verify it.'
101
        )
102
    )
103
104
    return redirect_to('.view')
105
106
107 1
@blueprint.get('/screen_name')
108 1
@login_required
109 1
@templated
110 1
def change_screen_name_form(erroneous_form=None):
111
    """Show a form to change the current user's screen name."""
112
    form = erroneous_form if erroneous_form else ChangeScreenNameForm()
113
114
    return {
115
        'form': form,
116
    }
117
118
119 1
@login_required
120 1
@blueprint.post('/screen_name')
121
def change_screen_name():
122
    """Change the current user's screen name."""
123
    current_user = g.user
124
125
    form = ChangeScreenNameForm(request.form)
126
    if not form.validate():
127
        return change_screen_name_form(form)
128
129
    old_screen_name = current_user.screen_name
130
    new_screen_name = form.screen_name.data.strip()
131
    initiator_id = current_user.id
132
133
    event = user_command_service.change_screen_name(
134
        current_user.id, new_screen_name, initiator_id
135
    )
136
137
    user_signals.screen_name_changed.send(None, event=event)
138
139
    flash_success(
140
        gettext(
141
            'Your username has been changed to "%(new_screen_name)s".',
142
            new_screen_name=new_screen_name,
143
        )
144
    )
145
146
    return redirect_to('.view')
147
148
149 1
@blueprint.post('/locale')
150 1
@login_required
151 1
@respond_no_content
152
def update_locale():
153
    """Update the current user's locale."""
154
    locale_str = request.args.get('locale')
155
    locale = Locale.parse(locale_str)
156
157
    user_command_service.update_locale(g.user.id, locale)
158
159
    flash_success(gettext('Your language preference has been updated.'))
160
161
162 1
@blueprint.get('/details')
163 1
@login_required
164 1
@templated
165 1
def details_update_form(erroneous_form=None):
166
    """Show a form to update the current user's details."""
167
    user = user_service.find_user_with_details(g.user.id)
168
169
    form = erroneous_form if erroneous_form else DetailsForm(obj=user.detail)
170
    country_names = country_service.get_country_names()
171
172
    return {
173
        'form': form,
174
        'country_names': country_names,
175
    }
176
177
178 1
@blueprint.post('/details')
179 1
@login_required
180
def details_update():
181
    """Update the current user's details."""
182
    current_user = g.user
183
184
    form = DetailsForm(request.form)
185
186
    if not form.validate():
187
        return details_update_form(form)
188
189
    first_names = form.first_names.data.strip()
190
    last_name = form.last_name.data.strip()
191
    date_of_birth = form.date_of_birth.data
192
    country = form.country.data.strip()
193
    zip_code = form.zip_code.data.strip()
194
    city = form.city.data.strip()
195
    street = form.street.data.strip()
196
    phone_number = form.phone_number.data.strip()
197
198
    event = user_command_service.update_user_details(
199
        current_user.id,
200
        first_names,
201
        last_name,
202
        date_of_birth,
203
        country,
204
        zip_code,
205
        city,
206
        street,
207
        phone_number,
208
        current_user.id,  # initiator_id
209
    )
210
211
    flash_success(gettext('Your data has been saved.'))
212
213
    user_signals.details_updated.send(None, event=event)
214
215
    return redirect_to('.view')
216
217
218 1
def _find_newsletter_list_for_brand() -> Optional[NewsletterListID]:
219
    """Return the newsletter list configured for this brand, or `None`
220
    if none is configured.
221
    """
222 1
    value = brand_settings_service.find_setting_value(
223
        g.brand_id, 'newsletter_list_id'
224
    )
225
226 1
    if not value:
227 1
        return None
228
229
    return NewsletterListID(value)
230