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()
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()
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()
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()
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(())
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()
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()
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()
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()
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)
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()
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()
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')