exobrain-database 0.1.2__tar.gz → 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/PKG-INFO +34 -1
  2. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/README.md +33 -0
  3. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/pyproject.toml +15 -1
  4. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/env.py +5 -3
  5. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/migration_manager.py +1 -1
  6. exobrain_database-0.2.0/src/exobrain/database/migrations/versions/2026_06_29_1324-b23761c01aac_add_updated_data_to_running_action_context.py +36 -0
  7. exobrain_database-0.2.0/src/exobrain/database/migrations/versions/2026_06_29_1500-c5a9e1f3b7d2_add_widget_executive_view_fields.py +78 -0
  8. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/associations/copilot_license.py +2 -1
  9. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/associations/exec_conf_execution_reason.py +2 -1
  10. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/associations/predefined_action_action_reason.py +2 -1
  11. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/associations/predefined_action_predefined_risk.py +2 -1
  12. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/associations/predefined_execution_execution_reason.py +2 -1
  13. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/associations/predefined_execution_predefined_action.py +2 -1
  14. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/associations/predefined_risk_risk_reason.py +2 -1
  15. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/associations/risk_conf_risk_reason.py +2 -1
  16. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/associations/roles_action_conf.py +2 -1
  17. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/associations/roles_exec_conf.py +2 -1
  18. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/associations/roles_permissions.py +2 -1
  19. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/associations/roles_predefined_action.py +2 -1
  20. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/associations/roles_predefined_execution.py +2 -1
  21. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/associations/roles_running_actions.py +2 -1
  22. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/associations/roles_running_executions.py +2 -1
  23. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/associations/roles_users.py +2 -1
  24. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/associations/running_action_context_scopes.py +2 -1
  25. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/associations/users_scopes.py +2 -1
  26. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/enums/__init__.py +2 -0
  27. exobrain_database-0.2.0/src/exobrain/database/model/enums/dashboard.py +14 -0
  28. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/general/permission.py +3 -2
  29. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/general/predefined_models.py +3 -4
  30. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/general/reason_models.py +3 -2
  31. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/org/dashboard_models.py +21 -7
  32. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/org/running_models.py +11 -5
  33. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/org/user.py +2 -1
  34. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/tools/jsonb_filter.py +2 -2
  35. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/LICENSE.md +0 -0
  36. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/__init__.py +0 -0
  37. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/README.md +0 -0
  38. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/__init__.py +0 -0
  39. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/alembic.ini +0 -0
  40. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/script.py.mako +0 -0
  41. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2023_08_17_0937-3ed3cf31c9d4_.py +0 -0
  42. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2023_08_31_1322-aa6854636eac_.py +0 -0
  43. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2023_09_01_0925-9667f0608380_.py +0 -0
  44. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2023_09_13_1243-3cd1eb0d7b52_.py +0 -0
  45. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2023_09_15_1447-52f33bc03521_.py +0 -0
  46. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2023_09_19_0956-f8e096a41120_.py +0 -0
  47. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2023_09_21_1642-74f18c0bab6e_.py +0 -0
  48. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2023_09_28_1237-919ce06afab1_.py +0 -0
  49. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2023_10_04_0718-03535f8dfe5f_.py +0 -0
  50. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2023_10_05_1508-f64d4c00b610_.py +0 -0
  51. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2023_10_06_0819-e544518a415c_.py +0 -0
  52. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2023_10_06_1312-b9b232d63be3_.py +0 -0
  53. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2023_10_25_0902-aab08fb68941_.py +0 -0
  54. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2023_10_25_0937-d59ec80e6dd7_.py +0 -0
  55. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2023_11_22_1628-84b116f3df26_.py +0 -0
  56. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2023_11_22_1654-bcb01e365c42_.py +0 -0
  57. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2023_11_27_1045-00ce519af235_.py +0 -0
  58. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2023_11_27_1048-f779dc9fe429_.py +0 -0
  59. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2023_11_29_1421-ad2b4c9c38fe_.py +0 -0
  60. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2023_12_04_1029-f91d936478fb_.py +0 -0
  61. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2023_12_11_1104-b33e0d6a5bdd_.py +0 -0
  62. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2023_12_18_1406-73ac94585923_.py +0 -0
  63. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2024_01_05_1022-f231770c573e_.py +0 -0
  64. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2024_01_17_1606-b94c145b2310_.py +0 -0
  65. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2024_01_18_1547-c450c961dfd0_.py +0 -0
  66. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2024_01_18_1855-7101980bc238_.py +0 -0
  67. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2024_01_22_1616-a35a2828dbcd_.py +0 -0
  68. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2024_03_04_1549-4cc4ffdb6c02_.py +0 -0
  69. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2024_03_13_1323-97a9ef3f38c3_.py +0 -0
  70. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2024_03_20_1033-13bc4d2ab3ab_.py +0 -0
  71. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2024_03_28_0905-ffd01ebb2c87_.py +0 -0
  72. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2024_03_28_1332-33744d8620d3_.py +0 -0
  73. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2024_04_05_0919-a14d98908583_.py +0 -0
  74. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2024_04_29_1515-882409414d37_.py +0 -0
  75. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2024_05_23_0959-24bb8fdb3ba7_.py +0 -0
  76. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2024_05_24_1248-f2a78a625a74_.py +0 -0
  77. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2024_06_07_1537-004b611f77cf_.py +0 -0
  78. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2024_06_10_1306-f0fe99d57963_.py +0 -0
  79. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2024_10_15_0646-ef0829fe3540_.py +0 -0
  80. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_01_28_1020-ea2ebd0e2cdc_.py +0 -0
  81. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_03_19_1341-adeeb7c46a3c_.py +0 -0
  82. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_03_25_1449-8fb5b2059d5a_.py +0 -0
  83. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_05_06_1503-88aa2ef323c5-org.json +0 -0
  84. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_05_06_1503-88aa2ef323c5-public.json +0 -0
  85. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_05_06_1503-88aa2ef323c5_add_constraints_to_fk.py +0 -0
  86. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_05_20_1302-37f7dbf56615_add_is_learning_field_to_license.py +0 -0
  87. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_05_21_0839-096c1ab6ea15_add_is_learning_field_to_predefined_.py +0 -0
  88. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_06_03_0336-60d91382b626_add_grace_period_field_to_risk_conf.py +0 -0
  89. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_06_17_1013-4894e248a31d_add_risk_conf_buffer_period_field_to_.py +0 -0
  90. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_06_20_0845-c0e0c905cfb1_add_computing_strategy.py +0 -0
  91. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_06_20_0919-360b6879ae25_add_fully_computed_field_to_running_.py +0 -0
  92. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_06_21_1200-1a37475a962d_fix_feasible_field_in_running_risk_table_set_not_null.py +0 -0
  93. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_06_21_1300-d456be82025a_add_computed_mapping_field_in_running_.py +0 -0
  94. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_06_27_0154-317d388748a1_adding_auto_rejected_reason_code.py +0 -0
  95. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_06_27_0227-0a9522eb04f0_update_predefined_actions_execution.py +0 -0
  96. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_06_27_0610-9daee7d935b1_add_rejection_and_expiration_fields.py +0 -0
  97. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_06_27_0617-ee6062e6dc4d_add_rejection_and_expiration_fields.py +0 -0
  98. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_06_29_0828-90923eeab038_calculate_due_dates_and_due_indicators.py +0 -0
  99. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_09_26_1624-2716d77c7904_make_context_fields_non_nullable.py +0 -0
  100. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_09_26_1857-0ab6e7d1a127_add_note_column_to_running_action.py +0 -0
  101. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_10_17_1620-6400ea4ce6f0_add_index_overdue_risks.py +0 -0
  102. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_10_31_0222-67c46f78caca_convert_action_context_data_json_to_jsonb.py +0 -0
  103. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2025_11_04_2117-a8a814d7f2ea_rename_execution_reason_code.py +0 -0
  104. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2026_01_04_1647-87c0d5fd2688_apply_new_naming_rules_for_indexes.py +0 -0
  105. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2026_01_04_1801-392b727bbaa1_remove_unused_exo_conf_table.py +0 -0
  106. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2026_01_05_0840-4b12100a932c_add_constraints_to_organizations_settings.py +0 -0
  107. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2026_01_05_0917-f67bd91a1913_change_copilot_uiConfiguration_json_to_jsonb.py +0 -0
  108. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2026_01_05_0935-87de8335f045_constrain_organizations_preferences_fields.py +0 -0
  109. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2026_01_05_1018-7271b6d49e2c_enforce_not_null_and_jsonb_for_predefined_tables.py +0 -0
  110. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2026_01_05_1510-711567521aa6_convert_config_tables_json_to_jsonb.py +0 -0
  111. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2026_01_05_1540-ce5a35090a82_convert_connection_json_to_jsonb.py +0 -0
  112. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2026_01_06_0939-115812c0bcd6_make_scope_key_non_nullable.py +0 -0
  113. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2026_01_06_1109-7dd6b5f271ed_convert_json_to_jsonb_for_dashboard_and_widgets.py +0 -0
  114. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2026_01_06_1452-4e4ad858fdf9_convert_json_to_jsonb_for_running_entities.py +0 -0
  115. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2026_01_09_1558-6954766729aa_simplify_one_to_many_relationships.py +0 -0
  116. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2026_01_12_1639-e548f437e5de_simplify_one_to_many_relationships.py +0 -0
  117. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2026_02_03_1456-abbb5a630567_simplify_one_to_many_relationships.py +0 -0
  118. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2026_02_06_0827-95438a5ec210_simplify_one_to_many_relationships.py +0 -0
  119. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2026_02_06_0835-881f104f8b2b_simplify_one_to_many_relationships.py +0 -0
  120. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2026_04_20_1015-8f3c5e2d9a1b_add_running_action_summary_table_with_text_column.py +0 -0
  121. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2026_04_30_1357-c3e8047f29f6_add_kpi_names_to_predefined_action.py +0 -0
  122. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/migrations/versions/2026_05_07_0100-a1b2c3d4e5f6_create_scores_table.py +0 -0
  123. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/__init__.py +0 -0
  124. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/associations/__init__.py +0 -0
  125. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/associations/action_conf_action_reason.py +0 -0
  126. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/base.py +0 -0
  127. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/enums/config.py +0 -0
  128. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/enums/currency.py +0 -0
  129. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/enums/running.py +0 -0
  130. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/field_types.py +0 -0
  131. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/general/__init__.py +0 -0
  132. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/general/copilot.py +0 -0
  133. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/general/general_base.py +0 -0
  134. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/general/organization_models.py +0 -0
  135. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/general/role.py +0 -0
  136. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/org/__init__.py +0 -0
  137. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/org/config_models.py +2 -2
  138. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/org/connection.py +0 -0
  139. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/org/org_base.py +0 -0
  140. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/org/organization_settings.py +0 -0
  141. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/model/org/scope.py +0 -0
  142. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/py.typed +0 -0
  143. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/tools/__init__.py +0 -0
  144. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/tools/record_count.py +0 -0
  145. {exobrain_database-0.1.2 → exobrain_database-0.2.0}/src/exobrain/database/tools/sql_query_logger.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: exobrain-database
