Projet

Général

Profil

auquo-0001-consider-all-user-forms-even-if-formdef-if-disabled-.patch

Thomas Noël, 20 juin 2016 17:56

Télécharger (5,97 ko)

Voir les différences:

Subject: [PATCH] consider all user forms, even if formdef if disabled (#11288)

 extra/modules/myspace.py |   6 +--
 extra/modules/root.py    |   2 +-
 tests/test_user_pages.py | 120 +++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 124 insertions(+), 4 deletions(-)
 create mode 100644 tests/test_user_pages.py
extra/modules/myspace.py
383 383
        return Directory._q_traverse(self, path)
384 384

  
385 385
    def forms(self):
386
        formdefs = FormDef.select(lambda x: not x.is_disabled(), order_by = 'name')
386
        formdefs = FormDef.select(order_by='name', ignore_errors=True)
387 387
        user_forms = []
388 388
        for formdef in formdefs:
389 389
            user_forms.extend(formdef.data_class().get_with_indexed_value(
......
401 401
        forms_output = []
402 402
        for form in user_forms:
403 403
            visible_status = form.get_visible_status(user=self.user)
404
            # skip hidden forms
404
            # skip drafts and hidden forms
405 405
            if not visible_status:
406 406
                continue
407 407
            name = form.formdef.name
......
455 455

  
456 456
        user_forms = []
457 457
        if user:
458
            formdefs = FormDef.select(lambda x: not x.is_disabled(), order_by = 'name')
458
            formdefs = FormDef.select(order_by='name', ignore_errors=True)
459 459
            user_forms = []
460 460
            for formdef in formdefs:
461 461
                user_forms.extend(formdef.data_class().get_with_indexed_value(
extra/modules/root.py
84 84
        r = TemplateIO(html=True)
85 85
        base_url = get_publisher().get_root_url()
86 86

  
87
        draft = [x for x in user_forms if x.is_draft()]
87
        draft = [x for x in user_forms if x.is_draft() and not x.formdef.is_disabled()]
88 88
        if draft:
89 89
            r += htmltext('<h4 id="drafts">%s</h4>') % _('My Current Drafts')
90 90
            r += htmltext('<ul>')
tests/test_user_pages.py
1
import os
2
import shutil
3
import StringIO
4
import time
5

  
6
import pytest
7

  
8
from quixote import cleanup, get_publisher
9
from wcs.qommon import errors, sessions
10
from qommon.ident.password_accounts import PasswordAccount
11
from wcs.qommon.http_request import HTTPRequest
12
from wcs.qommon.template import get_current_theme
13
from wcs.categories import Category
14
from wcs.roles import Role
15
from wcs.workflows import Workflow
16
from wcs.formdef import FormDef
17
from wcs import fields
18

  
19
from utilities import get_app, login, create_temporary_pub
20

  
21
def setup_module(module):
22
    cleanup()
23

  
24
    global pub
25

  
26
    pub = create_temporary_pub()
27

  
28
    req = HTTPRequest(None, {'SCRIPT_NAME': '/', 'SERVER_NAME': 'example.net'})
29
    pub.set_app_dir(req)
30
    pub.cfg['identification'] = {'methods': ['password']}
31
    pub.write_cfg()
32

  
33
def create_user():
34
    if pub.user_class.has_key('user'):
35
        return
36
    user1 = pub.user_class(name='user')
37
    user1.id = 'admin'
38
    user1.is_admin = False
39
    user1.store()
40

  
41
    account1 = PasswordAccount(id='user')
42
    account1.set_password('user')
43
    account1.user_id = user1.id
44
    account1.store()
45

  
46
    pub.cfg['identification'] = {'methods': ['password']}
47
    pub.write_cfg()
48

  
49
    return user1
50

  
51
def create_formdef():
52
    FormDef.wipe()
53
    formdef = FormDef()
54
    formdef.name = 'test'
55
    formdef.fields = []
56
    formdef.store()
57
    return formdef
58

  
59
def teardown_module(module):
60
    shutil.rmtree(pub.APP_DIR)
61

  
62
def test_with_user():
63
    user = create_user()
64
    app = login(get_app(pub), username='user', password='user')
65
    resp = app.get('/', status=200)
66
    resp = app.get('/myspace/', status=200)
67

  
68
def test_myspace_with_user_forms():
69
    user = create_user()
70
    formdef = create_formdef()
71

  
72
    cat = Category(name='cat')
73
    cat.store()
74
    formdef.category_id = cat.id
75

  
76
    wf = Workflow(name='status')
77
    st1 = wf.add_status('Status1', 'st1')
78
    wf.store()
79
    formdef.workflow_id = wf.id
80
    formdef.store()
81

  
82
    formdef.data_class().wipe()
83
    formdata = formdef.data_class()()
84
    formdata.user_id = user.id
85
    formdata.status = 'wf-st1'
86
    formdata.data = {}
87
    formdata.store()
88
    draft = formdef.data_class()()
89
    draft.user_id = user.id
90
    draft.status = 'draft'
91
    draft.data = {}
92
    draft.store()
93

  
94
    app = login(get_app(pub), username='user', password='user')
95
    resp = app.get('/myspace/')
96
    assert 'Status1' in resp
97
    assert '<a href="/cat/test/%s/"' % formdata.id in resp
98
    assert 'Draft' in resp
99
    assert '<a href="/cat/test/%s"' % draft.id in resp
100
    resp = app.get('/cat/test/%s' % formdata.id)
101
    resp.status_int = 200
102
    resp = app.get('/cat/test/%s' % draft.id, status=302)
103
    resp = resp.follow(status=302)
104
    resp.location.startswith('http://example.net/cat/test/?mt=')
105
    resp = resp.follow(status=200)
106

  
107
    # disable formdef: formdatas are still visible and accessible, drafts are not
108
    formdef.disabled = True
109
    formdef.store()
110
    resp = app.get('/myspace/')
111
    assert 'Status1' in resp
112
    assert '<a href="/cat/test/%s/"' % formdata.id in resp
113
    assert not 'Draft' in resp
114
    assert not '<a href="/cat/test/%s"' % draft.id in resp
115
    resp = app.get('/cat/test/%s' % formdata.id)
116
    resp.status_int = 200
117
    resp = app.get('/cat/test/%s' % draft.id, status=302)
118
    resp = resp.follow(status=302)
119
    resp.location.startswith('http://example.net/cat/test/?mt=')
120
    resp = resp.follow(status=403)
0
-