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 DynamicSplitFlow(Flow): """ Dynamic split Depends on initial decision, several instances on make_decision task would be instantiated """ process_class = models.DynamicSplitProcess summary_template = """ Decision on: {{ process.question }}<br/> {{ process.decision_set.count }} of {{ process.split_count }} completed """ start = (flow.Start( CreateProcessView, fields=['question', 'split_count'], task_result_summary="Asks for {{ process.split_count }} decisions"). Permission(auto_create=True).Next(this.spit_on_decision)) spit_on_decision = (DynamicSplit(lambda p: p.split_count).Next( this.make_decision)) make_decision = (flow.View(views.DecisionView, task_description="Decision required").Next( this.join_on_decision)) join_on_decision = 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()
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 MyPizzaFlow(Flow): process_class = MyPizzaProcess start = ( flow.Start(CreateProcessView, fields=['content']) .Available(available_in_group('customers')) .Next(this.order_pizza) ) order_pizza = ( flow.Handler(this.save_content_to_order) .Next(this.external_join) ) # To run this, we need to know which task we are specifically referring to # This can be done by querying the database my_trigger = ( flow.Function(trigger_triggered, task_loader=lambda flow_task, task: task) .Next(this.external_join) ) external_join = ( flow.Join() .Next(this.take_the_order) ) take_the_order = ( flow.View(TakeTheOrderView, fields=['table_location']) .Permission('users.can_take_the_order') .Next(this.prepare_pizza) ) prepare_pizza = ( flow.View( UpdateProcessView ).Next(this.bring_pizza) ) bring_pizza = ( flow.End() # TODO continue ) def save_content_to_order(self, activation): order = Order() order.content = activation.process.content order.save() activation.process.order = order activation.process.save()
class DynamicSplitFlow(Flow): process_cls = models.DynamicSplitProcess start = flow.Start(StartView, fields=['split_count']) \ .Permission(auto_create=True) \ .Next(this.spit_on_decision) spit_on_decision = DynamicSplit(lambda p: p.split_count) \ .Next(this.make_decision) make_decision = flow.View(views.DecisionView) \ .Next(this.join_on_decision) join_on_decision = flow.Join() \ .Next(this.end) end = flow.End()
def test_join_activation_activate(self): prev_task_mock = mock.Mock(spec=Task()) prev_task_mock.token = Token('start/1_2') task_mock = mock.Mock(spec=Task()) task_mock.previous.all = mock.Mock(return_value=[prev_task_mock]) flow_task_mock = mock.Mock(spec=flow.Join()) flow_task_mock._outgoing = mock.Mock(return_value=[]) flow_task_mock.flow_cls.task_cls = mock.Mock(return_value=task_mock) flow_task_mock.flow_cls.task_cls._default_manager.filter = mock.Mock( return_value=Task.objects.none()) prev_activation_mock = mock.Mock(spec=activation.StartActivation()) act = gates.JoinActivation.activate(flow_task_mock, prev_activation_mock, Token('start')) act.task.save.assert_has_calls(()) flow_task_mock._outgoing.assert_any_call()
class DynamicSplitFlow(Flow): """ Dynamic split Depends on initial decision, several instances on make_decision task would be instanciated """ process_cls = models.DynamicSplitProcess start = flow.Start(flow_views.StartProcessView, fields=['split_count']) \ .Permission(auto_create=True) \ .Next(this.spit_on_decision) spit_on_decision = DynamicSplit(lambda p: p.split_count) \ .Next(this.make_decision) make_decision = flow.View(views.DecisionView) \ .Next(this.join_on_decision) join_on_decision = flow.Join() \ .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 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 ProposalConfirmationFlow(Flow): process_class = ProposalProcess process_title = l_('Обработка заявки') process_menu_title = 'Все заявки' process_client_menu_title = 'Мои заявки' summary_template = '{{ process.company_name }} {{ process.city }}' start = (StartNodeView( CreateProposalProcessView, form_class=CreateProposalProcessForm, task_description=_('Send the invitation'), task_title=_('Send the invitation'), done_btn_title=_('Send the invitation'), ).Permission(auto_create=True).Next(this.create_user)) create_user = flow.Handler(this.perform_create_user).Next( this.add_data_by_client) def perform_create_user(self, activation, **kwargs): User = get_user_model() new_user = User( **{ 'username': activation.process.client_login, 'email': activation.process.client_email, 'first_name': activation.process.contact_name, }) new_user.save() clients = Group.objects.get(id=settings.CLIENTS_GROUP_ID) clients.user_set.add(new_user) activation.process.client = new_user activation.process.save() password_reset_form = SendLinkForm({'email': new_user.email}) password_reset_form.is_valid() password_reset_form.save() add_data_by_client = (ViewNode( ClientAddDataView, form_class=ClientAddDataForm, task_description=_('Client adds data'), task_title=_('Client adds data'), done_btn_title='Все данные добавлены', ).Permission(auto_create=True).Assign( lambda activation: activation.process.client).Next( this.split_to_sales_admin)) split_to_sales_admin = (SplitNode( task_description=_('Split to sales admin'), task_title=_('Split to sales admin'), ).Next(this.approve_paper_docs).Next( this.split_for_credit_and_account_manager)) split_for_credit_and_account_manager = (SplitNode( task_description=_('Split for credit and Account Manager')).Next( this.approve_by_account_manager).Next( this.approve_by_credit_manager)) approve_by_account_manager = ( ApproveViewNode( ApproveView, form_class=ApproveForm, task_description=_('Approve by account manager'), task_title=_('Approve by account manager'), task_comments='Аккаунт-менеджер проверяет заявку', done_btn_title='Согласовано', # block_btn_title=_('Block proposal'), # TODO MBPM-3: # Переименовать can_create_corrections в can_create_messages ? can_create_corrections=[{ 'for_step': this.fix_mistakes_after_account_manager, 'field_label_prefix': l_('Клиенту корректировка для поля '), 'non_field_corr_label': l_('Клиенту корректировка для всей заявки.'), 'action_btn_label': 'Заблокировать заявку', 'action_btn_name': '__block', # Это же используется как суффикс для имён корректировочных полей 'action_btn_class': 'white-text red lighten-1', }], show_corrections=[ { 'for_step': this.fix_mistakes_after_account_manager }, { 'for_step': this.approve_by_credit_manager }, { 'for_step': this.approve_by_region_chief }, { 'for_step': this.approve_paper_docs }, ], ).Permission(auto_create=True).Next(this.choose_the_path)) choose_the_path = (SwitchNode(task_description=_('Choose the path')).Case( this.fix_mistakes_after_account_manager, lambda a: (is_already_done(a, task=this.join_credit_and_account_manager) and has_active_correction( a, for_step=this.fix_mistakes_after_account_manager))).Default( this.join_credit_and_account_manager)) approve_by_credit_manager = ( ApproveViewNode( ApproveView, form_class=ApproveForm, task_description=_('Approve by credit manager'), task_title=_('Approve by credit manager'), done_btn_title='Согласовано', can_create_corrections=[{ 'for_step': this.approve_by_account_manager, 'field_label_prefix': l_('Заблокировать заявку из-за этого поля'), 'non_field_corr_label': l_('Заблокировать заявку'), 'action_btn_label': 'Заблокировать заявку', 'action_btn_name': '__block', # Это же используется как суффикс для имён корректировочных полей 'action_btn_class': 'white-text red lighten-1', }], show_corrections=[], ).Permission(auto_create=True).Next( this.check_is_able_to_download_contract)) check_is_able_to_download_contract = (SwitchNode( task_description=_('Check is able to download contract')).Case( this.join_credit_and_account_manager, lambda a: has_active_correction( a, for_step=this.approve_by_account_manager)).Default( this.download_clients_contract)) download_clients_contract = (DownloadableContractViewNode( DownloadClientsContractView, form_class=DownloadClientsContractForm, task_description=_('Client prints the contract'), task_title=_('Client prints the contract'), done_btn_title='Договор распечатан и отправлен', ).Permission(auto_create=True).Assign( lambda activation: activation.process.client).Next( this.join_credit_and_account_manager)) join_credit_and_account_manager = flow.Join( task_description=_('Join credit and account manager')).Next( this.check_approve_by_credit_and_account_manager) check_approve_by_credit_and_account_manager = (SwitchNode( task_description=_('Check approve by credit and account manager') ).Case( this.approve_by_account_manager, lambda a: has_active_correction( a, for_step=this.approve_by_account_manager)).Case( this.fix_mistakes_after_account_manager, lambda a: has_active_correction( a, for_step=this.fix_mistakes_after_account_manager) ).Default(this.approve_by_region_chief)) fix_mistakes_after_account_manager = ( # В текущей версии Клиент не может исправлять данные в заявке # ApproveViewNode( # FixMistakesView, # form_class=FixMistakesForm, # ViewNode( ApproveViewNode( ClientSeeDataView, form_class=ClientAcceptMistakesForm, task_description=_('Fix mistakes after account manager'), task_title=_('Fix mistakes after account manager'), done_btn_title='ОК', can_create_corrections=[], show_corrections=[], ).Permission( auto_create=True ).Assign(lambda activation: activation.process.client).Next(this.end)) approve_by_region_chief = ( ApproveViewNode( ApproveView, form_class=ApproveForm, task_description=_('Approve by region chief'), task_title=_('Approve by region chief'), task_comments='Шеф региона проверяет заявку', done_btn_title='Согласовано', can_create_corrections=[ { 'for_step': this.approve_by_account_manager, 'field_label_prefix': l_('Корректировка для поля '), 'non_field_corr_label': l_('Корректировка для всей заявки.'), 'action_btn_label': 'Заблокировать заявку', 'action_btn_name': '__block', # Это же используется как суффикс для имё корректировочных полей 'action_btn_class': 'white-text red lighten-1', }, { 'for_step': this.get_comments_from_logist, 'field_label_prefix': l_('Запросить комментарий у логиста для поля '), 'non_field_corr_label': l_('Запрос комментария для всей заявки.'), 'action_btn_label': 'Запросить комментарий логиста', 'action_btn_name': '_get_comments', 'action_btn_class': 'white-text grey darken-1', } ], show_corrections=[{ 'for_step': this.get_comments_from_logist }, { 'for_step': this.approve_by_account_manager, 'made_on_step': this.approve_by_region_chief }, { 'for_step': this.fix_mistakes_after_account_manager }], ).Permission(auto_create=True).Next( this.check_approve_by_region_chief)) check_approve_by_region_chief = (SwitchNode( task_description=_('Check approve by region chief')).Case( this.get_comments_from_logist, lambda a: has_active_correction( a, for_step=this.get_comments_from_logist)).Case( this.approve_by_account_manager, lambda a: has_active_correction( a, for_step=this.approve_by_account_manager)).Default( this.approve_by_adv)) get_comments_from_logist = ( ApproveViewNode( ApproveView, form_class=LogistForm, task_description=_('Get comments from logist'), task_title=_('Get comments from logist'), can_create_corrections=[{ 'for_step': this.approve_by_region_chief, 'field_label_prefix': l_('Пояснение шефу региона для поля '), 'non_field_corr_label': l_('Пояснение шефу региона для всей заявки.'), 'action_btn_label': 'Добавить комментарий', 'action_btn_name': '_set_comments', 'action_btn_class': 'white-text grey darken-1', }], # TODO MBPM-3: переименовать на # additionaly_show_corrections -- дополнительно показываем корректировки с каких шагов # И наверное лучше сделать просто списком. show_corrections=[{ 'for_step': this.approve_by_region_chief }]).Permission(auto_create=True).Next( this.approve_by_region_chief)) approve_by_adv = ( ApproveViewNode( ApproveView, form_class=ApproveForm, task_description=_('Approve by ADV'), task_title=_('Approve by ADV'), task_comments='ADV согласовывает заявку', done_btn_title='Согласовано', can_create_corrections=[ { 'for_step': this.approve_by_account_manager, 'field_label_prefix': l_('Корректировка для поля '), 'non_field_corr_label': l_('Корректировка для всей заявки.'), 'action_btn_label': 'Заблокировать заявку', 'action_btn_name': '__block', # Это же используется как суффикс для имё корректировочных полей 'action_btn_class': 'white-text red lighten-1', }, ], show_corrections=[], ).Permission(auto_create=True).Next(this.create_user_in_inner_systems)) create_user_in_inner_systems = (DownloadableXLSViewNode( DownloadCardView, form_class=DownloadCardForm, task_description=_('Create user in inner systems'), task_title=_('Create user in inner systems'), done_btn_title='Пользователь создан', ).Permission(auto_create=True).Next(this.add_j_code_by_adv)) add_j_code_by_adv = (ViewNode( AddJCodeView, form_class=AddJCodeADVForm, task_description=_('Add J-code by ADV'), task_title=_('Add J-code by ADV'), done_btn_title='J-код добавлен', ).Permission(auto_create=True).Next(this.add_d_code_by_logist)) add_d_code_by_logist = (ViewNode( AddDataView, form_class=AddDCodeLogistForm, task_description=_('Add D-code by Logist'), task_title=_('Add D-code by Logist'), done_btn_title='D-код добавлен', ).Permission(auto_create=True).Next(this.set_credit_limit)) set_credit_limit = (ViewNode( SeeDataView, form_class=SetCreditLimitForm, task_description=_('Set credit limit'), task_title=_('Set credit limit'), done_btn_title='Кредитный лимит установлен', ).Permission(auto_create=True).Next(this.join_from_sales_admin)) approve_paper_docs = (ApproveViewNode( ApproveView, form_class=ApproveForm, task_description=_('Approve paper docs'), task_title=_('Approve paper docs'), done_btn_title='Данные в документах совпадают с данными в системе', can_create_corrections=[], show_corrections=[], ).Permission(auto_create=True).Next(this.join_from_sales_admin)) join_from_sales_admin = (flow.Join( task_description=_('Join from sales admin')).Next(this.unblock_client)) unblock_client = (ViewNode( UnblockClientView, form_class=UnblockClientForm, task_description=_('Unblock client by ADV'), task_title=_('Unblock client by ADV'), done_btn_title='Клиент разблокирован', ).Permission(auto_create=True).Next(this.add_acs)) add_acs = (ViewNode( AddDataView, form_class=AddACSForm, task_description=_('Adding ACS'), task_title=_('Adding ACS'), done_btn_title='ACS прикреплён', ).Permission(auto_create=True).Next(this.end)) end = EndNode(task_description=_('End of proposal confirmation process'))
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 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')