Rename leads field: Google Ads as 'leads', Airtable as 'leads_lake'
- MetricasDiarias now stores both: leads (Google conv) and leads_lake (Airtable count) - Update backfill and migration scripts accordingly - migrate_leads_field.py executed: 49 May records updated Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
f1dec1c887
commit
f65f793c95
@ -40,11 +40,11 @@ for r in records:
|
|||||||
days_needed: set[str] = set()
|
days_needed: set[str] = set()
|
||||||
for _, (_, md) in gid_to_gcm.items():
|
for _, (_, md) in gid_to_gcm.items():
|
||||||
for day_str, vals in md.items():
|
for day_str, vals in md.items():
|
||||||
if "leads" not in vals:
|
if "leads_lake" not in vals:
|
||||||
days_needed.add(day_str)
|
days_needed.add(day_str)
|
||||||
|
|
||||||
if not days_needed:
|
if not days_needed:
|
||||||
print("Todos los días ya tienen 'leads'. Nada que hacer.")
|
print("Todos los días ya tienen 'leads_lake'. Nada que hacer.")
|
||||||
exit(0)
|
exit(0)
|
||||||
|
|
||||||
print(f"Días a rellenar: {sorted(days_needed)}")
|
print(f"Días a rellenar: {sorted(days_needed)}")
|
||||||
@ -61,8 +61,8 @@ for day_str in sorted(days_needed):
|
|||||||
leads_by_cid = at.get_leads_by_campaign_on_date(date_iso)
|
leads_by_cid = at.get_leads_by_campaign_on_date(date_iso)
|
||||||
updated = 0
|
updated = 0
|
||||||
for gid, (gcm_id, md) in gid_to_gcm.items():
|
for gid, (gcm_id, md) in gid_to_gcm.items():
|
||||||
if day_str in md and "leads" not in md[day_str]:
|
if day_str in md and "leads_lake" not in md[day_str]:
|
||||||
md[day_str]["leads"] = leads_by_cid.get(gid, 0)
|
md[day_str]["leads_lake"] = leads_by_cid.get(gid, 0)
|
||||||
updated += 1
|
updated += 1
|
||||||
print(f"{updated} campañas actualizadas")
|
print(f"{updated} campañas actualizadas")
|
||||||
|
|
||||||
@ -71,7 +71,7 @@ print("\nGuardando en Airtable...")
|
|||||||
batch = [
|
batch = [
|
||||||
{"id": gcm_id, "fields": {"MetricasDiarias": json.dumps(md, ensure_ascii=False)}}
|
{"id": gcm_id, "fields": {"MetricasDiarias": json.dumps(md, ensure_ascii=False)}}
|
||||||
for _, (gcm_id, md) in gid_to_gcm.items()
|
for _, (gcm_id, md) in gid_to_gcm.items()
|
||||||
if any("leads" in v for v in md.values())
|
if any("leads_lake" in v for v in md.values())
|
||||||
]
|
]
|
||||||
for i in range(0, len(batch), 10):
|
for i in range(0, len(batch), 10):
|
||||||
at.gacampaignmes.batch_update(batch[i:i+10])
|
at.gacampaignmes.batch_update(batch[i:i+10])
|
||||||
|
|||||||
43
migrate_leads_field.py
Normal file
43
migrate_leads_field.py
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
"""
|
||||||
|
Migración one-off: renombra el campo 'leads' a 'leads_lake' en MetricasDiarias
|
||||||
|
de todos los registros GACampaignMes de mayo 2026.
|
||||||
|
"""
|
||||||
|
import json
|
||||||
|
from airtable_client import AirtableClient
|
||||||
|
|
||||||
|
at = AirtableClient()
|
||||||
|
|
||||||
|
print("Cargando registros GACampaignMes de mayo...")
|
||||||
|
records = at.gacampaignmes.all(
|
||||||
|
formula="AND({Mes}='5',{Año}='2026')",
|
||||||
|
fields=["MetricasDiarias"],
|
||||||
|
)
|
||||||
|
|
||||||
|
batch = []
|
||||||
|
for r in records:
|
||||||
|
raw = r["fields"].get("MetricasDiarias") or "{}"
|
||||||
|
try:
|
||||||
|
md = json.loads(raw)
|
||||||
|
except (json.JSONDecodeError, TypeError):
|
||||||
|
md = {}
|
||||||
|
|
||||||
|
changed = False
|
||||||
|
for day_vals in md.values():
|
||||||
|
if "leads" in day_vals and "leads_lake" not in day_vals:
|
||||||
|
day_vals["leads_lake"] = day_vals.pop("leads")
|
||||||
|
changed = True
|
||||||
|
|
||||||
|
if changed:
|
||||||
|
batch.append({
|
||||||
|
"id": r["id"],
|
||||||
|
"fields": {"MetricasDiarias": json.dumps(md, ensure_ascii=False)},
|
||||||
|
})
|
||||||
|
|
||||||
|
print(f"Registros a migrar: {len(batch)}")
|
||||||
|
if not batch:
|
||||||
|
print("Nada que migrar.")
|
||||||
|
else:
|
||||||
|
for i in range(0, len(batch), 10):
|
||||||
|
at.gacampaignmes.batch_update(batch[i:i+10])
|
||||||
|
print(f" > {min(i+10, len(batch))}/{len(batch)} guardados")
|
||||||
|
print(f"OK Migracion completada: {len(batch)} registros actualizados.")
|
||||||
4
run.py
4
run.py
@ -303,8 +303,8 @@ def run():
|
|||||||
md = json.loads(campaign["metricas_diarias"])
|
md = json.loads(campaign["metricas_diarias"])
|
||||||
except (json.JSONDecodeError, TypeError):
|
except (json.JSONDecodeError, TypeError):
|
||||||
md = {}
|
md = {}
|
||||||
leads_hoy = leads_yesterday.get(cid, 0)
|
leads_lake_hoy = leads_yesterday.get(cid, 0)
|
||||||
md[dia_hoy] = {"coste": coste_hoy, "ingreso": ingreso_hoy, "margen": margen_hoy, "leads": leads_hoy}
|
md[dia_hoy] = {"coste": coste_hoy, "ingreso": ingreso_hoy, "margen": margen_hoy, "leads": int(conv_hoy), "leads_lake": leads_lake_hoy}
|
||||||
campaign["metricas_diarias"] = json.dumps(md, ensure_ascii=False)
|
campaign["metricas_diarias"] = json.dumps(md, ensure_ascii=False)
|
||||||
metricas_updates.append({
|
metricas_updates.append({
|
||||||
"airtable_id": campaign["airtable_id"],
|
"airtable_id": campaign["airtable_id"],
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user