caselawclient.models.documents.stub

 1import os
 2from typing import Literal, cast
 3
 4from ds_caselaw_utils.courts import courts
 5from ds_caselaw_utils.types import CourtCode
 6from saxonche import PySaxonProcessor
 7from typing_extensions import TypedDict
 8
 9
10class PartyData(TypedDict):
11    role: Literal["Claimant", "Respondent", "Appellant", "Defendant"]
12    name: str
13
14
15class EditorStubData(TypedDict):
16    decision_date: str  # day precision
17    transform_datetime: str  # second precision
18    court_code: str
19    title: str
20    year: str
21    case_numbers: list[str]  # can be none
22    parties: list[PartyData]  # (type (claimant|defendant), name)
23
24
25class RendererStubData(EditorStubData):
26    court_url: str  # should be populated from utils/courts.cs
27    court_full_name: str  # ditto
28
29
30def add_other_stub_fields(editor_data: EditorStubData) -> RendererStubData:
31    court = courts.get_court_by_code(CourtCode(editor_data["court_code"].upper()))
32    return {
33        **editor_data,
34        "court_url": court.identifier_iri,
35        "court_full_name": court.long_name,
36    }
37
38
39def render_stub_xml(editor_data: EditorStubData) -> bytes:
40    render_data = add_other_stub_fields(editor_data)
41    xquery_location = os.path.join(os.path.dirname(os.path.realpath(__file__)), "templates", "judgment.xqy")
42
43    with PySaxonProcessor() as proc:
44        xquery = proc.new_xquery_processor()
45    xquery.set_query_file(file_name=xquery_location)
46
47    xquery.set_parameter("decision_date", proc.make_string_value(render_data["decision_date"]))
48    xquery.set_parameter("transform_datetime", proc.make_string_value(render_data["transform_datetime"]))
49    xquery.set_parameter("court_code", proc.make_string_value(render_data["court_code"]))
50    xquery.set_parameter("title", proc.make_string_value(render_data["title"]))
51    xquery.set_parameter("year", proc.make_string_value(render_data["year"]))
52    xquery.set_parameter("court_url", proc.make_string_value(render_data["court_url"]))
53    xquery.set_parameter("court_full_name", proc.make_string_value(render_data["court_full_name"]))
54    xquery.set_parameter(
55        "case_numbers", proc.make_array([proc.make_string_value(x) for x in render_data["case_numbers"]])
56    )
57
58    builder = []
59    for party in render_data["parties"]:
60        builder.append(
61            proc.make_map({proc.make_string_value(key): proc.make_string_value(value) for key, value in party.items()})
62        )
63
64    xquery.set_parameter("parties", proc.make_array(builder))
65    return cast(bytes, xquery.run_query_to_string().encode("utf-8"))
class PartyData(typing_extensions.TypedDict):
11class PartyData(TypedDict):
12    role: Literal["Claimant", "Respondent", "Appellant", "Defendant"]
13    name: str
role: Literal['Claimant', 'Respondent', 'Appellant', 'Defendant']
name: str
class EditorStubData(typing_extensions.TypedDict):
16class EditorStubData(TypedDict):
17    decision_date: str  # day precision
18    transform_datetime: str  # second precision
19    court_code: str
20    title: str
21    year: str
22    case_numbers: list[str]  # can be none
23    parties: list[PartyData]  # (type (claimant|defendant), name)
decision_date: str
transform_datetime: str
court_code: str
title: str
year: str
case_numbers: list[str]
parties: list[PartyData]
class RendererStubData(EditorStubData):
26class RendererStubData(EditorStubData):
27    court_url: str  # should be populated from utils/courts.cs
28    court_full_name: str  # ditto
court_url: str
court_full_name: str
def add_other_stub_fields( editor_data: EditorStubData) -> RendererStubData:
31def add_other_stub_fields(editor_data: EditorStubData) -> RendererStubData:
32    court = courts.get_court_by_code(CourtCode(editor_data["court_code"].upper()))
33    return {
34        **editor_data,
35        "court_url": court.identifier_iri,
36        "court_full_name": court.long_name,
37    }
def render_stub_xml(editor_data: EditorStubData) -> bytes:
40def render_stub_xml(editor_data: EditorStubData) -> bytes:
41    render_data = add_other_stub_fields(editor_data)
42    xquery_location = os.path.join(os.path.dirname(os.path.realpath(__file__)), "templates", "judgment.xqy")
43
44    with PySaxonProcessor() as proc:
45        xquery = proc.new_xquery_processor()
46    xquery.set_query_file(file_name=xquery_location)
47
48    xquery.set_parameter("decision_date", proc.make_string_value(render_data["decision_date"]))
49    xquery.set_parameter("transform_datetime", proc.make_string_value(render_data["transform_datetime"]))
50    xquery.set_parameter("court_code", proc.make_string_value(render_data["court_code"]))
51    xquery.set_parameter("title", proc.make_string_value(render_data["title"]))
52    xquery.set_parameter("year", proc.make_string_value(render_data["year"]))
53    xquery.set_parameter("court_url", proc.make_string_value(render_data["court_url"]))
54    xquery.set_parameter("court_full_name", proc.make_string_value(render_data["court_full_name"]))
55    xquery.set_parameter(
56        "case_numbers", proc.make_array([proc.make_string_value(x) for x in render_data["case_numbers"]])
57    )
58
59    builder = []
60    for party in render_data["parties"]:
61        builder.append(
62            proc.make_map({proc.make_string_value(key): proc.make_string_value(value) for key, value in party.items()})
63        )
64
65    xquery.set_parameter("parties", proc.make_array(builder))
66    return cast(bytes, xquery.run_query_to_string().encode("utf-8"))