From ad82ebf9f1d151f8583e68beebd8018a3cd2d4cc Mon Sep 17 00:00:00 2001 From: Marie Backman Date: Thu, 19 Feb 2026 11:39:18 -0500 Subject: [PATCH] guard against monitored variable with pv_name equal to None --- src/webmon_app/reporting/dasmon/view_util.py | 9 +++-- .../tests/test_dasmon/test_view_util.py | 35 +++++++++++++++++++ 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/webmon_app/reporting/dasmon/view_util.py b/src/webmon_app/reporting/dasmon/view_util.py index f7d03d87..1fa7eb2a 100644 --- a/src/webmon_app/reporting/dasmon/view_util.py +++ b/src/webmon_app/reporting/dasmon/view_util.py @@ -969,6 +969,8 @@ def get_signals(instrument_id): try: monitored = MonitoredVariable.objects.filter(instrument=instrument_id) for item in monitored: + if item.pv_name is None: + continue try: latests = PVCache.objects.filter(instrument=instrument_id, name=item.pv_name) if len(latests) == 0: @@ -987,10 +989,11 @@ def get_signals(instrument_id): data = pvmon_view_util.get_live_variables(request=None, instrument_id=instrument_id, key_id=item.pv_name) data_list = [] try: - for point in data[0][1]: - data_list.append("%g:%g" % (point[0], point[1])) + if data is not None and len(data) > 0 and len(data[0]) > 1: + for point in data[0][1]: + data_list.append("%g:%g" % (point[0], point[1])) except: # noqa: E722 - logger.exception() + logger.exception(f"Error processing data for {instrument_id} {item.pv_name}:") sig_entry.data = ",".join(data_list) sig_alerts.append(sig_entry) except: # noqa: E722 diff --git a/src/webmon_app/reporting/tests/test_dasmon/test_view_util.py b/src/webmon_app/reporting/tests/test_dasmon/test_view_util.py index 98b5a0c4..ba83bbea 100644 --- a/src/webmon_app/reporting/tests/test_dasmon/test_view_util.py +++ b/src/webmon_app/reporting/tests/test_dasmon/test_view_util.py @@ -975,6 +975,41 @@ def test_get_signals(self): assert me.name == f"sig_{i}" assert f"msg_{i}" in me.status + def test_get_signals_when_has_monitored_variable_none(self): + from reporting.dasmon.view_util import get_signals + + # make instrument + inst = Instrument.objects.create(name="testinst_getsignals_no_mon_pvs") + inst.save() + + # test with monitored variable with pv_name equal to None + MonitoredVariable.objects.create( + instrument=inst, + pv_name=None, + rule_name="", + ) + sig_list = get_signals(inst) + assert len(sig_list) == 0 + + # test with monitored variables where one is None and one is valid + pvname = PVName.objects.create(name="testpv") + pvname.save() + PVStringCache.objects.create( + instrument=inst, + name=pvname, + value="test", + status=0, + timestamp=timezone.now(), + ) + MonitoredVariable.objects.create( + instrument=inst, + pv_name=pvname, + rule_name="", + ) + # test + sig_list = get_signals(inst) + assert len(sig_list) == 1 + def test_get_instrument_status_summary(self): from reporting.dasmon.view_util import get_instrument_status_summary