3
- Version: 0.1.2
3
+ Version: 0.2.0
4
4
  Summary: Exobrain database model and migration management
5
5
  Keywords:
6
6
  Author: Laurent LAPORTE
@@ -101,6 +101,39 @@ uv add --group dev package-name # Development
101
101
  uv sync --upgrade # Update all
102
102
  ```
103
103
 
104
+ ### Database migrations
105
+
106
+ Alembic reads the database connection from environment variables. Create a `.env` file at the project root (do not commit it):
107
+
108
+ ```sh
109
+ export SQL_HOST="localhost"
110
+ export SQL_DATABASE="exobrain"
111
+ export SQL_USER="postgres"
112
+ export SQL_PORT="5432"
113
+ export SQL_PASSWORD="Dfya2023"
114
+ ```
115
+
116
+ Source it before running any Alembic command:
117
+
118
+ ```console
119
+ source .env
120
+ ```
121
+
122
+ The Alembic settings are declared in `pyproject.toml` under `[tool.alembic]`, so you can run commands directly from the project root without the `-c` flag:
123
+
124
+ ```console
125
+ alembic current # Show applied revision
126
+ alembic history # List migration history
127
+ alembic upgrade head # Apply all pending migrations
128
+ alembic downgrade -1 # Roll back one migration
129
+ ```
130
+
131
+ For creating a new migration, pass `-c` explicitly so the file naming template from `alembic.ini` is applied:
132
+
133
+ ```console
134
+ alembic -c src/exobrain/database/migrations/alembic.ini revision --autogenerate -m "short description"
135
+ ```
136
+
104
137
  ---
105
138
 
106
139
  ## Project Structure
@@ -69,6 +69,39 @@ uv add --group dev package-name # Development
69
69
  uv sync --upgrade # Update all
70
70
  ```
