regscale-cli 6.16.0.0__py3-none-any.whl

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.

Potentially problematic release.


This version of regscale-cli might be problematic. Click here for more details.

Files changed (481) hide show
  1. regscale/__init__.py +1 -0
  2. regscale/airflow/__init__.py +9 -0
  3. regscale/airflow/azure/__init__.py +9 -0
  4. regscale/airflow/azure/cli.py +89 -0
  5. regscale/airflow/azure/upload_dags.py +116 -0
  6. regscale/airflow/click_dags.py +127 -0
  7. regscale/airflow/click_mixins.py +82 -0
  8. regscale/airflow/config.py +25 -0
  9. regscale/airflow/factories/__init__.py +0 -0
  10. regscale/airflow/factories/connections.py +58 -0
  11. regscale/airflow/factories/workflows.py +78 -0
  12. regscale/airflow/hierarchy.py +88 -0
  13. regscale/airflow/operators/__init__.py +0 -0
  14. regscale/airflow/operators/click.py +36 -0
  15. regscale/airflow/sensors/__init__.py +0 -0
  16. regscale/airflow/sensors/sql.py +107 -0
  17. regscale/airflow/sessions/__init__.py +0 -0
  18. regscale/airflow/sessions/sql/__init__.py +3 -0
  19. regscale/airflow/sessions/sql/queries.py +64 -0
  20. regscale/airflow/sessions/sql/sql_server_queries.py +248 -0
  21. regscale/airflow/tasks/__init__.py +0 -0
  22. regscale/airflow/tasks/branches.py +22 -0
  23. regscale/airflow/tasks/cli.py +116 -0
  24. regscale/airflow/tasks/click.py +73 -0
  25. regscale/airflow/tasks/debugging.py +9 -0
  26. regscale/airflow/tasks/groups.py +116 -0
  27. regscale/airflow/tasks/init.py +60 -0
  28. regscale/airflow/tasks/states.py +47 -0
  29. regscale/airflow/tasks/workflows.py +36 -0
  30. regscale/ansible/__init__.py +9 -0
  31. regscale/core/__init__.py +0 -0
  32. regscale/core/app/__init__.py +3 -0
  33. regscale/core/app/api.py +571 -0
  34. regscale/core/app/application.py +665 -0
  35. regscale/core/app/internal/__init__.py +136 -0
  36. regscale/core/app/internal/admin_actions.py +230 -0
  37. regscale/core/app/internal/assessments_editor.py +873 -0
  38. regscale/core/app/internal/catalog.py +316 -0
  39. regscale/core/app/internal/comparison.py +459 -0
  40. regscale/core/app/internal/control_editor.py +571 -0
  41. regscale/core/app/internal/encrypt.py +79 -0
  42. regscale/core/app/internal/evidence.py +1240 -0
  43. regscale/core/app/internal/file_uploads.py +151 -0
  44. regscale/core/app/internal/healthcheck.py +66 -0
  45. regscale/core/app/internal/login.py +305 -0
  46. regscale/core/app/internal/migrations.py +240 -0
  47. regscale/core/app/internal/model_editor.py +1701 -0
  48. regscale/core/app/internal/poam_editor.py +632 -0
  49. regscale/core/app/internal/workflow.py +105 -0
  50. regscale/core/app/logz.py +74 -0
  51. regscale/core/app/utils/XMLIR.py +258 -0
  52. regscale/core/app/utils/__init__.py +0 -0
  53. regscale/core/app/utils/api_handler.py +358 -0
  54. regscale/core/app/utils/app_utils.py +1110 -0
  55. regscale/core/app/utils/catalog_utils/__init__.py +0 -0
  56. regscale/core/app/utils/catalog_utils/common.py +91 -0
  57. regscale/core/app/utils/catalog_utils/compare_catalog.py +193 -0
  58. regscale/core/app/utils/catalog_utils/diagnostic_catalog.py +97 -0
  59. regscale/core/app/utils/catalog_utils/download_catalog.py +103 -0
  60. regscale/core/app/utils/catalog_utils/update_catalog.py +718 -0
  61. regscale/core/app/utils/catalog_utils/update_catalog_v2.py +1378 -0
  62. regscale/core/app/utils/catalog_utils/update_catalog_v3.py +1272 -0
  63. regscale/core/app/utils/catalog_utils/update_plans.py +334 -0
  64. regscale/core/app/utils/file_utils.py +238 -0
  65. regscale/core/app/utils/parser_utils.py +81 -0
  66. regscale/core/app/utils/pickle_file_handler.py +57 -0
  67. regscale/core/app/utils/regscale_utils.py +319 -0
  68. regscale/core/app/utils/report_utils.py +119 -0
  69. regscale/core/app/utils/variables.py +226 -0
  70. regscale/core/decorators.py +31 -0
  71. regscale/core/lazy_group.py +65 -0
  72. regscale/core/login.py +63 -0
  73. regscale/core/server/__init__.py +0 -0
  74. regscale/core/server/flask_api.py +473 -0
  75. regscale/core/server/helpers.py +373 -0
  76. regscale/core/server/rest.py +64 -0
  77. regscale/core/server/static/css/bootstrap.css +6030 -0
  78. regscale/core/server/static/css/bootstrap.min.css +6 -0
  79. regscale/core/server/static/css/main.css +176 -0
  80. regscale/core/server/static/images/regscale-cli.svg +49 -0
  81. regscale/core/server/static/images/regscale.svg +38 -0
  82. regscale/core/server/templates/base.html +74 -0
  83. regscale/core/server/templates/index.html +43 -0
  84. regscale/core/server/templates/login.html +28 -0
  85. regscale/core/server/templates/make_base64.html +22 -0
  86. regscale/core/server/templates/upload_STIG.html +109 -0
  87. regscale/core/server/templates/upload_STIG_result.html +26 -0
  88. regscale/core/server/templates/upload_ssp.html +144 -0
  89. regscale/core/server/templates/upload_ssp_result.html +128 -0
  90. regscale/core/static/__init__.py +0 -0
  91. regscale/core/static/regex.py +14 -0
  92. regscale/core/utils/__init__.py +117 -0
  93. regscale/core/utils/click_utils.py +13 -0
  94. regscale/core/utils/date.py +238 -0
  95. regscale/core/utils/graphql.py +254 -0
  96. regscale/core/utils/urls.py +23 -0
  97. regscale/dev/__init__.py +6 -0
  98. regscale/dev/analysis.py +454 -0
  99. regscale/dev/cli.py +235 -0
  100. regscale/dev/code_gen.py +492 -0
  101. regscale/dev/dirs.py +69 -0
  102. regscale/dev/docs.py +384 -0
  103. regscale/dev/monitoring.py +26 -0
  104. regscale/dev/profiling.py +216 -0
  105. regscale/exceptions/__init__.py +4 -0
  106. regscale/exceptions/license_exception.py +7 -0
  107. regscale/exceptions/validation_exception.py +9 -0
  108. regscale/integrations/__init__.py +1 -0
  109. regscale/integrations/commercial/__init__.py +486 -0
  110. regscale/integrations/commercial/ad.py +433 -0
  111. regscale/integrations/commercial/amazon/__init__.py +0 -0
  112. regscale/integrations/commercial/amazon/common.py +106 -0
  113. regscale/integrations/commercial/aqua/__init__.py +0 -0
  114. regscale/integrations/commercial/aqua/aqua.py +91 -0
  115. regscale/integrations/commercial/aws/__init__.py +6 -0
  116. regscale/integrations/commercial/aws/cli.py +322 -0
  117. regscale/integrations/commercial/aws/inventory/__init__.py +110 -0
  118. regscale/integrations/commercial/aws/inventory/base.py +64 -0
  119. regscale/integrations/commercial/aws/inventory/resources/__init__.py +19 -0
  120. regscale/integrations/commercial/aws/inventory/resources/compute.py +234 -0
  121. regscale/integrations/commercial/aws/inventory/resources/containers.py +113 -0
  122. regscale/integrations/commercial/aws/inventory/resources/database.py +101 -0
  123. regscale/integrations/commercial/aws/inventory/resources/integration.py +237 -0
  124. regscale/integrations/commercial/aws/inventory/resources/networking.py +253 -0
  125. regscale/integrations/commercial/aws/inventory/resources/security.py +240 -0
  126. regscale/integrations/commercial/aws/inventory/resources/storage.py +91 -0
  127. regscale/integrations/commercial/aws/scanner.py +823 -0
  128. regscale/integrations/commercial/azure/__init__.py +0 -0
  129. regscale/integrations/commercial/azure/common.py +32 -0
  130. regscale/integrations/commercial/azure/intune.py +488 -0
  131. regscale/integrations/commercial/azure/scanner.py +49 -0
  132. regscale/integrations/commercial/burp.py +78 -0
  133. regscale/integrations/commercial/cpe.py +144 -0
  134. regscale/integrations/commercial/crowdstrike.py +1117 -0
  135. regscale/integrations/commercial/defender.py +1511 -0
  136. regscale/integrations/commercial/dependabot.py +210 -0
  137. regscale/integrations/commercial/durosuite/__init__.py +0 -0
  138. regscale/integrations/commercial/durosuite/api.py +1546 -0
  139. regscale/integrations/commercial/durosuite/process_devices.py +101 -0
  140. regscale/integrations/commercial/durosuite/scanner.py +637 -0
  141. regscale/integrations/commercial/durosuite/variables.py +21 -0
  142. regscale/integrations/commercial/ecr.py +90 -0
  143. regscale/integrations/commercial/gcp/__init__.py +237 -0
  144. regscale/integrations/commercial/gcp/auth.py +96 -0
  145. regscale/integrations/commercial/gcp/control_tests.py +238 -0
  146. regscale/integrations/commercial/gcp/variables.py +18 -0
  147. regscale/integrations/commercial/gitlab.py +332 -0
  148. regscale/integrations/commercial/grype.py +165 -0
  149. regscale/integrations/commercial/ibm.py +90 -0
  150. regscale/integrations/commercial/import_all/__init__.py +0 -0
  151. regscale/integrations/commercial/import_all/import_all_cmd.py +467 -0
  152. regscale/integrations/commercial/import_all/scan_file_fingerprints.json +27 -0
  153. regscale/integrations/commercial/jira.py +1046 -0
  154. regscale/integrations/commercial/mappings/__init__.py +0 -0
  155. regscale/integrations/commercial/mappings/csf_controls.json +713 -0
  156. regscale/integrations/commercial/mappings/nist_800_53_r5_controls.json +1516 -0
  157. regscale/integrations/commercial/nessus/__init__.py +0 -0
  158. regscale/integrations/commercial/nessus/nessus_utils.py +429 -0
  159. regscale/integrations/commercial/nessus/scanner.py +416 -0
  160. regscale/integrations/commercial/nexpose.py +90 -0
  161. regscale/integrations/commercial/okta.py +798 -0
  162. regscale/integrations/commercial/opentext/__init__.py +0 -0
  163. regscale/integrations/commercial/opentext/click.py +99 -0
  164. regscale/integrations/commercial/opentext/scanner.py +143 -0
  165. regscale/integrations/commercial/prisma.py +91 -0
  166. regscale/integrations/commercial/qualys.py +1462 -0
  167. regscale/integrations/commercial/salesforce.py +980 -0
  168. regscale/integrations/commercial/sap/__init__.py +0 -0
  169. regscale/integrations/commercial/sap/click.py +31 -0
  170. regscale/integrations/commercial/sap/sysdig/__init__.py +0 -0
  171. regscale/integrations/commercial/sap/sysdig/click.py +57 -0
  172. regscale/integrations/commercial/sap/sysdig/sysdig_scanner.py +190 -0
  173. regscale/integrations/commercial/sap/tenable/__init__.py +0 -0
  174. regscale/integrations/commercial/sap/tenable/click.py +49 -0
  175. regscale/integrations/commercial/sap/tenable/scanner.py +196 -0
  176. regscale/integrations/commercial/servicenow.py +1756 -0
  177. regscale/integrations/commercial/sicura/__init__.py +0 -0
  178. regscale/integrations/commercial/sicura/api.py +855 -0
  179. regscale/integrations/commercial/sicura/commands.py +73 -0
  180. regscale/integrations/commercial/sicura/scanner.py +481 -0
  181. regscale/integrations/commercial/sicura/variables.py +16 -0
  182. regscale/integrations/commercial/snyk.py +90 -0
  183. regscale/integrations/commercial/sonarcloud.py +260 -0
  184. regscale/integrations/commercial/sqlserver.py +369 -0
  185. regscale/integrations/commercial/stig_mapper_integration/__init__.py +0 -0
  186. regscale/integrations/commercial/stig_mapper_integration/click_commands.py +38 -0
  187. regscale/integrations/commercial/stig_mapper_integration/mapping_engine.py +353 -0
  188. regscale/integrations/commercial/stigv2/__init__.py +0 -0
  189. regscale/integrations/commercial/stigv2/ckl_parser.py +349 -0
  190. regscale/integrations/commercial/stigv2/click_commands.py +95 -0
  191. regscale/integrations/commercial/stigv2/stig_integration.py +202 -0
  192. regscale/integrations/commercial/synqly/__init__.py +0 -0
  193. regscale/integrations/commercial/synqly/assets.py +46 -0
  194. regscale/integrations/commercial/synqly/ticketing.py +132 -0
  195. regscale/integrations/commercial/synqly/vulnerabilities.py +223 -0
  196. regscale/integrations/commercial/synqly_jira.py +840 -0
  197. regscale/integrations/commercial/tenablev2/__init__.py +0 -0
  198. regscale/integrations/commercial/tenablev2/authenticate.py +31 -0
  199. regscale/integrations/commercial/tenablev2/click.py +1584 -0
  200. regscale/integrations/commercial/tenablev2/scanner.py +504 -0
  201. regscale/integrations/commercial/tenablev2/stig_parsers.py +140 -0
  202. regscale/integrations/commercial/tenablev2/utils.py +78 -0
  203. regscale/integrations/commercial/tenablev2/variables.py +17 -0
  204. regscale/integrations/commercial/trivy.py +162 -0
  205. regscale/integrations/commercial/veracode.py +96 -0
  206. regscale/integrations/commercial/wizv2/WizDataMixin.py +97 -0
  207. regscale/integrations/commercial/wizv2/__init__.py +0 -0
  208. regscale/integrations/commercial/wizv2/click.py +429 -0
  209. regscale/integrations/commercial/wizv2/constants.py +1001 -0
  210. regscale/integrations/commercial/wizv2/issue.py +361 -0
  211. regscale/integrations/commercial/wizv2/models.py +112 -0
  212. regscale/integrations/commercial/wizv2/parsers.py +339 -0
  213. regscale/integrations/commercial/wizv2/sbom.py +115 -0
  214. regscale/integrations/commercial/wizv2/scanner.py +416 -0
  215. regscale/integrations/commercial/wizv2/utils.py +796 -0
  216. regscale/integrations/commercial/wizv2/variables.py +39 -0
  217. regscale/integrations/commercial/wizv2/wiz_auth.py +159 -0
  218. regscale/integrations/commercial/xray.py +91 -0
  219. regscale/integrations/integration/__init__.py +2 -0
  220. regscale/integrations/integration/integration.py +26 -0
  221. regscale/integrations/integration/inventory.py +17 -0
  222. regscale/integrations/integration/issue.py +100 -0
  223. regscale/integrations/integration_override.py +149 -0
  224. regscale/integrations/public/__init__.py +103 -0
  225. regscale/integrations/public/cisa.py +641 -0
  226. regscale/integrations/public/criticality_updater.py +70 -0
  227. regscale/integrations/public/emass.py +411 -0
  228. regscale/integrations/public/emass_slcm_import.py +697 -0
  229. regscale/integrations/public/fedramp/__init__.py +0 -0
  230. regscale/integrations/public/fedramp/appendix_parser.py +548 -0
  231. regscale/integrations/public/fedramp/click.py +479 -0
  232. regscale/integrations/public/fedramp/components.py +714 -0
  233. regscale/integrations/public/fedramp/docx_parser.py +259 -0
  234. regscale/integrations/public/fedramp/fedramp_cis_crm.py +1124 -0
  235. regscale/integrations/public/fedramp/fedramp_common.py +3181 -0
  236. regscale/integrations/public/fedramp/fedramp_docx.py +388 -0
  237. regscale/integrations/public/fedramp/fedramp_five.py +2343 -0
  238. regscale/integrations/public/fedramp/fedramp_traversal.py +138 -0
  239. regscale/integrations/public/fedramp/import_fedramp_r4_ssp.py +279 -0
  240. regscale/integrations/public/fedramp/import_workbook.py +495 -0
  241. regscale/integrations/public/fedramp/inventory_items.py +244 -0
  242. regscale/integrations/public/fedramp/mappings/__init__.py +0 -0
  243. regscale/integrations/public/fedramp/mappings/fedramp_r4_parts.json +7388 -0
  244. regscale/integrations/public/fedramp/mappings/fedramp_r5_params.json +8636 -0
  245. regscale/integrations/public/fedramp/mappings/fedramp_r5_parts.json +9605 -0
  246. regscale/integrations/public/fedramp/mappings/system_roles.py +34 -0
  247. regscale/integrations/public/fedramp/mappings/user.py +175 -0
  248. regscale/integrations/public/fedramp/mappings/values.py +141 -0
  249. regscale/integrations/public/fedramp/markdown_parser.py +150 -0
  250. regscale/integrations/public/fedramp/metadata.py +689 -0
  251. regscale/integrations/public/fedramp/models/__init__.py +59 -0
  252. regscale/integrations/public/fedramp/models/leveraged_auth_new.py +168 -0
  253. regscale/integrations/public/fedramp/models/poam_importer.py +522 -0
  254. regscale/integrations/public/fedramp/parts_mapper.py +107 -0
  255. regscale/integrations/public/fedramp/poam/__init__.py +0 -0
  256. regscale/integrations/public/fedramp/poam/scanner.py +851 -0
  257. regscale/integrations/public/fedramp/properties.py +201 -0
  258. regscale/integrations/public/fedramp/reporting.py +84 -0
  259. regscale/integrations/public/fedramp/resources.py +496 -0
  260. regscale/integrations/public/fedramp/rosetta.py +110 -0
  261. regscale/integrations/public/fedramp/ssp_logger.py +87 -0
  262. regscale/integrations/public/fedramp/system_characteristics.py +922 -0
  263. regscale/integrations/public/fedramp/system_control_implementations.py +582 -0
  264. regscale/integrations/public/fedramp/system_implementation.py +190 -0
  265. regscale/integrations/public/fedramp/xml_utils.py +87 -0
  266. regscale/integrations/public/nist_catalog.py +275 -0
  267. regscale/integrations/public/oscal.py +1946 -0
  268. regscale/integrations/public/otx.py +169 -0
  269. regscale/integrations/scanner_integration.py +2692 -0
  270. regscale/integrations/variables.py +25 -0
  271. regscale/models/__init__.py +7 -0
  272. regscale/models/app_models/__init__.py +5 -0
  273. regscale/models/app_models/catalog_compare.py +213 -0
  274. regscale/models/app_models/click.py +252 -0
  275. regscale/models/app_models/datetime_encoder.py +21 -0
  276. regscale/models/app_models/import_validater.py +321 -0
  277. regscale/models/app_models/mapping.py +260 -0
  278. regscale/models/app_models/pipeline.py +37 -0
  279. regscale/models/click_models.py +413 -0
  280. regscale/models/config.py +154 -0
  281. regscale/models/email_style.css +67 -0
  282. regscale/models/hierarchy.py +8 -0
  283. regscale/models/inspect_models.py +79 -0
  284. regscale/models/integration_models/__init__.py +0 -0
  285. regscale/models/integration_models/amazon_models/__init__.py +0 -0
  286. regscale/models/integration_models/amazon_models/inspector.py +262 -0
  287. regscale/models/integration_models/amazon_models/inspector_scan.py +206 -0
  288. regscale/models/integration_models/aqua.py +247 -0
  289. regscale/models/integration_models/azure_alerts.py +255 -0
  290. regscale/models/integration_models/base64.py +23 -0
  291. regscale/models/integration_models/burp.py +433 -0
  292. regscale/models/integration_models/burp_models.py +128 -0
  293. regscale/models/integration_models/cisa_kev_data.json +19333 -0
  294. regscale/models/integration_models/defender_data.py +93 -0
  295. regscale/models/integration_models/defenderimport.py +143 -0
  296. regscale/models/integration_models/drf.py +443 -0
  297. regscale/models/integration_models/ecr_models/__init__.py +0 -0
  298. regscale/models/integration_models/ecr_models/data.py +69 -0
  299. regscale/models/integration_models/ecr_models/ecr.py +239 -0
  300. regscale/models/integration_models/flat_file_importer.py +1079 -0
  301. regscale/models/integration_models/grype_import.py +247 -0
  302. regscale/models/integration_models/ibm.py +126 -0
  303. regscale/models/integration_models/implementation_results.py +85 -0
  304. regscale/models/integration_models/nexpose.py +140 -0
  305. regscale/models/integration_models/prisma.py +202 -0
  306. regscale/models/integration_models/qualys.py +720 -0
  307. regscale/models/integration_models/qualys_scanner.py +160 -0
  308. regscale/models/integration_models/sbom/__init__.py +0 -0
  309. regscale/models/integration_models/sbom/cyclone_dx.py +139 -0
  310. regscale/models/integration_models/send_reminders.py +620 -0
  311. regscale/models/integration_models/snyk.py +155 -0
  312. regscale/models/integration_models/synqly_models/__init__.py +0 -0
  313. regscale/models/integration_models/synqly_models/capabilities.json +1 -0
  314. regscale/models/integration_models/synqly_models/connector_types.py +22 -0
  315. regscale/models/integration_models/synqly_models/connectors/__init__.py +7 -0
  316. regscale/models/integration_models/synqly_models/connectors/assets.py +97 -0
  317. regscale/models/integration_models/synqly_models/connectors/ticketing.py +583 -0
  318. regscale/models/integration_models/synqly_models/connectors/vulnerabilities.py +169 -0
  319. regscale/models/integration_models/synqly_models/ocsf_mapper.py +331 -0
  320. regscale/models/integration_models/synqly_models/param.py +72 -0
  321. regscale/models/integration_models/synqly_models/synqly_model.py +733 -0
  322. regscale/models/integration_models/synqly_models/tenants.py +39 -0
  323. regscale/models/integration_models/tenable_models/__init__.py +0 -0
  324. regscale/models/integration_models/tenable_models/integration.py +187 -0
  325. regscale/models/integration_models/tenable_models/models.py +513 -0
  326. regscale/models/integration_models/trivy_import.py +231 -0
  327. regscale/models/integration_models/veracode.py +217 -0
  328. regscale/models/integration_models/xray.py +135 -0
  329. regscale/models/locking.py +100 -0
  330. regscale/models/platform.py +110 -0
  331. regscale/models/regscale_models/__init__.py +67 -0
  332. regscale/models/regscale_models/assessment.py +570 -0
  333. regscale/models/regscale_models/assessment_plan.py +52 -0
  334. regscale/models/regscale_models/asset.py +567 -0
  335. regscale/models/regscale_models/asset_mapping.py +190 -0
  336. regscale/models/regscale_models/case.py +42 -0
  337. regscale/models/regscale_models/catalog.py +261 -0
  338. regscale/models/regscale_models/cci.py +46 -0
  339. regscale/models/regscale_models/change.py +167 -0
  340. regscale/models/regscale_models/checklist.py +372 -0
  341. regscale/models/regscale_models/comment.py +49 -0
  342. regscale/models/regscale_models/compliance_settings.py +112 -0
  343. regscale/models/regscale_models/component.py +412 -0
  344. regscale/models/regscale_models/component_mapping.py +65 -0
  345. regscale/models/regscale_models/control.py +38 -0
  346. regscale/models/regscale_models/control_implementation.py +1128 -0
  347. regscale/models/regscale_models/control_objective.py +261 -0
  348. regscale/models/regscale_models/control_parameter.py +100 -0
  349. regscale/models/regscale_models/control_test.py +34 -0
  350. regscale/models/regscale_models/control_test_plan.py +75 -0
  351. regscale/models/regscale_models/control_test_result.py +52 -0
  352. regscale/models/regscale_models/custom_field.py +245 -0
  353. regscale/models/regscale_models/data.py +109 -0
  354. regscale/models/regscale_models/data_center.py +40 -0
  355. regscale/models/regscale_models/deviation.py +203 -0
  356. regscale/models/regscale_models/email.py +97 -0
  357. regscale/models/regscale_models/evidence.py +47 -0
  358. regscale/models/regscale_models/evidence_mapping.py +40 -0
  359. regscale/models/regscale_models/facility.py +59 -0
  360. regscale/models/regscale_models/file.py +382 -0
  361. regscale/models/regscale_models/filetag.py +37 -0
  362. regscale/models/regscale_models/form_field_value.py +94 -0
  363. regscale/models/regscale_models/group.py +169 -0
  364. regscale/models/regscale_models/implementation_objective.py +335 -0
  365. regscale/models/regscale_models/implementation_option.py +275 -0
  366. regscale/models/regscale_models/implementation_role.py +33 -0
  367. regscale/models/regscale_models/incident.py +177 -0
  368. regscale/models/regscale_models/interconnection.py +43 -0
  369. regscale/models/regscale_models/issue.py +1176 -0
  370. regscale/models/regscale_models/leveraged_authorization.py +125 -0
  371. regscale/models/regscale_models/line_of_inquiry.py +52 -0
  372. regscale/models/regscale_models/link.py +205 -0
  373. regscale/models/regscale_models/meta_data.py +64 -0
  374. regscale/models/regscale_models/mixins/__init__.py +0 -0
  375. regscale/models/regscale_models/mixins/parent_cache.py +124 -0
  376. regscale/models/regscale_models/module.py +224 -0
  377. regscale/models/regscale_models/modules.py +191 -0
  378. regscale/models/regscale_models/objective.py +14 -0
  379. regscale/models/regscale_models/parameter.py +87 -0
  380. regscale/models/regscale_models/ports_protocol.py +81 -0
  381. regscale/models/regscale_models/privacy.py +89 -0
  382. regscale/models/regscale_models/profile.py +50 -0
  383. regscale/models/regscale_models/profile_link.py +68 -0
  384. regscale/models/regscale_models/profile_mapping.py +124 -0
  385. regscale/models/regscale_models/project.py +63 -0
  386. regscale/models/regscale_models/property.py +278 -0
  387. regscale/models/regscale_models/question.py +85 -0
  388. regscale/models/regscale_models/questionnaire.py +87 -0
  389. regscale/models/regscale_models/questionnaire_instance.py +177 -0
  390. regscale/models/regscale_models/rbac.py +132 -0
  391. regscale/models/regscale_models/reference.py +86 -0
  392. regscale/models/regscale_models/regscale_model.py +1643 -0
  393. regscale/models/regscale_models/requirement.py +29 -0
  394. regscale/models/regscale_models/risk.py +274 -0
  395. regscale/models/regscale_models/sbom.py +54 -0
  396. regscale/models/regscale_models/scan_history.py +436 -0
  397. regscale/models/regscale_models/search.py +53 -0
  398. regscale/models/regscale_models/security_control.py +132 -0
  399. regscale/models/regscale_models/security_plan.py +204 -0
  400. regscale/models/regscale_models/software_inventory.py +159 -0
  401. regscale/models/regscale_models/stake_holder.py +64 -0
  402. regscale/models/regscale_models/stig.py +647 -0
  403. regscale/models/regscale_models/supply_chain.py +152 -0
  404. regscale/models/regscale_models/system_role.py +188 -0
  405. regscale/models/regscale_models/system_role_external_assignment.py +40 -0
  406. regscale/models/regscale_models/tag.py +37 -0
  407. regscale/models/regscale_models/tag_mapping.py +19 -0
  408. regscale/models/regscale_models/task.py +133 -0
  409. regscale/models/regscale_models/threat.py +196 -0
  410. regscale/models/regscale_models/user.py +175 -0
  411. regscale/models/regscale_models/user_group.py +55 -0
  412. regscale/models/regscale_models/vulnerability.py +242 -0
  413. regscale/models/regscale_models/vulnerability_mapping.py +162 -0
  414. regscale/models/regscale_models/workflow.py +55 -0
  415. regscale/models/regscale_models/workflow_action.py +34 -0
  416. regscale/models/regscale_models/workflow_instance.py +269 -0
  417. regscale/models/regscale_models/workflow_instance_step.py +114 -0
  418. regscale/models/regscale_models/workflow_template.py +58 -0
  419. regscale/models/regscale_models/workflow_template_step.py +45 -0
  420. regscale/regscale.py +815 -0
  421. regscale/utils/__init__.py +7 -0
  422. regscale/utils/b64conversion.py +14 -0
  423. regscale/utils/click_utils.py +118 -0
  424. regscale/utils/decorators.py +48 -0
  425. regscale/utils/dict_utils.py +59 -0
  426. regscale/utils/files.py +79 -0
  427. regscale/utils/fxns.py +30 -0
  428. regscale/utils/graphql_client.py +113 -0
  429. regscale/utils/lists.py +16 -0
  430. regscale/utils/numbers.py +12 -0
  431. regscale/utils/shell.py +148 -0
  432. regscale/utils/string.py +121 -0
  433. regscale/utils/synqly_utils.py +165 -0
  434. regscale/utils/threading/__init__.py +8 -0
  435. regscale/utils/threading/threadhandler.py +131 -0
  436. regscale/utils/threading/threadsafe_counter.py +47 -0
  437. regscale/utils/threading/threadsafe_dict.py +242 -0
  438. regscale/utils/threading/threadsafe_list.py +83 -0
  439. regscale/utils/version.py +104 -0
  440. regscale/validation/__init__.py +0 -0
  441. regscale/validation/address.py +37 -0
  442. regscale/validation/record.py +48 -0
  443. regscale/visualization/__init__.py +5 -0
  444. regscale/visualization/click.py +34 -0
  445. regscale_cli-6.16.0.0.dist-info/LICENSE +21 -0
  446. regscale_cli-6.16.0.0.dist-info/METADATA +659 -0
  447. regscale_cli-6.16.0.0.dist-info/RECORD +481 -0
  448. regscale_cli-6.16.0.0.dist-info/WHEEL +5 -0
  449. regscale_cli-6.16.0.0.dist-info/entry_points.txt +6 -0
  450. regscale_cli-6.16.0.0.dist-info/top_level.txt +2 -0
  451. tests/fixtures/__init__.py +2 -0
  452. tests/fixtures/api.py +87 -0
  453. tests/fixtures/models.py +91 -0
  454. tests/fixtures/test_fixture.py +144 -0
  455. tests/mocks/__init__.py +0 -0
  456. tests/mocks/objects.py +3 -0
  457. tests/mocks/response.py +32 -0
  458. tests/mocks/xml.py +13 -0
  459. tests/regscale/__init__.py +0 -0
  460. tests/regscale/core/__init__.py +0 -0
  461. tests/regscale/core/test_api.py +232 -0
  462. tests/regscale/core/test_app.py +406 -0
  463. tests/regscale/core/test_login.py +37 -0
  464. tests/regscale/core/test_logz.py +66 -0
  465. tests/regscale/core/test_sbom_generator.py +87 -0
  466. tests/regscale/core/test_validation_utils.py +163 -0
  467. tests/regscale/core/test_version.py +78 -0
  468. tests/regscale/models/__init__.py +0 -0
  469. tests/regscale/models/test_asset.py +71 -0
  470. tests/regscale/models/test_config.py +26 -0
  471. tests/regscale/models/test_control_implementation.py +27 -0
  472. tests/regscale/models/test_import.py +97 -0
  473. tests/regscale/models/test_issue.py +36 -0
  474. tests/regscale/models/test_mapping.py +52 -0
  475. tests/regscale/models/test_platform.py +31 -0
  476. tests/regscale/models/test_regscale_model.py +346 -0
  477. tests/regscale/models/test_report.py +32 -0
  478. tests/regscale/models/test_tenable_integrations.py +118 -0
  479. tests/regscale/models/test_user_model.py +121 -0
  480. tests/regscale/test_about.py +19 -0
  481. tests/regscale/test_authorization.py +65 -0
