Beispiel #1
0
class ShipmentFlow(Flow):
    process_cls = ShipmentProcess
    task_cls = ShipmentTask
    lock_impl = select_for_update_lock

    start = flow.Start(views.StartView) \
        .Permission('shipment.can_start_request') \
        .Next(this.split_clerk_warehouse)

    # clerk
    split_clerk_warehouse = flow.Split() \
        .Next(this.shipment_type) \
        .Next(this.package_goods)

    shipment_type = flow.View(views.ShipmentView, fields=["carrier"]) \
        .Next(this.delivery_mode) \
        .Assign(lambda p: p.created_by)

    delivery_mode = flow.If(cond=lambda p: p.is_normal_post()) \
        .OnTrue(this.check_insurance) \
        .OnFalse(this.request_quotes)

    request_quotes = flow.View(views.ShipmentView, fields=["carrier_quote"]) \
        .Next(this.join_clerk_warehouse) \
        .Assign(lambda p: p.created_by)

    check_insurance = flow.View(views.ShipmentView, fields=["need_insurance"]) \
        .Next('split_on_insurance') \
        .Assign(lambda p: p.created_by)

    split_on_insurance = flow.Split() \
        .Next(this.take_extra_insurance, cond=lambda p: p.need_extra_insurance()) \
        .Always(this.fill_post_label)

    fill_post_label = flow.View(views.ShipmentView, fields=["post_label"]) \
        .Next(this.join_on_insurance) \
        .Assign(lambda p: p.created_by)

    join_on_insurance = flow.Join() \
        .Next(this.join_clerk_warehouse)

    # Logistic manager
    take_extra_insurance = flow.View(views.InsuranceView) \
        .Next(this.join_on_insurance) \
        .Permission('shipment.can_take_extra_insurance')

    # Warehouse worker
    package_goods = flow.View(ProcessView.as_view()) \
        .Next(this.join_clerk_warehouse) \
        .Permission('shipment.can_package_goods')

    join_clerk_warehouse = flow.Join() \
        .Next(this.move_package)

    move_package = flow.View(ProcessView.as_view()) \
        .Next(this.end) \
        .Assign(this.package_goods.owner)

    end = flow.End()
class JoinTestFlow(Flow):
    start = flow.StartFunction().Next(this.split)
    split = flow.Split().Next(this.task1).Next(this.task2)
    task1 = flow.Function(func, task_loader=lambda flow_task, task: task).Next(this.join)
    task2 = flow.Function(func, task_loader=lambda flow_task, task: task).Next(this.join)
    join = flow.Join().Next(this.end)
    end = flow.End()
Beispiel #3
0
class BloodTestFlow(Flow):
    process_class = models.BloodTestProcess

    first_sample = flow.Start(views.FirstBloodSampleView).Next(
        this.biochemical_analysis)

    second_sample = flow.Start(views.second_blood_sample).Next(
        this.biochemical_analysis)

    biochemical_analysis = flow.View(views.biochemical_data).Next(
        this.split_analysis)

    split_analysis = (flow.Split().Next(
        this.hormone_tests,
        cond=lambda act: act.process.hormone_test_required).Next(
            this.tumor_markers_test,
            cond=lambda act: act.process.tumor_test_required).Next(
                this.join_analysis))

    hormone_tests = flow.View(views.HormoneTestFormView).Next(
        this.join_analysis)

    tumor_markers_test = flow.View(
        views.GenericTestFormView,
        model=models.TumorMarkers,
        fields=[
            'alpha_fetoprotein', 'beta_gonadotropin', 'ca19', 'cea', 'pap',
            'pas'
        ],
        task_description='Tumor Markers Test').Next(this.join_analysis)

    join_analysis = flow.Join().Next(this.end)

    end = flow.End()
Beispiel #4
0
class JoinTestFlow(Flow):
    start = flow.StartFunction().Next(this.split)
    split = flow.Split().Next(this.task1).Next(this.task2)
    task1 = flow.Function(func).Next(this.join)
    task2 = flow.Function(func).Next(this.join)
    join = flow.Join().Next(this.end)
    end = flow.End()