71
71
 
72
+ ### Database migrations
73
+
74
+ Alembic reads the database connection from environment variables. Create a `.env` file at the project root (do not commit it):
75
+
76
+ ```sh
77
+ export SQL_HOST="localhost"
78
+ export SQL_DATABASE="exobrain"
79
+ export SQL_USER="postgres"
80
+ export SQL_PORT="5432"
81
+ export SQL_PASSWORD="Dfya2023"
82
+ ```
83
+
84
+ Source it before running any Alembic command:
85
+
86
+ ```console
87
+ source .env
88
+ ```
89
+
90
+ The Alembic settings are declared in `pyproject.toml` under `[tool.alembic]`, so you can run commands directly from the project root without the `-c` flag:
91
+
92
+ ```console
93
+ alembic current # Show applied revision
94
+ alembic history # List migration history
95
+ alembic upgrade head # Apply all pending migrations
96
+ alembic downgrade -1 # Roll back one migration
97
+ ```
98
+
99
+ For creating a new migration, pass `-c` explicitly so the file naming template from `alembic.ini` is applied:
100
+
101
+ ```console
102
+ alembic -c src/exobrain/database/migrations/alembic.ini revision --autogenerate -m "short description"
103
+ ```
104
+
72
105
  ---
73
106
 
74
107
  ## Project Structure
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "exobrain-database"
7
- version = "0.1.2"
7
+ version = "0.2.0"
8
8
  description = "Exobrain database model and migration management"
