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,6 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
{
|
||||
"name": "Active Blue Family Law",
|
||||
"name": "Active Blue Family Law v2",
|
||||
"version": "18.0.14.0.0",
|
||||
"category": "Services/Legal",
|
||||
"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.exceptions import UserError
|
||||
|
||||
ATTORNEY_GROUP = "activeblue_familylaw.group_familylaw_attorney"
|
||||
ATTORNEY_GROUP = "activeblue_familylaw_v2.group_familylaw_attorney"
|
||||
|
||||
|
||||
class FamilyLawRetentionClass(models.Model):
|
||||
@@ -6,7 +6,7 @@ related records, initial-proceeding creation, conflict screening).
|
||||
from odoo import api, fields, models, _
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
ATTORNEY_GROUP = "activeblue_familylaw.group_familylaw_attorney"
|
||||
ATTORNEY_GROUP = "activeblue_familylaw_v2.group_familylaw_attorney"
|
||||
|
||||
STATE_SEQUENCE = [
|
||||
"intake",
|
||||
@@ -14,7 +14,7 @@ hallucinated cites — this ledger is what makes that mechanically impossible.
|
||||
from odoo import api, fields, models, _
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
ATTORNEY_GROUP = "activeblue_familylaw.group_familylaw_attorney"
|
||||
ATTORNEY_GROUP = "activeblue_familylaw_v2.group_familylaw_attorney"
|
||||
|
||||
|
||||
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.exceptions import UserError
|
||||
|
||||
ATTORNEY_GROUP = "activeblue_familylaw.group_familylaw_attorney"
|
||||
ATTORNEY_GROUP = "activeblue_familylaw_v2.group_familylaw_attorney"
|
||||
|
||||
|
||||
class FamilyLawComms(models.Model):
|
||||
@@ -20,7 +20,7 @@ top of the same outbound guard.
|
||||
from odoo import api, fields, models, _
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
ATTORNEY_GROUP = "activeblue_familylaw.group_familylaw_attorney"
|
||||
ATTORNEY_GROUP = "activeblue_familylaw_v2.group_familylaw_attorney"
|
||||
|
||||
|
||||
class FamilyLawDocument(models.Model):
|
||||
@@ -30,14 +30,14 @@ class TestCaseLifecycle(TransactionCase):
|
||||
login="fl_attorney",
|
||||
name="Test Attorney",
|
||||
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.env,
|
||||
login="fl_paralegal",
|
||||
name="Test Paralegal",
|
||||
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"]
|
||||
@@ -16,7 +16,7 @@ from unittest.mock import patch
|
||||
from odoo.tests.common import TransactionCase, new_test_user, tagged
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
DSCLIENT = ("odoo.addons.activeblue_familylaw.models.familylaw_docuseal."
|
||||
DSCLIENT = ("odoo.addons.activeblue_familylaw_v2.models.familylaw_docuseal."
|
||||
"FamilyLawDocusealClient")
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ class TestStep11Docuseal(TransactionCase):
|
||||
cls.attorney = new_test_user(
|
||||
cls.env, login="fl_atty11", name="Attorney 11",
|
||||
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.case = cls.env["familylaw.case"].create({
|
||||
@@ -90,7 +90,7 @@ class TestStep11Docuseal(TransactionCase):
|
||||
self._approve(doc)
|
||||
para = new_test_user(
|
||||
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",
|
||||
return_value={"id": "S1", "status": "sent"}):
|
||||
@@ -32,7 +32,7 @@ class TestStep12Archive(TransactionCase):
|
||||
cls.attorney = new_test_user(
|
||||
cls.env, login="fl_atty12", name="Attorney 12",
|
||||
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.case = cls.env["familylaw.case"].create({
|
||||
@@ -116,7 +116,7 @@ class TestStep12Archive(TransactionCase):
|
||||
})
|
||||
para = new_test_user(
|
||||
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):
|
||||
arch.with_user(para).action_destroy()
|
||||
@@ -25,7 +25,7 @@ class TestStep13Obligations(TransactionCase):
|
||||
cls.attorney = new_test_user(
|
||||
cls.env, login="fl_atty13", name="Attorney 13",
|
||||
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.Case = cls.env["familylaw.case"]
|
||||
@@ -25,15 +25,15 @@ class TestStep14Comms(TransactionCase):
|
||||
cls.attorney = new_test_user(
|
||||
cls.env, login="fl_atty14", name="Attorney 14",
|
||||
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.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.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.case = cls.env["familylaw.case"].create({
|
||||
@@ -31,14 +31,14 @@ class TestStep2RelationsAndProceeding(TransactionCase):
|
||||
login="fl_atty2",
|
||||
name="Test Attorney 2",
|
||||
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.env,
|
||||
login="fl_para2",
|
||||
name="Test Paralegal 2",
|
||||
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"]
|
||||
|
||||
@@ -209,7 +209,7 @@ class TestStep2ConflictScreening(TransactionCase):
|
||||
login="fl_atty_conflict",
|
||||
name="Conflict Attorney",
|
||||
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
|
||||
cls.old_client = cls.env["res.partner"].create({"name": "Old Client"})
|
||||
@@ -25,12 +25,12 @@ class TestStep3ReviewGate(TransactionCase):
|
||||
cls.attorney = new_test_user(
|
||||
cls.env, login="fl_atty3", name="Attorney 3",
|
||||
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.env, login="fl_para3", name="Paralegal 3",
|
||||
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.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.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):
|
||||
@@ -49,7 +49,7 @@ class TestStep6AIClient(TransactionCase):
|
||||
cls.attorney = new_test_user(
|
||||
cls.env, login="fl_atty6", name="Attorney 6",
|
||||
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
|
||||
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.exceptions import UserError
|
||||
|
||||
VERIFIER = ("odoo.addons.activeblue_familylaw.models.familylaw_verifier."
|
||||
VERIFIER = ("odoo.addons.activeblue_familylaw_v2.models.familylaw_verifier."
|
||||
"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):
|
||||
@@ -38,7 +38,7 @@ class TestStep7CitationGate(TransactionCase):
|
||||
cls.attorney = new_test_user(
|
||||
cls.env, login="fl_atty7", name="Attorney 7",
|
||||
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.case = cls.env["familylaw.case"].create({
|
||||
@@ -134,7 +134,7 @@ class TestStep7CitationGate(TransactionCase):
|
||||
doc = self._doc(); cite = self._cite(doc)
|
||||
para = new_test_user(
|
||||
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):
|
||||
cite.with_user(para).action_attorney_verify()
|
||||
@@ -19,7 +19,7 @@ from unittest.mock import patch
|
||||
|
||||
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"):
|
||||
@@ -96,7 +96,7 @@
|
||||
<button name="action_attorney_verify" type="object"
|
||||
string="Attorney Attest"
|
||||
invisible="status == 'verified'"
|
||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
||||
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||
<button name="action_reject" type="object" string="Reject"
|
||||
invisible="status in ('verified','rejected')"/>
|
||||
</header>
|
||||
@@ -52,7 +52,7 @@
|
||||
record that destruction occurred; the content
|
||||
itself will not be retained."
|
||||
invisible="retention_state == 'destroyed'"
|
||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
||||
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||
<field name="retention_state" widget="statusbar"/>
|
||||
</header>
|
||||
<sheet>
|
||||
@@ -38,7 +38,7 @@
|
||||
<button name="action_mark_conflict_cleared" type="object"
|
||||
string="Clear Conflict Check" class="btn-warning"
|
||||
invisible="conflict_check_cleared"
|
||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
||||
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||
<!-- Forward transitions -->
|
||||
<button name="action_engage" type="object" string="Engage"
|
||||
class="btn-primary" invisible="state != 'intake'"/>
|
||||
@@ -63,14 +63,14 @@
|
||||
<!-- Attorney-only: close / reopen -->
|
||||
<button name="action_close" type="object" string="Close Case"
|
||||
invisible="state == 'closed'"
|
||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
||||
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||
<button name="action_reopen" type="object" string="Reopen"
|
||||
invisible="state != 'closed'"
|
||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
||||
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||
<button name="action_return_client_file" type="object"
|
||||
string="Return Client File"
|
||||
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"
|
||||
statusbar_visible="intake,engaged,disclosure,discovery,mediation,hearing,closed"/>
|
||||
</header>
|
||||
@@ -26,7 +26,7 @@
|
||||
<header>
|
||||
<button name="action_approve" type="object" string="Approve"
|
||||
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"
|
||||
invisible="state != 'approved'"/>
|
||||
<field name="state" widget="statusbar"
|
||||
@@ -38,27 +38,27 @@
|
||||
<button name="action_approve" type="object"
|
||||
string="Approve" class="btn-primary"
|
||||
invisible="state != 'attorney_review'"
|
||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
||||
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||
<button name="action_reject" type="object"
|
||||
string="Reject"
|
||||
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"
|
||||
string="Mark Filed"
|
||||
invisible="state != 'approved'"
|
||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
||||
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||
<button name="action_mark_sent" type="object"
|
||||
string="Mark Sent"
|
||||
invisible="state != 'approved'"
|
||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
||||
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||
<button name="action_send_for_signature" type="object"
|
||||
string="Send for E-Signature"
|
||||
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"
|
||||
string="Reset to Draft"
|
||||
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"
|
||||
statusbar_visible="ai_draft,attorney_review,approved,filed"/>
|
||||
</header>
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
<!-- Top-level application menu -->
|
||||
<menuitem id="menu_familylaw_root"
|
||||
name="Family Law"
|
||||
name="Family Law (v2)"
|
||||
sequence="50"/>
|
||||
|
||||
<!-- New Intake — opens the triage wizard -->
|
||||
@@ -75,7 +75,7 @@
|
||||
parent="menu_familylaw_root"
|
||||
action="action_familylaw_ai_task"
|
||||
sequence="60"
|
||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
||||
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||
|
||||
<!-- Communications -->
|
||||
<menuitem id="menu_familylaw_comms"
|
||||
@@ -96,7 +96,7 @@
|
||||
name="Configuration"
|
||||
parent="menu_familylaw_root"
|
||||
sequence="90"
|
||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
||||
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||
|
||||
<!-- Configuration > Retention Classes -->
|
||||
<menuitem id="menu_familylaw_retention_class"
|
||||
@@ -104,6 +104,6 @@
|
||||
parent="menu_familylaw_config"
|
||||
action="action_familylaw_retention_class"
|
||||
sequence="10"
|
||||
groups="activeblue_familylaw.group_familylaw_attorney"/>
|
||||
groups="activeblue_familylaw_v2.group_familylaw_attorney"/>
|
||||
|
||||
</odoo>
|
||||
Reference in New Issue
Block a user