Projet

Général

Profil

0001-backoffice-apply-form-user-as-current-user-filter-on.patch

Frédéric Péters, 01 juillet 2022 17:52

Télécharger (6,05 ko)

Voir les différences:

Subject: [PATCH] backoffice: apply form user as "current user" filter on card
 sources (#66870)

 tests/backoffice_pages/test_submission.py | 100 ++++++++++++++++++++++
 wcs/backoffice/management.py              |  12 ++-
 2 files changed, 110 insertions(+), 2 deletions(-)
tests/backoffice_pages/test_submission.py
8 8

  
9 9
from wcs import fields
10 10
from wcs.api_utils import sign_url
11
from wcs.carddef import CardDef
11 12
from wcs.formdef import FormDef
12 13
from wcs.qommon.http_request import HTTPRequest
13 14
from wcs.workflows import Workflow, WorkflowBackofficeFieldsFormDef
......
1632 1633
    assert live_resp.json == {'result': {'3': {'visible': True, 'content': 'test9@invalid'}}}
1633 1634

  
1634 1635

  
1636
def test_backoffice_submission_user_selection_then_card_data_source(pub):
1637
    pub.session_manager.session_class.wipe()
1638

  
1639
    user = create_user(pub)
1640

  
1641
    for i in range(10):
1642
        random_user = pub.user_class()
1643
        random_user.name = 'random user %s' % i
1644
        random_user.email = 'test%s@invalid' % i
1645
        random_user.store()
1646

  
1647
    CardDef.wipe()
1648
    carddef = CardDef()
1649
    carddef.name = 'foo'
1650
    carddef.fields = []
1651
    carddef.digest_templates = {'default': 'card {{ form_number }}'}
1652
    carddef.backoffice_submission_roles = user.roles
1653
    carddef.workflow_roles = {'_editor': user.roles[0]}
1654
    carddef.user_support = 'optional'
1655
    carddef.store()
1656

  
1657
    carddata = carddef.data_class()()
1658
    carddata.data = {}
1659
    carddata.user_id = user.id
1660
    carddata.just_created()
1661
    carddata.store()
1662

  
1663
    for i in range(3):
1664
        carddata = carddef.data_class()()
1665
        carddata.data = {}
1666
        carddata.user_id = random_user.id
1667
        carddata.just_created()
1668
        carddata.store()
1669

  
1670
    pub.custom_view_class.wipe()
1671
    custom_view = pub.custom_view_class()
1672
    custom_view.title = 'shared custom test view'
1673
    custom_view.formdef = carddef
1674
    custom_view.visibility = 'datasource'
1675
    custom_view.columns = {'list': [{'id': 'id'}]}
1676
    custom_view.filters = {
1677
        'filter-user': 'on',
1678
        'filter-user-value': '__current__',
1679
    }
1680
    custom_view.store()
1681

  
1682
    Workflow.wipe()
1683
    workflow = Workflow(name='wfedit')
1684
    st1 = workflow.add_status('Status1')
1685
    wfedit = st1.add_action('editable', id='_wfedit')
1686
    wfedit.by = [user.roles[0]]
1687
    workflow.store()
1688

  
1689
    FormDef.wipe()
1690
    formdef = FormDef()
1691
    formdef.name = 'form title'
1692
    formdef.fields = [
1693
        fields.PageField(id='1', label='1st page', type='page'),
1694
        fields.PageField(id='2', label='2nd page', type='page'),
1695
        fields.ItemField(
1696
            id='3',
1697
            label='Test',
1698
            type='item',
1699
            data_source={'type': 'carddef:foo:%s' % custom_view.slug, 'value': ''},
1700
        ),
1701
    ]
1702
    formdef.backoffice_submission_roles = user.roles[:]
1703
    formdef.workflow_roles = {'_receiver': 1}
1704
    formdef.workflow_id = workflow.id
1705
    formdef.store()
1706
    formdef.data_class().wipe()
1707

  
1708
    app = login(get_app(pub))
1709
    resp = app.get('/backoffice/submission/%s/' % formdef.url_name)
1710

  
1711
    resp = resp.form.submit('submit')  # -> 2nd page
1712
    # check the field doesn't propose cards linked to agent
1713
    assert resp.form['f3'].options == [('', False, '---')]
1714

  
1715
    formdef.data_class().wipe()
1716
    resp = app.get('/backoffice/submission/%s/' % formdef.url_name)
1717
    resp.form['user_id'] = str(random_user.id)  # happens via javascript
1718
    resp = resp.form.submit('submit')  # -> 2nd page
1719
    # check three cards are proposed
1720
    assert len(resp.form['f3'].options) == 3
1721
    resp = resp.form.submit('submit')  # -> validation page
1722
    resp = resp.form.submit('submit')  # -> submit
1723
    assert formdef.data_class().count() == 1
1724
    formdata = formdef.data_class().select()[0]
1725
    assert formdata.data['3_display'] == 'card 2'
1726

  
1727
    # check it's also ok during edition
1728
    resp = app.get(formdata.get_backoffice_url())
1729
    resp = resp.form.submit('button_wfedit')
1730
    resp = resp.follow()
1731
    resp = resp.form.submit('submit')  # page 2
1732
    assert len(resp.form['f3'].options) == 3
1733

  
1734

  
1635 1735
def test_backoffice_submission_sidebar_lateral_block(pub):
1636 1736
    user = create_user(pub)
1637 1737

  
wcs/backoffice/management.py
2047 2047
                    criterias.append(LessOrEqual('last_update_time', filter_date_value))
2048 2048
                criterias[-1]._label = '%s: %s' % (filter_field.label, filter_field_value)
2049 2049
            elif filter_field.type == 'user-id':
2050
                if filter_field_value == '__current__' and get_request().user:
2051
                    filter_field_value = str(get_request().user.id)
2050
                if filter_field_value == '__current__':
2051
                    context_vars = get_publisher().substitutions.get_context_variables(mode='lazy')
2052
                    if get_request().is_in_backoffice() and context_vars.get('form'):
2053
                        # in case of backoffice submission/edition, take user associated
2054
                        # with the form being submitted/edited, if any.
2055
                        form_user = context_vars.get('form_user')
2056
                        if form_user:
2057
                            filter_field_value = str(form_user.id)
2058
                    elif get_request().user:
2059
                        filter_field_value = str(get_request().user.id)
2052 2060
                criterias.append(Equal('user_id', filter_field_value))
2053 2061
            elif filter_field.type == 'submission-agent-id':
2054 2062
                criterias.append(Equal('submission_agent_id', filter_field_value))
2055
-