Rename module to activeblue_familylaw_v2 (coexist with legacy prod module)
Production already has a DIFFERENT, earlier module installed as `activeblue_familylaw` (models fl.*, real data). Renamed this build's technical name to `activeblue_familylaw_v2` so it installs ALONGSIDE the legacy app instead of replacing it. Models (familylaw.*) and test tags (familylaw_step<N>) are unchanged — only the module name and its group XML IDs change. Changes: - Folder activeblue_familylaw -> activeblue_familylaw_v2 (git mv) - All 44 dotted refs activeblue_familylaw. -> activeblue_familylaw_v2. (security group XML IDs in views/python; test patch targets odoo.addons.*) - Manifest display name -> "Active Blue Family Law v2"; root menu -> "Family Law (v2)" - scripts/validate_module.py ROOT path; BUILD_STATUS.md run commands + coexistence note; START_HERE.md pointer Verified in live Odoo 18: - Fresh install + full suite: 200 tests, 0 failed, 0 errors. - COEXISTENCE on a clone of prod db1: installing _v2 alongside the installed legacy activeblue_familylaw left the legacy untouched (still installed 18.0.1.0.0, fl.* models registered, fl_caselaw 25 rows intact) while adding the 30 familylaw.* models. Exit 0, no errors. Clone dropped; prod DBs untouched. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1,9 +1,17 @@
|
|||||||
# Build Status — Active Blue Family Law (`activeblue_familylaw`)
|
# Build Status — Active Blue Family Law (`activeblue_familylaw_v2`)
|
||||||
|
|
||||||
**All 14 roadmap steps are implemented, validated, and committed.**
|
**All 14 roadmap steps are implemented, validated, and committed.**
|
||||||
Module version `18.0.14.0.0`. Built on Odoo 18 Community.
|
Module version `18.0.14.0.0`. Built on Odoo 18 Community.
|
||||||
|
|
||||||
> ✅ **Tests run green in a live Odoo 18:** `0 failed, 0 error(s) of 198 tests`
|
> ⚠️ **Technical name is `activeblue_familylaw_v2`** (folder
|
||||||
|
> `activeblue_familylaw_handoff/activeblue_familylaw_build/activeblue_familylaw_v2`).
|
||||||
|
> It was renamed from `activeblue_familylaw` because production already has a
|
||||||
|
> **different, earlier** module installed under that name (models `fl.*`, real data) —
|
||||||
|
> see "Production coexistence" below. The `_v2` module uses `familylaw.*` models and
|
||||||
|
> its own security groups, so it installs **alongside** the legacy app without
|
||||||
|
> collision. Models/tags are unchanged (`familylaw.case`, `familylaw_step<N>`).
|
||||||
|
|
||||||
|
> ✅ **Tests run green in a live Odoo 18:** `0 failed, 0 error(s) of 200 tests`
|
||||||
> (installed clean into a throwaway DB on the local `odoo:18.0` image against
|
> (installed clean into a throwaway DB on the local `odoo:18.0` image against
|
||||||
> Postgres 16, then dropped — production DBs untouched). Also validated statically
|
> Postgres 16, then dropped — production DBs untouched). Also validated statically
|
||||||
> via `scripts/validate_module.py` (Python compile, XML well-formed, no Odoo-18
|
> via `scripts/validate_module.py` (Python compile, XML well-formed, no Odoo-18
|
||||||
@@ -15,16 +23,23 @@ Module version `18.0.14.0.0`. Built on Odoo 18 Community.
|
|||||||
## Run the tests
|
## Run the tests
|
||||||
```bash
|
```bash
|
||||||
# whole module (install + all tests)
|
# whole module (install + all tests)
|
||||||
odoo -d <db> -i activeblue_familylaw --test-enable --stop-after-init
|
odoo -d <db> -i activeblue_familylaw_v2 --test-enable --stop-after-init
|
||||||
|
|
||||||
# one step
|
# one step
|
||||||
odoo -d <db> -u activeblue_familylaw --test-enable --test-tags familylaw_step7 --stop-after-init
|
odoo -d <db> -u activeblue_familylaw_v2 --test-enable --test-tags familylaw_step7 --stop-after-init
|
||||||
|
|
||||||
# all family-law tests
|
# all family-law tests
|
||||||
odoo -d <db> -u activeblue_familylaw --test-enable --test-tags familylaw --stop-after-init
|
odoo -d <db> -u activeblue_familylaw_v2 --test-enable --test-tags familylaw --stop-after-init
|
||||||
```
|
```
|
||||||
Re-run static checks any time: `python3 scripts/validate_module.py`
|
Re-run static checks any time: `python3 scripts/validate_module.py`
|
||||||
|
|
||||||
|
## Production coexistence
|
||||||
|
Prod `db1` has a **separate legacy** `activeblue_familylaw` installed (different
|
||||||
|
lineage: `fl.*` models incl. `fl.caselaw`, `fl.statute`, `fl.support.schedule.entry`,
|
||||||
|
with real rows). This module is `activeblue_familylaw_v2` with `familylaw.*` models and
|
||||||
|
distinct group XML IDs, so it **coexists** — installing it will NOT touch or remove the
|
||||||
|
legacy app or its data. Verified by cloning `db1` and installing `_v2` into the clone.
|
||||||
|
|
||||||
## Steps
|
## Steps
|
||||||
| Step | Slice | Tag |
|
| Step | Slice | Tag |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
# START HERE — Claude Code kickoff
|
# START HERE — Claude Code kickoff
|
||||||
|
|
||||||
|
> **Note (current state):** the module is fully built (Steps 1–14) and its technical
|
||||||
|
> name is now **`activeblue_familylaw_v2`** (renamed from `activeblue_familylaw` to
|
||||||
|
> coexist with a different legacy module of that name already in production). The
|
||||||
|
> design docs below still say `activeblue_familylaw` — that's the historical narrative;
|
||||||
|
> the live module folder/name is `activeblue_familylaw_v2`. See `BUILD_STATUS.md`.
|
||||||
|
|
||||||
You are picking up an in-progress build. Read in this order, then start the task at
|
You are picking up an in-progress build. Read in this order, then start the task at
|
||||||
the bottom. Do **not** re-derive the design — it exists; follow it.
|
the bottom. Do **not** re-derive the design — it exists; follow it.
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
{
|
{
|
||||||
"name": "Active Blue Family Law",
|
"name": "Active Blue Family Law v2",
|
||||||
"version": "18.0.14.0.0",
|
"version": "18.0.14.0.0",
|
||||||
"category": "Services/Legal",
|
"category": "Services/Legal",
|
||||||
"summary": "Florida family law case management (Miami-Dade / 11th Judicial Circuit)",
|
"summary": "Florida family law case management (Miami-Dade / 11th Judicial Circuit)",
|
||||||
@@ -23,7 +23,7 @@ from dateutil.relativedelta import relativedelta
|
|||||||
from odoo import api, fields, models, _
|
from odoo import api, fields, models, _
|
||||||
from odoo.exceptions import UserError
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
ATTORNEY_GROUP = "activeblue_familylaw.group_familylaw_attorney"
|
ATTORNEY_GROUP = "activeblue_familylaw_v2.group_familylaw_attorney"
|
||||||
|
|
||||||
|
|
||||||
class FamilyLawRetentionClass(models.Model):
|
class FamilyLawRetentionClass(models.Model):
|
||||||
@@ -6,7 +6,7 @@ related records, initial-proceeding creation, conflict screening).
|
|||||||
from odoo import api, fields, models, _
|
from odoo import api, fields, models, _
|
||||||
from odoo.exceptions import UserError
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
ATTORNEY_GROUP = "activeblue_familylaw.group_familylaw_attorney"
|
ATTORNEY_GROUP = "activeblue_familylaw_v2.group_familylaw_attorney"
|
||||||
|
|
||||||
STATE_SEQUENCE = [
|
STATE_SEQUENCE = [
|
||||||
"intake",
|
"intake",
|
||||||
@@ -14,7 +14,7 @@ hallucinated cites — this ledger is what makes that mechanically impossible.
|
|||||||
from odoo import api, fields, models, _
|
from odoo import api, fields, models, _
|
||||||
from odoo.exceptions import UserError
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
ATTORNEY_GROUP = "activeblue_familylaw.group_familylaw_attorney"
|
ATTORNEY_GROUP = "activeblue_familylaw_v2.group_familylaw_attorney"
|
||||||
|
|
||||||
|
|
||||||
class FamilyLawCitation(models.Model):
|
class FamilyLawCitation(models.Model):
|
||||||
@@ -19,7 +19,7 @@ audit trail / DocuSeal host are operational requirements (Requirements for Succe
|
|||||||
from odoo import api, fields, models, _
|
from odoo import api, fields, models, _
|
||||||
from odoo.exceptions import UserError
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
ATTORNEY_GROUP = "activeblue_familylaw.group_familylaw_attorney"
|
ATTORNEY_GROUP = "activeblue_familylaw_v2.group_familylaw_attorney"
|
||||||
|
|
||||||
|
|
||||||
class FamilyLawComms(models.Model):
|
class FamilyLawComms(models.Model):
|
||||||
@@ -20,7 +20,7 @@ top of the same outbound guard.
|
|||||||
from odoo import api, fields, models, _
|
from odoo import api, fields, models, _
|
||||||
from odoo.exceptions import UserError
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
ATTORNEY_GROUP = "activeblue_familylaw.group_familylaw_attorney"
|
ATTORNEY_GROUP = "activeblue_familylaw_v2.group_familylaw_attorney"
|
||||||
|
|
||||||
|
|
||||||
class FamilyLawDocument(models.Model):
|
class FamilyLawDocument(models.Model):
|
||||||
@@ -30,14 +30,14 @@ class TestCaseLifecycle(TransactionCase):
|
|||||||
login="fl_attorney",
|
login="fl_attorney",
|
||||||
name="Test Attorney",
|
name="Test Attorney",
|
||||||
email="attorney@example.com",
|
email="attorney@example.com",
|
||||||
groups="base.group_user,activeblue_familylaw.group_familylaw_attorney",
|
groups="base.group_user,activeblue_familylaw_v2.group_familylaw_attorney",
|
||||||
)
|
)
|
||||||
cls.paralegal = new_test_user(
|
cls.paralegal = new_test_user(
|
||||||
cls.env,
|
cls.env,
|
||||||
login="fl_paralegal",
|
login="fl_paralegal",
|
||||||
name="Test Paralegal",
|
name="Test Paralegal",
|
||||||
email="paralegal@example.com",
|
email="paralegal@example.com",
|
||||||
groups="base.group_user,activeblue_familylaw.group_familylaw_user",
|
groups="base.group_user,activeblue_familylaw_v2.group_familylaw_user",
|
||||||
)
|
)
|
||||||
|
|
||||||
cls.Case = cls.env["familylaw.case"]
|
cls.Case = cls.env["familylaw.case"]
|
||||||
@@ -16,7 +16,7 @@ from unittest.mock import patch
|
|||||||
from odoo.tests.common import TransactionCase, new_test_user, tagged
|
from odoo.tests.common import TransactionCase, new_test_user, tagged
|
||||||
from odoo.exceptions import UserError
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
DSCLIENT = ("odoo.addons.activeblue_familylaw.models.familylaw_docuseal."
|
DSCLIENT = ("odoo.addons.activeblue_familylaw_v2.models.familylaw_docuseal."
|
||||||
"FamilyLawDocusealClient")
|
"FamilyLawDocusealClient")
|
||||||
|
|
||||||
|
|
||||||
@@ -29,7 +29,7 @@ class TestStep11Docuseal(TransactionCase):
|
|||||||
cls.attorney = new_test_user(
|
cls.attorney = new_test_user(
|
||||||
cls.env, login="fl_atty11", name="Attorney 11",
|
cls.env, login="fl_atty11", name="Attorney 11",
|
||||||
email="atty11@example.com",
|
email="atty11@example.com",
|
||||||
groups="base.group_user,activeblue_familylaw.group_familylaw_attorney",
|
groups="base.group_user,activeblue_familylaw_v2.group_familylaw_attorney",
|
||||||
)
|
)
|
||||||
cls.partner = cls.env["res.partner"].create({"name": "Sign Client"})
|
cls.partner = cls.env["res.partner"].create({"name": "Sign Client"})
|
||||||
cls.case = cls.env["familylaw.case"].create({
|
cls.case = cls.env["familylaw.case"].create({
|
||||||
@@ -90,7 +90,7 @@ class TestStep11Docuseal(TransactionCase):
|
|||||||
self._approve(doc)
|
self._approve(doc)
|
||||||
para = new_test_user(
|
para = new_test_user(
|
||||||
self.env, login="fl_para11", name="Para 11", email="p11@example.com",
|
self.env, login="fl_para11", name="Para 11", email="p11@example.com",
|
||||||
groups="base.group_user,activeblue_familylaw.group_familylaw_user",
|
groups="base.group_user,activeblue_familylaw_v2.group_familylaw_user",
|
||||||
)
|
)
|
||||||
with patch(DSCLIENT + "._create_submission",
|
with patch(DSCLIENT + "._create_submission",
|
||||||
return_value={"id": "S1", "status": "sent"}):
|
return_value={"id": "S1", "status": "sent"}):
|
||||||
@@ -32,7 +32,7 @@ class TestStep12Archive(TransactionCase):
|
|||||||
cls.attorney = new_test_user(
|
cls.attorney = new_test_user(
|
||||||
cls.env, login="fl_atty12", name="Attorney 12",
|
cls.env, login="fl_atty12", name="Attorney 12",
|
||||||
email="atty12@example.com",
|
email="atty12@example.com",
|
||||||
groups="base.group_user,activeblue_familylaw.group_familylaw_attorney",
|
groups="base.group_user,activeblue_familylaw_v2.group_familylaw_attorney",
|
||||||
)
|
)
|
||||||
cls.partner = cls.env["res.partner"].create({"name": "Arch Client"})
|
cls.partner = cls.env["res.partner"].create({"name": "Arch Client"})
|
||||||
cls.case = cls.env["familylaw.case"].create({
|
cls.case = cls.env["familylaw.case"].create({
|
||||||
@@ -116,7 +116,7 @@ class TestStep12Archive(TransactionCase):
|
|||||||
})
|
})
|
||||||
para = new_test_user(
|
para = new_test_user(
|
||||||
self.env, login="fl_para12", name="Para 12", email="p12@example.com",
|
self.env, login="fl_para12", name="Para 12", email="p12@example.com",
|
||||||
groups="base.group_user,activeblue_familylaw.group_familylaw_user",
|
groups="base.group_user,activeblue_familylaw_v2.group_familylaw_user",
|
||||||
)
|
)
|
||||||
with self.assertRaises(UserError):
|
with self.assertRaises(UserError):
|
||||||
arch.with_user(para).action_destroy()
|
arch.with_user(para).action_destroy()
|
||||||
@@ -25,7 +25,7 @@ class TestStep13Obligations(TransactionCase):
|
|||||||
cls.attorney = new_test_user(
|
cls.attorney = new_test_user(
|
||||||
cls.env, login="fl_atty13", name="Attorney 13",
|
cls.env, login="fl_atty13", name="Attorney 13",
|
||||||
email="atty13@example.com",
|
email="atty13@example.com",
|
||||||
groups="base.group_user,activeblue_familylaw.group_familylaw_attorney",
|
groups="base.group_user,activeblue_familylaw_v2.group_familylaw_attorney",
|
||||||
)
|
)
|
||||||
cls.partner = cls.env["res.partner"].create({"name": "AO Client"})
|
cls.partner = cls.env["res.partner"].create({"name": "AO Client"})
|
||||||
cls.Case = cls.env["familylaw.case"]
|
cls.Case = cls.env["familylaw.case"]
|
||||||
@@ -25,15 +25,15 @@ class TestStep14Comms(TransactionCase):
|
|||||||
cls.attorney = new_test_user(
|
cls.attorney = new_test_user(
|
||||||
cls.env, login="fl_atty14", name="Attorney 14",
|
cls.env, login="fl_atty14", name="Attorney 14",
|
||||||
email="atty14@example.com",
|
email="atty14@example.com",
|
||||||
groups="base.group_user,activeblue_familylaw.group_familylaw_attorney",
|
groups="base.group_user,activeblue_familylaw_v2.group_familylaw_attorney",
|
||||||
)
|
)
|
||||||
cls.para = new_test_user(
|
cls.para = new_test_user(
|
||||||
cls.env, login="fl_para14", name="Para 14", email="para14@example.com",
|
cls.env, login="fl_para14", name="Para 14", email="para14@example.com",
|
||||||
groups="base.group_user,activeblue_familylaw.group_familylaw_user",
|
groups="base.group_user,activeblue_familylaw_v2.group_familylaw_user",
|
||||||
)
|
)
|
||||||
cls.para_other = new_test_user(
|
cls.para_other = new_test_user(
|
||||||
cls.env, login="fl_para14b", name="Para 14b", email="para14b@example.com",
|
cls.env, login="fl_para14b", name="Para 14b", email="para14b@example.com",
|
||||||
groups="base.group_user,activeblue_familylaw.group_familylaw_user",
|
groups="base.group_user,activeblue_familylaw_v2.group_familylaw_user",
|
||||||
)
|
)
|
||||||
cls.partner = cls.env["res.partner"].create({"name": "Comms Client"})
|
cls.partner = cls.env["res.partner"].create({"name": "Comms Client"})
|
||||||
cls.case = cls.env["familylaw.case"].create({
|
cls.case = cls.env["familylaw.case"].create({
|
||||||
@@ -31,14 +31,14 @@ class TestStep2RelationsAndProceeding(TransactionCase):
|
|||||||
login="fl_atty2",
|
login="fl_atty2",
|
||||||
name="Test Attorney 2",
|
name="Test Attorney 2",
|
||||||
email="atty2@example.com",
|
email="atty2@example.com",
|
||||||
groups="base.group_user,activeblue_familylaw.group_familylaw_attorney",
|
groups="base.group_user,activeblue_familylaw_v2.group_familylaw_attorney",
|
||||||
)
|
)
|
||||||
cls.paralegal = new_test_user(
|
cls.paralegal = new_test_user(
|
||||||
cls.env,
|
cls.env,
|
||||||
login="fl_para2",
|
login="fl_para2",
|
||||||
name="Test Paralegal 2",
|
name="Test Paralegal 2",
|
||||||
email="para2@example.com",
|
email="para2@example.com",
|
||||||
groups="base.group_user,activeblue_familylaw.group_familylaw_user",
|
groups="base.group_user,activeblue_familylaw_v2.group_familylaw_user",
|
||||||
)
|
)
|
||||||
cls.Case = cls.env["familylaw.case"]
|
cls.Case = cls.env["familylaw.case"]
|
||||||
|
|
||||||
@@ -209,7 +209,7 @@ class TestStep2ConflictScreening(TransactionCase):
|
|||||||
login="fl_atty_conflict",
|
login="fl_atty_conflict",
|
||||||
name="Conflict Attorney",
|
name="Conflict Attorney",
|
||||||
email="catty@example.com",
|
email="catty@example.com",
|
||||||
groups="base.group_user,activeblue_familylaw.group_familylaw_attorney",
|
groups="base.group_user,activeblue_familylaw_v2.group_familylaw_attorney",
|
||||||
)
|
)
|
||||||
# Case A: "Old Client" is the client
|
# Case A: "Old Client" is the client
|
||||||
cls.old_client = cls.env["res.partner"].create({"name": "Old Client"})
|
cls.old_client = cls.env["res.partner"].create({"name": "Old Client"})
|
||||||
@@ -25,12 +25,12 @@ class TestStep3ReviewGate(TransactionCase):
|
|||||||
cls.attorney = new_test_user(
|
cls.attorney = new_test_user(
|
||||||
cls.env, login="fl_atty3", name="Attorney 3",
|
cls.env, login="fl_atty3", name="Attorney 3",
|
||||||
email="atty3@example.com",
|
email="atty3@example.com",
|
||||||
groups="base.group_user,activeblue_familylaw.group_familylaw_attorney",
|
groups="base.group_user,activeblue_familylaw_v2.group_familylaw_attorney",
|
||||||
)
|
)
|
||||||
cls.paralegal = new_test_user(
|
cls.paralegal = new_test_user(
|
||||||
cls.env, login="fl_para3", name="Paralegal 3",
|
cls.env, login="fl_para3", name="Paralegal 3",
|
||||||
email="para3@example.com",
|
email="para3@example.com",
|
||||||
groups="base.group_user,activeblue_familylaw.group_familylaw_user",
|
groups="base.group_user,activeblue_familylaw_v2.group_familylaw_user",
|
||||||
)
|
)
|
||||||
cls.partner = cls.env["res.partner"].create({"name": "Doc Client"})
|
cls.partner = cls.env["res.partner"].create({"name": "Doc Client"})
|
||||||
cls.case = cls.env["familylaw.case"].create({
|
cls.case = cls.env["familylaw.case"].create({
|
||||||
@@ -20,7 +20,7 @@ from unittest.mock import patch
|
|||||||
from odoo.tests.common import TransactionCase, new_test_user, tagged
|
from odoo.tests.common import TransactionCase, new_test_user, tagged
|
||||||
from odoo.exceptions import UserError
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
CLIENT = "odoo.addons.activeblue_familylaw.models.familylaw_ai.FamilyLawAIClient"
|
CLIENT = "odoo.addons.activeblue_familylaw_v2.models.familylaw_ai.FamilyLawAIClient"
|
||||||
|
|
||||||
|
|
||||||
def _fake_response(text="DRAFT BODY", citations=None, pt=100, ct=200):
|
def _fake_response(text="DRAFT BODY", citations=None, pt=100, ct=200):
|
||||||
@@ -49,7 +49,7 @@ class TestStep6AIClient(TransactionCase):
|
|||||||
cls.attorney = new_test_user(
|
cls.attorney = new_test_user(
|
||||||
cls.env, login="fl_atty6", name="Attorney 6",
|
cls.env, login="fl_atty6", name="Attorney 6",
|
||||||
email="atty6@example.com",
|
email="atty6@example.com",
|
||||||
groups="base.group_user,activeblue_familylaw.group_familylaw_attorney",
|
groups="base.group_user,activeblue_familylaw_v2.group_familylaw_attorney",
|
||||||
)
|
)
|
||||||
# configure a key + model so config-dependent code paths work
|
# configure a key + model so config-dependent code paths work
|
||||||
icp = cls.env["ir.config_parameter"].sudo()
|
icp = cls.env["ir.config_parameter"].sudo()
|
||||||
@@ -19,9 +19,9 @@ from unittest.mock import patch
|
|||||||
from odoo.tests.common import TransactionCase, new_test_user, tagged
|
from odoo.tests.common import TransactionCase, new_test_user, tagged
|
||||||
from odoo.exceptions import UserError
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
VERIFIER = ("odoo.addons.activeblue_familylaw.models.familylaw_verifier."
|
VERIFIER = ("odoo.addons.activeblue_familylaw_v2.models.familylaw_verifier."
|
||||||
"FamilyLawCitationVerifier")
|
"FamilyLawCitationVerifier")
|
||||||
CLIENT = "odoo.addons.activeblue_familylaw.models.familylaw_ai.FamilyLawAIClient"
|
CLIENT = "odoo.addons.activeblue_familylaw_v2.models.familylaw_ai.FamilyLawAIClient"
|
||||||
|
|
||||||
|
|
||||||
def _ai_response(text="MEMO", citations=None, pt=10, ct=20):
|
def _ai_response(text="MEMO", citations=None, pt=10, ct=20):
|
||||||
@@ -38,7 +38,7 @@ class TestStep7CitationGate(TransactionCase):
|
|||||||
cls.attorney = new_test_user(
|
cls.attorney = new_test_user(
|
||||||
cls.env, login="fl_atty7", name="Attorney 7",
|
cls.env, login="fl_atty7", name="Attorney 7",
|
||||||
email="atty7@example.com",
|
email="atty7@example.com",
|
||||||
groups="base.group_user,activeblue_familylaw.group_familylaw_attorney",
|
groups="base.group_user,activeblue_familylaw_v2.group_familylaw_attorney",
|
||||||
)
|
)
|
||||||
cls.partner = cls.env["res.partner"].create({"name": "Cite Client"})
|
cls.partner = cls.env["res.partner"].create({"name": "Cite Client"})
|
||||||
cls.case = cls.env["familylaw.case"].create({
|
cls.case = cls.env["familylaw.case"].create({
|
||||||
@@ -134,7 +134,7 @@ class TestStep7CitationGate(TransactionCase):
|
|||||||
doc = self._doc(); cite = self._cite(doc)
|
doc = self._doc(); cite = self._cite(doc)
|
||||||
para = new_test_user(
|
para = new_test_user(
|
||||||
self.env, login="fl_para7", name="Para 7", email="p7@example.com",
|
self.env, login="fl_para7", name="Para 7", email="p7@example.com",
|
||||||
groups="base.group_user,activeblue_familylaw.group_familylaw_user",
|
groups="base.group_user,activeblue_familylaw_v2.group_familylaw_user",
|
||||||
)
|
)
|
||||||
with self.assertRaises(UserError):
|
with self.assertRaises(UserError):
|
||||||
cite.with_user(para).action_attorney_verify()
|
cite.with_user(para).action_attorney_verify()
|
||||||
@@ -19,7 +19,7 @@ from unittest.mock import patch
|
|||||||
|
|
||||||
from odoo.tests.common import TransactionCase, tagged
|
from odoo.tests.common import TransactionCase, tagged
|
||||||
|
|
||||||
CLIENT = "odoo.addons.activeblue_familylaw.models.familylaw_ai.FamilyLawAIClient"
|
CLIENT = "odoo.addons.activeblue_familylaw_v2.models.familylaw_ai.FamilyLawAIClient"
|
||||||
|
|
||||||
|
|
||||||
def _ai(text="EXTRACTION OUTPUT"):
|
def _ai(text="EXTRACTION OUTPUT"):
|
||||||
@@ -96,7 +96,7 @@
|
|||||||
<button name="action_attorney_verify" type="object"
|
<button name="action_attorney_verify" type="object"
|
||||||
string="Attorney Attest"
|
string="Attorney Attest"
|
||||||
invisible="status == 'verified'"
|
invisible="status == 'verified'"
|
||||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||||
<button name="action_reject" type="object" string="Reject"
|
<button name="action_reject" type="object" string="Reject"
|
||||||
invisible="status in ('verified','rejected')"/>
|
invisible="status in ('verified','rejected')"/>
|
||||||
</header>
|
</header>
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
record that destruction occurred; the content
|
record that destruction occurred; the content
|
||||||
itself will not be retained."
|
itself will not be retained."
|
||||||
invisible="retention_state == 'destroyed'"
|
invisible="retention_state == 'destroyed'"
|
||||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||||
<field name="retention_state" widget="statusbar"/>
|
<field name="retention_state" widget="statusbar"/>
|
||||||
</header>
|
</header>
|
||||||
<sheet>
|
<sheet>
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
<button name="action_mark_conflict_cleared" type="object"
|
<button name="action_mark_conflict_cleared" type="object"
|
||||||
string="Clear Conflict Check" class="btn-warning"
|
string="Clear Conflict Check" class="btn-warning"
|
||||||
invisible="conflict_check_cleared"
|
invisible="conflict_check_cleared"
|
||||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||||
<!-- Forward transitions -->
|
<!-- Forward transitions -->
|
||||||
<button name="action_engage" type="object" string="Engage"
|
<button name="action_engage" type="object" string="Engage"
|
||||||
class="btn-primary" invisible="state != 'intake'"/>
|
class="btn-primary" invisible="state != 'intake'"/>
|
||||||
@@ -63,14 +63,14 @@
|
|||||||
<!-- Attorney-only: close / reopen -->
|
<!-- Attorney-only: close / reopen -->
|
||||||
<button name="action_close" type="object" string="Close Case"
|
<button name="action_close" type="object" string="Close Case"
|
||||||
invisible="state == 'closed'"
|
invisible="state == 'closed'"
|
||||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||||
<button name="action_reopen" type="object" string="Reopen"
|
<button name="action_reopen" type="object" string="Reopen"
|
||||||
invisible="state != 'closed'"
|
invisible="state != 'closed'"
|
||||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||||
<button name="action_return_client_file" type="object"
|
<button name="action_return_client_file" type="object"
|
||||||
string="Return Client File"
|
string="Return Client File"
|
||||||
invisible="state != 'closed' or client_file_returned"
|
invisible="state != 'closed' or client_file_returned"
|
||||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||||
<field name="state" widget="statusbar"
|
<field name="state" widget="statusbar"
|
||||||
statusbar_visible="intake,engaged,disclosure,discovery,mediation,hearing,closed"/>
|
statusbar_visible="intake,engaged,disclosure,discovery,mediation,hearing,closed"/>
|
||||||
</header>
|
</header>
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
<header>
|
<header>
|
||||||
<button name="action_approve" type="object" string="Approve"
|
<button name="action_approve" type="object" string="Approve"
|
||||||
class="btn-primary" invisible="state != 'draft'"
|
class="btn-primary" invisible="state != 'draft'"
|
||||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||||
<button name="action_send" type="object" string="Send"
|
<button name="action_send" type="object" string="Send"
|
||||||
invisible="state != 'approved'"/>
|
invisible="state != 'approved'"/>
|
||||||
<field name="state" widget="statusbar"
|
<field name="state" widget="statusbar"
|
||||||
@@ -38,27 +38,27 @@
|
|||||||
<button name="action_approve" type="object"
|
<button name="action_approve" type="object"
|
||||||
string="Approve" class="btn-primary"
|
string="Approve" class="btn-primary"
|
||||||
invisible="state != 'attorney_review'"
|
invisible="state != 'attorney_review'"
|
||||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||||
<button name="action_reject" type="object"
|
<button name="action_reject" type="object"
|
||||||
string="Reject"
|
string="Reject"
|
||||||
invisible="state not in ('attorney_review','approved')"
|
invisible="state not in ('attorney_review','approved')"
|
||||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||||
<button name="action_mark_filed" type="object"
|
<button name="action_mark_filed" type="object"
|
||||||
string="Mark Filed"
|
string="Mark Filed"
|
||||||
invisible="state != 'approved'"
|
invisible="state != 'approved'"
|
||||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||||
<button name="action_mark_sent" type="object"
|
<button name="action_mark_sent" type="object"
|
||||||
string="Mark Sent"
|
string="Mark Sent"
|
||||||
invisible="state != 'approved'"
|
invisible="state != 'approved'"
|
||||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||||
<button name="action_send_for_signature" type="object"
|
<button name="action_send_for_signature" type="object"
|
||||||
string="Send for E-Signature"
|
string="Send for E-Signature"
|
||||||
invisible="state != 'approved' or signature_status != 'none'"
|
invisible="state != 'approved' or signature_status != 'none'"
|
||||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||||
<button name="action_reset_to_draft" type="object"
|
<button name="action_reset_to_draft" type="object"
|
||||||
string="Reset to Draft"
|
string="Reset to Draft"
|
||||||
invisible="state in ('ai_draft','filed','sent')"
|
invisible="state in ('ai_draft','filed','sent')"
|
||||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||||
<field name="state" widget="statusbar"
|
<field name="state" widget="statusbar"
|
||||||
statusbar_visible="ai_draft,attorney_review,approved,filed"/>
|
statusbar_visible="ai_draft,attorney_review,approved,filed"/>
|
||||||
</header>
|
</header>
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
<!-- Top-level application menu -->
|
<!-- Top-level application menu -->
|
||||||
<menuitem id="menu_familylaw_root"
|
<menuitem id="menu_familylaw_root"
|
||||||
name="Family Law"
|
name="Family Law (v2)"
|
||||||
sequence="50"/>
|
sequence="50"/>
|
||||||
|
|
||||||
<!-- New Intake — opens the triage wizard -->
|
<!-- New Intake — opens the triage wizard -->
|
||||||
@@ -75,7 +75,7 @@
|
|||||||
parent="menu_familylaw_root"
|
parent="menu_familylaw_root"
|
||||||
action="action_familylaw_ai_task"
|
action="action_familylaw_ai_task"
|
||||||
sequence="60"
|
sequence="60"
|
||||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||||
|
|
||||||
<!-- Communications -->
|
<!-- Communications -->
|
||||||
<menuitem id="menu_familylaw_comms"
|
<menuitem id="menu_familylaw_comms"
|
||||||
@@ -96,7 +96,7 @@
|
|||||||
name="Configuration"
|
name="Configuration"
|
||||||
parent="menu_familylaw_root"
|
parent="menu_familylaw_root"
|
||||||
sequence="90"
|
sequence="90"
|
||||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||||
|
|
||||||
<!-- Configuration > Retention Classes -->
|
<!-- Configuration > Retention Classes -->
|
||||||
<menuitem id="menu_familylaw_retention_class"
|
<menuitem id="menu_familylaw_retention_class"
|
||||||
@@ -104,6 +104,6 @@
|
|||||||
parent="menu_familylaw_config"
|
parent="menu_familylaw_config"
|
||||||
action="action_familylaw_retention_class"
|
action="action_familylaw_retention_class"
|
||||||
sequence="10"
|
sequence="10"
|
||||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||||
|
|
||||||
</odoo>
|
</odoo>
|
||||||
@@ -24,7 +24,7 @@ ROOT = os.path.join(
|
|||||||
os.path.dirname(os.path.dirname(os.path.abspath(__file__))),
|
os.path.dirname(os.path.dirname(os.path.abspath(__file__))),
|
||||||
"activeblue_familylaw_handoff",
|
"activeblue_familylaw_handoff",
|
||||||
"activeblue_familylaw_build",
|
"activeblue_familylaw_build",
|
||||||
"activeblue_familylaw",
|
"activeblue_familylaw_v2",
|
||||||
)
|
)
|
||||||
|
|
||||||
errors = []
|
errors = []
|
||||||
|
|||||||
Reference in New Issue
Block a user