Beispiel #5
0
class SplitJoinTestFlow(Flow):
    start = flow.StartFunction(create_test_flow).Next(this.split)
    split = flow.Split().Next(this.task1).Next(this.task2).Next(
        this.task3, cond=lambda process: False)
    task1 = flow.Function(function_task).Next(this.join)
    task2 = flow.Function(function_task).Next(this.join)
    task3 = flow.Function(function_task).Next(this.join)
    join = flow.Join().Next(this.end)
    end = flow.End()
Beispiel #6
0
    def test_switch_activation_activate(self):
        flow_task_mock = mock.Mock(spec=flow.Split())
        flow_task_mock._outgoing = mock.Mock(return_value=[])
        type(flow_task_mock).branches = mock.PropertyMock(
            return_value=[(mock.Mock(), lambda p: True)])
        prev_activation_mock = mock.Mock(spec=activation.StartActivation())

        act = gates.SplitActivation.activate(flow_task_mock,
                                             prev_activation_mock,
                                             Token('start'))
        act.task.save.assert_has_calls(())
Beispiel #7
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()
Beispiel #8
0
class ManageClaimFlow(Flow):
    process_class = models.ClaimProcess

    user_claim = flow.Start(views.RegisterCustomerClaim).Next(this.type_claim)

    type_claim = flow.View(UpdateProcessView,
                           form_class=forms.TypeClaimForm).Next(
                               this.split_type_claim)

    split_type_claim = (flow.Split().Next(
        this.sample_continue, cond=lambda act: act.process.pqr_required).Next(
            this.end, cond=lambda act: act.process.s_required))
    sample_continue = flow.View(views.testView).Next(this.end)

    end = flow.End()
Beispiel #9
0
class ShipmentFlow(Flow):
    process_class = ShipmentProcess
    task_class = ShipmentTask
    lock_impl = CacheLock()

    summary_template = """
        Shipment {{ process.shipment.shipmentitem_set.count }} items
        to {{ process.shipment.first_name }} {{ process.shipment.last_name }} / {{ process.shipment.city }}
        """

    start = (flow.Start(
        views.start_view).Permission('shipment.can_start_request').Next(
            this.split_clerk_warehouse))

    # clerk
    split_clerk_warehouse = (flow.Split().Next(this.shipment_type).Next(
        this.package_goods))

    shipment_type = (flow.View(views.ShipmentView,
                               fields=["carrier"],
                               task_description="Carrier selection").Assign(
                                   lambda act: act.process.created_by).Next(
                                       this.delivery_mode))

    delivery_mode = (flow.If(
        cond=lambda act: act.process.is_normal_post()).Then(
            this.check_insurance).Else(this.request_quotes))

    request_quotes = (flow.View(views.ShipmentView, fields=[
        "carrier_quote"
    ]).Assign(lambda act: act.process.created_by).Next(
        this.join_clerk_warehouse))

    check_insurance = (flow.View(views.ShipmentView, fields=[
        "need_insurance"
    ]).Assign(lambda act: act.process.created_by).Next(
        this.split_on_insurance))

    split_on_insurance = (flow.Split().Next(
        this.take_extra_insurance,
        cond=lambda act: act.process.need_extra_insurance()).Always(
            this.fill_post_label))

    fill_post_label = (flow.View(views.ShipmentView, fields=[
        "post_label"
    ]).Assign(lambda act: act.process.created_by).Next(this.join_on_insurance))

    join_on_insurance = (flow.Join().Next(this.join_clerk_warehouse))

    # Logistic manager
    take_extra_insurance = (flow.View(views.InsuranceView).Permission(
        'shipment.can_take_extra_insurance').Next(this.join_on_insurance))

    # Warehouse worker
    package_goods = (flow.View(UpdateProcessView).Permission(
        'shipment.can_package_goods').Next(this.join_clerk_warehouse))

    join_clerk_warehouse = (flow.Join().Next(this.move_package))

    move_package = (flow.View(UpdateProcessView).Assign(
        this.package_goods.owner).Next(this.end))

    end = flow.End()
