Projet

Général

Profil

0001-backoffice-make-edit-workflow-stay-in-backoffice-909.patch

Frédéric Péters, 26 novembre 2015 22:16

Télécharger (5,87 ko)

Voir les différences:

Subject: [PATCH] backoffice: make 'edit' workflow stay in backoffice (#9093)

 tests/test_backoffice_pages.py | 40 +++++++++++++++++++++++++++++++++++++++-
 wcs/backoffice/management.py   | 19 +++++++++++++++++++
 wcs/backoffice/submission.py   |  7 +++++--
 wcs/workflows.py               |  2 +-
 4 files changed, 64 insertions(+), 4 deletions(-)
tests/test_backoffice_pages.py
17 17
from wcs.qommon.http_request import HTTPRequest
18 18
from wcs.roles import Role
19 19
from wcs.workflows import (Workflow, CommentableWorkflowStatusItem,
20
        ChoiceWorkflowStatusItem)
20
        ChoiceWorkflowStatusItem, EditableWorkflowStatusItem)
21 21
from wcs.wf.wscall import WebserviceCallStatusItem
22 22
from wcs.categories import Category
23 23
from wcs.formdef import FormDef
......
1049 1049
    assert (' with the number %s.' % number31) in resp.body
1050 1050
    assert not 'Error during webservice call' in resp.body
1051 1051

  
1052
def test_backoffice_wfedit(pub):
1053
    user = create_user(pub)
1054
    create_environment(pub)
1055
    formdef = FormDef.get_by_urlname('form-title')
1056
    form_class = formdef.data_class()
1057

  
1058
    number31 = [x for x in form_class.select() if x.data['1'] == 'FOO BAR 30'][0]
1059

  
1060
    # attach a custom workflow
1061
    workflow = Workflow(name='wfedit')
1062
    st1 = workflow.add_status('Status1', number31.status.split('-')[1])
1063

  
1064
    wfedit = EditableWorkflowStatusItem()
1065
    wfedit.id = '_wfedit'
1066
    wfedit.by = [user.roles[0]]
1067
    st1.items.append(wfedit)
1068
    wfedit.parent = st1
1069
    workflow.store()
1070

  
1071
    formdef.workflow_id = workflow.id
1072
    formdef.store()
1073

  
1074
    app = login(get_app(pub))
1075

  
1076
    resp = app.get('/backoffice/management/form-title/%s/' % number31.id)
1077
    assert (' with the number %s.' % number31.id) in resp.body
1078
    resp = resp.form.submit('button_wfedit')
1079
    resp = resp.follow()
1080
    assert resp.form['f1'].value == number31.data['1']
1081
    assert resp.form['f2'].value == number31.data['2']
1082
    assert resp.form['f3'].value == number31.data['3']
1083
    assert 'value="Save Changes"' in resp.body
1084
    resp.form['f2'].value = 'bar'
1085
    resp = resp.form.submit('submit')
1086
    resp = resp.follow()
1087
    assert form_class().get(number31.id).data['2'] == 'bar'
1088
    number31.store()
1089

  
1052 1090
def test_global_listing(pub):
1053 1091
    if not pub.is_using_postgresql():
1054 1092
        pytest.skip('this requires SQL')
wcs/backoffice/management.py
51 51
from wcs.categories import Category
52 52
from wcs.formdef import FormDef
53 53
from wcs.roles import logged_users_role
54
from wcs.workflows import EditableWorkflowStatusItem
55

  
56
from .submission import FormFillPage
54 57

  
55 58

  
56 59
class SendCodeFormdefDirectory(Directory):
......
1547 1550

  
1548 1551

  
1549 1552
class FormBackOfficeStatusPage(FormStatusPage):
1553
    _q_exports = ['', 'download', 'json', 'wfedit']
1554

  
1550 1555
    def html_top(self, title = None):
1551 1556
        return html_top('management', title)
1552 1557

  
......
1669 1674

  
1670 1675
        return r.getvalue()
1671 1676

  
1677
    def wfedit(self):
1678
        wf_status = self.filled.get_status()
1679
        for item in wf_status.items:
1680
            if not isinstance(item, EditableWorkflowStatusItem):
1681
                continue
1682
            if item.check_auth(self.filled, get_request().user):
1683
                f = FormFillPage(self.formdef.url_name)
1684
                f.edit_mode = True
1685
                get_response().breadcrumb = get_response().breadcrumb[:-1]
1686
                get_response().breadcrumb.append( ('wfedit', _('Edit')) )
1687
                return f._q_index(editing=self.filled)
1688

  
1689
        raise errors.AccessForbiddenError()
1690

  
1672 1691

  
1673 1692
class FakeField(object):
1674 1693
    def __init__(self, id, type_, label):
wcs/backoffice/submission.py
25 25
from wcs.categories import Category
26 26
from wcs.forms.root import FormPage as PublicFormFillPage
27 27

  
28
from .management import FormBackOfficeStatusPage
29

  
30 28

  
31 29
class FormFillPage(PublicFormFillPage):
30
    edit_mode = False
31

  
32 32
    def html_top(self, *args, **kwargs):
33 33
        return html_top('submission', *args, **kwargs)
34 34

  
35 35
    def check_role(self):
36
        if self.edit_mode:
37
            return True
36 38
        if not self.formdef.backoffice_submission_roles:
37 39
            raise errors.AccessUnauthorizedError()
38 40
        for role in get_request().user.roles or []:
......
57 59
                r += htmltext('<p>-</p>')
58 60

  
59 61
        if formdata and formdata.submission_context:
62
            from .management import FormBackOfficeStatusPage
60 63
            r += FormBackOfficeStatusPage(self.formdef, formdata).get_extra_context_bar()
61 64

  
62 65
        return r.getvalue()
wcs/workflows.py
1656 1656

  
1657 1657
    def submit_form(self, form, formdata, user, evo):
1658 1658
        if form.get_submit() == 'button%s' % self.id:
1659
            return formdata.get_url() + 'wfedit'
1659
            return formdata.get_url(backoffice=get_request().is_in_backoffice()) + 'wfedit'
1660 1660

  
1661 1661
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
1662 1662
        if 'by' in parameters:
1663
-