0001-general-add-a-new-language-attribute-kind-71033.patch
src/authentic2/attribute_kinds.py | ||
---|---|---|
33 | 33 |
from django.urls import reverse, reverse_lazy |
34 | 34 |
from django.utils import html |
35 | 35 |
from django.utils.functional import keep_lazy |
36 |
from django.utils.translation import get_supported_language_variant |
|
36 | 37 |
from django.utils.translation import gettext_lazy as _ |
37 | 38 |
from django.utils.translation import pgettext_lazy |
38 | 39 |
from gadjo.templatetags.gadjo import xstatic |
... | ... | |
286 | 287 |
return super().to_internal_value(data) |
287 | 288 | |
288 | 289 | |
290 |
def language_choices(): |
|
291 |
return settings.LANGUAGES |
|
292 | ||
293 | ||
294 |
def language_default(): |
|
295 |
return get_supported_language_variant(settings.LANGUAGE_CODE) |
|
296 | ||
297 | ||
298 |
def language_html_value(attribute, value): |
|
299 |
for key, label in language_choices(): |
|
300 |
if value == key: |
|
301 |
return label |
|
302 |
return '' |
|
303 | ||
304 | ||
289 | 305 |
DEFAULT_ALLOW_BLANK = True |
290 | 306 |
DEFAULT_MAX_LENGTH = 256 |
291 | 307 | |
... | ... | |
371 | 387 |
'attributes_ng_serialize': profile_attributes_ng_serialize, |
372 | 388 |
'csv_importable': False, |
373 | 389 |
}, |
390 |
{ |
|
391 |
'label': _('language'), |
|
392 |
'name': 'language', |
|
393 |
'default': language_default, |
|
394 |
'field_class': forms.ChoiceField, |
|
395 |
'html_value': language_html_value, |
|
396 |
'kwargs': { |
|
397 |
'choices': language_choices, |
|
398 |
'widget': forms.Select, |
|
399 |
}, |
|
400 |
}, |
|
374 | 401 |
] |
375 | 402 | |
376 | 403 |
src/authentic2/forms/profile.py | ||
---|---|---|
68 | 68 |
self.atvs = [] |
69 | 69 |
self.locked_fields = set() |
70 | 70 |
if instance: |
71 |
for attribute in self.attributes: |
|
72 |
kind = attribute.get_kind() |
|
73 |
if kind.get('default'): |
|
74 |
if attribute.name in self.declared_fields: |
|
75 |
initial[attribute.name] = ( |
|
76 |
kind['default']() if callable(kind['default']) else kind['default'] |
|
77 |
) |
|
71 | 78 |
self.atvs = models.AttributeValue.objects.select_related('attribute').with_owner(instance) |
72 | 79 |
for atv in self.atvs: |
73 | 80 |
name = atv.attribute.name |
tests/test_profile.py | ||
---|---|---|
41 | 41 |
agreement = Attribute.objects.create( |
42 | 42 |
name='agreement', label='agreement', kind='boolean', user_visible=True, user_editable=True |
43 | 43 |
) |
44 |
language = Attribute.objects.create( |
|
45 |
name='language', label='language', kind='language', user_visible=True, user_editable=True |
|
46 |
) |
|
44 | 47 | |
45 | 48 |
resp = old_resp = app.get(url, status=200) |
46 | 49 |
resp.form['phone'] = '1234' |
47 | 50 |
assert resp.form['phone'].attrs['type'] == 'tel' |
48 | 51 |
resp.form['title'] = 'Mrs' |
49 | 52 |
resp.form['agreement'] = False |
53 |
assert resp.form['language'].tag == 'select' |
|
54 |
assert resp.form['language'].value == 'en' |
|
55 |
resp.form['language'] = 'fr' |
|
50 | 56 |
resp = resp.form.submit() |
51 | 57 |
# verify that missing next_url in POST is ok |
52 | 58 |
assert resp['Location'].endswith(reverse('account_management')) |
53 | 59 |
assert phone.get_value(simple_user) == '1234' |
54 | 60 |
assert title.get_value(simple_user) == 'Mrs' |
55 | 61 |
assert agreement.get_value(simple_user) is False |
62 |
assert language.get_value(simple_user) == 'fr' |
|
56 | 63 | |
57 | 64 |
resp = resp.follow() |
58 | 65 |
profile = [ |
... | ... | |
65 | 72 |
('Email address', 'user@example.net'), |
66 | 73 |
('Phone', '1234'), |
67 | 74 |
('Title', 'Mrs'), |
75 |
('Language', 'French'), |
|
68 | 76 |
] |
69 | 77 | |
70 | 78 |
resp = app.get(url, status=200) |
71 |
- |