Step 10: emergency workflow (12.941 pick-up/removal) — fork + attachment block
familylaw.emergency.motion (+ familylaw.emergency.attachment): - have-order-vs-not FORK: action_seed_requirements seeds different required attachments (existing-order path = certified copy + proposed order; no-order path = verified motion/sworn affidavit + proposed order) - MISSING-ATTACHMENT BLOCK: _ensure_complete raises if any required attachment is unprovided (or no checklist seeded); action_mark_ready / action_file gated on it - open_for_case() uses the case's open proceeding (fast-path matter from Step 2) Wizard + views + menu; "Emergency Motion" button on the case form (shown when the matter is_emergency). ACL added. Tests (familylaw_step10): fork seeds differ; missing/partial blocks ready; complete allows ready + file; file requires ready; no-checklist blocks; intake fast-path (urgency -> is_emergency case) then motion creation; motion uses open proceeding. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
{
|
{
|
||||||
"name": "Active Blue Family Law",
|
"name": "Active Blue Family Law",
|
||||||
"version": "18.0.9.0.0",
|
"version": "18.0.10.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)",
|
||||||
"description": """
|
"description": """
|
||||||
@@ -36,6 +36,7 @@ Each step adds one vertical, independently testable slice. See BUILD_PLAN.md.
|
|||||||
"views/familylaw_ai_views.xml",
|
"views/familylaw_ai_views.xml",
|
||||||
"views/familylaw_discovery_views.xml",
|
"views/familylaw_discovery_views.xml",
|
||||||
"views/familylaw_modification_views.xml",
|
"views/familylaw_modification_views.xml",
|
||||||
|
"views/familylaw_emergency_views.xml",
|
||||||
"views/familylaw_proceeding_views.xml",
|
"views/familylaw_proceeding_views.xml",
|
||||||
"views/familylaw_intake_views.xml",
|
"views/familylaw_intake_views.xml",
|
||||||
"views/familylaw_case_views.xml",
|
"views/familylaw_case_views.xml",
|
||||||
|
|||||||
@@ -14,5 +14,7 @@ from . import familylaw_verifier
|
|||||||
from . import familylaw_research
|
from . import familylaw_research
|
||||||
from . import familylaw_discovery
|
from . import familylaw_discovery
|
||||||
from . import familylaw_modification
|
from . import familylaw_modification
|
||||||
|
from . import familylaw_emergency
|
||||||
from . import familylaw_ai_wizard
|
from . import familylaw_ai_wizard
|
||||||
from . import familylaw_modification_wizard
|
from . import familylaw_modification_wizard
|
||||||
|
from . import familylaw_emergency_wizard
|
||||||
|
|||||||
@@ -0,0 +1,172 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""STEP 10 — Emergency workflow (Rule 12.941 pick-up / removal).
|
||||||
|
|
||||||
|
An emergency motion hangs off a PROCEEDING (typically the fast-path matter opened by
|
||||||
|
the intake urgency screen in Step 2). The two structural safety features:
|
||||||
|
|
||||||
|
* the HAVE-ORDER-vs-NOT fork — the required attachments differ depending on whether
|
||||||
|
there is already an order to enforce (certified copy) or the movant must establish
|
||||||
|
the emergency from scratch (verified motion / sworn affidavit);
|
||||||
|
* a MISSING-ATTACHMENT BLOCK — the motion cannot be marked ready/filed until every
|
||||||
|
required attachment for its fork is present.
|
||||||
|
|
||||||
|
VERIFY current rule — pick-up / emergency-relief mechanics and required attachments
|
||||||
|
are volatile; confirm before relying in production. Nothing here decides the motion;
|
||||||
|
the attorney signs and the court rules.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from odoo import api, fields, models, _
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
|
|
||||||
|
class FamilyLawEmergencyMotion(models.Model):
|
||||||
|
_name = "familylaw.emergency.motion"
|
||||||
|
_description = "Emergency Motion (12.941)"
|
||||||
|
_inherit = ["mail.thread"]
|
||||||
|
_order = "create_date desc"
|
||||||
|
|
||||||
|
name = fields.Char(required=True, default="Emergency Motion", tracking=True)
|
||||||
|
proceeding_id = fields.Many2one(
|
||||||
|
"familylaw.proceeding", required=True, ondelete="cascade", index=True,
|
||||||
|
tracking=True,
|
||||||
|
)
|
||||||
|
case_id = fields.Many2one(
|
||||||
|
"familylaw.case", related="proceeding_id.case_id", store=True, index=True,
|
||||||
|
)
|
||||||
|
child_id = fields.Many2one("familylaw.child", string="Child")
|
||||||
|
motion_type = fields.Selection(
|
||||||
|
selection=[
|
||||||
|
("pickup_order", "Pick-Up Order"),
|
||||||
|
("temporary_custody", "Emergency Temporary Custody"),
|
||||||
|
("prevent_removal", "Prevent Removal from Jurisdiction"),
|
||||||
|
("other", "Other Emergency Relief"),
|
||||||
|
],
|
||||||
|
string="Motion Type",
|
||||||
|
required=True,
|
||||||
|
default="pickup_order",
|
||||||
|
tracking=True,
|
||||||
|
)
|
||||||
|
have_existing_order = fields.Boolean(
|
||||||
|
string="Existing Order to Enforce?",
|
||||||
|
tracking=True,
|
||||||
|
help="The fork: enforce an existing order (certified copy) vs. establish the "
|
||||||
|
"emergency from scratch (verified motion / sworn affidavit).",
|
||||||
|
)
|
||||||
|
existing_order_reference = fields.Char(string="Existing Order Reference")
|
||||||
|
basis = fields.Text(string="Sworn Basis (no existing order)")
|
||||||
|
|
||||||
|
attachment_ids = fields.One2many(
|
||||||
|
"familylaw.emergency.attachment", "motion_id", string="Required Attachments",
|
||||||
|
)
|
||||||
|
missing_required_count = fields.Integer(
|
||||||
|
compute="_compute_missing", string="Missing Required",
|
||||||
|
)
|
||||||
|
state = fields.Selection(
|
||||||
|
selection=[
|
||||||
|
("draft", "Draft"),
|
||||||
|
("ready", "Ready to File"),
|
||||||
|
("filed", "Filed"),
|
||||||
|
],
|
||||||
|
default="draft",
|
||||||
|
required=True,
|
||||||
|
tracking=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
@api.depends("attachment_ids.is_required", "attachment_ids.provided")
|
||||||
|
def _compute_missing(self):
|
||||||
|
for m in self:
|
||||||
|
m.missing_required_count = len(
|
||||||
|
m.attachment_ids.filtered(lambda a: a.is_required and not a.provided)
|
||||||
|
)
|
||||||
|
|
||||||
|
# --- requirement seeding (the fork) -------------------------------------
|
||||||
|
def _required_for_fork(self):
|
||||||
|
self.ensure_one()
|
||||||
|
if self.have_existing_order:
|
||||||
|
return [
|
||||||
|
_("Certified copy of the existing order"),
|
||||||
|
_("Proposed pick-up / enforcement order"),
|
||||||
|
]
|
||||||
|
return [
|
||||||
|
_("Verified motion / sworn affidavit establishing the emergency"),
|
||||||
|
_("Proposed pick-up order"),
|
||||||
|
]
|
||||||
|
|
||||||
|
def action_seed_requirements(self):
|
||||||
|
Att = self.env["familylaw.emergency.attachment"]
|
||||||
|
for m in self:
|
||||||
|
m.attachment_ids.unlink()
|
||||||
|
for label in m._required_for_fork():
|
||||||
|
Att.create({"motion_id": m.id, "name": label, "is_required": True})
|
||||||
|
m.message_post(body=_("Required attachments seeded for the %s path.")
|
||||||
|
% ("existing-order" if m.have_existing_order else "no-order"))
|
||||||
|
return True
|
||||||
|
|
||||||
|
# --- gates --------------------------------------------------------------
|
||||||
|
def _ensure_complete(self):
|
||||||
|
for m in self:
|
||||||
|
missing = m.attachment_ids.filtered(
|
||||||
|
lambda a: a.is_required and not a.provided)
|
||||||
|
if not m.attachment_ids:
|
||||||
|
raise UserError(
|
||||||
|
_("No attachment checklist yet. Seed the requirements first.")
|
||||||
|
)
|
||||||
|
if missing:
|
||||||
|
raise UserError(
|
||||||
|
_("Emergency motion '%(name)s' is missing required attachment(s): "
|
||||||
|
"%(list)s. It cannot be filed until complete.",
|
||||||
|
name=m.name, list="; ".join(missing.mapped("name")))
|
||||||
|
)
|
||||||
|
|
||||||
|
def action_mark_ready(self):
|
||||||
|
self._ensure_complete()
|
||||||
|
for m in self:
|
||||||
|
m.state = "ready"
|
||||||
|
m.message_post(body=_("All required attachments present — ready to file."))
|
||||||
|
return True
|
||||||
|
|
||||||
|
def action_file(self):
|
||||||
|
for m in self:
|
||||||
|
if m.state != "ready":
|
||||||
|
raise UserError(
|
||||||
|
_("Mark the motion ready (all attachments present) before filing.")
|
||||||
|
)
|
||||||
|
m.state = "filed"
|
||||||
|
m.message_post(body=_("Emergency motion filed."))
|
||||||
|
return True
|
||||||
|
|
||||||
|
# --- creation helper (fast-path) ----------------------------------------
|
||||||
|
@api.model
|
||||||
|
def open_for_case(self, case, motion_type, have_existing_order, *,
|
||||||
|
child=None, basis=None, existing_order_reference=None):
|
||||||
|
case = case if hasattr(case, "id") else self.env["familylaw.case"].browse(case)
|
||||||
|
proc = case.proceeding_ids.filtered(lambda p: p.state == "open")[:1]
|
||||||
|
if not proc:
|
||||||
|
proc = self.env["familylaw.proceeding"].create({
|
||||||
|
"case_id": case.id,
|
||||||
|
"name": _("Emergency Proceeding"),
|
||||||
|
"proceeding_type": "other",
|
||||||
|
})
|
||||||
|
motion = self.create({
|
||||||
|
"proceeding_id": proc.id,
|
||||||
|
"motion_type": motion_type,
|
||||||
|
"have_existing_order": have_existing_order,
|
||||||
|
"child_id": child.id if child else False,
|
||||||
|
"basis": basis or False,
|
||||||
|
"existing_order_reference": existing_order_reference or False,
|
||||||
|
})
|
||||||
|
motion.action_seed_requirements()
|
||||||
|
return motion
|
||||||
|
|
||||||
|
|
||||||
|
class FamilyLawEmergencyAttachment(models.Model):
|
||||||
|
_name = "familylaw.emergency.attachment"
|
||||||
|
_description = "Emergency Motion Attachment Requirement"
|
||||||
|
_order = "id"
|
||||||
|
|
||||||
|
motion_id = fields.Many2one(
|
||||||
|
"familylaw.emergency.motion", required=True, ondelete="cascade", index=True,
|
||||||
|
)
|
||||||
|
name = fields.Char(required=True)
|
||||||
|
is_required = fields.Boolean(default=True)
|
||||||
|
provided = fields.Boolean(default=False)
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""STEP 10 — Wizard to open an emergency motion from a case (fast-path)."""
|
||||||
|
|
||||||
|
from odoo import fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class FamilyLawEmergencyWizard(models.TransientModel):
|
||||||
|
_name = "familylaw.emergency.wizard"
|
||||||
|
_description = "Open Emergency Motion"
|
||||||
|
|
||||||
|
case_id = fields.Many2one("familylaw.case", required=True)
|
||||||
|
motion_type = fields.Selection(
|
||||||
|
selection=[
|
||||||
|
("pickup_order", "Pick-Up Order"),
|
||||||
|
("temporary_custody", "Emergency Temporary Custody"),
|
||||||
|
("prevent_removal", "Prevent Removal from Jurisdiction"),
|
||||||
|
("other", "Other Emergency Relief"),
|
||||||
|
],
|
||||||
|
default="pickup_order",
|
||||||
|
required=True,
|
||||||
|
)
|
||||||
|
have_existing_order = fields.Boolean(string="Existing Order to Enforce?")
|
||||||
|
child_id = fields.Many2one("familylaw.child", string="Child")
|
||||||
|
existing_order_reference = fields.Char(string="Existing Order Reference")
|
||||||
|
basis = fields.Text(string="Sworn Basis (no existing order)")
|
||||||
|
|
||||||
|
def action_open(self):
|
||||||
|
self.ensure_one()
|
||||||
|
motion = self.env["familylaw.emergency.motion"].open_for_case(
|
||||||
|
self.case_id, self.motion_type, self.have_existing_order,
|
||||||
|
child=self.child_id or None,
|
||||||
|
basis=self.basis or None,
|
||||||
|
existing_order_reference=self.existing_order_reference or None,
|
||||||
|
)
|
||||||
|
return {
|
||||||
|
"type": "ir.actions.act_window",
|
||||||
|
"res_model": "familylaw.emergency.motion",
|
||||||
|
"res_id": motion.id,
|
||||||
|
"view_mode": "form",
|
||||||
|
"target": "current",
|
||||||
|
}
|
||||||
@@ -32,3 +32,8 @@ access_familylaw_discovery_attorney,familylaw.discovery.request attorney,model_f
|
|||||||
access_familylaw_modification_user,familylaw.support.modification staff,model_familylaw_support_modification,group_familylaw_user,1,1,1,0
|
access_familylaw_modification_user,familylaw.support.modification staff,model_familylaw_support_modification,group_familylaw_user,1,1,1,0
|
||||||
access_familylaw_modification_attorney,familylaw.support.modification attorney,model_familylaw_support_modification,group_familylaw_attorney,1,1,1,1
|
access_familylaw_modification_attorney,familylaw.support.modification attorney,model_familylaw_support_modification,group_familylaw_attorney,1,1,1,1
|
||||||
access_familylaw_modification_wizard_user,familylaw.modification.wizard user,model_familylaw_modification_wizard,group_familylaw_user,1,1,1,1
|
access_familylaw_modification_wizard_user,familylaw.modification.wizard user,model_familylaw_modification_wizard,group_familylaw_user,1,1,1,1
|
||||||
|
access_familylaw_emergency_user,familylaw.emergency.motion staff,model_familylaw_emergency_motion,group_familylaw_user,1,1,1,0
|
||||||
|
access_familylaw_emergency_attorney,familylaw.emergency.motion attorney,model_familylaw_emergency_motion,group_familylaw_attorney,1,1,1,1
|
||||||
|
access_familylaw_emergency_att_user,familylaw.emergency.attachment staff,model_familylaw_emergency_attachment,group_familylaw_user,1,1,1,1
|
||||||
|
access_familylaw_emergency_att_attorney,familylaw.emergency.attachment attorney,model_familylaw_emergency_attachment,group_familylaw_attorney,1,1,1,1
|
||||||
|
access_familylaw_emergency_wizard_user,familylaw.emergency.wizard user,model_familylaw_emergency_wizard,group_familylaw_user,1,1,1,1
|
||||||
|
|||||||
|
@@ -7,3 +7,4 @@ from . import test_step6
|
|||||||
from . import test_step7
|
from . import test_step7
|
||||||
from . import test_step8
|
from . import test_step8
|
||||||
from . import test_step9
|
from . import test_step9
|
||||||
|
from . import test_step10
|
||||||
|
|||||||
@@ -0,0 +1,112 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""STEP 10 tests — emergency workflow (12.941 pick-up/removal).
|
||||||
|
|
||||||
|
odoo -d <db> -u activeblue_familylaw --test-enable \
|
||||||
|
--test-tags familylaw_step10 --stop-after-init
|
||||||
|
|
||||||
|
Proves:
|
||||||
|
* the have-order-vs-not fork seeds different required attachments;
|
||||||
|
* a missing required attachment BLOCKS marking ready / filing;
|
||||||
|
* once complete, the motion can be marked ready and filed;
|
||||||
|
* the intake fast-path opens a matter on minimum facts (is_emergency) and an
|
||||||
|
emergency motion can be created on it.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from odoo.tests.common import TransactionCase, tagged
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
|
|
||||||
|
@tagged("post_install", "-at_install", "familylaw", "familylaw_step10")
|
||||||
|
class TestStep10Emergency(TransactionCase):
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
super().setUpClass()
|
||||||
|
cls.partner = cls.env["res.partner"].create({"name": "Emerg Client"})
|
||||||
|
cls.case = cls.env["familylaw.case"].create({
|
||||||
|
"name": "Emergency Matter", "client_id": cls.partner.id,
|
||||||
|
"case_type": "enforcement", "is_emergency": True,
|
||||||
|
})
|
||||||
|
cls.Motion = cls.env["familylaw.emergency.motion"]
|
||||||
|
|
||||||
|
# --- the fork -----------------------------------------------------------
|
||||||
|
def test_01_no_order_fork_requirements(self):
|
||||||
|
m = self.Motion.open_for_case(self.case, "pickup_order", False)
|
||||||
|
names = m.attachment_ids.mapped("name")
|
||||||
|
self.assertTrue(any("sworn affidavit" in n.lower() or "verified motion" in n.lower()
|
||||||
|
for n in names))
|
||||||
|
|
||||||
|
def test_02_have_order_fork_requirements(self):
|
||||||
|
m = self.Motion.open_for_case(self.case, "pickup_order", True)
|
||||||
|
names = m.attachment_ids.mapped("name")
|
||||||
|
self.assertTrue(any("certified copy" in n.lower() for n in names))
|
||||||
|
|
||||||
|
def test_03_forks_differ(self):
|
||||||
|
m_no = self.Motion.open_for_case(self.case, "pickup_order", False)
|
||||||
|
m_yes = self.Motion.open_for_case(self.case, "pickup_order", True)
|
||||||
|
self.assertNotEqual(
|
||||||
|
set(m_no.attachment_ids.mapped("name")),
|
||||||
|
set(m_yes.attachment_ids.mapped("name")),
|
||||||
|
)
|
||||||
|
|
||||||
|
# --- missing-attachment block -------------------------------------------
|
||||||
|
def test_04_missing_blocks_ready(self):
|
||||||
|
m = self.Motion.open_for_case(self.case, "pickup_order", True)
|
||||||
|
# nothing provided yet
|
||||||
|
self.assertGreater(m.missing_required_count, 0)
|
||||||
|
with self.assertRaises(UserError):
|
||||||
|
m.action_mark_ready()
|
||||||
|
self.assertEqual(m.state, "draft")
|
||||||
|
|
||||||
|
def test_05_partial_still_blocks(self):
|
||||||
|
m = self.Motion.open_for_case(self.case, "pickup_order", True)
|
||||||
|
m.attachment_ids[0].provided = True
|
||||||
|
if len(m.attachment_ids) > 1:
|
||||||
|
with self.assertRaises(UserError):
|
||||||
|
m.action_mark_ready()
|
||||||
|
|
||||||
|
def test_06_complete_allows_ready(self):
|
||||||
|
m = self.Motion.open_for_case(self.case, "pickup_order", True)
|
||||||
|
m.attachment_ids.write({"provided": True})
|
||||||
|
m.action_mark_ready()
|
||||||
|
self.assertEqual(m.state, "ready")
|
||||||
|
self.assertEqual(m.missing_required_count, 0)
|
||||||
|
|
||||||
|
def test_07_file_requires_ready(self):
|
||||||
|
m = self.Motion.open_for_case(self.case, "pickup_order", True)
|
||||||
|
with self.assertRaises(UserError):
|
||||||
|
m.action_file()
|
||||||
|
m.attachment_ids.write({"provided": True})
|
||||||
|
m.action_mark_ready()
|
||||||
|
m.action_file()
|
||||||
|
self.assertEqual(m.state, "filed")
|
||||||
|
|
||||||
|
def test_08_no_checklist_blocks(self):
|
||||||
|
m = self.Motion.create({
|
||||||
|
"proceeding_id": self.case.proceeding_ids[0].id,
|
||||||
|
"motion_type": "pickup_order",
|
||||||
|
})
|
||||||
|
# remove any seeded items
|
||||||
|
m.attachment_ids.unlink()
|
||||||
|
with self.assertRaises(UserError):
|
||||||
|
m.action_mark_ready()
|
||||||
|
|
||||||
|
# --- fast-path intake ---------------------------------------------------
|
||||||
|
def test_09_intake_fast_path_then_motion(self):
|
||||||
|
wiz = self.env["familylaw.intake.wizard"].create({
|
||||||
|
"caller_name": "Panicked Parent",
|
||||||
|
"urgency_child_withheld": True,
|
||||||
|
})
|
||||||
|
self.assertTrue(wiz.is_emergency)
|
||||||
|
wiz._create_emergency_case()
|
||||||
|
case = wiz.created_case_id
|
||||||
|
self.assertTrue(case.is_emergency)
|
||||||
|
# emergency motion on the fast-path matter
|
||||||
|
m = self.Motion.open_for_case(case, "pickup_order", False)
|
||||||
|
self.assertEqual(m.case_id, case)
|
||||||
|
self.assertTrue(m.attachment_ids)
|
||||||
|
|
||||||
|
def test_10_motion_uses_open_proceeding(self):
|
||||||
|
m = self.Motion.open_for_case(self.case, "prevent_removal", False)
|
||||||
|
self.assertEqual(m.proceeding_id.state, "open")
|
||||||
|
self.assertEqual(m.case_id, self.case)
|
||||||
@@ -55,6 +55,11 @@
|
|||||||
string="Open Support Modification"
|
string="Open Support Modification"
|
||||||
context="{'default_case_id': id}"
|
context="{'default_case_id': id}"
|
||||||
invisible="case_type != 'support_modification'"/>
|
invisible="case_type != 'support_modification'"/>
|
||||||
|
<!-- Open an emergency motion (fast-path) -->
|
||||||
|
<button name="%(action_familylaw_emergency_wizard)d" type="action"
|
||||||
|
string="Emergency Motion" class="btn-danger"
|
||||||
|
context="{'default_case_id': id}"
|
||||||
|
invisible="not is_emergency"/>
|
||||||
<!-- 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'"
|
||||||
|
|||||||
@@ -0,0 +1,125 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="view_familylaw_emergency_list" model="ir.ui.view">
|
||||||
|
<field name="name">familylaw.emergency.motion.list</field>
|
||||||
|
<field name="model">familylaw.emergency.motion</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<list string="Emergency Motions"
|
||||||
|
decoration-danger="missing_required_count > 0"
|
||||||
|
decoration-success="state == 'filed'">
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="case_id"/>
|
||||||
|
<field name="motion_type"/>
|
||||||
|
<field name="have_existing_order"/>
|
||||||
|
<field name="missing_required_count"/>
|
||||||
|
<field name="state" widget="badge"/>
|
||||||
|
</list>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="view_familylaw_emergency_form" model="ir.ui.view">
|
||||||
|
<field name="name">familylaw.emergency.motion.form</field>
|
||||||
|
<field name="model">familylaw.emergency.motion</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form string="Emergency Motion">
|
||||||
|
<header>
|
||||||
|
<button name="action_seed_requirements" type="object"
|
||||||
|
string="Seed Requirements"/>
|
||||||
|
<button name="action_mark_ready" type="object"
|
||||||
|
string="Mark Ready" class="btn-primary"
|
||||||
|
invisible="state != 'draft'"/>
|
||||||
|
<button name="action_file" type="object"
|
||||||
|
string="File" invisible="state != 'ready'"/>
|
||||||
|
<field name="state" widget="statusbar"
|
||||||
|
statusbar_visible="draft,ready,filed"/>
|
||||||
|
</header>
|
||||||
|
<sheet>
|
||||||
|
<div class="alert alert-danger" role="alert"
|
||||||
|
invisible="missing_required_count == 0">
|
||||||
|
<field name="missing_required_count" readonly="1" nolabel="1"/>
|
||||||
|
required attachment(s) missing — the motion is blocked from
|
||||||
|
filing until complete.
|
||||||
|
</div>
|
||||||
|
<div class="oe_title">
|
||||||
|
<label for="name"/>
|
||||||
|
<h1><field name="name"/></h1>
|
||||||
|
</div>
|
||||||
|
<group>
|
||||||
|
<group string="Motion">
|
||||||
|
<field name="motion_type"/>
|
||||||
|
<field name="have_existing_order"/>
|
||||||
|
<field name="existing_order_reference"
|
||||||
|
invisible="not have_existing_order"/>
|
||||||
|
<field name="child_id"/>
|
||||||
|
</group>
|
||||||
|
<group string="Matter">
|
||||||
|
<field name="proceeding_id"/>
|
||||||
|
<field name="case_id" readonly="1"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<group string="Sworn Basis (no existing order)"
|
||||||
|
invisible="have_existing_order">
|
||||||
|
<field name="basis" nolabel="1"/>
|
||||||
|
</group>
|
||||||
|
<notebook>
|
||||||
|
<page string="Required Attachments" name="attachments">
|
||||||
|
<field name="attachment_ids">
|
||||||
|
<list editable="bottom">
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="is_required"/>
|
||||||
|
<field name="provided" widget="boolean_toggle"/>
|
||||||
|
</list>
|
||||||
|
</field>
|
||||||
|
</page>
|
||||||
|
</notebook>
|
||||||
|
</sheet>
|
||||||
|
<div class="oe_chatter">
|
||||||
|
<field name="message_follower_ids"/>
|
||||||
|
<field name="activity_ids"/>
|
||||||
|
<field name="message_ids"/>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_familylaw_emergency" model="ir.actions.act_window">
|
||||||
|
<field name="name">Emergency Motions</field>
|
||||||
|
<field name="res_model">familylaw.emergency.motion</field>
|
||||||
|
<field name="view_mode">list,form</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- Wizard -->
|
||||||
|
<record id="view_familylaw_emergency_wizard_form" model="ir.ui.view">
|
||||||
|
<field name="name">familylaw.emergency.wizard.form</field>
|
||||||
|
<field name="model">familylaw.emergency.wizard</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form string="Open Emergency Motion">
|
||||||
|
<sheet>
|
||||||
|
<group>
|
||||||
|
<field name="case_id"/>
|
||||||
|
<field name="motion_type"/>
|
||||||
|
<field name="have_existing_order"/>
|
||||||
|
<field name="existing_order_reference"
|
||||||
|
invisible="not have_existing_order"/>
|
||||||
|
<field name="child_id"/>
|
||||||
|
<field name="basis" invisible="have_existing_order"/>
|
||||||
|
</group>
|
||||||
|
</sheet>
|
||||||
|
<footer>
|
||||||
|
<button name="action_open" type="object"
|
||||||
|
string="Open Motion" class="btn-primary"/>
|
||||||
|
<button string="Cancel" special="cancel"/>
|
||||||
|
</footer>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_familylaw_emergency_wizard" model="ir.actions.act_window">
|
||||||
|
<field name="name">Open Emergency Motion</field>
|
||||||
|
<field name="res_model">familylaw.emergency.wizard</field>
|
||||||
|
<field name="view_mode">form</field>
|
||||||
|
<field name="target">new</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@@ -41,6 +41,13 @@
|
|||||||
action="action_familylaw_affidavit"
|
action="action_familylaw_affidavit"
|
||||||
sequence="40"/>
|
sequence="40"/>
|
||||||
|
|
||||||
|
<!-- Emergency Motions -->
|
||||||
|
<menuitem id="menu_familylaw_emergency"
|
||||||
|
name="Emergency Motions"
|
||||||
|
parent="menu_familylaw_root"
|
||||||
|
action="action_familylaw_emergency"
|
||||||
|
sequence="43"/>
|
||||||
|
|
||||||
<!-- Support Modifications -->
|
<!-- Support Modifications -->
|
||||||
<menuitem id="menu_familylaw_modifications"
|
<menuitem id="menu_familylaw_modifications"
|
||||||
name="Support Modifications"
|
name="Support Modifications"
|
||||||
|
|||||||
Reference in New Issue
Block a user