0001-backoffice-organize-workflows-by-categories-in-selec.patch
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 |
- |