- Created skeleton templates for events, notifications, plugins, presence, report, settings, and workflows to enhance loading states.
- Implemented structured skeletons for tab details, tab events, maintenance backup, database tools, logging, multi-edit, presence, sessions, and system info.
- Each template includes shimmer effects for loading indicators, improving user experience during data fetching.
- Implemented the REST Import plugin (rest_import.py) to handle importing data from REST APIs.
- Added functionality for configurable HTTP methods, authentication types, and custom headers.
- Included error handling for various HTTP response statuses and connection issues.
- Created unit tests for the plugin covering header building, path resolution, MAC validation, record mapping, and authentication methods.
- Ensured that module-level side effects are patched during tests to prevent live interactions.
- Added `queryByConditions` method to `DeviceInstance` for flexible device querying based on dynamic conditions.
- Introduced `interpolate_tokens` function to replace placeholders in action values with actual device data.
- Updated `UpdateFieldAction` to handle cross-device updates and archive conflicting MAC addresses.
- Implemented cascade prevention in `WorkflowManager` to avoid processing events for devices modified in the same batch.
- Added unit tests for new functionalities, including token interpolation, condition querying, and action execution.
- Created constants for device column validation to enhance security and maintainability.
- Established a structured research skill specification to guide development practices.
get_setting_value returns an empty string when a key is not found,
which forces every call site to remember to treat '' as a sentinel
and provide its own fallback. The fallback is sometimes a hard-coded
default and sometimes a different code path entirely, leading to
inconsistent handling across the codebase.
Add an optional argument that defaults to '' (preserves
the existing behaviour for every call site) and is returned when
the key is not present. New call sites can opt into a more
meaningful default without changing the function's signature for
existing callers.
Refs #1626.
Replaces the raw sqlite3 query in get_netalertx_devices() with
DeviceInstance().getAll() as suggested in code review, applying the
archived/offline/new filters in Python. Removes the sqlite3 and
fullDbPath imports. Updates tests to mock DeviceInstance.getAll().
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>