mirror of
https://github.com/smittix/intercept.git
synced 2026-07-24 08:58:09 -07:00
fix: location fallback to constants, compact card sizing
- Add third location fallback to utils/constants (London 51.5074/-0.1278) so location always resolves even without GPS or env vars configured - Remove min-height from sys-card to eliminate wasted space - Switch System Info to vertical key-value layout filling the card - Clean up OS string (strip glibc suffix), use locale date for boot time - Bump info grid font size from 11px to 12px for readability Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
+9
-1
@@ -452,7 +452,7 @@ def _get_observer_location() -> dict[str, Any]:
|
|||||||
if pos.altitude is not None:
|
if pos.altitude is not None:
|
||||||
gps_meta['altitude'] = round(pos.altitude, 1)
|
gps_meta['altitude'] = round(pos.altitude, 1)
|
||||||
|
|
||||||
# Fall back to config defaults
|
# Fall back to config env vars
|
||||||
if lat is None:
|
if lat is None:
|
||||||
with contextlib.suppress(Exception):
|
with contextlib.suppress(Exception):
|
||||||
from config import DEFAULT_LATITUDE, DEFAULT_LONGITUDE
|
from config import DEFAULT_LATITUDE, DEFAULT_LONGITUDE
|
||||||
@@ -460,6 +460,14 @@ def _get_observer_location() -> dict[str, Any]:
|
|||||||
if DEFAULT_LATITUDE != 0.0 or DEFAULT_LONGITUDE != 0.0:
|
if DEFAULT_LATITUDE != 0.0 or DEFAULT_LONGITUDE != 0.0:
|
||||||
lat, lon, source = DEFAULT_LATITUDE, DEFAULT_LONGITUDE, 'config'
|
lat, lon, source = DEFAULT_LATITUDE, DEFAULT_LONGITUDE, 'config'
|
||||||
|
|
||||||
|
# Fall back to hardcoded constants (London)
|
||||||
|
if lat is None:
|
||||||
|
with contextlib.suppress(Exception):
|
||||||
|
from utils.constants import DEFAULT_LATITUDE as CONST_LAT
|
||||||
|
from utils.constants import DEFAULT_LONGITUDE as CONST_LON
|
||||||
|
|
||||||
|
lat, lon, source = CONST_LAT, CONST_LON, 'default'
|
||||||
|
|
||||||
result: dict[str, Any] = {'lat': lat, 'lon': lon, 'source': source}
|
result: dict[str, Any] = {'lat': lat, 'lon': lon, 'source': source}
|
||||||
if gps_meta:
|
if gps_meta:
|
||||||
result['gps'] = gps_meta
|
result['gps'] = gps_meta
|
||||||
|
|||||||
@@ -32,7 +32,6 @@
|
|||||||
border: 1px solid var(--border-color, #2a2a4a);
|
border: 1px solid var(--border-color, #2a2a4a);
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
padding: 16px;
|
padding: 16px;
|
||||||
min-height: 120px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.sys-card-wide {
|
.sys-card-wide {
|
||||||
@@ -464,17 +463,24 @@
|
|||||||
background: var(--bg-primary, #0d0d1a);
|
background: var(--bg-primary, #0d0d1a);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* System info — horizontal layout */
|
/* System info — vertical layout to fill card */
|
||||||
.sys-info-grid {
|
.sys-info-grid {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-direction: column;
|
||||||
gap: 4px 20px;
|
gap: 6px;
|
||||||
font-size: 11px;
|
font-size: 12px;
|
||||||
color: var(--text-dim, #8888aa);
|
color: var(--text-dim, #8888aa);
|
||||||
}
|
}
|
||||||
|
|
||||||
.sys-info-item {
|
.sys-info-item {
|
||||||
white-space: nowrap;
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 2px 0;
|
||||||
|
border-bottom: 1px solid rgba(255, 255, 255, 0.04);
|
||||||
|
}
|
||||||
|
|
||||||
|
.sys-info-item:last-child {
|
||||||
|
border-bottom: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sys-info-item strong {
|
.sys-info-item strong {
|
||||||
|
|||||||
@@ -612,19 +612,19 @@ const SystemHealth = (function () {
|
|||||||
var sys = m.system || {};
|
var sys = m.system || {};
|
||||||
var html = '<div class="sys-card-header">System Info</div><div class="sys-card-body"><div class="sys-info-grid">';
|
var html = '<div class="sys-card-header">System Info</div><div class="sys-card-body"><div class="sys-info-grid">';
|
||||||
|
|
||||||
html += '<div class="sys-info-item"><strong>Host:</strong> ' + escHtml(sys.hostname || '--') + '</div>';
|
html += '<div class="sys-info-item"><strong>Host</strong><span>' + escHtml(sys.hostname || '--') + '</span></div>';
|
||||||
html += '<div class="sys-info-item"><strong>OS:</strong> ' + escHtml(sys.platform || '--') + '</div>';
|
html += '<div class="sys-info-item"><strong>OS</strong><span>' + escHtml((sys.platform || '--').replace(/-with-glibc[\d.]+/, '')) + '</span></div>';
|
||||||
html += '<div class="sys-info-item"><strong>Python:</strong> ' + escHtml(sys.python || '--') + '</div>';
|
html += '<div class="sys-info-item"><strong>Python</strong><span>' + escHtml(sys.python || '--') + '</span></div>';
|
||||||
html += '<div class="sys-info-item"><strong>App:</strong> v' + escHtml(sys.version || '--') + '</div>';
|
html += '<div class="sys-info-item"><strong>App</strong><span>v' + escHtml(sys.version || '--') + '</span></div>';
|
||||||
html += '<div class="sys-info-item"><strong>Uptime:</strong> ' + escHtml(sys.uptime_human || '--') + '</div>';
|
html += '<div class="sys-info-item"><strong>Uptime</strong><span>' + escHtml(sys.uptime_human || '--') + '</span></div>';
|
||||||
|
|
||||||
if (m.boot_time) {
|
if (m.boot_time) {
|
||||||
var bootDate = new Date(m.boot_time * 1000);
|
var bootDate = new Date(m.boot_time * 1000);
|
||||||
html += '<div class="sys-info-item"><strong>Boot:</strong> ' + escHtml(bootDate.toUTCString()) + '</div>';
|
html += '<div class="sys-info-item"><strong>Boot</strong><span>' + escHtml(bootDate.toLocaleString()) + '</span></div>';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m.network && m.network.connections != null) {
|
if (m.network && m.network.connections != null) {
|
||||||
html += '<div class="sys-info-item"><strong>Connections:</strong> ' + m.network.connections + '</div>';
|
html += '<div class="sys-info-item"><strong>Connections</strong><span>' + m.network.connections + '</span></div>';
|
||||||
}
|
}
|
||||||
|
|
||||||
html += '</div></div>';
|
html += '</div></div>';
|
||||||
|
|||||||
@@ -169,14 +169,17 @@ def test_location_from_gps(client):
|
|||||||
assert data['gps']['altitude'] == 45.0
|
assert data['gps']['altitude'] == 45.0
|
||||||
|
|
||||||
|
|
||||||
def test_location_falls_back_to_config(client):
|
def test_location_falls_back_to_defaults(client):
|
||||||
"""Location endpoint returns config defaults when GPS unavailable."""
|
"""Location endpoint returns constants defaults when GPS and config unavailable."""
|
||||||
_login(client)
|
_login(client)
|
||||||
with patch('utils.gps.get_current_position', return_value=None):
|
resp = client.get('/system/location')
|
||||||
resp = client.get('/system/location')
|
|
||||||
assert resp.status_code == 200
|
assert resp.status_code == 200
|
||||||
data = resp.get_json()
|
data = resp.get_json()
|
||||||
assert 'source' in data
|
assert 'source' in data
|
||||||
|
# Should get location from config or default constants
|
||||||
|
assert data['lat'] is not None
|
||||||
|
assert data['lon'] is not None
|
||||||
|
assert data['source'] in ('config', 'default')
|
||||||
|
|
||||||
|
|
||||||
def test_weather_requires_location(client):
|
def test_weather_requires_location(client):
|
||||||
|
|||||||
Reference in New Issue
Block a user