@@ -0,0 +1,372 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Model for a RegScale Security Checklist"""
4
+ import warnings
5
+ from enum import Enum
6
+ from json import JSONDecodeError
7
+ from typing import Any, List, Optional, Union
8
+ from urllib.parse import urljoin
9
+
10
+ from pydantic import ConfigDict, Field
11
+
12
+ from regscale.core.app.api import Api
13
+ from regscale.core.app.application import Application
14
+ from regscale.core.app.utils.app_utils import get_current_datetime
15
+ from regscale.models.regscale_models.regscale_model import RegScaleModel
16
+
17
+
18
+ class ChecklistTool(str, Enum):
19
+ Ansible = "Ansible"
20
+ Chef = "Chef"
21
+ CISBenchmarks = "CIS Benchmarks"
22
+ MITRESAF = "MITRE SAF"
23
+ Puppet = "Puppet"
24
+ SCAP = "SCAP"
25
+ SIEM = "SIEM"
26
+ STIGs = "STIGs"
27
+ VulnerabilityScanner = "Vulnerability Scanner"
28
+ Other = "Other"
29
+
30
+
31
+ class ChecklistStatus(str, Enum):
32
+ FAIL = "Fail"
33
+ PASS = "Pass"
34
+ NOT_APPLICABLE = "Not Applicable"
35
+ NOT_REVIEWED = "Not Reviewed"
36
+
37
+
38
+ class Checklist(RegScaleModel):
39
+ """RegScale Checklist
40
+
41
+ :return: RegScale Checklist
42
+ """
43
+
44
+ _module_slug = "securitychecklist"
45
+ _module_string = "securitychecklists"
46
+ # Should we include baseline, ruleId, check, and results in unique fields?
47
+ _unique_fields = [
48
+ [
49
+ "assetId",
50
+ "tool",
51
+ "vulnerabilityId",
52
+ ],
53
+ ]
54
+ _parent_id_field = "assetId"
55
+ # Required
56
+ id: int = 0
57
+ status: Union[ChecklistStatus, str]
58
+ assetId: int
59
+ tool: Union[ChecklistTool, str]
60
+ baseline: str
61
+ vulnerabilityId: str
62
+ results: str
63
+ check: str
64
+ version: Optional[str] = None
65
+ uuid: Optional[str] = None
66
+ ruleId: Optional[str] = None
67
+ cci: Optional[str] = None
68
+ comments: Optional[str] = None
69
+ createdById: Optional[str] = None
70
+ lastUpdatedById: Optional[str] = None
71
+ datePerformed: Optional[str] = None
72
+ isPublic: bool = True
73
+ dateCreated: Optional[str] = Field(default_factory=get_current_datetime)
74
+ dateLastUpdated: Optional[str] = Field(default_factory=get_current_datetime)
75
+
76
+ @staticmethod
77
+ def _get_additional_endpoints() -> ConfigDict:
78
+ """
79
+ Override RegScaleModel and get additional endpoints for the Checklist model.
80
+
81
+ :return: A dictionary of additional endpoints
82
+ :rtype: ConfigDict
83
+ """
84
+ return ConfigDict( # type: ignore
85
+ get_all_by_parent="/api/{model_slug}/getAllByParent/{intParentID}",
86
+ )
87
+
88
+ def __hash__(self) -> hash:
89
+ """
90
+ Enable object to be hashable
91
+
92
+ :return: Hashed Checklist
93
+ :rtype: hash
94
+ """
95
+ return hash(
96
+ (
97
+ self.tool,
98
+ self.vulnerabilityId,
99
+ self.ruleId,
100
+ self.baseline,
101
+ self.check,
102
+ self.results,
103
+ self.comments,
104
+ self.assetId,
105
+ )
106
+ )
107
+
108
+ def __eq__(self, other: object) -> bool:
109
+ """
110
+ Compare Checklists
111
+
112
+ :param object other: Checklist to compare against
113
+ :return: True if equal, False if not
114
+ :rtype: bool
115
+ """
116
+ return (
117
+ # Unique values
118
+ # Tool, VulnerabilityId, RuleId, Baseline, [Check], Results, Comments, Status, AssetId,
119
+ # TenantsId, CCI, Version
120
+ self.tool == other.tool
121
+ and self.vulnerabilityId == other.vulnerabilityId
122
+ and self.ruleId == other.ruleId
123
+ and self.baseline == other.baseline
124
+ and self.check == other.check
125
+ and self.results == other.results
126
+ and self.comments == other.comments
127
+ and self.assetId == other.assetId
128
+ )
129
+
130
+ def __delitem__(self, key: Any) -> None:
131
+ """
132
+ Delete an item from the Checklist
133
+
134
+ :param Any key: Key to delete
135
+ :rtype: None
136
+ """
137
+ del self[key]
138
+
139
+ @staticmethod
140
+ def insert_or_update_checklist(
141
+ app: Application,
142
+ new_checklist: "Checklist",
143
+ existing_checklists: list[Any],
144
+ ) -> Optional[int]:
145
+ """
146
+ DEPRECATED: This method is deprecated and will be removed in a future version.
147
+ Use the create_or_update method instead.
148
+
149
+ Insert or update a checklist
150
+
151
+ :param Application app: RegScale Application instance
152
+ :param Checklist new_checklist: New checklist to insert or update
153
+ :param list[Any] existing_checklists: Existing checklists to compare against
154
+ :return: int of the checklist id or None
155
+ :rtype: Optional[int]
156
+ """
157
+ warnings.warn(
158
+ "insert_or_update_checklist is deprecated and will be removed in a future version. "
159
+ "Use create_or_update method instead.",
160
+ DeprecationWarning,
161
+ )
162
+ delete_keys = [
163
+ "asset",
164
+ "uuid",
165
+ "lastUpdatedById",
166
+ "dateLastUpdated",
167
+ "createdById",
168
+ "dateCreated",
169
+ ]
170
+ for dat in existing_checklists:
171
+ for key in delete_keys:
172
+ if key in dat:
173
+ del dat[key]
174
+ api = Api()
175
+ if matching_checklists := [
176
+ Checklist(**chk) for chk in existing_checklists if Checklist(**chk) == new_checklist
177
+ ]:
178
+ app.logger.info("Updating checklist %s...", new_checklist.baseline)
179
+ new_checklist.id = matching_checklists[0].id
180
+ res = api.put(
181
+ url=urljoin(app.config["domain"], f"/api/securitychecklist/{new_checklist.id}"),
182
+ json=new_checklist.dict(),
183
+ )
184
+ else:
185
+ app.logger.info("Inserting checklist %s", new_checklist.baseline)
186
+ res = api.post(
187
+ url=urljoin(app.config["domain"], "/api/securitychecklist"),
188
+ json=new_checklist.dict(),
189
+ )
190
+ if res.status_code != 200:
191
+ app.logger.warning("Unable to insert or update checklist %s", new_checklist.baseline)
192
+ return None
193
+ return res.json()["id"]
194
+
195
+ @staticmethod
196
+ def batch_insert_or_update(
197
+ api: Api, checklists: list["Checklist"], method: Optional[str] = "insert"
198
+ ) -> Optional[list["Checklist"]]:
199
+ """
200
+ Insert a batch of checklists
201
+
202
+ :param Api api: RegScale API instance
203
+ :param list[Checklist] checklists: List of checklists to insert
204
+ :param Optional[str] method: Method to use (insert or update), defaults to insert
205
+ :return: List of checklists inserted
206
+ :rtype: Optional[list[Checklist]]
207
+ """
208
+ if method == "insert":
209
+ endpoint = "batchCreate"
210
+ api.logger.info("Creating %i checklist(s) in RegScale...", len(checklists))
211
+ elif method == "update":
212
+ endpoint = "batchUpdate"
213
+ api.logger.info("Updating %i checklist(s) in RegScale...", len(checklists))
214
+ else:
215
+ api.logger.error("Invalid method %s, please use insert or update.", method)
216
+ return None
217
+ response = api.post(
218
+ url=urljoin(api.app.config["domain"], f"/api/securityChecklist/{endpoint}"),
219
+ json=[check.dict() for check in checklists],
220
+ )
221
+ if response.ok:
222
+ try:
223
+ return [Checklist(**check) for check in response.json()]
224
+ except TypeError as err:
225
+ api.logger.error("Unable to convert checklist(s): %s", err)
226
+ return None
227
+ except JSONDecodeError:
228
+ api.logger.error("Unable to %s checklist(s) in batch: %s", method, response.text)
229
+ return None
230
+ else:
231
+ api.logger.error(
232
+ "Unable to %s checklist(s) in batch: %i: %s %s",
233
+ method,
234
+ response.status_code,
235
+ response.reason,
236
+ response.text,
237
+ )
238
+ response.raise_for_status()
239
+ return None
240
+
241
+ @staticmethod
242
+ def analyze_and_batch_process(
243
+ app: Application,
244
+ new_checklists: Optional[list[dict]] = None,
245
+ existing_checklists: Optional[list["Checklist"]] = None,
246
+ ) -> dict:
247
+ """
248
+ Function to insert or update a checklist using batches via API
249
+
250
+ :param Application app: RegScale CLI Application instance
251
+ :param Optional[list[dict]] new_checklists: List of new checklists to insert or update
252
+ :param Optional[list[Checklist]] existing_checklists: List of existing checklists to compare against
253
+ :return: Dictionary with list of checklists inserted and/or updated
254
+ example: {'inserted': [], 'updated': [Checklist()...]}
255
+ :rtype: dict
256
+ """
257
+ if not new_checklists:
258
+ new_checklists = []
259
+
260
+ api = Api()
261
+ results = {"inserted": [], "updated": []} # type: dict
262
+ # if no existing checklists, insert all new checklists and return results
263
+ if existing_checklists is None:
264
+ results["inserted"] = Checklist.batch_insert_or_update(api, new_checklists, "insert")
265
+ return results
266
+ # see if any of the new checklists already exist
267
+ update_checks = []
268
+ create_checks = []
269
+ for new_checklist in new_checklists:
270
+ if matching_checklists := [
271
+ check for check in existing_checklists if check.vulnerabilityId == new_checklist.vulnerabilityId
272
+ ]:
273
+ new_checklist.id = matching_checklists[0].id
274
+ update_checks.append(new_checklist)
275
+ else:
276
+ create_checks.append(new_checklist)
277
+ if update_checks:
278
+ results["updated"] = Checklist.batch_insert_or_update(api, update_checks, "update")
279
+ if create_checks:
280
+ results["inserted"] = Checklist.batch_insert_or_update(api, create_checks, "insert")
281
+ return results
282
+
283
+ @classmethod
284
+ def get_checklists_by_asset(cls, api: Api, asset_id: int) -> List["Checklist"]: # noqa
285
+ """
286
+ Return all checklists for a given RegScale parent id and parent module
287
+
288
+ :param Api api: RegScale CLI API instance
289
+ :param int asset_id: RegScale Asset ID
290
+ :return: List of checklists for the given asset_id
291
+ :rtype: List[Checklist]
292
+ """
293
+ api.logger.info("Fetching all checklists for RegScale asset #%i...", asset_id)
294
+ response = api.get(
295
+ url=urljoin(
296
+ api.config.get("domain"),
297
+ f"/api/securityChecklist/getAllByParent/{asset_id}",
298
+ )
299
+ )
300
+ try:
301
+ if checklists := [Checklist(**check) for check in response.json()]:
302
+ api.logger.info(
303
+ "Found %i checklist(s) for asset #%i in RegScale.",
304
+ len(checklists),
305
+ asset_id,
306
+ )
307
+ return checklists
308
+ except TypeError as err:
309
+ api.logger.error("Unable to convert checklist(s): %s", err)
310
+ except JSONDecodeError:
311
+ api.logger.error(
312
+ "Unable to retrieve any checklists for asset #%i.\n%i: %s-%s",
313
+ asset_id,
314
+ response.status_code,
315
+ response.reason,
316
+ response.text,
317
+ )
318
+ return []
319
+
320
+ @staticmethod
321
+ def get_checklists(parent_id: int, parent_module: str = "components") -> List[dict]:
322
+ """
323
+ Return all checklists for a given RegScale parent id and parent module
324
+
325
+ :param int parent_id: RegScale parent id
326
+ :param str parent_module: RegScale parent module, defaults to components
327
+ :return: List of checklists for the given parent id and module
328
+ :rtype: List[dict]
329
+ """
330
+ app = Application()
331
+ api = Api()
332
+ app.logger.debug("Fetching all checklists for %s %s", parent_module, parent_id)
333
+ checklists = []
334
+ query = """
335
+ query {
336
+ securityChecklists(skip: 0, take: 50,where:{asset: {parentId: {eq: parent_id_placeholder}, parentModule: {eq: "parent_module_placeholder"}}}) {
337
+ items {
338
+ id
339
+ asset {
340
+ id
341
+ name
342
+ parentId
343
+ parentModule
344
+ }
345
+ status
346
+ tool
347
+ datePerformed
348
+ vulnerabilityId
349
+ ruleId
350
+ cci
351
+ check
352
+ results
353
+ baseline
354
+ comments
355
+ }
356
+ totalCount
357
+ pageInfo {
358
+ hasNextPage
359
+ }
360
+ }
361
+ }
362
+ """.replace(
363
+ "parent_id_placeholder", str(parent_id)
364
+ ).replace(
365
+ "parent_module_placeholder", parent_module
366
+ )
367
+ data = api.graph(query)
368
+ if "securityChecklists" in data and "items" in data["securityChecklists"]:
369
+ for item in data["securityChecklists"]["items"]:
370
+ item["assetId"] = item["asset"]["id"]
371
+ checklists.append(item)
372
+ return checklists
@@ -0,0 +1,49 @@
1
+ """This module contains the Comment model class."""
2
+
3
+ from typing import Optional
4
+
5
+ from pydantic import Field, ConfigDict
6
+
7
+ from regscale.core.app.utils.app_utils import get_current_datetime
8
+ from .regscale_model import RegScaleModel
9
+
10
+
11
+ class Comment(RegScaleModel):
12
+ """
13
+ Comment model class
14
+ """
15
+
16
+ _module_slug = "comments"
17
+ _unique_fields = [
18
+ ["comment", "parentID", "parentModule"],
19
+ ]
20
+ _parent_id_field = "parentID"
21
+
22
+ id: int = 0
23
+ comment: str
24
+ commentDate: Optional[str] = None
25
+ parentID: int = 0
26
+ parentModule: Optional[str] = None
27
+ userId: str = Field(default_factory=RegScaleModel.get_user_id)
28
+ tenantsId: int = 1
29
+ createdById: str = Field(default_factory=RegScaleModel.get_user_id)
30
+ dateCreated: str = Field(default_factory=get_current_datetime)
31
+ dateLastUpdated: str = Field(default_factory=get_current_datetime)
32
+ isPublic: bool = True
33
+ lastUpdatedById: str = Field(default_factory=RegScaleModel.get_user_id)
34
+ partId: Optional[int] = None
35
+ partType: Optional[str] = None
36
+
37
+ @staticmethod
38
+ def _get_additional_endpoints() -> ConfigDict:
39
+ """
40
+ Get additional endpoints for the Comments model.
41
+
42
+ :return: A dictionary of additional endpoints
43
+ :rtype: ConfigDict
44
+ """
45
+ return ConfigDict( # type: ignore
46
+ get_all_by_part="/api/comments/getAllByPart/{intParentID}/{strModule}/{strType}/{strPart}",
47
+ batch_create="/api/{model_slug}/batchCreate",
48
+ batch_update="/api/{model_slug}/batchUpdate",
49
+ )
@@ -0,0 +1,112 @@
1
+ """This module contains the Compliance Settings model class."""
2
+
3
+ from typing import List, Optional
4
+
5
+ from pydantic import ConfigDict
6
+
7
+ from regscale.models.regscale_models.regscale_model import RegScaleModel
8
+
9
+
10
+ class ComplianceSettings(RegScaleModel):
11
+ """
12
+ Compliance Settings model class
13
+ """
14
+
15
+ _module_slug = "settings"
16
+ _module_slug_id_url = "/api/compliance/{model_slug}/{id}"
17
+ _unique_fields = [
18
+ ["title"],
19
+ ]
20
+
21
+ id: int
22
+ title: str
23
+ hasParts: bool = True
24
+ wayfinderOptionId: Optional[int] = None
25
+ profileIds: Optional[List] = None
26
+ complianceSettingsFieldGroups: Optional[List] = None
27
+
28
+ @classmethod
29
+ def get_by_current_tenant(cls) -> List["ComplianceSettings"]:
30
+ """
31
+ Get a list of compliance settings by current tenant.
32
+
33
+ :return: A list of compliance settings
34
+ :rtype: List[ComplianceSettings]
35
+ """
36
+ response = cls._get_api_handler().get(
37
+ endpoint=cls.get_endpoint("get_by_current_tenant").format(model_slug=cls._module_slug)
38
+ )
39
+ compliance_settings = []
40
+ if response and response.ok:
41
+ for setting in response.json():
42
+ compliance_settings.append(ComplianceSettings(**setting))
43
+ return compliance_settings
44
+
45
+ @staticmethod
46
+ def _get_additional_endpoints() -> ConfigDict:
47
+ """
48
+ Get additional endpoints for the ComplianceSettings model.
49
+
50
+ :return: A dictionary of additional endpoints
51
+ :rtype: ConfigDict
52
+ """
53
+ return ConfigDict( # type: ignore
54
+ get_by_current_tenant="/api/compliance/{model_slug}", # type: ignore
55
+ get_by_compliance_id="/api/compliance/{model_slug}/{id}/", # type: ignore
56
+ )
57
+
58
+ @classmethod
59
+ def _get_endpoints(cls) -> ConfigDict:
60
+ """
61
+ Get the endpoints for the API.
62
+
63
+ :return: A dictionary of endpoints
64
+ :rtype: ConfigDict
65
+ """
66
+ endpoints = ConfigDict( # type: ignore
67
+ get=cls._module_slug_id_url, # type: ignore
68
+ insert="/api/compliance/{model_slug}/", # type: ignore
69
+ update=cls._module_slug_id_url, # type: ignore
70
+ delete=cls._module_slug_id_url, # type: ignore
71
+ )
72
+ endpoints.update(cls._get_additional_endpoints())
73
+ return endpoints
74
+
75
+ @classmethod
76
+ def get_labels(cls, setting_id: int, setting_field: str) -> List[str]:
77
+ """
78
+ Get the labels for the ComplianceSettings model.
79
+
80
+ :param int setting_id: The ID of the compliance setting
81
+ :param str setting_field: The field of the compliance setting
82
+ :return: A list of labels
83
+ :rtype: List[str]
84
+ """
85
+ compliance_setting = None
86
+ response = cls._get_api_handler().get(
87
+ endpoint=cls.get_endpoint("get_by_compliance_id").format(model_slug=cls._module_slug, id=setting_id)
88
+ )
89
+ labels = []
90
+ if response and response.ok:
91
+ compliance_setting = cls(**response.json())
92
+ else:
93
+ return labels
94
+ if not compliance_setting:
95
+ return labels
96
+ if compliance_setting.complianceSettingsFieldGroups:
97
+ for group in compliance_setting.complianceSettingsFieldGroups:
98
+ if group["formFieldId"] == setting_field:
99
+ for item in group["complianceSettingsList"]:
100
+ labels.append(item["statusName"])
101
+
102
+ return labels
103
+
104
+ def get_field_labels(self, setting_field: str) -> List[str]:
105
+ """
106
+ Get the labels for the specified field from this compliance setting.
107
+
108
+ :param str setting_field: The field of the compliance setting
109
+ :return: A list of labels
110
+ :rtype: List[str]
111
+ """
112
+ return self.__class__.get_labels(self.id, setting_field)