0002-misc-make-digests-update-after-job-work-with-multipl.patch
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 |
- |