Projet

Général

Profil

0004-backoffice-convert-mass-action-execution-to-afterjob.patch

Frédéric Péters, 08 décembre 2020 13:40

Télécharger (7,31 ko)

Voir les différences:

Subject: [PATCH 4/5] backoffice: convert mass action execution to afterjob
 class (#48407)

 wcs/backoffice/management.py | 115 ++++++++++++++++++++---------------
 1 file changed, 67 insertions(+), 48 deletions(-)
wcs/backoffice/management.py
1827 1827
    def listing_top_actions(self):
1828 1828
        return ''
1829 1829

  
1830
    def get_multi_actions(self, user, status_filter):
1831
        global_actions = self.formdef.workflow.get_global_manual_actions()
1830
    @classmethod
1831
    def get_multi_actions(self, formdef, user, status_filter):
1832
        global_actions = formdef.workflow.get_global_manual_actions()
1832 1833

  
1833 1834
        if status_filter not in ('open', 'waiting', 'done', 'all'):
1834 1835
            # when the listing is filtered on a specific status, include
1835 1836
            # manual jumps with identifiers
1836 1837
            try:
1837
                status = self.formdef.workflow.get_status(status_filter)
1838
                status = formdef.workflow.get_status(status_filter)
1838 1839
            except KeyError:
1839 1840
                status = None
1840 1841
            else:
......
1887 1888
        if get_request().get_query():
1888 1889
            qs = '?' + get_request().get_query()
1889 1890

  
1890
        multi_actions = self.get_multi_actions(get_request().user,
1891
                status_filter=selected_filter)
1891
        multi_actions = self.get_multi_actions(
1892
                self.formdef, get_request().user, status_filter=selected_filter)
1892 1893
        multi_form = Form(id='multi-actions')
1893 1894
        for action in multi_actions:
1894 1895
            attrs = {}
......
1947 1948
        return r.getvalue()
1948 1949

  
1949 1950
    def submit_multi(self, action, selected_filter, query, criterias):
1950
        class ActionJob(object):
1951
            def __init__(self, formdef, query_string, action, item_ids):
1952
                self.formdef = formdef
1953
                self.query_string = query_string
1954
                self.action = action
1955
                self.item_ids = item_ids
1956
                self.user = get_request().user
1957

  
1958
            def execute(self, job=None):
1959
                # sort formdatas so we know for sure the processing order
1960
                formdatas = self.formdef.data_class().get_ids(
1961
                        item_ids,
1962
                        order_by='receipt_time')
1963
                job.completion_status = '{}/{}'.format(0, len(formdatas))
1964
                job.store()
1965
                publisher = get_publisher()
1966
                if formdatas:
1967
                    oldest_lazy_form = formdatas[0].get_as_lazy()
1968
                for i, formdata in enumerate(formdatas):
1969
                    publisher.substitutions.reset()
1970
                    publisher.substitutions.feed(publisher)
1971
                    publisher.substitutions.feed(self.user)
1972
                    publisher.substitutions.feed(self.formdef)
1973
                    publisher.substitutions.feed(formdata)
1974
                    publisher.substitutions.feed({
1975
                        'oldest_form': oldest_lazy_form,
1976
                        'mass_action_index': i,
1977
                        'mass_action_length': len(formdatas),
1978
                    })
1979
                    if getattr(self.action['action'], 'status_action', False):
1980
                        # manual jump action
1981
                        from wcs.wf.jump import jump_and_perform
1982
                        jump_and_perform(formdata, self.action['action'].action)
1983
                    else:
1984
                        # global action
1985
                        formdata.perform_global_action(self.action['action'].id, self.user)
1986
                    job.completion_status = '{}/{}'.format(i+1, len(formdatas))
1987
                    job.store()
1988

  
1989 1951
        item_ids = get_request().form['select[]']
1990 1952
        if '_all' in item_ids:
1991 1953
            item_ids = FormDefUI(self.formdef).get_listing_item_ids(
1992 1954
                        selected_filter, user=get_request().user, query=query,
1993 1955
                        criterias=criterias)
1994
        action_job = ActionJob(self.formdef, get_request().get_query(), action, item_ids)
1956

  
1995 1957
        job = get_response().add_after_job(
1996
                _('Executing task "%s" on forms') % action['action'].name,
1997
                action_job.execute)
1998
        job.query_string = get_request().get_query()
1958
                MassActionAfterJob(
1959
                    label=_('Executing task "%s" on forms') % action['action'].name,
1960
                    formdef=self.formdef,
1961
                    user_id=get_request().user.id,
1962
                    status_filter=selected_filter,
1963
                    query_string=get_request().get_query(),
1964
                    action_id=action['action'].id,
1965
                    item_ids=item_ids))
1999 1966
        job.store()
2000 1967
        return redirect('./?job=%s' % job.id)
2001 1968

  
......
3469 3436
            return _('%(minutes)d minute(s) and %(seconds)d seconds') % {
3470 3437
                    'minutes': minutes, 'seconds': seconds}
3471 3438
    return _('%d seconds') % seconds
3439

  
3440

  
3441
class MassActionAfterJob(AfterJob):
3442
    def __init__(self, formdef, **kwargs):
3443
        super().__init__(
3444
            formdef_class=formdef.__class__,
3445
            formdef_id=formdef.id,
3446
            **kwargs)
3447
        self.query_string = kwargs.get('query_string')
3448

  
3449
    def execute(self):
3450
        formdef = self.kwargs['formdef_class'].get(self.kwargs['formdef_id'])
3451
        item_ids = self.kwargs['item_ids']
3452
        action_id = self.kwargs['action_id']
3453
        status_filter = self.kwargs['status_filter']
3454
        user = get_publisher().user_class.get(self.kwargs['user_id'])
3455

  
3456
        multi_actions = FormPage.get_multi_actions(formdef, user, status_filter)
3457
        for action in multi_actions:
3458
            if action['action'].id == action_id:
3459
                break
3460
        else:
3461
            # action not found
3462
            return
3463

  
3464
        formdatas = formdef.data_class().get_ids(item_ids, order_by='receipt_time')
3465
        self.completion_status = '{}/{}'.format(0, len(formdatas))
3466
        self.store()
3467

  
3468
        publisher = get_publisher()
3469
        if formdatas:
3470
            oldest_lazy_form = formdatas[0].get_as_lazy()
3471
        for i, formdata in enumerate(formdatas):
3472
            publisher.substitutions.reset()
3473
            publisher.substitutions.feed(publisher)
3474
            publisher.substitutions.feed(user)
3475
            publisher.substitutions.feed(formdef)
3476
            publisher.substitutions.feed(formdata)
3477
            publisher.substitutions.feed({
3478
                'oldest_form': oldest_lazy_form,
3479
                'mass_action_index': i,
3480
                'mass_action_length': len(formdatas),
3481
            })
3482
            if getattr(action['action'], 'status_action', False):
3483
                # manual jump action
3484
                from wcs.wf.jump import jump_and_perform
3485
                jump_and_perform(formdata, action['action'].action)
3486
            else:
3487
                # global action
3488
                formdata.perform_global_action(action['action'].id, user)
3489
            self.completion_status = '{}/{}'.format(i + 1, len(formdatas))
3490
            self.store()
3472
-