9
9
  authors = [
10
10
  { name = "Laurent LAPORTE", email = "laurent@dfya.io" }
@@ -98,6 +98,20 @@ exclude = [
98
98
  "src/exobrain/database/migrations/versions",
99
99
  ]
100
100
 
101
+ [tool.ruff.lint.extend-per-file-ignores]
102
+ "src/exobrain/database/model/*/*.py" = ["TID252"]
103
+ "src/exobrain/database/migrations/versions/*.py" = ["INP001"]
104
+
105
+
106
+ # -----------------------------------------------
107
+ # Configuration for "alembic" migration tool
108
+ # Mirrors alembic.ini so `alembic` commands can be run
109
+ # from the project root without the `-c` flag.
110
+ # -----------------------------------------------
111
+
112
+ [tool.alembic]
113
+ script_location = "src/exobrain/database/migrations"
114
+
101
115
  # -----------------------------------------------
102
116
  # Configuration for "ty" type checker
103
117
  # -----------------------------------------------
@@ -12,8 +12,9 @@ from sqlalchemy.sql.schema import SchemaItem
12
12
 
13
13
  from exobrain.database.model.base import BASE
14
14
 
15
- # Apply logging configuration from alembic.ini
16
- if context.config.config_file_name:
15
+ # Apply logging configuration from alembic.ini (only when the file exists,
16
+ # e.g. not when alembic is invoked via [tool.alembic] in pyproject.toml).
17
+ if context.config.config_file_name and os.path.exists(context.config.config_file_name):
17
18
  fileConfig(context.config.config_file_name)
18
19
 
19
20
  logger = logging.getLogger("alembic.runtime.migration")
@@ -169,7 +170,8 @@ def run_migrations_online() -> None:
169
170
  sql_port = int(os.getenv("SQL_PORT", "5432"))
170
171
  sql_password = os.getenv("SQL_PASSWORD")
171
172
  if not sql_password:
172
- raise MigrationException("SQL_PASSWORD environment variable is required.")
173
+ err = "SQL_PASSWORD environment variable is required."
174
+ raise MigrationException(err)
173
175
 
174
176
  db_url = URL.create(
175
177
  drivername=sql_engine,
@@ -32,7 +32,7 @@ P = ParamSpec("P")
32
32
  T = TypeVar("T")
33
33
 
34
34
 
35
- def _synchronized(func: abc.Callable[P, T]) -> abc.Callable[P, T]:
35
+ def _synchronized(func: abc.Callable[P, T]) -> abc.Callable[P, T]: # noqa: UP047
36
36
  """
37
37
  Decorator to synchronize access to migration functions.
38
38
 
@@ -0,0 +1,36 @@
1
+ """add updated_data to running_action_context_context
2
+
3
+ Revision ID: b23761c01aac
4
+ Revises: a1b2c3d4e5f6
5
+ Create Date: 2026-06-29 13:24:09.539774+00:00
6
+ """
7
+
8
+ from collections.abc import Sequence
9
+
10
+ import sqlalchemy as sa
11
+ from alembic import op
12
+ from sqlalchemy.dialects import postgresql
13
+
14
+ # revision identifiers, used by Alembic.
15
+ revision: str = "b23761c01aac"
16
+ down_revision: str | None = "a1b2c3d4e5f6"
17
+ branch_labels: str | Sequence[str] | None = None
18
+ depends_on: str | Sequence[str] | None = None
19
+
20
+
21
+ def upgrade(schema_type: str) -> None:
22
+ if schema_type != "base":
23
+ op.add_column(
24
+ "running_action_context",
25
+ sa.Column(
26
+ "updated_data",
27
+ postgresql.JSONB(astext_type=sa.Text()),
28
+ server_default=sa.text("'{}'::jsonb"),
29
+ nullable=False,
30
+ ),
31
+ )
32
+
33
+
34
+ def downgrade(schema_type: str) -> None:
35
+ if schema_type != "base":
36
+ op.drop_column("running_action_context", "updated_data")
@@ -0,0 +1,78 @@
1
+ """Add executive-view fields to widget: is_pinned, widget_kind, nullable dashboard_id
2
+
3
+ Revision ID: c5a9e1f3b7d2
4
+ Revises: b23761c01aac
5
+ Create Date: 2026-06-29 15:00:00.000000+00:00
6
+
7
+ """
8
+
9
+ import contextlib
10
+ from collections.abc import Sequence
11
+
12
+ import sqlalchemy as sa
13
+ from alembic import op
14
+ from sqlalchemy.exc import InternalError
15
+
16
+ # revision identifiers, used by Alembic.
17
+ revision: str = "c5a9e1f3b7d2"
18
+ down_revision: str | None = "b23761c01aac"
19
+ branch_labels: str | Sequence[str] | None = None
20
+ depends_on: str | Sequence[str] | None = None
21
+
22
+
23
+ def upgrade(schema_type: str) -> None:
24
+ if schema_type != "base":
25
+ upgrade_organization()
26
+
27
+
28
+ def downgrade(schema_type: str) -> None:
29
+ if schema_type != "base":
30
+ downgrade_organization()
31
+
32
+
33
+ def upgrade_organization() -> None:
34
+ """Add the executive-view fields to the widget table in organization schemas."""
35
+ widget_kind = sa.Enum("STANDARD", "AGGREGATE", name="widget_kind")
36
+ widget_kind.create(op.get_bind(), checkfirst=True)
37
+
38
+ op.add_column(
39
+ "widget",
40
+ sa.Column(
41
+ "is_pinned",
42
+ sa.Boolean(),
43
+ server_default=sa.text("false"),
44
+ nullable=False,
45
+ ),
46
+ )
47
+ op.add_column(
48
+ "widget",
49
+ sa.Column(
50
+ "widget_kind",
51
+ widget_kind,
52
+ server_default="STANDARD",
53
+ nullable=False,
54
+ ),
55
+ )
56
+ op.alter_column(
57
+ "widget",
58
+ "dashboard_id",
59
+ existing_type=sa.UUID(),
60
+ nullable=True,
61
+ )
62
+
63
+
64
+ def downgrade_organization() -> None:
65
+ """Revert the executive-view fields on the widget table in organization schemas."""
66
+ op.alter_column(
67
+ "widget",
68
+ "dashboard_id",
69
+ existing_type=sa.UUID(),
70
+ nullable=False,
71
+ )
72
+ op.drop_column("widget", "widget_kind")
73
+ op.drop_column("widget", "is_pinned")
74
+
75
+ # Note: the drop is wrapped defensively in case the enum type is still
76
+ # referenced by tables in other organization schemas when this runs.
77
+ with contextlib.suppress(InternalError):
78
+ sa.Enum(name="widget_kind").drop(op.get_bind(), checkfirst=True)
@@ -1,6 +1,7 @@
1
- from ..base import CommonBase
2
1
  from sqlalchemy import UUID, Column, ForeignKey
3
2
 
3
+ from ..base import CommonBase
4
+
4
5
 
5
6
  class CopilotLicense(CommonBase):
6
7
  __tablename__ = "copilot_license"
@@ -1,6 +1,7 @@
1
- from ..base import CommonBase
2
1
  from sqlalchemy import UUID, Column, ForeignKey
3
2
 
3
+ from ..base import CommonBase
4
+
4
5
 
5
6
  class ExecConfExecutionReason(CommonBase):
6
7
  __tablename__ = "exec_conf_execution_reason"
@@ -1,6 +1,7 @@
1
- from ..base import CommonBase
2
1
  from sqlalchemy import UUID, Column, ForeignKey
3
2
 
3
+ from ..base import CommonBase
4
+
4
5
 
5
6
  class PredefinedActionActionReason(CommonBase):
6
7
  __tablename__ = "predefined_action_action_reason"
@@ -1,6 +1,7 @@
1
- from ..base import CommonBase
2
1
  from sqlalchemy import UUID, Column, ForeignKey
3
2
 
3
+ from ..base import CommonBase
4
+
4
5
 
5
6
  class PredefinedActionPredefinedRisk(CommonBase):
6
7
  __tablename__ = "predefined_action_predefined_risk"
@@ -1,6 +1,7 @@
1
- from ..base import CommonBase
2
1
  from sqlalchemy import UUID, Column, ForeignKey
3
2
 
3
+ from ..base import CommonBase
4
+
4
5
 
5
6
  class PredefinedExecutionExecutionReason(CommonBase):
6
7
  __tablename__ = "predefined_execution_execution_reason"
@@ -1,6 +1,7 @@
1
- from ..base import CommonBase
2
1
  from sqlalchemy import UUID, Column, ForeignKey
3
2
 
3
+ from ..base import CommonBase
4
+
4
5
 
5
6
  class PredefinedExecutionPredefinedAction(CommonBase):
6
7
  __tablename__ = "predefined_execution_predefined_action"
@@ -1,6 +1,7 @@
1
- from ..base import CommonBase
2
1
  from sqlalchemy import UUID, Column, ForeignKey
3
2
 
3
+ from ..base import CommonBase
4
+
4
5
 
5
6
  class PredefinedRiskRiskReason(CommonBase):
6
7
  __tablename__ = "predefined_risk_risk_reason"
@@ -1,6 +1,7 @@
1
- from ..base import CommonBase
2
1
  from sqlalchemy import UUID, Column, ForeignKey
3
2
 
3
+ from ..base import CommonBase
4
+
4
5
 
5
6
  class RiskConfRiskReason(CommonBase):
6
7
  __tablename__ = "risk_conf_risk_reason"
@@ -1,6 +1,7 @@
1
- from ..base import CommonBase
2
1
  from sqlalchemy import UUID, Column, ForeignKey
3
2
 
3
+ from ..base import CommonBase
4
+
4
5
 
5
6
  class RolesActionConf(CommonBase):
6
7
  __tablename__ = "roles_action_conf"
@@ -1,6 +1,7 @@
1
- from ..base import CommonBase
2
1
  from sqlalchemy import UUID, Column, ForeignKey
3
2
 
3
+ from ..base import CommonBase
4
+
4
5
 
5
6
  class RolesExecConf(CommonBase):
6
7
  __tablename__ = "roles_exec_conf"
@@ -1,6 +1,7 @@
1
- from ..base import CommonBase
2
1
  from sqlalchemy import UUID, Column, ForeignKey
3
2
 
3
+ from ..base import CommonBase
4
+
4
5
 
5
6
  class RolesPermissions(CommonBase):
6
7
  __tablename__ = "roles_permissions"
@@ -1,6 +1,7 @@
1
- from ..base import CommonBase
2
1
  from sqlalchemy import UUID, Column, ForeignKey
3
2
 
3
+ from ..base import CommonBase
4
+
4
5
 
5
6
  class RolesPredefinedAction(CommonBase):
6
7
  __tablename__ = "roles_predefined_action"
@@ -1,6 +1,7 @@
1
- from ..base import CommonBase
2
1
  from sqlalchemy import UUID, Column, ForeignKey
3
2
 
3
+ from ..base import CommonBase
4
+
4
5
 
5
6
  class RolesPredefinedExecution(CommonBase):
6
7
  __tablename__ = "roles_predefined_execution"
@@ -1,6 +1,7 @@
1
- from ..base import CommonBase
2
1
  from sqlalchemy import UUID, Column, ForeignKey
3
2
 
3
+ from ..base import CommonBase
4
+
4
5
 
5
6
  class RolesRunningActions(CommonBase):
6
7
  __tablename__ = "roles_running_actions"
@@ -1,6 +1,7 @@
1
- from ..base import CommonBase
2
1
  from sqlalchemy import UUID, Column, ForeignKey
3
2
 
3
+ from ..base import CommonBase
4
+
4
5
 
5
6
  class RolesRunningExecutions(CommonBase):
6
7
  __tablename__ = "roles_running_executions"
@@ -1,6 +1,7 @@
1
- from ..base import CommonBase
2
1
  from sqlalchemy import UUID, Column, ForeignKey
3
2
 
3
+ from ..base import CommonBase
4
+
4
5
 
5
6
  class RolesUsers(CommonBase):
6
7
  __tablename__ = "roles_users"
@@ -1,6 +1,7 @@
1
- from ..base import CommonBase
2
1
  from sqlalchemy import UUID, Column, ForeignKey
3
2
 
3
+ from ..base import CommonBase
4
+
4
5
 
5
6
  class RunningActionContextScopes(CommonBase):
6
7
  __tablename__ = "running_action_context_scopes"
@@ -1,6 +1,7 @@
1
- from ..base import CommonBase
2
1
  from sqlalchemy import UUID, Column, ForeignKey
3
2
 
3
+ from ..base import CommonBase
4
+
4
5
 
5
6
  class UsersScopes(CommonBase):
6
7
  __tablename__ = "users_scopes"
@@ -1,6 +1,7 @@
1
1
  from .config import ComputingStrategy, ExpirationOp
2
2
  from .currency import Currency
3
3
  from .running import ActionStatus, DueIndicator, ExecutionStatus, RiskStatus
4
+ from .dashboard import WidgetKind
4
5
 
5
6
  __all__ = (
6
7
  "ActionStatus",
@@ -10,4 +11,5 @@ __all__ = (
10
11
  "ExecutionStatus",
11
12
  "ExpirationOp",
12
13
  "RiskStatus",
14
+ "WidgetKind",
13
15
  )
@@ -0,0 +1,14 @@
1
+ from enum import StrEnum
2
+
3
+
4
+ class WidgetKind(StrEnum):
5
+ """
6
+ Distinguishes a standard dashboard widget from a dashboard-less
7
+ aggregate widget used on the executive view.
8
+
9
+ - STANDARD: A widget that belongs to a dashboard (the existing behavior).
10
+ - AGGREGATE: A dashboard-less widget aggregating data for the executive view.
11
+ """
12
+
13
+ STANDARD = "STANDARD"
14
+ AGGREGATE = "AGGREGATE"
@@ -1,10 +1,11 @@
1
- import uuid
2
1
  import typing as t
2
+ import uuid
3
3
 
4
- from ..base import CommonBase
5
4
  from sqlalchemy import UUID, Text
6
5
  from sqlalchemy.orm import Mapped, mapped_column, relationship
7
6
 
7
+ from ..base import CommonBase
8
+
8
9
  if t.TYPE_CHECKING: # pragma: no cover
9
10
  from ..general import Role
10
11
 
@@ -1,13 +1,12 @@
1
1
  import typing as t
2
2
  import uuid
3
3
 
4
- from sqlalchemy import Boolean, Text, text, UUID, ForeignKey
5
- from sqlalchemy.dialects.postgresql import JSONB, ARRAY
4
+ from sqlalchemy import UUID, Boolean, ForeignKey, Text, text
5
+ from sqlalchemy.dialects.postgresql import ARRAY, JSONB
6
6
  from sqlalchemy.orm import Mapped, mapped_column, relationship
7
7
 
8
- from ..general.general_base import GeneralBase
9
-
10
8
  from ..field_types import JSONDict
9
+ from ..general.general_base import GeneralBase
11
10
 
12
11
  if t.TYPE_CHECKING: # pragma: no cover
13
12
  from ..general import ActionReason, Copilot, ExecutionReason, RiskReason, Role
@@ -1,10 +1,11 @@
1
- import uuid
2
1
  import typing as t
2
+ import uuid
3
3
 
4
- from ..base import CommonBase
5
4
  from sqlalchemy import UUID, Boolean, Text
6
5
  from sqlalchemy.orm import Mapped, mapped_column, relationship
7
6
 
7
+ from ..base import CommonBase
8
+
8
9
  if t.TYPE_CHECKING: # pragma: no cover
9
10
  from ..general import PredefinedAction, PredefinedExecution, PredefinedRisk
10
11
  from ..org import (
@@ -1,9 +1,10 @@
1
1
  import uuid
2
2
 
3
- from sqlalchemy import UUID, ForeignKey, Text, text
3
+ from sqlalchemy import UUID, Boolean, Enum, ForeignKey, Text, text
4
4
  from sqlalchemy.dialects.postgresql import JSONB
5
5
  from sqlalchemy.orm import Mapped, mapped_column, relationship
6
6
 
7
+ from ..enums import WidgetKind
7
8
  from ..field_types import JSONDict
8
9
  from ..general import Copilot
9
10
  from ..org.org_base import OrgBase
@@ -35,7 +36,7 @@ class Dashboard(OrgBase):
35
36
  # Many-to-one relationship with Copilot.
36
37
  # Note: Copilot does not declare the reverse relationship — public entities must not
37
38
  # navigate to org entities, as org schemas are created dynamically per organization.
38
- copilot_obj: Mapped["Copilot"] = relationship(
39
+ copilot_obj: Mapped[Copilot] = relationship(
39
40
  foreign_keys=[copilot],
40
41
  )
41
42
 
@@ -70,15 +71,28 @@ class Widget(OrgBase):
70
71
  server_default=text("'{}'::jsonb"),
71
72
  )
72
73
 
73
- # Foreign key to Dashboard.
74
- dashboard_id: Mapped[uuid.UUID] = mapped_column(
74
+ is_pinned: Mapped[bool] = mapped_column(
75
+ Boolean,
76
+ default=False,
77
+ server_default=text("false"),
78
+ )
79
+
80
+ widget_kind: Mapped[WidgetKind] = mapped_column(
81
+ Enum(WidgetKind, name="widget_kind"),
82
+ default=WidgetKind.STANDARD,
83
+ server_default=WidgetKind.STANDARD,
84
+ )
85
+
86
+ # Foreign key to Dashboard. Nullable so a widget can exist without a
87
+ # dashboard (e.g.: an aggregate widget pinned to the executive view).
88
+ dashboard_id: Mapped[uuid.UUID | None] = mapped_column(
75
89
  UUID,
76
90
  ForeignKey("dashboard.id", onupdate="CASCADE", ondelete="CASCADE"),
77
91
  )
78
92
 
79
- # Many-to-one relationship with Dashboard.
80
- dashboard: Mapped["Dashboard"] = relationship(
93
+ # This is configured as a many-to-one relationship.
94
+ # No innerjoin: an inner join would silently filter out dashboard-less widgets.
95
+ dashboard: Mapped["Dashboard | None"] = relationship(
81
96
  back_populates="widgets",
82
- innerjoin=True,
83
97
  foreign_keys=[dashboard_id],
84
98
  )
@@ -25,8 +25,7 @@ from sqlalchemy.ext.mutable import MutableDict
25
25
  from sqlalchemy.orm import Mapped, attribute_keyed_dict, declared_attr, mapped_column, relationship
26
26
 
27
27
  from ..base import BASE
28
- from ..enums import ComputingStrategy, ExpirationOp
29
- from ..enums import ActionStatus, DueIndicator, ExecutionStatus, RiskStatus
28
+ from ..enums import ActionStatus, ComputingStrategy, DueIndicator, ExecutionStatus, ExpirationOp, RiskStatus
30
29
  from ..field_types import JSONDict
31
30
  from ..org.org_base import OrgBase
32
31
 
@@ -86,8 +85,8 @@ class RunningContextBase(OrgBase):
86
85
  )
87
86
 
88
87
  @declared_attr
89
- def user_obj(cls) -> Mapped["User | None"]:
90
- return relationship(foreign_keys=[cls.user]) # type: ignore
88
+ def user_obj(self) -> Mapped["User | None"]:
89
+ return relationship(foreign_keys=[self.user]) # type: ignore
91
90
 
92
91
 
93
92
  class RunningRisk(OrgBase):
@@ -161,8 +160,8 @@ class RunningRisk(OrgBase):
161
160
  else: # noqa: RET505
162
161
  return (datetime.now(tz=self.created_at.tzinfo) - self.created_at).total_seconds() / SECONDS_PER_DAY
163
162
 
164
- @age_days.inplace.expression
165
163
  @classmethod
164
+ @age_days.inplace.expression
166
165
  def _age_days__expression(cls) -> ColumnElement[float]:
167
166
  """
168
167
  SQL expression for the ``age_days`` hybrid property.
@@ -479,6 +478,13 @@ class RunningActionContext(RunningContextBase):
479
478
  ),
480
479
  )
