workflows: consider custom id when looking for carddata (#88024)
gitea/wcs/pipeline/head Build queued...
Details
gitea/wcs/pipeline/head Build queued...
Details
This commit is contained in:
parent
4ba3ebf6b4
commit
1b976a36a7
|
@ -1119,6 +1119,117 @@ def test_edit_carddata_targeting_itself(pub):
|
|||
assert carddata.status == 'wf-%s' % st2.id
|
||||
|
||||
|
||||
def test_edit_carddata_auto_targeting_custom_id(pub):
|
||||
CardDef.wipe()
|
||||
|
||||
carddef = CardDef()
|
||||
carddef.name = 'Foo Card'
|
||||
carddef.fields = [
|
||||
StringField(id='0', label='foo', varname='foo'),
|
||||
StringField(id='1', label='slug', varname='slug'),
|
||||
]
|
||||
carddef.id_template = 'card_{{form_var_slug}}'
|
||||
carddef.store()
|
||||
carddef.data_class().wipe()
|
||||
|
||||
carddata = carddef.data_class()()
|
||||
carddata.data = {'0': 'foo', '1': 'foo'}
|
||||
carddata.store()
|
||||
carddata.just_created()
|
||||
carddata.store()
|
||||
assert carddata.identifier == 'card_foo'
|
||||
|
||||
carddef2 = CardDef()
|
||||
carddef2.name = 'Bar Card'
|
||||
carddef2.fields = [
|
||||
ItemField(id='1', label='card', varname='card', data_source={'type': 'carddef:%s' % carddef.url_name})
|
||||
]
|
||||
carddef2.store()
|
||||
|
||||
card_wf = Workflow(name='Card workflow')
|
||||
st1 = card_wf.add_status('Status1')
|
||||
st2 = card_wf.add_status('Status2')
|
||||
|
||||
edit = st1.add_action('edit_carddata', id='_edit')
|
||||
edit.formdef_slug = carddef.url_name
|
||||
edit.target_mode = 'all'
|
||||
edit.mappings = [Mapping(field_id='0', expression='bar')]
|
||||
|
||||
jump = st1.add_action('jump', '_jump')
|
||||
jump.status = st2.id
|
||||
|
||||
card_wf.store()
|
||||
|
||||
carddef2.workflow = card_wf
|
||||
carddef2.store()
|
||||
|
||||
carddata2 = carddef2.data_class()()
|
||||
carddata2.data = {
|
||||
'1': 'card_foo',
|
||||
}
|
||||
carddata2.store()
|
||||
carddata2.just_created()
|
||||
carddata2.store()
|
||||
carddata2.perform_workflow()
|
||||
|
||||
carddata.refresh_from_storage()
|
||||
assert carddata.data['0'] == 'bar'
|
||||
|
||||
|
||||
def test_edit_carddata_manual_targeting_custom_id(pub):
|
||||
CardDef.wipe()
|
||||
|
||||
carddef = CardDef()
|
||||
carddef.name = 'Foo Card'
|
||||
carddef.fields = [
|
||||
StringField(id='0', label='foo', varname='foo'),
|
||||
StringField(id='1', label='slug', varname='slug'),
|
||||
]
|
||||
carddef.id_template = 'card_{{form_var_slug}}'
|
||||
carddef.store()
|
||||
carddef.data_class().wipe()
|
||||
|
||||
carddata = carddef.data_class()()
|
||||
carddata.data = {'0': 'foo', '1': 'foo'}
|
||||
carddata.store()
|
||||
carddata.just_created()
|
||||
carddata.store()
|
||||
assert carddata.identifier == 'card_foo'
|
||||
|
||||
carddef2 = CardDef()
|
||||
carddef2.name = 'Bar Card'
|
||||
carddef2.fields = []
|
||||
carddef2.store()
|
||||
|
||||
card_wf = Workflow(name='Card workflow')
|
||||
st1 = card_wf.add_status('Status1')
|
||||
st2 = card_wf.add_status('Status2')
|
||||
|
||||
edit = st1.add_action('edit_carddata', id='_edit')
|
||||
edit.formdef_slug = carddef.url_name
|
||||
edit.target_mode = 'manual'
|
||||
edit.target_id = 'card_foo'
|
||||
edit.mappings = [Mapping(field_id='0', expression='bar')]
|
||||
|
||||
jump = st1.add_action('jump', '_jump')
|
||||
jump.status = st2.id
|
||||
|
||||
card_wf.store()
|
||||
|
||||
carddef2.workflow = card_wf
|
||||
carddef2.store()
|
||||
|
||||
carddata2 = carddef2.data_class()()
|
||||
carddata2.data = {}
|
||||
carddata2.store()
|
||||
carddata2.just_created()
|
||||
carddata2.store()
|
||||
carddata2.perform_workflow()
|
||||
|
||||
carddata.refresh_from_storage()
|
||||
assert carddata.data['0'] == 'bar'
|
||||
|
||||
|
||||
def test_edit_carddata_from_created_object(pub):
|
||||
FormDef.wipe()
|
||||
CardDef.wipe()
|
||||
|
|
|
@ -19,7 +19,7 @@ from quixote import get_publisher, get_request, get_session
|
|||
from wcs.formdata import FormData
|
||||
|
||||
from .qommon import _
|
||||
from .sql_criterias import Equal, Null, StrictNotEqual
|
||||
from .sql_criterias import Equal
|
||||
|
||||
|
||||
class CardData(FormData):
|
||||
|
@ -39,20 +39,6 @@ class CardData(FormData):
|
|||
|
||||
formdef = property(get_formdef)
|
||||
|
||||
@classmethod
|
||||
def get_by_id(cls, value):
|
||||
try:
|
||||
return cls.select(
|
||||
[
|
||||
StrictNotEqual('status', 'draft'),
|
||||
Null('anonymised'),
|
||||
cls._formdef.get_by_id_criteria(value),
|
||||
],
|
||||
limit=1,
|
||||
)[0]
|
||||
except IndexError:
|
||||
raise KeyError(value)
|
||||
|
||||
def get_data_source_structured_item(
|
||||
self, digest_key='default', group_by=None, with_related_urls=False, with_files_urls=False
|
||||
):
|
||||
|
|
|
@ -32,7 +32,7 @@ from quixote.errors import RequestError
|
|||
from quixote.html import htmltext
|
||||
from quixote.http_request import Upload
|
||||
|
||||
from wcs.sql_criterias import And, Contains, Equal, Intersects
|
||||
from wcs.sql_criterias import And, Contains, Equal, Intersects, Null, StrictNotEqual
|
||||
|
||||
from .qommon import _, misc
|
||||
from .qommon.evalutils import make_datetime
|
||||
|
@ -365,7 +365,10 @@ class FormData(StorableObject):
|
|||
def get_by_id(cls, value):
|
||||
if cls._formdef.id_template:
|
||||
try:
|
||||
return cls.select([Equal('id_display', str(value))], limit=1)[0]
|
||||
return cls.select(
|
||||
[StrictNotEqual('status', 'draft'), Null('anonymised'), Equal('id_display', str(value))],
|
||||
limit=1,
|
||||
)[0]
|
||||
except IndexError:
|
||||
raise KeyError(value)
|
||||
return cls.get(value)
|
||||
|
@ -1932,7 +1935,7 @@ class FormData(StorableObject):
|
|||
if object_type:
|
||||
# workflow action
|
||||
try:
|
||||
yield objectdef.data_class().get(target_id)
|
||||
yield objectdef.data_class().get_by_id(target_id)
|
||||
except KeyError:
|
||||
# linked object may be missing
|
||||
pass
|
||||
|
@ -1952,7 +1955,7 @@ class FormData(StorableObject):
|
|||
_('%s - not found') % origin,
|
||||
)
|
||||
else:
|
||||
yield (_objectdef.data_class().get(target_id), origin)
|
||||
yield (_objectdef.data_class().get_by_id(target_id), origin)
|
||||
except ValueError:
|
||||
pass
|
||||
except KeyError:
|
||||
|
|
|
@ -267,7 +267,7 @@ class ExternalWorkflowGlobalAction(WorkflowStatusItem):
|
|||
return
|
||||
|
||||
try:
|
||||
yield objectdef.data_class().get(target_id)
|
||||
yield objectdef.data_class().get_by_id(target_id)
|
||||
except KeyError as e:
|
||||
# use custom error message depending on target type
|
||||
get_publisher().record_error(
|
||||
|
|
Loading…
Reference in New Issue