def index():

    parent = aliased(ContractBase)

    parent_specs = db.session.query(
        ContractBase.id, ContractProperty.value,
        parent.expiration_date, parent.contract_href
    ).join(
        ContractProperty,
        ContractBase.parent_id == ContractProperty.contract_id
    ).join(
        parent, ContractBase.parent
    ).filter(
        db.func.lower(ContractProperty.key) == 'spec number',
        ContractType.name == 'County'
    ).subquery()

    in_progress = db.session.query(
        db.distinct(ContractBase.id).label('id'),
        ContractProperty.value.label('spec_number'),
        parent_specs.c.value.label('parent_spec'),
        parent_specs.c.expiration_date.label('parent_expiration'),
        parent_specs.c.contract_href.label('parent_contract_href'),
        ContractBase.description, Flow.flow_name,
        Stage.name.label('stage_name'), ContractStage.entered,
        User.first_name, User.email,
        Department.name.label('department')
    ).outerjoin(Department).join(
        ContractStage, db.and_(
            ContractStage.stage_id == ContractBase.current_stage_id,
            ContractStage.contract_id == ContractBase.id,
            ContractStage.flow_id == ContractBase.flow_id
        )
    ).join(
        Stage, Stage.id == ContractBase.current_stage_id
    ).join(
        Flow, Flow.id == ContractBase.flow_id
    ).outerjoin(
        ContractProperty, ContractProperty.contract_id == ContractBase.id
    ).outerjoin(
        parent_specs, ContractBase.id == parent_specs.c.id
    ).join(User, User.id == ContractBase.assigned_to).filter(
        ContractStage.flow_id == ContractBase.flow_id,
        ContractStage.entered != None,
        ContractBase.assigned_to != None,
        ContractBase.is_visible == False,
        ContractBase.is_archived == False
    ).all()

    all_contracts = db.session.query(
        ContractBase.id, ContractBase.description,
        ContractBase.financial_id, ContractBase.expiration_date,
        ContractProperty.value.label('spec_number'),
        ContractBase.contract_href, ContractBase.department,
        User.first_name, User.email
    ).join(ContractType).outerjoin(
        User, User.id == ContractBase.assigned_to
    ).outerjoin(
        Department, Department.id == ContractBase.department_id
    ).outerjoin(
        ContractProperty, ContractProperty.contract_id == ContractBase.id
    ).filter(
        db.func.lower(ContractType.name).in_(['county', 'a-bid', 'b-bid']),
        db.func.lower(ContractProperty.key) == 'spec number',
        ContractBase.children == None,
        ContractBase.is_visible == True
    ).order_by(ContractBase.expiration_date).all()

    conductors = User.query.join(Role, User.role_id == Role.id).filter(
        Role.name == 'conductor',
        User.email != current_user.email
    ).all()

    current_app.logger.info('CONDUCTOR INDEX - Conductor index page view')

    return render_template(
        'conductor/index.html',
        in_progress=in_progress, _all=all_contracts,
        current_user=current_user,
        conductors=[current_user] + conductors,
        path='{path}?{query}'.format(
            path=request.path, query=request.query_string
        )
    )
