Пример #1
0
class HelloRestFlow(Flow):
    """
    Sample flow with REST interface

    This is the simple approvement demo process, where one person
    requests message send and another one approves it
    """
    process_class = models.HelloRestProcess

    summary_template = "'{{ process.text }}' message to the world"

    start = (flow.Start(CreateView, actions={
        'get': 'list'
    }).Permission(auto_create=True).Next(this.approve))

    approve = (flow.View(
        views.UpdateProcessView,
        fields=['approved'],
        task_description="Message approvement required",
        task_result_summary=
        "Messsage was {{ process.approved|yesno:'Approved,Rejected' }}").
               Permission(auto_create=True).Next(this.check_approve))

    check_approve = (flow.If(cond=lambda act: act.process.approved).Then(
        this.send).Else(this.end))

    send = (celery.Job(send_hello_world_request).Next(this.end))

    end = flow.End()
    def test_failed_activate_next(self):
        job_task_mock = mock.Mock(spec=Task())
        gate_task_mock = mock.Mock(spec=Task())

        next_flow_task_mock = mock.Mock()
        next_flow_task_mock.flow_cls.task_cls = mock.Mock(
            return_value=gate_task_mock)
        next_flow_task_mock.dst.activate = \
            lambda prev_activation, token: activation.GateActivation().activate(next_flow_task_mock, prev_activation, token)  # NOQA

        flow_task_mock = mock.MagicMock(spec=celery.Job(lambda p: None))
        flow_task_mock.flow_cls.task_cls.objects.get = mock.Mock(
            return_value=job_task_mock)
        flow_task_mock.activation_cls = mock.Mock(
            return_value=celery.JobActivation())
        flow_task_mock._outgoing = mock.Mock(
            return_value=[next_flow_task_mock])

        with mock.patch('viewflow.flow.job.import_task_by_ref',
                        return_value=flow_task_mock):
            successful_job(flow_task_strref='unit/TestFlow.job',
                           process_pk=-1,
                           task_pk=-1)

        job_task_mock.prepare.assert_called_once_with()
        job_task_mock.start.assert_called_once_with()
        job_task_mock.done.assert_called_once_with()
        self.assertFalse(job_task_mock.error.called)

        gate_task_mock.prepare.assert_called_once_with()
        gate_task_mock.error.assert_called_once_with()
        self.assertFalse(gate_task_mock.done.called)
Пример #3
0
class HelloWorldFlow(Flow):
    process_class = HelloWorldProcess

    start = (
        flow.Start(
            CreateProcessView,
            fields=["text"]
        ).Permission(
            auto_create=True
        ).Next(this.approve)
    )

    approve = (
        flow.View(
            UpdateProcessView,
            fields=["approved"]
        ).Permission(
            auto_create=True
        ).Next(this.check_approve)
    )

    check_approve = (
        flow.If(lambda activation: activation.process.approved)
        .Then(this.send)
        .Else(this.end)
    )

    send = (
        celery.Job(
            send_hello_world_request
        ).Next(this.end)
    )

    end = flow.End()
Пример #4
0
class HelloWorldFlow(Flow):
    """
    Hello world

    This process demonstrates hello world approval request flow.
    """
    process_class = HelloWorldProcess
    lock_impl = lock.CacheLock()

    summary_template = "'{{ process.text }}' message to the world"

    start = (flow.Start(flow_views.CreateProcessView,
                        fields=['text']).Permission(auto_create=True).Next(
                            this.approve))

    approve = (flow.View(
        flow_views.UpdateProcessView,
        fields=['approved'],
        task_description="Message approvement required",
        task_result_summary=
        "Messsage was {{ process.approved|yesno:'Approved,Rejected' }}").
               Permission(auto_create=True).Next(this.check_approve))

    check_approve = (flow.If(cond=lambda act: act.process.approved).Then(
        this.send).Else(this.end))

    send = celery.Job(send_hello_world_request).Next(this.end)

    end = flow.End()
