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 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()
Beispiel #5
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 #6
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 #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 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()
Beispiel #9
0
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()
Beispiel #10
0
    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()
Beispiel #11
0
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()
Beispiel #12
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 #13
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 #14
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 #15
0
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'))
Beispiel #16
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 #17
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')