Projet

Général

Profil

0001-workflow-stop-workflow-after-a-remove-action-52927.patch

Thomas Noël, 10 avril 2021 12:43

Télécharger (5 ko)

Voir les différences:

Subject: [PATCH] workflow: stop workflow after a remove action (#52927)

 tests/test_workflows.py | 68 ++++++++++++++++++++++++++++++++++++-----
 wcs/wf/remove.py        |  8 +++--
 wcs/workflows.py        |  6 ++--
 3 files changed, 69 insertions(+), 13 deletions(-)
tests/test_workflows.py
843 843
    assert formdef.data_class().get(formdata.id).evolution[0].who is None
844 844

  
845 845

  
846
def test_remove(pub):
846
def test_remove(two_pubs):
847 847
    formdef = FormDef()
848 848
    formdef.name = 'baz'
849 849
    formdef.store()
850 850

  
851
    formdef.data_class().wipe()
851 852
    formdata = formdef.data_class()()
852 853
    formdata.store()
853 854

  
854 855
    item = RemoveWorkflowStatusItem()
855
    assert formdef.data_class().has_key(formdata.id)
856
    assert item.perform(formdata) == 'http://example.net'
857
    assert not formdef.data_class().has_key(formdata.id)
856
    assert formdef.data_class().count() == 1
857
    with pytest.raises(AbortActionException) as e:
858
        item.perform(formdata)
859
        assert e.url == 'http://example.net'
860
    assert formdef.data_class().count() == 0
858 861

  
859 862
    formdata = formdef.data_class()()
860 863
    formdata.store()
861 864

  
862 865
    item = RemoveWorkflowStatusItem()
863
    req = pub.get_request()
866
    req = two_pubs.get_request()
864 867
    req.response.filter['in_backoffice'] = True
865
    assert formdef.data_class().has_key(formdata.id)
866
    assert item.perform(formdata) == '..'
867
    assert not formdef.data_class().has_key(formdata.id)
868
    assert formdef.data_class().count() == 1
869
    with pytest.raises(AbortActionException) as e:
870
        item.perform(formdata)
871
        assert e.url == '..'
872
    assert formdef.data_class().count() == 0
868 873
    req.response.filter = {}
869 874
    assert req.session.message
870 875

  
871 876

  
877
def test_stop_on_remove(two_pubs, emails):
878
    workflow = Workflow(name='stop-on-remove')
879
    st1 = workflow.add_status('Status1', 'st1')
880

  
881
    # sendmail + remove + sendmail
882
    mail1 = SendmailWorkflowStatusItem()
883
    mail1.to = ['bar@localhost']
884
    mail1.subject = 'Foobar'
885
    mail1.body = 'email body'
886
    st1.items.append(mail1)
887
    mail1.parent = st1
888
    remove = RemoveWorkflowStatusItem()
889
    st1.items.append(remove)
890
    remove.parent = st1
891
    mail2 = SendmailWorkflowStatusItem()
892
    mail2.to = ['bar@localhost']
893
    mail2.subject = 'Foobar2'
894
    mail2.body = 'email body 2'
895
    st1.items.append(mail2)
896
    mail2.parent = st1
897

  
898
    workflow.store()
899

  
900
    formdef = FormDef()
901
    formdef.name = 'baz%s' % id(two_pubs)
902
    formdef.fields = []
903
    formdef.workflow_id = workflow.id
904
    assert formdef.get_workflow().id == workflow.id
905
    formdef.store()
906

  
907
    formdef.data_class().wipe()
908
    emails.empty()
909
    assert formdef.data_class().count() == 0
910
    assert emails.count() == 0
911

  
912
    formdata = formdef.data_class()()
913
    formdata.just_created()
914
    formdata.store()
915
    url = perform_items(st1.items, formdata)
916
    get_response().process_after_jobs()
917

  
918
    # formdata is removed, no email were sent
919
    assert formdef.data_class().count() == 0
920
    assert emails.count() == 1
921
    assert url == 'http://example.net'
922

  
923

  
872 924
def test_register_comment(pub):
873 925
    pub.substitutions.feed(MockSubstitutionVariables())
874 926

  
wcs/wf/remove.py
16 16

  
17 17
from quixote import get_publisher, get_request, get_response, get_session
18 18

  
19
from wcs.workflows import WorkflowStatusItem, register_item_class
19
from wcs.workflows import AbortActionException, WorkflowStatusItem, register_item_class
20 20

  
21 21
from ..qommon import N_, _
22 22

  
......
30 30
        formdata.remove_self()
31 31
        if get_request() and get_response().filter.get('in_backoffice'):
32 32
            get_session().message = ('info', _('The form has been deleted.'))
33
            return '..'
34
        return get_publisher().get_frontoffice_url()
33
            url = '..'
34
        else:
35
            url = get_publisher().get_frontoffice_url()
36
        raise AbortActionException(url=url)
35 37

  
36 38

  
37 39
register_item_class(RemoveWorkflowStatusItem)
wcs/workflows.py
78 78
            continue
79 79
        try:
80 80
            url = item.perform(formdata) or url
81
        except AbortActionException:
81
        except AbortActionException as e:
82
            url = e.url or url
82 83
            break
83 84
        if formdata.status != old_status:
84 85
            break
......
109 110

  
110 111

  
111 112
class AbortActionException(Exception):
112
    pass
113
    def __init__(self, url=None):
114
        self.url = url
113 115

  
114 116

  
115 117
class AttachmentSubstitutionProxy:
116
-