Пример #5
0
class HelloWorldFlow(Flow):
    """
    Hello world

    This process demonstrates hello world approval request flow.
    """
    process_cls = HelloWorldProcess
    lock_impl = lock.select_for_update_lock

    start = flow.Start(flow_views.StartProcessView, fields=['text']) \
        .Permission(auto_create=True) \
        .Next(this.approve)

    approve = flow.View(flow_views.ProcessView, fields=['approved']) \
        .Permission(auto_create=True) \
        .Next(this.check_approve)

    check_approve = flow.If(cond=lambda p: p.approved) \
        .OnTrue(this.send) \
        .OnFalse(this.end)

    send = celery.Job(send_hello_world_request) \
        .Next(this.end)

    end = flow.End()
Пример #6
0
class HelloWorldFlow(Flow):
    """
    Hello world

    This process demonstrates hello world approval request flow.
    """
    process_cls = HelloWorldProcess
    lock_impl = lock.select_for_update_lock

    summary_template = "'{{ process.text }}' message to the world"

    start = flow.Start(StartProcessView,
                       fields=['text']).Permission(auto_create=True).Next(
                           this.approve)

    approve = flow.View(
        ProcessView,
        fields=['approved'],
        task_description="Message approvement required",
        task_result_summary=
        "Messsage was {{ process.approved|yesno:'Approved,Rejected' }}"
    ).Permission(auto_create=True).Next(this.check_approve)

    check_approve = flow.If(cond=lambda p: p.approved).OnTrue(
        this.send).OnFalse(this.end)

    send = celery.Job(send_hello_world_request).Next(this.end)

    end = flow.End()
Пример #7
0
class FailedGateFlow(Flow):
    """
    Test that failed If gate not reflects on finished job
    """
    lock_impl = lock.cache_lock

    start = flow.Start().Next(this.job)
    job = celery.Job(tasks.dummy_job).Next(this.iff)
    iff = flow.If(lambda p: 2 / 0).OnTrue(this.end).OnFalse(this.end)
    end = flow.End()
Пример #8
0
class FailedJobFlow(Flow):
    """
    Test that failed job gate stored task in error state
    """
    lock_impl = lock.cache_lock

    start = flow.Start().Next(this.job)
    job = celery.Job(tasks.dummy_job).Next(this.iff)
    iff = flow.If(lambda p: 2 / (1 - 1)).OnTrue(this.end).OnFalse(this.end)
    end = flow.End()
Пример #9
0
class AllTaskFlow(Flow):
    lock_impl = lock.cache_lock

    start = flow.Start().Next(this.view)
    view = flow.View(perform_task).Next(this.job)
    job = celery.Job(tasks.dummy_job).Next(this.iff)
    iff = flow.If(lambda act: True).OnTrue(this.switch).OnFalse(this.switch)
    switch = flow.Switch().Default(this.split)
    split = flow.Split().Always(this.join)
    join = flow.Join().Next(this.first)
    first = flow.First().Of(this.end)
    end = flow.End()
Пример #10
0
    def test_job_activation_activate(self):
        flow_task_mock = mock.Mock(
            spec=celery.Job(lambda *args, **kwargs: None))
        flow_task_mock._outgoing = mock.Mock(return_value=[])
        prev_activation_mock = mock.Mock(spec=activation.StartActivation())

        with mock.patch('viewflow.contrib.celery.get_task_ref'):
            act = celery.JobActivation.activate(flow_task_mock,
                                                prev_activation_mock,
                                                Token('start'))
            act.task.save.assert_has_calls(())
            self.assertEqual(1, flow_task_mock.job.apply_async.call_count)
Пример #11
0
    def test_job_activation_lifecycle(self):
        flow_task_mock = mock.Mock(
            spec=celery.Job(lambda *args, **kwargs: None))
        flow_task_mock._outgoing = mock.Mock(return_value=[])
        task_mock = mock.Mock(spec=Task())

        act = celery.JobActivation()
        act.initialize(flow_task_mock, task_mock)
        act.prepare()
        act.start()
        act.done(result=None)

        act.task.done.assert_called_once_with()
        flow_task_mock._outgoing.assert_any_call()
