Projet

Général

Profil

0001-backoffice-organize-workflows-by-categories-in-selec.patch

Lauréline Guérin, 21 février 2022 11:05

Télécharger (6,61 ko)

Voir les différences:

Subject: [PATCH] backoffice: organize workflows by categories in select widget
 (#56002)

 tests/admin_pages/test_form.py | 63 +++++++++++++++++++++++++++++++++-
 wcs/admin/forms.py             | 41 +++++++++++++++++++---
 2 files changed, 99 insertions(+), 5 deletions(-)
tests/admin_pages/test_form.py
11 11

  
12 12
from wcs import fields
13 13
from wcs.carddef import CardDef
14
from wcs.categories import Category
14
from wcs.categories import Category, WorkflowCategory
15 15
from wcs.data_sources import NamedDataSource
16 16
from wcs.formdef import FormDef
17 17
from wcs.qommon.errors import ConnectionError
......
553 553

  
554 554
    resp = app.get('/backoffice/forms/1/')
555 555
    resp = resp.click(href='workflow', index=1)
556
    # no categories, no optgroup
557
    assert [x[2] for x in resp.form['workflow_id'].options] == ['Default', 'Workflow Two']
556 558
    assert 'Workflow One' not in resp.text  # this workflow doesn't have any status
557 559
    resp.forms[0]['workflow_id'] = workflow.id
558 560
    resp = resp.forms[0].submit('submit')
......
561 563
    # run a SQL SELECT and we known all columns are defined.
562 564
    FormDef.get(formdef.id).data_class().select()
563 565

  
566
    Category.wipe()
567
    WorkflowCategory.wipe()
568
    cat1 = WorkflowCategory(name='Foo')
569
    cat1.store()
570
    cat2 = WorkflowCategory(name='Bar')
571
    cat2.store()
572

  
573
    wf = Workflow(name='Workflow Foo zz')
574
    wf.possible_status = Workflow.get_default_workflow().possible_status[:]
575
    wf.category = cat1
576
    wf.store()
577
    wf = Workflow(name='Workflow Foo aa')
578
    wf.possible_status = Workflow.get_default_workflow().possible_status[:]
579
    wf.category = cat1
580
    wf.store()
581
    wf = Workflow(name='Workflow Bar bb')
582
    wf.possible_status = Workflow.get_default_workflow().possible_status[:]
583
    wf.category = cat2
584
    wf.store()
585
    wf = Workflow(name='Workflow Bar yy')
586
    wf.possible_status = Workflow.get_default_workflow().possible_status[:]
587
    wf.category = cat2
588
    wf.store()
589
    resp = app.get('/backoffice/forms/1/workflow')
590
    assert [x[2] for x in resp.form['workflow_id'].options] == [
591
        'Workflow Bar bb',
592
        'Workflow Bar yy',
593
        'Workflow Foo aa',
594
        'Workflow Foo zz',
595
        'Default',
596
        'Workflow Two',
597
    ]
598

  
599
    cat = Category(name='Foo')
600
    cat.store()
601
    formdef.category = cat
602
    formdef.store()
603
    resp = app.get('/backoffice/forms/1/workflow')
604
    assert [x[2] for x in resp.form['workflow_id'].options] == [
605
        'Workflow Foo aa',
606
        'Workflow Foo zz',
607
        'Workflow Bar bb',
608
        'Workflow Bar yy',
609
        'Default',
610
        'Workflow Two',
611
    ]
612

  
613
    workflow.category = cat1
614
    workflow.store()
615
    resp = app.get('/backoffice/forms/1/workflow')
616
    assert [x[2] for x in resp.form['workflow_id'].options] == [
617
        'Workflow Foo aa',
618
        'Workflow Foo zz',
619
        'Workflow Two',
620
        'Workflow Bar bb',
621
        'Workflow Bar yy',
622
        'Default',
623
    ]
624

  
564 625

  
565 626
def test_form_workflow_link(pub):
566 627
    create_superuser(pub)
wcs/admin/forms.py
19 19
import tarfile
20 20
import time
21 21
import xml.etree.ElementTree as ET
22
from collections import defaultdict
22 23

  
23 24
from quixote import get_publisher, get_request, get_response, get_session, redirect
24 25
from quixote.directory import AccessControlled, Directory
......
41 42
    FileWidget,
42 43
    Form,
43 44
    HtmlWidget,
45
    OptGroup,
44 46
    SingleSelectWidget,
45 47
    SlugWidget,
46 48
    StringWidget,
......
87 89
        return get_categories(self.category_class, filter_function=filter_function)
88 90

  
89 91
    @classmethod
90
    def get_workflows(cls, condition=lambda x: True):
92
    def get_workflows(cls, condition=lambda x: True, formdef_category=None):
91 93
        default_workflow = cls.formdef_class.get_default_workflow()
92
        t = sorted((misc.simplify(x.name), x.id, x.name, x.id) for x in Workflow.select() if condition(x))
93
        return [(None, default_workflow.name, '')] + [x[1:] for x in t]
94
        t = sorted(
95
            (misc.simplify(x.name), x.category, x.id, x.name, x.id) for x in Workflow.select() if condition(x)
96
        )
97
        workflows_by_category_names = defaultdict(list)
98
        for x in t:
99
            name = ''
100
            if x[1]:
101
                name = x[1].name
102
            workflows_by_category_names[name].append(x[2:])
103
        category_names = list(workflows_by_category_names.keys())
104
        if len(category_names) == 1 and category_names[0] == '':
105
            # no category found
106
            return [(None, default_workflow.name, '')] + [x[2:] for x in t]
107
        options = []
108
        # first options, workflows with the same category name as updated formdef
109
        if formdef_category and formdef_category.name in workflows_by_category_names:
110
            options.append(OptGroup(formdef_category.name))
111
            options.extend(workflows_by_category_names[formdef_category.name])
112
        # then other categories
113
        for name in sorted(category_names):
114
            if not name:
115
                continue
116
            if formdef_category and formdef_category.name == name:
117
                continue
118
            options.append(OptGroup(name))
119
            options.extend(workflows_by_category_names[name])
120
        # and workflows without category
121
        options.append(OptGroup(_('Without category')))
122
        options.append((None, default_workflow.name, ''))
123
        options.extend(workflows_by_category_names[''])
124
        return options
94 125

  
95 126
    def new_form_ui(self):
96 127
        form = Form(enctype='multipart/form-data')
......
1058 1089

  
1059 1090
    def workflow(self):
1060 1091
        form = Form(enctype='multipart/form-data')
1061
        workflows = self.formdef_ui_class.get_workflows(condition=lambda x: x.possible_status)
1092
        workflows = self.formdef_ui_class.get_workflows(
1093
            condition=lambda x: x.possible_status, formdef_category=self.formdef.category
1094
        )
1062 1095
        form.add(SingleSelectWidget, 'workflow_id', value=self.formdef.workflow_id, options=workflows)
1063 1096
        if not self.formdef.is_readonly():
1064 1097
            form.add_submit('submit', _('Submit'))
1065
-