5-min cron processes up to 100 pending rows per pass: private IPs short-circuit to state=private_ip; same-IP cache (30 days) avoids duplicate ip-api.com calls; reverse DNS via socket with 1.5s timeout; HTTP lookup respects ip-api''s X-Rl rate-limit header. Tests cover private-IP shortcut, cache hit (no HTTP), and internal-state skip -- no network calls needed. Per-row isolation uses cr.savepoint() instead of cr.commit() because Odoo 19 TestCursor raises AssertionError on commit/rollback. Recorded the gotcha as CLAUDE.md rule #14. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
28 lines
1.1 KiB
XML
28 lines
1.1 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<odoo>
|
|
<data noupdate="1">
|
|
|
|
<record id="cron_retention_gc" model="ir.cron">
|
|
<field name="name">Fusion Login Audit: Retention GC</field>
|
|
<field name="model_id" ref="model_fusion_login_audit"/>
|
|
<field name="state">code</field>
|
|
<field name="code">model._fc_retention_gc()</field>
|
|
<field name="interval_number">1</field>
|
|
<field name="interval_type">days</field>
|
|
<field name="active" eval="True"/>
|
|
</record>
|
|
|
|
<record id="cron_geo_enrich" model="ir.cron">
|
|
<field name="name">Fusion Login Audit: Geo Enrichment</field>
|
|
<field name="model_id" ref="model_fusion_login_audit"/>
|
|
<field name="state">code</field>
|
|
<field name="code">model._fc_geo_enrich_pending(limit=100)</field>
|
|
<field name="interval_number">5</field>
|
|
<field name="interval_type">minutes</field>
|
|
<field name="active" eval="True"/>
|
|
<field name="priority">10</field>
|
|
</record>
|
|
|
|
</data>
|
|
</odoo>
|