Пример #12
0
    def test_failed_job(self):
        task_mock = mock.Mock(spec=Task())
        flow_task_mock = mock.MagicMock(spec=celery.Job(lambda p: None))
        flow_task_mock.flow_cls.task_cls.objects.get = mock.Mock(
            return_value=task_mock)
        flow_task_mock.activation_cls = mock.Mock(
            return_value=celery.JobActivation())

        with mock.patch('viewflow.flow.job.import_task_by_ref',
                        return_value=flow_task_mock):
            with self.assertRaises(NotImplementedError):
                failure_job(flow_task_strref='unit/TestFlow.job',
                            process_pk=-1,
                            task_pk=-1)

        task_mock.prepare.assert_called_once_with()
        task_mock.start.assert_called_once_with()
        task_mock.error.assert_called_once_with()
        self.assertFalse(task_mock.done.called)
Пример #13
0
class HelloWorldFlow(Flow):
    process_cls = models.HelloWorldProcess
            
    start = flow.Start(StartProcessView, fields=["text"]) \
        .Permission(auto_create=True).Available(username="******") \
        .Next(this.approve)
            
    approve = flow.View(ProcessView, fields=["approved"]) \
        .Permission(auto_create=True).Assign(username="******") \
        .Next(this.check_approve)
            
    check_approve = flow.If(cond=lambda p: p.approved) \
        .OnTrue(this.send) \
        .OnFalse(this.end)
            
    send = celery.Job(tasks.send_hello_world_request) \
        .Next(this.end)
            
    end = flow.End()
Пример #14
0
class HelloWorldFlow(Flow):
    process_cls = models.HelloWorldProcess
    lock_impl = lock.select_for_update_lock

    start = flow.Start(StartProcessView, fields=["text"]) \
        .Permission(auto_create=True) \
        .Next(this.approve)

    approve = flow.View(ProcessView, fields=["approved"]) \
        .Permission(auto_create=True) \
        .Next(this.check_approve)

    check_approve = flow.If(cond=lambda p: p.approved) \
        .OnTrue(this.send) \
        .OnFalse(this.end)

    send = celery.Job(tasks.send_hello_world_request) \
        .Next(this.end)

    end = flow.End()
Пример #15
0
class StudentApplyFlow(Flow):
    process_cls = models.StudentApply
    lock_impl = lock.select_for_update_lock

    start = flow.Start(StartProcessView, fields=["text"]) \
        .Permission(auto_create=True) \
        .Available(username= '******') \
        .Next(this.approve)

    approve = flow.View(ProcessView, fields=["approved"]) \
        .Permission(auto_create=True) \
        .Next(this.check_approve)

    check_approve = flow.If(cond=lambda p: p.approved) \
        .OnTrue(this.send) \
        .OnFalse(this.end)

    send = celery.Job(tasks.send_student_apply_request) \
        .Next(this.end)

    end = flow.End()
Пример #16
0
class HelloRestFlow(Flow):
    """
    Sample flow with REST interface

    This is the simple approvement demo process, where one person
    requests message send and another one approves it
    """
    process_class = models.HelloRestProcess

    summary_template = "'{{ process.text }}' message to the world"

    start = (
        flow.Start(
            views.CreateProcessView,
            fields=['text'])
        .Permission(auto_create=True)
        .Next(this.approve)
    )

    approve = (
        flow.View(
            views.UpdateProcessView,
            fields=['approved'])
        .Permission(auto_create=True)
        .Next(this.check_approve)
    )

    check_approve = (
        flow.If(cond=lambda act: act.process.approved)
        .Then(this.send)
        .Else(this.end)
    )

    send = (
        celery.Job(send_hello_world_request)
        .Next(this.end)
    )

    end = flow.End()
Пример #17
0
class TestCeleryFlow(Flow):
    process_cls = TestCeleryProcess

    start = flow.StartFunction(create_test_flow).Next(this.task)
    task = celery.Job(celery_test_job).Next(this.end)
    end = flow.End()