From e56f252ffd7f5f9223d0b206d8018ab312db84a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=85=E5=BF=B5?= Date: Tue, 15 Sep 2026 16:59:24 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20ingest=20=E8=90=BD=E5=BA=93=20SDK=20time?= =?UTF-8?q?zone=20=E5=88=B0=20Visitor.timezone=5Fname=EF=BC=88Task16=20?= =?UTF-8?q?=E8=81=94=E8=B0=83=E5=8F=91=E7=8E=B0=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Code --- server/tracker/services/ingest.py | 3 +++ server/tracker/tests/test_ingest.py | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/server/tracker/services/ingest.py b/server/tracker/services/ingest.py index a350a9c..e786726 100644 --- a/server/tracker/services/ingest.py +++ b/server/tracker/services/ingest.py @@ -42,6 +42,9 @@ def _geo_field(g, key): def _touch_visitor(site, vid, ctx, ip): env = {k: str(ctx.get(k, "") or "")[:n] for k, n in _FIELD_LEN.items()} + # Task16 联调发现:键名映射缺口——SDK context 发 "timezone",模型字段是 timezone_name, + # 同名推导的 _FIELD_LEN 取不到值,导致 timezone_name 恒空。 + env["timezone_name"] = str(ctx.get("timezone", "") or "")[:64] v, created = Visitor.objects.get_or_create( site=site, visitor_id=vid, defaults={**env, "last_ip": ip}) now = timezone.now() diff --git a/server/tracker/tests/test_ingest.py b/server/tracker/tests/test_ingest.py index 3505d78..2f0bf4e 100644 --- a/server/tracker/tests/test_ingest.py +++ b/server/tracker/tests/test_ingest.py @@ -134,3 +134,11 @@ def test_missing_payload_fields_rejected(db): p = _batch([_ev(1)]) del p["session_id"] assert ingest_batch(site, p)["rejected"] == [{"reason": "invalid_payload"}] + +# 14. SDK context 的 timezone 落库 Visitor.timezone_name(Task16 联调发现:键名映射缺口) +def test_context_timezone_persisted_to_visitor(db): + site = Site.objects.create(name="s", domains=["a.com"]) + b = _batch([_ev(1)]) + b["context"]["timezone"] = "Asia/Shanghai" + ingest_batch(site, b) + assert Visitor.objects.get(visitor_id="v1").timezone_name == "Asia/Shanghai"