Exemplo n.º 2
0
def index():
    '''Main conductor index page/splash view

    Renders two tables that conductors can use to track their progress:
    ``in_progress``, which contains all of the
    :py:class:`~purchasing.data.contracts.ContractBase` objects that are
    currently being worked on by a conductor. ``in_progress`` contracts
    are generated by selecting only :py:class:`~purchasing.data.contracts.ContractBase`
    objects that have a ``parent_id``, have an existing ``flow``,
    non-null ``entered`` current contract stage, and are neither ``is_archived`` nor
    ``is_visible``.

    ``all_contracts`` contains all contracts that are eligible
    to show up in conductor to be worked on. These are filtered based on the
    :py:class:`~purchasing.data.contracts.ContractType`
    ``managed_by_conductor`` field. Additionally, these are
    filtered by having no ``children``, and ``is_visible`` set to True

    .. seealso:: :py:class:`~purchasing.data.contracts.ContractBase`,
        :py:class:`~purchasing.data.contract_stages.ContractStage`,
        :py:class:`~purchasing.data.flows.Flow`

    :status 200: Render the main conductor index page
    '''
    parent = aliased(ContractBase)

    parent_specs = db.session.query(
        ContractBase.id, ContractProperty.value, parent.expiration_date,
        parent.contract_href, Company.company_name).join(
            ContractProperty,
            ContractBase.parent_id == ContractProperty.contract_id).join(
                parent, ContractBase.parent).outerjoin(
                    Company, parent.companies).filter(
                        db.func.lower(ContractProperty.key) == 'spec number',
                        ContractType.managed_by_conductor == True).subquery()

    in_progress = db.session.query(
        db.distinct(ContractBase.id).label('id'),
        ContractProperty.value.label('spec_number'),
        parent_specs.c.value.label('parent_spec'),
        parent_specs.c.expiration_date.label('parent_expiration'),
        parent_specs.c.contract_href.label('parent_contract_href'),
        ContractBase.description, Flow.flow_name,
        Stage.name.label('stage_name'), ContractStage.entered, User.first_name,
        User.email, Department.name.label('department'),
        db.func.array_remove(
            db.func.array_agg(parent_specs.c.company_name),
            None).label('companies')).outerjoin(Department).join(
                ContractStage,
                db.and_(
                    ContractStage.stage_id == ContractBase.current_stage_id,
                    ContractStage.contract_id == ContractBase.id,
                    ContractStage.flow_id == ContractBase.flow_id)
            ).join(Stage, Stage.id == ContractBase.current_stage_id).join(
                Flow, Flow.id == ContractBase.flow_id).outerjoin(
                    ContractProperty,
                    ContractProperty.contract_id == ContractBase.id).outerjoin(
                        parent_specs,
                        ContractBase.id == parent_specs.c.id).join(
                            User, User.id == ContractBase.assigned_to).filter(
                                ContractStage.flow_id == ContractBase.flow_id,
                                ContractStage.entered != None,
                                ContractBase.assigned_to != None,
                                ContractBase.is_visible == False,
                                ContractBase.is_archived == False).group_by(
                                    ContractBase.id,
                                    ContractProperty.value.label(
                                        'spec_number'),
                                    parent_specs.c.value.label('parent_spec'),
                                    parent_specs.c.expiration_date.label(
                                        'parent_expiration'),
                                    parent_specs.c.contract_href.label(
                                        'parent_contract_href'),
                                    ContractBase.description, Flow.flow_name,
                                    Stage.name.label('stage_name'),
                                    ContractStage.entered, User.first_name,
                                    User.email,
                                    Department.name.label('department')).all()

    all_contracts = db.session.query(
        ContractBase.id, ContractBase.description, ContractBase.financial_id,
        ContractBase.expiration_date,
        ContractProperty.value.label('spec_number'),
        ContractBase.contract_href, ContractBase.department, User.first_name,
        User.email,
        db.func.array_remove(
            db.func.array_agg(Company.company_name),
            None).label('companies')).join(ContractType).outerjoin(
                User, User.id == ContractBase.assigned_to
            ).outerjoin(Company, ContractBase.companies).outerjoin(
                Department,
                Department.id == ContractBase.department_id).outerjoin(
                    ContractProperty,
                    ContractProperty.contract_id == ContractBase.id).filter(
                        ContractType.managed_by_conductor == True,
                        db.func.lower(ContractProperty.key) == 'spec number',
                        ContractBase.children == None,
                        ContractBase.is_visible == True).group_by(
                            ContractBase.id, ContractBase.description,
                            ContractBase.financial_id,
                            ContractBase.expiration_date,
                            ContractProperty.value.label('spec_number'),
                            ContractBase.contract_href,
                            ContractBase.department, User.first_name,
                            User.email).order_by(
                                ContractBase.expiration_date).all()

    conductors = User.query.filter(User.roles.any(Role.name == 'conductor'),
                                   User.email != current_user.email).all()

    current_app.logger.info('CONDUCTOR INDEX - Conductor index page view')

    return render_template('conductor/index.html',
                           in_progress=in_progress,
                           _all=all_contracts,
                           current_user=current_user,
                           conductors=[current_user] + conductors,
                           path='{path}?{query}'.format(
                               path=request.path, query=request.query_string))
def index():
    '''Main conductor index page/splash view

    Renders two tables that conductors can use to track their progress:
    ``in_progress``, which contains all of the
    :py:class:`~purchasing.data.contracts.ContractBase` objects that are
    currently being worked on by a conductor. ``in_progress`` contracts
    are generated by selecting only :py:class:`~purchasing.data.contracts.ContractBase`
    objects that have a ``parent_id``, have an existing ``flow``,
    non-null ``entered`` current contract stage, and are neither ``is_archived`` nor
    ``is_visible``.

    ``all_contracts`` contains all contracts that are eligible
    to show up in conductor to be worked on. These are filtered based on the
    :py:class:`~purchasing.data.contracts.ContractType`
    ``managed_by_conductor`` field. Additionally, these are
    filtered by having no ``children``, and ``is_visible`` set to True

    .. seealso:: :py:class:`~purchasing.data.contracts.ContractBase`,
        :py:class:`~purchasing.data.contract_stages.ContractStage`,
        :py:class:`~purchasing.data.flows.Flow`

    :status 200: Render the main conductor index page
    '''
    parent = aliased(ContractBase)

    parent_specs = db.session.query(
        ContractBase.id, ContractProperty.value,
        parent.expiration_date, parent.contract_href,
        Company.company_name
    ).join(
        ContractProperty,
        ContractBase.parent_id == ContractProperty.contract_id
    ).join(
        parent, ContractBase.parent
    ).outerjoin(
        Company, parent.companies
    ).filter(
        db.func.lower(ContractProperty.key) == 'spec number',
        ContractType.managed_by_conductor == True
    ).subquery()

    in_progress = db.session.query(
        db.distinct(ContractBase.id).label('id'),
        ContractProperty.value.label('spec_number'),
        parent_specs.c.value.label('parent_spec'),
        parent_specs.c.expiration_date.label('parent_expiration'),
        parent_specs.c.contract_href.label('parent_contract_href'),
        ContractBase.description, Flow.flow_name,
        Stage.name.label('stage_name'), ContractStage.entered,
        User.first_name, User.email,
        Department.name.label('department'),
        db.func.array_remove(
            db.func.array_agg(parent_specs.c.company_name),
            None
        ).label('companies')
    ).outerjoin(Department).join(
        ContractStage, db.and_(
            ContractStage.stage_id == ContractBase.current_stage_id,
            ContractStage.contract_id == ContractBase.id,
            ContractStage.flow_id == ContractBase.flow_id
        )
    ).join(
        Stage, Stage.id == ContractBase.current_stage_id
    ).join(
        Flow, Flow.id == ContractBase.flow_id
    ).outerjoin(
        ContractProperty, ContractProperty.contract_id == ContractBase.id
    ).outerjoin(
        parent_specs, ContractBase.id == parent_specs.c.id
    ).join(User, User.id == ContractBase.assigned_to).filter(
        ContractStage.flow_id == ContractBase.flow_id,
        ContractStage.entered != None,
        ContractBase.assigned_to != None,
        ContractBase.is_visible == False,
        ContractBase.is_archived == False
    ).group_by(
        ContractBase.id,
        ContractProperty.value.label('spec_number'),
        parent_specs.c.value.label('parent_spec'),
        parent_specs.c.expiration_date.label('parent_expiration'),
        parent_specs.c.contract_href.label('parent_contract_href'),
        ContractBase.description, Flow.flow_name,
        Stage.name.label('stage_name'), ContractStage.entered,
        User.first_name, User.email,
        Department.name.label('department')
    ).all()

    all_contracts = db.session.query(
        ContractBase.id, ContractBase.description,
        ContractBase.financial_id, ContractBase.expiration_date,
        ContractProperty.value.label('spec_number'),
        ContractBase.contract_href, ContractBase.department,
        User.first_name, User.email,
        db.func.array_remove(
            db.func.array_agg(Company.company_name),
            None
        ).label('companies')
    ).join(ContractType).outerjoin(
        User, User.id == ContractBase.assigned_to
    ).outerjoin(Company, ContractBase.companies).outerjoin(
        Department, Department.id == ContractBase.department_id
    ).outerjoin(
        ContractProperty, ContractProperty.contract_id == ContractBase.id
    ).filter(
        ContractType.managed_by_conductor == True,
        db.func.lower(ContractProperty.key) == 'spec number',
        ContractBase.children == None,
        ContractBase.is_visible == True
    ).group_by(
        ContractBase.id, ContractBase.description,
        ContractBase.financial_id, ContractBase.expiration_date,
        ContractProperty.value.label('spec_number'),
        ContractBase.contract_href, ContractBase.department,
        User.first_name, User.email
    ).order_by(ContractBase.expiration_date).all()

    conductors = User.query.filter(
        User.roles.any(Role.name == 'conductor'),
        User.email != current_user.email
    ).all()

    current_app.logger.info('CONDUCTOR INDEX - Conductor index page view')

    return render_template(
        'conductor/index.html',
        in_progress=in_progress, _all=all_contracts,
        current_user=current_user,
        conductors=[current_user] + conductors,
        path='{path}?{query}'.format(
            path=request.path, query=request.query_string
        )
    )