Beispiel #10
0
class VacationApprovalFlow(Flow):
    process_class = VacationApproval
    lock_impl = lock.no_lock

    process_description = 'Vacation Approval Request'

    label = 'vacation'
    flow_label = 'vacation'

    start = (
        flow.Start(
            CreateProcessView,
            task_title='Request a vacation')
        .Permission('auth.no_permission')
        .Next(this.fill)
    )

    fill = (
        flow.View(
            FillVacationView,
            task_title='Fill your vacation details')
        .Permission('auth.no_permission')
        .Assign(lambda a: a.process.created_by)
        .Next(this.split)
    )

    split = (
        flow.Split()
        .Next(
            this.renew,
            cond=lambda act: act.process.vacation.requires_renewal())
        .Always(this.approve)
    )

    renew = (
        flow.View(
            RenewPassportView,
            task_title='Renew this passport expiry date',
        )
        .Permission('auth.can_renew_passport')
        .Assign(lambda a: User.objects.get(username='******'))
        .Next(this.join_)
    )

    update = (
        flow.View(
            UpdateVacationView,
            task_title='Update your vacation details')
        .Permission('auth.no_permission')
        .Assign(lambda a: a.process.created_by)
        .Next(this.approve)
    )

    approve = (
        flow.View(
            ApproveVacationView,
            task_title='Approve this vacation request',
        )
        .Permission('auth.can_approve')
        .Next(this.check_approval)
    )
    check_approval = (
        flow.If(lambda a: a.task.process.vacation.is_approved())
        .Then(this.join_)
        .Else(this.update)
    )

    join_ = (
        flow.Join()
        .Next(this.end)
    )
    end = flow.End()
Beispiel #11
0
class GrantManagementFlow(Flow):
    summary_template = "{{ process.grant_application.company.name" \
                       "|default:process.grant_application.manual_company_name }} " \
                       "[{{ process.status }}]"
    process_class = GrantManagementProcess

    start = flow.StartFunction(this.start_callback,
                               task_title='Submit your application.').Next(
                                   this.send_application_submitted_email)

    send_application_submitted_email = flow.Handler(
        this.send_application_submitted_email_callback).Next(
            this.create_verify_tasks)

    # Verify Eligibility tasks
    create_verify_tasks = (flow.Split().Always(
        this.verify_previous_applications).Always(
            this.verify_event_commitment).Always(
                this.verify_business_entity).Always(
                    this.verify_state_aid).Always(this.finish_verify_tasks))

    verify_previous_applications = flow.View(
        BaseGrantManagementView,
        form_class=VerifyPreviousApplicationsForm,
        task_title='Verify number of previous grants').Next(
            this.finish_verify_tasks)

    verify_event_commitment = flow.View(
        BaseGrantManagementView,
        form_class=VerifyEventCommitmentForm,
        task_title='Verify event commitment').Next(this.finish_verify_tasks)

    verify_business_entity = flow.View(
        BaseGrantManagementView,
        form_class=VerifyBusinessEntityForm,
        task_title='Verify business eligibility').Next(
            this.finish_verify_tasks)

    verify_state_aid = flow.View(BaseGrantManagementView,
                                 form_class=VerifyStateAidForm,
                                 task_title='Verify event commitment').Next(
                                     this.finish_verify_tasks)

    finish_verify_tasks = flow.Join().Next(this.create_suitability_tasks)

    # Suitability tasks
    create_suitability_tasks = (flow.Split().Always(
        this.products_and_services).Always(
            this.products_and_services_competitors).Always(
                this.export_strategy).Always(this.event_is_appropriate).Always(
                    this.finish_suitability_tasks))

    products_and_services = flow.View(BaseGrantManagementView,
                                      form_class=ProductsAndServicesForm,
                                      task_title='Products and services').Next(
                                          this.finish_suitability_tasks)

    products_and_services_competitors = flow.View(
        BaseGrantManagementView,
        form_class=ProductsAndServicesCompetitorsForm,
        task_title='Products and services competitors').Next(
            this.finish_suitability_tasks)

    export_strategy = flow.View(BaseGrantManagementView,
                                form_class=ExportStrategyForm,
                                task_title='Export strategy').Next(
                                    this.finish_suitability_tasks)

    event_is_appropriate = flow.View(BaseGrantManagementView,
                                     form_class=EventIsAppropriateForm,
                                     task_title='Event is appropriate').Next(
                                         this.finish_suitability_tasks)

    finish_suitability_tasks = flow.Join().Next(this.decision)

    # Decision task
    decision = flow.View(
        BaseGrantManagementView,
        form_class=DecisionForm,
        task_title='Final review',
    ).Next(this.send_decision_email)

    send_decision_email = flow.Handler(this.send_decision_email_callback).Next(
        this.end)

    end = flow.End()

    @method_decorator(flow.flow_start_func)
    def start_callback(self, activation, grant_application):
        activation.prepare()
        activation.process.grant_application = grant_application
        activation.done()
        return activation.process

    def send_application_submitted_email_callback(self, activation):
        NotifyService().send_application_submitted_email(
            email_address=activation.process.grant_application.applicant_email,
            applicant_full_name=activation.process.grant_application.
            applicant_full_name,
            application_id=activation.process.grant_application.id_str)

    def send_decision_email_callback(self, activation):
        if activation.process.is_approved:
            NotifyService().send_application_approved_email(
                email_address=activation.process.grant_application.
                applicant_email,
                applicant_full_name=activation.process.grant_application.
                applicant_full_name,
                application_id=activation.process.grant_application.id_str)
        else:
            NotifyService().send_application_rejected_email(
                email_address=activation.process.grant_application.
                applicant_email,
                applicant_full_name=activation.process.grant_application.
                applicant_full_name,
                application_id=activation.process.grant_application.id_str)
