workflows: consider custom id when looking for carddata (#88024)
gitea/wcs/pipeline/head Build queued... Details

This commit is contained in:
Frédéric Péters 2024-03-11 18:18:59 +01:00
parent 4ba3ebf6b4
commit 1b976a36a7
4 changed files with 120 additions and 20 deletions

View File

@ -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()

View File

@ -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
):

View File

@ -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:

View File

@ -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(