feat(sales-finder): ранг горячести из трёх сигналов

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-07-12 07:56:06 +03:00
parent e675ff7630
commit 4e90b15a95
2 changed files with 35 additions and 0 deletions
+20
View File
@@ -0,0 +1,20 @@
"""«Горячесть» фирмы = взвешенная сумма сигналов рекламы. Больше сигналов и «крутит сейчас»
(бюджет Директа) → выше. Deterministic, легко тестируется."""
def score(f) -> int:
s = 0
if f.advertises == "да":
s += 40
s += {"высокая": 30, "средняя": 15, "низкая": 0}.get(f.confidence, 0)
if f.two_gis_promoted:
s += 20
if f.direct_budget > 0:
s += min(30, f.direct_budget // 5000) # до +30 за бюджет Директа
if f.legal_status and f.legal_status != "действующая":
s -= 25 # мёртвых вниз
return s
def rank(firms: list) -> list:
for f in firms:
f.hotness = score(f)
return sorted(firms, key=lambda x: -x.hotness)
+15
View File
@@ -0,0 +1,15 @@
from salesfinder.models import Firm
from salesfinder.ranker import score, rank
def test_more_signals_more_hotness():
hot = Firm(name="H", domain="h.ru", two_gis_promoted=True,
advertises="да", confidence="высокая", direct_budget=50000)
cold = Firm(name="C", domain="c.ru", advertises="нет", confidence="низкая")
assert score(hot) > score(cold)
def test_rank_sorts_desc_and_sets_field():
a = Firm(name="A", domain="a.ru", advertises="нет")
b = Firm(name="B", domain="b.ru", advertises="да", confidence="высокая", two_gis_promoted=True)
out = rank([a, b])
assert out[0].name == "B"
assert out[0].hotness > 0