Beispiel #12
0
class ShipmentFlow(Flow):
    """
    Delivery process
    """
    process_cls = models.ShipmentProcess

    start = flow.StartFunction(tasks.start_shipment_process) \
        .Next(this.split_clerk_warehouse)

    # clerk
    split_clerk_warehouse = flow.Split() \
        .Next(this.set_shipment_type) \
        .Next(this.package_goods)

    set_shipment_type = flow.View(views.ShipmentView, fields=["carrier"]) \
        .Permission(auto_create=True) \
        .Next(this.delivery_mode)

    delivery_mode = flow.If(cond=lambda p: p.is_normal_post()) \
        .OnTrue(this.check_insurance) \
        .OnFalse(this.request_quotes)

    request_quotes = flow.View(views.ShipmentView, fields=["carrier_quote"]) \
        .Assign(this.set_shipment_type.owner) \
        .Next(this.join_clerk_warehouse)

    check_insurance = flow.View(views.ShipmentView, fields=["need_insurance"]) \
        .Assign(this.set_shipment_type.owner) \
        .Next(this.split_on_insurance)

    split_on_insurance = flow.Split() \
        .Next(this.take_extra_insurance, cond=lambda p: p.need_extra_insurance()) \
        .Always(this.fill_post_label)

    fill_post_label = flow.View(views.ShipmentView, fields=["post_label"]) \
        .Next(this.join_on_insurance) \
        .Assign(this.set_shipment_type.owner)

    join_on_insurance = flow.Join() \
        .Next(this.join_clerk_warehouse)

    # Logistic manager
    take_extra_insurance = flow.View(views.InsuranceView) \
        .Next(this.join_on_insurance) \
        .Permission(auto_create=True)

    # Warehouse worker
    package_goods = flow.View(ProcessView) \
        .Next(this.join_clerk_warehouse) \
        .Permission(auto_create=True)

    join_clerk_warehouse = flow.Join() \
        .Next(this.move_package)

    move_package = flow.View(ProcessView.as_view()) \
        .Assign(this.package_goods.owner) \
        .Next(this.mark_order_done)

    mark_order_done = flow.Handler(tasks.done_order) \
        .Next(this.end)

    end = flow.End()
Beispiel #13
0
class ActivityCalendarFlow(Flow):
    """
    Plotting Activity to Calendar 
    """
    process_class = ActivityCalendarProcess
    task_class = ActivityCalendarTask
    #lock_impl = select_for_update_lock
    
    summary_template = """
    Activity {{ process.activity.activity_set.count }}
    """
    
    start = (
        flow.Start(views.CalendarCreateView)
        .Permission('activity.can_create_activity_request')
        .Next(this.for_approval)
    )
    
    
    for_approval = (
        flow.Split()
        .Next(this.approved_request)
        .Next(this.revised_request)
        .Next(this.rejected_request)
    )
    
    
    approved_request = (
        flow.View(
            views.CalendarView,
            task_description="Approval Request"
        )
        .Assign(lambda act: act.process.created_by)
        .Next(this.check_approve)
    )
    
    revised_request = (
        flow.If(
           cond=lambda act: act.process.is_revised_activity(),
        )
        .Then(this.check_activity_request)
        .Else(this.check_approve)
    )

    check_activity_request = (
        flow.View(views.RevisedView, fields=['approved'])
        .Assign(lambda act: act.process.created_by)        
        .Next(this.approved_request)
    )
    
    rejected_request = (
        flow.View(views.CalendarTemplateView)
        .Next(this.end)
    )
    
    check_approve = (
        flow.If(lambda act: act.process.approved)
        .Then(this.plot_to_calendar)
        .Else(this.end)
    )
    
    plot_to_calendar = (
        flow.View(
            views.CalendarTemplateView
        )
        .Next(this.end)
    )
    
    
    end = flow.End()
Beispiel #14
0
class CSFlow(Flow):
    """
    并行会签demo
    动态拆分见作者自带的customnode列子。
    """
    process_class = cs_process
    process_title = _('会签')
    process_description = _('会签演示.')

    lock_impl = lock.select_for_update_lock

    summary_template = _("'{{ process.mark }}' 会签")

    start = (flow.Start(flow_views.CreateProcessView,
                        fields=['file', 'mark', 'version'],
                        task_title=_('新会签')).Permission(auto_create=True).Next(
                            this.split_sign))

    split_sign = (flow.Split(task_title=_('并行会签')).Next(this.cfo_sign).Next(
        this.ceo_sign))

    #财务官会签
    cfo_sign = (flow.View(
        flow_views.UpdateProcessView,
        fields=['file', 'mark', 'cfo_approved'],
        task_title=_('CFO 会签'),
        task_result_summary=
        _("CFO{% ifequal process.cfo_approved '1' %} 同意 {% else %}不同意{% endifequal %}"
          )).Permission(auto_create=True).Next(this.join_on_sign))

    #CEO会签
    ceo_sign = (flow.View(
        flow_views.UpdateProcessView,
        fields=['file', 'mark', 'ceo_approved'],
        task_title=_('CEO 会签'),
        task_result_summary=
        _("CEO{% if process.ceo_approved == '1' %} 同意 {% else %}不同意{% endif %}"
          )).Permission(auto_create=True).Next(this.join_on_sign))

    join_on_sign = (flow.Join(task_title=_('等待所有会签结束')).Next(this.decision))
    #一票否决制。
    decision = (flow.If(
        cond=lambda act: act.process.cfo_approved == '1' and act.process.
        ceo_approved == '1',
        task_title=_('会签结果'),
        task_result_summary=
        _("会签结果{% if process.ceo_approved == '1' and  process.cfo_approved == '1'%} 通过 {% else %}不通过{% endif %}"
          )).Then(this.OK).Else(this.NG))

    NG = (flow.Handler(this.send_NG_request).Next(this.end))

    OK = (flow.Handler(this.send_OK_request).Next(this.end))

    end = flow.End()

    def send_NG_request(self, activation):
        print('ceo_approved==>' + str(activation.process.ceo_approved))
        print('cfo_approved==>' + str(activation.process.cfo_approved))
        print('NG')

    def send_OK_request(self, activation):
        print('OK')