481
480
 
481
+ # Free-form key/value dictionary of fields updated on this context.
482
+ updated_data: Mapped[JSONDict] = mapped_column(
483
+ JSONB,
484
+ default=dict,
485
+ server_default=text("'{}'::jsonb"),
486
+ )
487
+
482
488
  # Foreign key to ActionReason (org -> public is allowed).
483
489
  # When the reason is deleted, this reference is set to NULL.
484
490
  reason_id: Mapped[uuid.UUID | None] = mapped_column(
@@ -1,9 +1,10 @@
1
1
  import typing as t
2
2
 
3
- from ..org.org_base import OrgBase
4
3
  from sqlalchemy import Text
5
4
  from sqlalchemy.orm import Mapped, mapped_column, relationship
6
5
 
6
+ from ..org.org_base import OrgBase
7
+
7
8
  if t.TYPE_CHECKING: # pragma: no cover
8
9
  from ..general import Role
9
10
  from ..org import Scope
@@ -312,13 +312,13 @@ class JSONBFilter:
312
312
  def combine_and(self, other: "JSONBFilter") -> "JSONBFilter":
313
313
  """Combine this filter with another using AND logic."""
314
314
  combined = JSONBFilter(self.field)
315
- combined._conditions = [sa.and_(self.build(), other.build())] # noqa: SLF001
315
+ combined._conditions = [sa.and_(self.build(), other.build())]
316
316
  return combined
317
317
 
318
318
  def combine_or(self, other: "JSONBFilter") -> "JSONBFilter":
319
319
  """Combine this filter with another using OR logic."""
320
320
  combined = JSONBFilter(self.field)
321
- combined._conditions = [sa.or_(self.build(), other.build())] # noqa: SLF001
321
+ combined._conditions = [sa.or_(self.build(), other.build())]
322
322
  return combined
323
323
 
324
324
  # -------------------------------------------------------------------
@@ -14,11 +14,11 @@ if typing.TYPE_CHECKING: # pragma: no cover
14
14
  from ..general import (
15
15
  ActionReason,
16
16
  ExecutionReason,
17
+ PredefinedAction,
18
+ PredefinedExecution,
17
19
  PredefinedRisk,
18
20
  RiskReason,
19
21
  Role,
20
- PredefinedAction,
21
- PredefinedExecution,
22
22
  )
23
23
 
24
24