wcs: display field labels an hide cell slug if possible (#68643)
gitea-wip/combo/pipeline/head Build started... Details
gitea/combo/pipeline/head Something is wrong with the build of this commit Details

This commit is contained in:
Lauréline Guérin 2022-09-02 11:38:11 +02:00
parent f47971df8a
commit c43d003e54
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
3 changed files with 226 additions and 78 deletions

View File

@ -1102,7 +1102,7 @@ class WcsCardCell(CardMixin, CellBase):
if not self.carddef_reference:
return []
def iter_relations(relations, path, label, carddefs_already_seen):
def iter_relations(relations, path, labels, source_label, carddefs_already_seen):
carddefs_already_seen = carddefs_already_seen[:]
for relation in relations:
new_path = '%s/%s%s' % (
@ -1110,15 +1110,21 @@ class WcsCardCell(CardMixin, CellBase):
'reverse:' if relation['reverse'] else '',
relation['varname'],
)
_new_label = '%s/%s%s' % (
label,
relation['varname'],
' (reverse)' if relation['reverse'] else '',
)
new_label = _('Linked card: %s') % _new_label
new_labels = copy.deepcopy(labels)
new_labels.append('"%s"' % (relation.get('label') or relation['varname']))
if relation['reverse']:
label = _('Linked cards%s: %s (reverse relation)') % (
source_label,
' -> '.join(reversed(new_labels)),
)
else:
if relation['type'] == 'items':
label = _('Linked cards%s: %s') % (source_label, ' -> '.join(new_labels))
else:
label = _('Linked card%s: %s') % (source_label, ' -> '.join(new_labels))
if relation['obj'] == 'carddef:%s' % self.card_slug:
# target carddef found
yield (new_path, new_label)
yield (new_path, label)
if not relation['reverse'] and relation['type'] in ['item', 'computed']:
# relation is not multiple, continue to search for matching relations
new_card_slug = relation['obj'][8:] # remove 'carddef:'
@ -1128,28 +1134,29 @@ class WcsCardCell(CardMixin, CellBase):
yield from iter_relations(
relations=new_card_schema.get('relations') or [],
path=new_path,
label=_new_label,
labels=new_labels,
source_label=source_label,
carddefs_already_seen=carddefs_already_seen,
)
# get cells with explicit ids
results = []
for cell in WcsCardCell.objects.filter(page=self.page_id).exclude(pk=self.pk):
if not cell.slug:
# no slug
continue
if cell.related_card_path:
# no explicit ids
continue
if ',' in cell.card_ids:
# multiple ids, can not follow relations
continue
cells = (
WcsCardCell.objects.filter(page=self.page_id)
.exclude(pk=self.pk)
.exclude(slug='') # no slug
.filter(related_card_path='') # no explicit ids
.exclude(card_ids__contains=',') # multiple ids, can not follow relations
)
many_cells = len(cells) > 1
for cell in cells:
# follow relations
results += list(
iter_relations(
relations=cell.cached_json.get('relations') or [],
path=cell.slug,
label=cell.slug,
labels=[],
source_label=' (%s)' % (_('From cell %s') % cell.slug) if many_cells else '',
carddefs_already_seen=[self.card_slug],
)
)

View File

@ -500,12 +500,12 @@ def test_manager_card_cell(mock_send, app, admin_user):
assert resp.forms[1]['c%s-related_card_path' % cell2.get_reference()].options == [
('__all__', False, 'All cards'),
('--', True, 'Card whose identifier is in the URL'),
('sluga/cardb', False, 'Linked card: sluga/cardb'),
('sluga/cardsb', False, 'Linked card: sluga/cardsb'),
('sluga/blockb_cardb', False, 'Linked card: sluga/blockb_cardb'),
('sluga/cardc/cardb', False, 'Linked card: sluga/cardc/cardb'),
('sluga/cardc/cardsb', False, 'Linked card: sluga/cardc/cardsb'),
('sluga/cardc/blockb_cardb', False, 'Linked card: sluga/cardc/blockb_cardb'),
('sluga/cardb', False, 'Linked card: "Card B"'),
('sluga/cardsb', False, 'Linked cards: "Cards B"'),
('sluga/blockb_cardb', False, 'Linked card: "Block B - Card B"'),
('sluga/cardc/cardb', False, 'Linked card: "Card C" -> "Card B"'),
('sluga/cardc/cardsb', False, 'Linked cards: "Card C" -> "Cards B"'),
('sluga/cardc/blockb_cardb', False, 'Linked card: "Card C" -> "Block B - Card B"'),
('', False, 'Template'),
]
@ -536,21 +536,21 @@ def test_manager_card_cell(mock_send, app, admin_user):
assert resp.forms[0]['c%s-related_card_path' % cell.get_reference()].options == [
('__all__', False, 'All cards'),
('--', True, 'Card whose identifier is in the URL'),
('slugb/reverse:cardb', False, 'Linked card: slugb/cardb (reverse)'),
('slugb/reverse:cardsb', False, 'Linked card: slugb/cardsb (reverse)'),
('slugb/reverse:blockb_cardb', False, 'Linked card: slugb/blockb_cardb (reverse)'),
('slugb/reverse:cardb', False, 'Linked cards: "Card B" (reverse relation)'),
('slugb/reverse:cardsb', False, 'Linked cards: "Cards B" (reverse relation)'),
('slugb/reverse:blockb_cardb', False, 'Linked cards: "Block B - Card B" (reverse relation)'),
('', False, 'Template'),
]
# still multiple relations to follow
assert resp.forms[1]['c%s-related_card_path' % cell2.get_reference()].options == [
('__all__', False, 'All cards'),
('--', True, 'Card whose identifier is in the URL'),
('sluga/cardb', False, 'Linked card: sluga/cardb'),
('sluga/cardsb', False, 'Linked card: sluga/cardsb'),
('sluga/blockb_cardb', False, 'Linked card: sluga/blockb_cardb'),
('sluga/cardc/cardb', False, 'Linked card: sluga/cardc/cardb'),
('sluga/cardc/cardsb', False, 'Linked card: sluga/cardc/cardsb'),
('sluga/cardc/blockb_cardb', False, 'Linked card: sluga/cardc/blockb_cardb'),
('sluga/cardb', False, 'Linked card: "Card B"'),
('sluga/cardsb', False, 'Linked cards: "Cards B"'),
('sluga/blockb_cardb', False, 'Linked card: "Block B - Card B"'),
('sluga/cardc/cardb', False, 'Linked card: "Card C" -> "Card B"'),
('sluga/cardc/cardsb', False, 'Linked cards: "Card C" -> "Cards B"'),
('sluga/cardc/blockb_cardb', False, 'Linked card: "Card C" -> "Block B - Card B"'),
('', False, 'Template'),
]
@ -572,12 +572,12 @@ def test_manager_card_cell(mock_send, app, admin_user):
assert resp.forms[1]['c%s-related_card_path' % cell2.get_reference()].options == [
('__all__', False, 'All cards'),
('--', False, 'Card whose identifier is in the URL'),
('sluga/cardb', True, 'Linked card: sluga/cardb'),
('sluga/cardsb', False, 'Linked card: sluga/cardsb'),
('sluga/blockb_cardb', False, 'Linked card: sluga/blockb_cardb'),
('sluga/cardc/cardb', False, 'Linked card: sluga/cardc/cardb'),
('sluga/cardc/cardsb', False, 'Linked card: sluga/cardc/cardsb'),
('sluga/cardc/blockb_cardb', False, 'Linked card: sluga/cardc/blockb_cardb'),
('sluga/cardb', True, 'Linked card: "Card B"'),
('sluga/cardsb', False, 'Linked cards: "Cards B"'),
('sluga/blockb_cardb', False, 'Linked card: "Block B - Card B"'),
('sluga/cardc/cardb', False, 'Linked card: "Card C" -> "Card B"'),
('sluga/cardc/cardsb', False, 'Linked cards: "Card C" -> "Cards B"'),
('sluga/cardc/blockb_cardb', False, 'Linked card: "Card C" -> "Block B - Card B"'),
('', False, 'Template'),
]
resp.forms[1].submit()
@ -597,15 +597,15 @@ def test_manager_card_cell(mock_send, app, admin_user):
assert resp.forms[0]['c%s-related_card_path' % cell.get_reference()].options == [
('__all__', False, 'All cards'),
('--', True, 'Card whose identifier is in the URL'),
('slugd/cardd-foo/carde-foo', False, 'Linked card: slugd/cardd-foo/carde-foo'),
('slugd/carde-foo', False, 'Linked card: slugd/carde-foo'),
('slugd/cardd-foo/carde-foo', False, 'Linked card: "Card D" -> "Card E"'),
('slugd/carde-foo', False, 'Linked card: "Card E"'),
('', False, 'Template'),
]
assert resp.forms[1]['c%s-related_card_path' % cell2.get_reference()].options == [
('__all__', False, 'All cards'),
('--', True, 'Card whose identifier is in the URL'),
('sluge/cardd-bar', False, 'Linked card: sluge/cardd-bar'),
('sluge/reverse:carde-foo', False, 'Linked card: sluge/carde-foo (reverse)'),
('sluge/cardd-bar', False, 'Linked card: "Card D"'),
('sluge/reverse:carde-foo', False, 'Linked cards: "Card E" (reverse relation)'),
('', False, 'Template'),
]
@ -620,23 +620,23 @@ def test_manager_card_cell(mock_send, app, admin_user):
assert resp.forms[0]['c%s-related_card_path' % cell.get_reference()].options == [
('__all__', False, 'All cards'),
('--', True, 'Card whose identifier is in the URL'),
('slugd-bis/cardd-foo', False, 'Linked card: slugd-bis/cardd-foo'),
('slugd-bis/reverse:cardd-foo', False, 'Linked card: slugd-bis/cardd-foo (reverse)'),
('slugd-bis/carde-foo/cardd-bar', False, 'Linked card: slugd-bis/carde-foo/cardd-bar'),
('slugd-bis/cardd-foo', False, 'Linked card: "Card D"'),
('slugd-bis/reverse:cardd-foo', False, 'Linked cards: "Card D" (reverse relation)'),
('slugd-bis/carde-foo/cardd-bar', False, 'Linked card: "Card E" -> "Card D"'),
(
'slugd-bis/carde-foo/reverse:carde-foo',
False,
'Linked card: slugd-bis/carde-foo/carde-foo (reverse)',
'Linked cards: "Card E" -> "Card E" (reverse relation)',
),
('', False, 'Template'),
]
assert resp.forms[1]['c%s-related_card_path' % cell2.get_reference()].options == [
('__all__', False, 'All cards'),
('--', True, 'Card whose identifier is in the URL'),
('slugd/cardd-foo', False, 'Linked card: slugd/cardd-foo'),
('slugd/reverse:cardd-foo', False, 'Linked card: slugd/cardd-foo (reverse)'),
('slugd/carde-foo/cardd-bar', False, 'Linked card: slugd/carde-foo/cardd-bar'),
('slugd/carde-foo/reverse:carde-foo', False, 'Linked card: slugd/carde-foo/carde-foo (reverse)'),
('slugd/cardd-foo', False, 'Linked card: "Card D"'),
('slugd/reverse:cardd-foo', False, 'Linked cards: "Card D" (reverse relation)'),
('slugd/carde-foo/cardd-bar', False, 'Linked card: "Card E" -> "Card D"'),
('slugd/carde-foo/reverse:carde-foo', False, 'Linked cards: "Card E" -> "Card E" (reverse relation)'),
('', False, 'Template'),
]
@ -651,13 +651,46 @@ def test_manager_card_cell(mock_send, app, admin_user):
assert resp.forms[0]['c%s-related_card_path' % cell.get_reference()].options == [
('__all__', False, 'All cards'),
('--', True, 'Card whose identifier is in the URL'),
('sluge-bis/cardd-bar/carde-foo', False, 'Linked card: sluge-bis/cardd-bar/carde-foo'),
('sluge-bis/cardd-bar/carde-foo', False, 'Linked card: "Card D" -> "Card E"'),
('', False, 'Template'),
]
assert resp.forms[1]['c%s-related_card_path' % cell2.get_reference()].options == [
('__all__', False, 'All cards'),
('--', True, 'Card whose identifier is in the URL'),
('sluge/cardd-bar/carde-foo', False, 'Linked card: sluge/cardd-bar/carde-foo'),
('sluge/cardd-bar/carde-foo', False, 'Linked card: "Card D" -> "Card E"'),
('', False, 'Template'),
]
# many cells with slug
WcsCardCell.objects.create(
page=page,
placeholder='content',
order=2,
carddef_reference='default:card_e',
slug="sluge-again",
card_ids="42",
)
resp = app.get('/manage/pages/%s/' % page.pk)
assert resp.forms[0]['c%s-related_card_path' % cell.get_reference()].options == [
('__all__', False, 'All cards'),
('--', True, 'Card whose identifier is in the URL'),
(
'sluge-again/cardd-bar/carde-foo',
False,
'Linked card (From cell sluge-again): "Card D" -> "Card E"',
),
('sluge-bis/cardd-bar/carde-foo', False, 'Linked card (From cell sluge-bis): "Card D" -> "Card E"'),
('', False, 'Template'),
]
assert resp.forms[1]['c%s-related_card_path' % cell2.get_reference()].options == [
('__all__', False, 'All cards'),
('--', True, 'Card whose identifier is in the URL'),
(
'sluge-again/cardd-bar/carde-foo',
False,
'Linked card (From cell sluge-again): "Card D" -> "Card E"',
),
('sluge/cardd-bar/carde-foo', False, 'Linked card (From cell sluge): "Card D" -> "Card E"'),
('', False, 'Template'),
]

View File

@ -256,10 +256,34 @@ WCS_CARDDEF_SCHEMAS = {
{'label': 'Card C', 'varname': 'cardc', 'type': 'item'},
],
'relations': [
{'obj': 'carddef:card_b', 'varname': 'cardb', 'type': 'item', 'reverse': False},
{'obj': 'carddef:card_b', 'varname': 'cardsb', 'type': 'items', 'reverse': False},
{'obj': 'carddef:card_b', 'varname': 'blockb_cardb', 'type': 'item', 'reverse': False},
{'obj': 'carddef:card_c', 'varname': 'cardc', 'type': 'item', 'reverse': False},
{
'obj': 'carddef:card_b',
'varname': 'cardb',
'label': 'Card B',
'type': 'item',
'reverse': False,
},
{
'obj': 'carddef:card_b',
'varname': 'cardsb',
'label': 'Cards B',
'type': 'items',
'reverse': False,
},
{
'obj': 'carddef:card_b',
'varname': 'blockb_cardb',
'label': 'Block B - Card B',
'type': 'item',
'reverse': False,
},
{
'obj': 'carddef:card_c',
'varname': 'cardc',
'label': 'Card C',
'type': 'item',
'reverse': False,
},
{
'obj': 'carddef:card_z', # unknown card model
'varname': 'cardz',
@ -272,12 +296,36 @@ WCS_CARDDEF_SCHEMAS = {
'name': 'Card B',
'fields': [],
'relations': [
{'obj': 'carddef:card_a', 'varname': 'cardb', 'type': 'item', 'reverse': True},
{'obj': 'carddef:card_a', 'varname': 'cardsb', 'type': 'items', 'reverse': True},
{'obj': 'carddef:card_a', 'varname': 'blockb_cardb', 'type': 'item', 'reverse': True},
{'obj': 'carddef:card_c', 'varname': 'cardb', 'type': 'item', 'reverse': True},
{'obj': 'carddef:card_c', 'varname': 'cardsb', 'type': 'items', 'reverse': True},
{'obj': 'carddef:card_c', 'varname': 'blockb_cardb', 'type': 'item', 'reverse': True},
{'obj': 'carddef:card_a', 'varname': 'cardb', 'label': 'Card B', 'type': 'item', 'reverse': True},
{
'obj': 'carddef:card_a',
'varname': 'cardsb',
'label': 'Cards B',
'type': 'items',
'reverse': True,
},
{
'obj': 'carddef:card_a',
'varname': 'blockb_cardb',
'label': 'Block B - Card B',
'type': 'item',
'reverse': True,
},
{'obj': 'carddef:card_c', 'varname': 'cardb', 'label': 'Card B', 'type': 'item', 'reverse': True},
{
'obj': 'carddef:card_c',
'varname': 'cardsb',
'label': 'Cards B',
'type': 'items',
'reverse': True,
},
{
'obj': 'carddef:card_c',
'varname': 'blockb_cardb',
'label': 'Block B - Card B',
'type': 'item',
'reverse': True,
},
],
},
'card_c': {
@ -288,10 +336,28 @@ WCS_CARDDEF_SCHEMAS = {
{'label': 'Block B', 'varname': 'blockb', 'type': 'block:b'},
],
'relations': [
{'obj': 'carddef:card_b', 'varname': 'cardb', 'type': 'item', 'reverse': False},
{'obj': 'carddef:card_b', 'varname': 'cardsb', 'type': 'items', 'reverse': False},
{'obj': 'carddef:card_b', 'varname': 'blockb_cardb', 'type': 'item', 'reverse': False},
{'obj': 'carddef:card_a', 'varname': 'cardc', 'type': 'item', 'reverse': True},
{
'obj': 'carddef:card_b',
'varname': 'cardb',
'label': 'Card B',
'type': 'item',
'reverse': False,
},
{
'obj': 'carddef:card_b',
'varname': 'cardsb',
'label': 'Cards B',
'type': 'items',
'reverse': False,
},
{
'obj': 'carddef:card_b',
'varname': 'blockb_cardb',
'label': 'Block B - Card B',
'type': 'item',
'reverse': False,
},
{'obj': 'carddef:card_a', 'varname': 'cardc', 'label': 'Card C', 'type': 'item', 'reverse': True},
],
},
'card_d': {
@ -301,9 +367,27 @@ WCS_CARDDEF_SCHEMAS = {
{'label': 'Card E', 'varname': 'carde-foo', 'type': 'item'},
],
'relations': [
{'obj': 'carddef:card_d', 'varname': 'cardd-foo', 'type': 'item', 'reverse': False},
{'obj': 'carddef:card_d', 'varname': 'cardd-foo', 'type': 'item', 'reverse': True},
{'obj': 'carddef:card_e', 'varname': 'carde-foo', 'type': 'item', 'reverse': False},
{
'obj': 'carddef:card_d',
'varname': 'cardd-foo',
'label': 'Card D',
'type': 'item',
'reverse': False,
},
{
'obj': 'carddef:card_d',
'varname': 'cardd-foo',
'label': 'Card D',
'type': 'item',
'reverse': True,
},
{
'obj': 'carddef:card_e',
'varname': 'carde-foo',
'label': 'Card E',
'type': 'item',
'reverse': False,
},
],
},
'card_e': {
@ -312,8 +396,20 @@ WCS_CARDDEF_SCHEMAS = {
{'label': 'Card D', 'varname': 'cardd-bar', 'type': 'item'},
],
'relations': [
{'obj': 'carddef:card_d', 'varname': 'cardd-bar', 'type': 'item', 'reverse': False},
{'obj': 'carddef:card_d', 'varname': 'carde-foo', 'type': 'item', 'reverse': True},
{
'obj': 'carddef:card_d',
'varname': 'cardd-bar',
'label': 'Card D',
'type': 'item',
'reverse': False,
},
{
'obj': 'carddef:card_d',
'varname': 'carde-foo',
'label': 'Card E',
'type': 'item',
'reverse': True,
},
],
},
'card_f': {
@ -322,7 +418,13 @@ WCS_CARDDEF_SCHEMAS = {
{'label': 'Card H', 'varname': 'cardh', 'type': 'item'},
],
'relations': [
{'obj': 'carddef:card_h', 'varname': 'cardh', 'type': 'item', 'reverse': False},
{
'obj': 'carddef:card_h',
'varname': 'cardh',
'label': 'Card H',
'type': 'item',
'reverse': False,
},
],
},
'card_g': {
@ -331,15 +433,21 @@ WCS_CARDDEF_SCHEMAS = {
{'label': 'Card H', 'varname': 'cardh', 'type': 'item'},
],
'relations': [
{'obj': 'carddef:card_h', 'varname': 'cardh', 'type': 'item', 'reverse': False},
{
'obj': 'carddef:card_h',
'varname': 'cardh',
'label': 'Card H',
'type': 'item',
'reverse': False,
},
],
},
'card_h': {
'name': 'Card H',
'fields': [],
'relations': [
{'obj': 'carddef:card_f', 'varname': 'cardh', 'type': 'item', 'reverse': True},
{'obj': 'carddef:card_g', 'varname': 'cardh', 'type': 'item', 'reverse': True},
{'obj': 'carddef:card_f', 'varname': 'cardh', 'label': 'Card H', 'type': 'item', 'reverse': True},
{'obj': 'carddef:card_g', 'varname': 'cardh', 'label': 'Card H', 'type': 'item', 'reverse': True},
],
},
}