Projet

Général

Profil

0003-cards-create-use-translated-digests-71590.patch

Frédéric Péters, 26 décembre 2022 16:18

Télécharger (4,98 ko)

Voir les différences:

Subject: [PATCH 3/6] cards: create/use translated digests (#71590)

 tests/test_i18n.py | 42 +++++++++++++++++++++++++++++++++++++++++-
 wcs/carddef.py     |  5 +++++
 wcs/formdata.py    | 14 ++++++++++++++
 wcs/publisher.py   |  3 +++
 4 files changed, 63 insertions(+), 1 deletion(-)
tests/test_i18n.py
2 2

  
3 3
import pytest
4 4

  
5
from wcs import sql
5
from wcs import fields, sql
6
from wcs.carddef import CardDef
6 7
from wcs.i18n import TranslatableMessage
7 8
from wcs.qommon.template import Template
8 9

  
......
115 116
        msg.store()
116 117
        del pub._i18n_catalog['fr']
117 118
        assert tmpl3.render() == 'alt chaine 1'
119

  
120

  
121
def test_translated_digest(pub):
122
    pub.cfg['language'] = {'language': 'en', 'multilinguism': True, 'languages': ['fr', 'en']}
123
    pub.write_cfg()
124
    TranslatableMessage.do_table()
125
    TranslatableMessage.wipe()
126

  
127
    CardDef.wipe()
128
    carddef = CardDef()
129
    carddef.name = 'foo'
130
    carddef.fields = [
131
        fields.StringField(id='1', label='Test', type='string', varname='foo'),
132
    ]
133
    carddef.digest_templates = {'default': '{{ form_var_foo|translate }}'}
134
    carddef.store()
135
    carddef.data_class().wipe()
136

  
137
    carddata = carddef.data_class()()
138
    carddata.data = {'1': 'hello world'}
139
    carddata.just_created()
140
    carddata.store()
141
    assert carddata.digests == {
142
        'default': 'hello world',
143
        'default:fr': 'hello world',
144
        'default:en': 'hello world',
145
    }
146

  
147
    msg = TranslatableMessage.select([sql.Equal('string', 'hello world')])[0]
148
    msg.string_fr = 'bonjour monde'
149
    msg.store()
150
    del pub._i18n_catalog['fr']
151

  
152
    carddata.store()
153
    assert carddata.digests == {
154
        'default': 'hello world',
155
        'default:fr': 'bonjour monde',
156
        'default:en': 'hello world',
157
    }
wcs/carddef.py
227 227
            if view_digest_key in (carddef.digest_templates or {}):
228 228
                digest_key = view_digest_key
229 229

  
230
        if get_publisher() and not get_publisher().is_using_default_language():
231
            digest_template = carddef.digest_templates.get(digest_key)
232
            if '|translate' in digest_template:
233
                digest_key += ':%s' % get_publisher().current_language
234

  
230 235
        if query:
231 236
            criterias.append(ElementILike('digests', digest_key, query))
232 237
        if get_by_id:
wcs/formdata.py
561 561
            context = self.get_substitution_variables()
562 562
            context['formdef_id'] = self.formdef.id
563 563
            digests = self.digests or {}
564
            i18n_enabled = bool(get_publisher() and get_publisher().has_i18n_enabled())
564 565
            for attribute, template in fields.items():
565 566
                if template is None:
566 567
                    new_value = None
......
585 586
                    key = attribute[9:]
586 587
                    if new_value != (self.digests or {}).get(key):
587 588
                        digests[key] = new_value
589

  
590
                    if i18n_enabled and '|translate' in template and new_value != 'ERROR':
591
                        # generate additional digests if there are translatable parts
592
                        for language in get_publisher().get_enabled_languages():
593
                            key = attribute[9:] + ':%s' % language
594
                            with get_publisher().with_language(language):
595
                                try:
596
                                    new_value = Template(template, autoescape=False).render(context)
597
                                except Exception:
598
                                    continue
599
                            if new_value != (self.digests or {}).get(key):
600
                                digests[key] = new_value
601

  
588 602
                else:
589 603
                    if new_value != getattr(self, attribute, None):
590 604
                        setattr(self, attribute, new_value)
wcs/publisher.py
187 187
        self.session_manager_class = sessions.StorageSessionManager
188 188
        self.set_session_manager(self.session_manager_class(session_class=self.session_class))
189 189

  
190
    def get_enabled_languages(self):
191
        return self.cfg.get('language', {}).get('languages') or []
192

  
190 193
    def import_zip(self, fd):
191 194
        results = {
192 195
            'formdefs': 0,
193
-