diff --git a/meshview/store.py b/meshview/store.py
index 67b9947..3d85758 100644
--- a/meshview/store.py
+++ b/meshview/store.py
@@ -162,15 +162,12 @@ async def get_packet(packet_id):
return result.scalar_one_or_none()
-async def get_uplinked_packets(node_id):
+async def get_uplinked_packets(node_id, portnum=None):
async with database.async_session() as session:
- result = await session.execute(
- select(Packet)
- .join(PacketSeen)
- .where(PacketSeen.node_id == node_id)
- .order_by(Packet.import_time.desc())
- .limit(500)
- )
+ q = select(Packet).join(PacketSeen).where(PacketSeen.node_id == node_id).order_by(Packet.import_time.desc()).limit(500)
+ if portnum:
+ q = q.where(Packet.portnum == portnum)
+ result = await session.execute(q)
return result.scalars()
diff --git a/meshview/templates/buttons.html b/meshview/templates/buttons.html
index be80487..9959bff 100644
--- a/meshview/templates/buttons.html
+++ b/meshview/templates/buttons.html
@@ -2,14 +2,14 @@
TX/RX
Uplinked
diff --git a/meshview/templates/search.html b/meshview/templates/search.html
new file mode 100644
index 0000000..8c9d2e7
--- /dev/null
+++ b/meshview/templates/search.html
@@ -0,0 +1,21 @@
+{% extends "base.html" %}
+
+
+{% block body %}
+
+{% include "search_form.html" %}
+
+
+
+{% endblock %}
diff --git a/meshview/web.py b/meshview/web.py
index a287bc0..5e4c4e6 100644
--- a/meshview/web.py
+++ b/meshview/web.py
@@ -231,38 +231,32 @@ async def node_match(request):
@routes.get("/packet_list/{node_id}")
async def packet_list(request):
node_id = int(request.match_info["node_id"])
-
- async with asyncio.TaskGroup() as tg:
- raw_packets = tg.create_task(store.get_packets(node_id))
- node = tg.create_task(store.get_node(node_id))
- trace = tg.create_task(build_trace(node_id))
- neighbors = tg.create_task(build_neighbors(node_id))
- has_telemetry = tg.create_task(store.has_packets(node_id, PortNum.TELEMETRY_APP))
-
- packets = (Packet.from_model(p) for p in await raw_packets)
-
- template = env.get_template("node.html")
- return web.Response(
- text=template.render(
- raw_node_id=node_id_to_hex(node_id),
- node_id=node_id,
- node=await node,
- packets=packets,
- packet_event="packet",
- trace=await trace,
- neighbors=await neighbors,
- has_telemetry=await has_telemetry,
- ),
- content_type="text/html",
- )
+ if portnum := request.query.get("portnum"):
+ portnum = int(portnum)
+ else:
+ portnum = None
+ return await _packet_list(request, store.get_packets(node_id, portnum), 'packet')
@routes.get("/uplinked_list/{node_id}")
async def uplinked_list(request):
node_id = int(request.match_info["node_id"])
+ if portnum := request.query.get("portnum"):
+ portnum = int(portnum)
+ else:
+ portnum = None
+ return await _packet_list(request, store.get_uplinked_packets(node_id, portnum), 'uplinked')
+
+
+async def _packet_list(request, raw_packets, packet_event):
+ node_id = int(request.match_info["node_id"])
+ if portnum := request.query.get("portnum"):
+ portnum = int(portnum)
+ else:
+ portnum = None
async with asyncio.TaskGroup() as tg:
- raw_packets = tg.create_task(store.get_uplinked_packets(node_id))
+ raw_packets = tg.create_task(raw_packets)
node = tg.create_task(store.get_node(node_id))
trace = tg.create_task(build_trace(node_id))
neighbors = tg.create_task(build_neighbors(node_id))
@@ -276,11 +270,13 @@ async def uplinked_list(request):
raw_node_id=node_id_to_hex(node_id),
node_id=node_id,
node=await node,
+ portnum=portnum,
packets=packets,
- packet_event="uplinked",
+ packet_event=packet_event,
trace=await trace,
neighbors=await neighbors,
has_telemetry=await has_telemetry,
+ query_string=request.query_string,
),
content_type="text/html",
)
@@ -346,7 +342,7 @@ async def events(request):
uplinked = [
u
for u in event.uplinked
- if portnum is None or portnum == p.portnum
+ if portnum is None or portnum == u.portnum
]
event.clear()
try: