backups: one tabbed DNC card, machine-numbered downloads, themed history
DNC Info becomes a single tabbed card - General, eFocas, Serial, NTSHR and MARK - instead of a flat wall of every value. On 3204 that is 11 rows visible rather than 22, and on 0600 eleven rather than 27, which also stops the card unbalancing the detail page's two-column layout. Everything DNC now lives on that one card, so the Part Marker panel is gone: its settings are the MARK tab. The partmarker KIND is untouched and still stores, dedupes and serves revisions - they are listed on the backup history page - it simply contributes no card of its own, which on 145 of 147 machines would have been an empty box. Downloads are named for the machine: 3204.reg, and 3204-wow6432node.reg for the dialect that imports outside NTLARS. The view had been rebuilding the name from sourcefilename and producing 3204.reg-wow6432node.reg, so the revision now carries assetnumber and both ends agree. That needed a viewonly relationship to Asset - no backref, so the core asset side gains no dependency on this plugin. The history page was hardcoded to light colours (#e0e0e0, #f4f9ff, #666) and rendered as a white table on a dark page. It now uses the palette variables throughout, per frontend/CLAUDE.md. The current-revision tint is a color-mix against --primary so it reads in both themes rather than a baked light blue that disappears on dark, and the diff columns are headed as well as red/green, since colour alone does not survive a colourblind reader.
This commit is contained in:
@@ -526,7 +526,13 @@ DNCINFOREG = (
|
||||
|
||||
|
||||
def _headings(card):
|
||||
return [f['label'] for f in card['fields'] if f.get('heading')]
|
||||
"""Section labels of the DNC Info card (tabs renderer shape)."""
|
||||
return [s['label'] for s in card['sections']]
|
||||
|
||||
|
||||
def _labels(card):
|
||||
"""Every field label across all sections."""
|
||||
return [f['label'] for s in card['sections'] for f in s['fields']]
|
||||
|
||||
|
||||
def test_dncinfo_shows_efocas_and_serial():
|
||||
@@ -563,15 +569,14 @@ def test_dncinfo_shows_mark_when_the_asset_is_a_part_marker(monkeypatch):
|
||||
def test_dncinfo_drops_empty_values_within_a_shown_section():
|
||||
populated = DNCINFOREG.replace('"ShrHost"=""', '"ShrHost"="WJFMS3"')
|
||||
card = dncinfo.build(ntlars.parse(_asbytes(populated)), assetid=0)
|
||||
labels = [f['label'] for f in card['fields'] if not f.get('heading')]
|
||||
assert 'ShrHost' in labels
|
||||
assert 'ShrFolder' not in labels
|
||||
assert 'ShrHost' in _labels(card)
|
||||
assert 'ShrFolder' not in _labels(card)
|
||||
|
||||
|
||||
def test_dncinfo_is_empty_for_a_projection_with_nothing_interesting():
|
||||
card = dncinfo.build(ntlars.parse(_asbytes(CONFIGUREDREG)), assetid=0)
|
||||
assert card['sectioncount'] == 0
|
||||
assert card['fields'] == []
|
||||
assert card['sections'] == []
|
||||
|
||||
|
||||
def test_ispartmarker_is_false_when_the_machines_plugin_is_absent(monkeypatch):
|
||||
@@ -606,8 +611,7 @@ def test_base_kind_buildinfo_is_an_empty_card():
|
||||
def test_dncinfo_general_section_leads_with_controller_identity():
|
||||
card = dncinfo.build(ntlars.parse(_asbytes(DNCINFOREG)), assetid=0)
|
||||
assert _headings(card)[0] == 'General'
|
||||
labels = [f['label'] for f in card['fields'] if not f.get('heading')]
|
||||
assert 'Cnc' in labels and 'HostType' in labels
|
||||
assert 'Cnc' in _labels(card) and 'HostType' in _labels(card)
|
||||
|
||||
|
||||
def test_dncinfo_general_omits_the_rest_of_the_key():
|
||||
@@ -615,8 +619,7 @@ def test_dncinfo_general_omits_the_rest_of_the_key():
|
||||
reg = DNCINFOREG.replace('"MachineNo"="3204"',
|
||||
'"MachineNo"="3204"\r\n"Debug"="NO"\r\n"Site"="WJ"')
|
||||
card = dncinfo.build(ntlars.parse(_asbytes(reg)), assetid=0)
|
||||
labels = [f['label'] for f in card['fields'] if not f.get('heading')]
|
||||
assert 'Debug' not in labels and 'Site' not in labels
|
||||
assert 'Debug' not in _labels(card) and 'Site' not in _labels(card)
|
||||
|
||||
|
||||
def test_cnc_marker_reveals_the_mark_section_without_shopdb():
|
||||
|
||||
Reference in New Issue
Block a user