Projet

Général

Profil

0002-misc-make-digests-update-after-job-work-with-multipl.patch

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

Télécharger (6,88 ko)

Voir les différences:

Subject: [PATCH 2/6] misc: make digests update after job work with multiple
 formdefs (#71590)

 tests/admin_pages/test_card.py |  5 ++++-
 wcs/admin/forms.py             | 23 ++++++++---------------
 wcs/backoffice/management.py   |  5 ++---
 wcs/formdef.py                 | 14 ++++++++++++++
 wcs/publisher.py               |  6 +++++-
 5 files changed, 33 insertions(+), 20 deletions(-)
tests/admin_pages/test_card.py
291 291
    carddef = CardDef()
292 292
    carddef.name = 'foo'
293 293
    carddef.fields = [
294
        fields.StringField(id='1', label='Test', type='string', varname='foo'),
294
        fields.StringField(id='1', label='Test', type='string', varname='test'),
295 295
    ]
296 296
    carddef.store()
297 297
    carddata = carddef.data_class()()
......
314 314
    assert carddef.lateral_template is None
315 315
    assert carddef.submission_lateral_template is None
316 316
    assert 'Existing cards will be updated in the background.' in resp.text
317
    # after jobs are run synchronously in tests
318
    carddata.refresh_from_storage()
319
    assert carddata.digests == {'default': 'XbarY'}
317 320

  
318 321
    resp = app.get('/backoffice/cards/1/options/templates')
319 322
    resp.form['lateral_template'] = 'X{{form_var_test}}Y'
wcs/admin/forms.py
26 26
from wcs.backoffice.snapshots import SnapshotsDirectory
27 27
from wcs.carddef import CardDef
28 28
from wcs.categories import Category
29
from wcs.formdef import DRAFTS_DEFAULT_LIFESPAN, FormDef, FormdefImportError, FormdefImportRecoverableError
29
from wcs.formdef import (
30
    DRAFTS_DEFAULT_LIFESPAN,
31
    FormDef,
32
    FormdefImportError,
33
    FormdefImportRecoverableError,
34
    UpdateDigestAfterJob,
35
)
30 36
from wcs.forms.root import qrcode
31 37
from wcs.qommon import _, force_str, misc, pgettext_lazy, template
32
from wcs.qommon.afterjobs import AfterJob
33 38
from wcs.qommon.backoffice.menu import html_top
34 39
from wcs.qommon.errors import AccessForbiddenError, TraversalError
35 40
from wcs.qommon.form import (
......
451 456
        )
452 457
        result = self.handle(form, _('Templates'))
453 458
        if self.changed and self.formdef.data_class().count():
454
            get_response().add_after_job(UpdateDigestAfterJob(formdef=self.formdef))
459
            get_response().add_after_job(UpdateDigestAfterJob(formdefs=[self.formdef]))
455 460
            if isinstance(self.formdef, CardDef):
456 461
                get_session().message = ('info', _('Existing cards will be updated in the background.'))
457 462
            else:
......
1895 1900
        formdef.disabled = True
1896 1901
        formdef.store()
1897 1902
        return redirect('%s/' % formdef.id)
1898

  
1899

  
1900
class UpdateDigestAfterJob(AfterJob):
1901
    label = _('Updating digests')
1902

  
1903
    def __init__(self, formdef):
1904
        super().__init__(formdef_class=formdef.__class__, formdef_id=formdef.id)
1905

  
1906
    def execute(self):
1907
        formdef = self.kwargs['formdef_class'].get(self.kwargs['formdef_id'])
1908
        for formdata in formdef.data_class().select(order_by='id'):
1909
            formdata.store()
wcs/backoffice/management.py
32 32
from quixote.html import TemplateIO, htmlescape, htmltext
33 33
from quixote.http_request import parse_query
34 34

  
35
from wcs.admin.forms import UpdateDigestAfterJob
36 35
from wcs.api_access import ApiAccess
37 36
from wcs.api_utils import get_query_flag, get_user_from_api_query_string
38 37
from wcs.carddef import CardDef
39 38
from wcs.categories import Category
40 39
from wcs.conditions import Condition
41 40
from wcs.formdata import FormData
42
from wcs.formdef import FormDef
41
from wcs.formdef import FormDef, UpdateDigestAfterJob
43 42
from wcs.forms.backoffice import FormDefUI
44 43
from wcs.forms.common import FormdefDirectoryBase, FormStatusPage
45 44
from wcs.roles import logged_users_role
......
1575 1574
                ] = form.get_widget('digest_template').parse()
1576 1575
                self.formdef.store()
1577 1576
                if self.formdef.data_class().count():
1578
                    get_response().add_after_job(UpdateDigestAfterJob(formdef=self.formdef))
1577
                    get_response().add_after_job(UpdateDigestAfterJob(formdefs=[self.formdef]))
1579 1578

  
1580 1579
        if custom_view.is_default and custom_view.visibility != 'datasource':
1581 1580
            # need to clean other views to have only one default per owner/any visibility
wcs/formdef.py
40 40
from .formdata import FormData
41 41
from .qommon import PICKLE_KWARGS, _, force_str, get_cfg, pgettext_lazy
42 42
from .qommon.admin.emails import EmailsDirectory
43
from .qommon.afterjobs import AfterJob
43 44
from .qommon.cron import CronJob
44 45
from .qommon.form import Form, HtmlWidget, UploadedFile
45 46
from .qommon.misc import JSONEncoder, get_as_datetime, is_attachment, is_upload, simplify, xml_node_text
......
2169 2170
    get_publisher_class().register_cronjob(
2170 2171
        CronJob(clean_unused_files, name='clean_unused_files', hours=[2], minutes=[0])
2171 2172
    )
2173

  
2174

  
2175
class UpdateDigestAfterJob(AfterJob):
2176
    label = _('Updating digests')
2177

  
2178
    def __init__(self, formdefs):
2179
        super().__init__(formdefs=[(x.__class__, x.id) for x in formdefs])
2180

  
2181
    def execute(self):
2182
        for formdef_class, formdef_id in self.kwargs['formdefs']:
2183
            formdef = formdef_class.get(formdef_id)
2184
            for formdata in formdef.data_class().select(order_by='id'):
2185
                formdata.store()
wcs/publisher.py
68 68
        module = module_moves.get((module, name), module)
69 69
        __import__(module)
70 70
        mod = sys.modules[module]
71
        if module == 'wcs.formdef' and name != 'FormDef' and not name.startswith('_wcs_'):
71
        if (
72
            module == 'wcs.formdef'
73
            and name not in ('FormDef', 'UpdateDigestAfterJob')
74
            and not name.startswith('_wcs_')
75
        ):
72 76
            name = '_wcs_%s' % name
73 77
        elif module == 'wcs.carddef' and name != 'CardDef' and not name.startswith('_wcs_'):
74 78
            name = '_wcs_%s' % name
75
-