Projet

Général

Profil

0001-general-add-a-new-language-attribute-kind-71033.patch

Frédéric Péters, 06 novembre 2022 10:41

Télécharger (4,36 ko)

Voir les différences:

Subject: [PATCH] general: add a new "language" attribute kind (#71033)

 src/authentic2/attribute_kinds.py | 27 +++++++++++++++++++++++++++
 src/authentic2/forms/profile.py   |  7 +++++++
 tests/test_profile.py             |  8 ++++++++
 3 files changed, 42 insertions(+)
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
-