trueppm-api 0.4.0b2__tar.gz → 0.4.0b4__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.
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/Dockerfile +2 -2
- trueppm_api-0.4.0b4/PKG-INFO +267 -0
- trueppm_api-0.4.0b4/README.md +204 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/docker-compose.capacity.yml +2 -2
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/pyproject.toml +1 -1
- trueppm_api-0.4.0b4/src/trueppm_api/__init__.py +27 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/management/commands/create_admin.py +48 -3
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/management/commands/revoke_api_tokens.py +97 -68
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/permissions.py +5 -7
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/serializers.py +11 -1
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/views.py +34 -15
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/csvimport/tasks.py +184 -146
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/external_sources.py +50 -24
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/selectors.py +25 -11
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/views.py +8 -3
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/authentication.py +3 -2
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/fixtures/seeds/atlas-platform-launch.json +19 -0
- trueppm_api-0.4.0b4/src/trueppm_api/apps/projects/management/commands/load_sample_project.py +455 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/seed/exporter.py +52 -43
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/seed/importer.py +186 -102
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/seed/validation.py +43 -23
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/serializers.py +36 -7
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/share_services.py +1 -1
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/share_views.py +20 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/task_bulk.py +82 -12
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/template_views.py +38 -8
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/utilization.py +48 -27
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/views.py +121 -58
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/serializers.py +86 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/views.py +22 -3
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sso/serializers.py +10 -1
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sso/services.py +60 -4
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/models.py +6 -6
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/celery.py +11 -2
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/auth_views.py +9 -14
- trueppm_api-0.4.0b4/src/trueppm_api/core/demo_read_only.py +279 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/openapi.py +48 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/password_reset.py +28 -24
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/security_checks.py +89 -1
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/throttling.py +170 -1
- trueppm_api-0.4.0b4/src/trueppm_api/core/worker_selfheal.py +205 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/settings/base.py +78 -1
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/settings/prod.py +21 -1
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/urls.py +53 -1
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/role_route_matrix.txt +8 -8
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_create_admin.py +56 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_login_success_event.py +3 -1
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_me_api.py +4 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_password_reset.py +90 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_rbac.py +10 -4
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/integrations/test_git_automation.py +98 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/observability/test_system_health.py +19 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_persona_logins.py +2 -2
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_project_memberships.py +56 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_samples.py +190 -1
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_api.py +102 -25
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_calendar_change_attribution.py +16 -9
- trueppm_api-0.4.0b4/tests/apps/projects/test_calendar_write_gate.py +264 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_composable_calendars.py +5 -2
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_fuzz_500_regressions.py +36 -11
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_inbound_task_sync.py +2 -1
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_pat_general_endpoint_auth.py +6 -3
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_project_templates.py +171 -2
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_share_links.py +41 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_structure_declaration_on_restructure.py +45 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_bulk_contract.py +80 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_token_scope_matrix.py +11 -4
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_schedule_derivation.py +60 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sso/test_services.py +47 -2
- trueppm_api-0.4.0b4/tests/apps/sso/test_sso_error_codes_contract.py +187 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/conftest.py +30 -0
- trueppm_api-0.4.0b4/tests/core/test_client_address_readback.py +158 -0
- trueppm_api-0.4.0b4/tests/core/test_demo_read_only.py +728 -0
- trueppm_api-0.4.0b4/tests/core/test_resolve_client_ip.py +105 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_attachment_storage_check.py +50 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_ci_api_test_contract.py +11 -0
- trueppm_api-0.4.0b4/tests/test_demo_read_only_enforcement_check.py +82 -0
- trueppm_api-0.4.0b4/tests/test_edition.py +225 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_prod_settings.py +42 -0
- trueppm_api-0.4.0b4/tests/test_version.py +48 -0
- trueppm_api-0.4.0b4/tests/test_worker_selfheal.py +241 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/uv.lock +1 -1
- trueppm_api-0.4.0b2/PKG-INFO +0 -70
- trueppm_api-0.4.0b2/README.md +0 -7
- trueppm_api-0.4.0b2/src/trueppm_api/__init__.py +0 -14
- trueppm_api-0.4.0b2/src/trueppm_api/apps/projects/management/commands/load_sample_project.py +0 -247
- trueppm_api-0.4.0b2/tests/test_edition.py +0 -48
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/.gitignore +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/.test_durations +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/changelog.d/2268.fixed.md +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/conftest.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/manage.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/osv-scanner.toml +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/README.md +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/README.md +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/README.md +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/diagnostics/current-fresh-stack-2000.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/diagnostics/current-harness-sequence-autovacuum.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/diagnostics/forced-analyze-jit-on.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/diagnostics/jit-off-sweep-and-forced-analyze.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/diagnostics/main-with-and-without-fix-forced-analyze.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/diagnostics/slow-query-log-current-2000-tasks-jit-on.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/diagnostics/slow-query-log-july-2000-tasks-jit-on.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/explain/current-2000-tasks-offset1000-jit-off.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/explain/current-2000-tasks-offset1000-jit-on.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/explain/current-page-query-offset1000.sql +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/explain/fix-32000-tasks-offset31800-jit-off.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/explain/fix-page-query-offset31800.sql +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/fresh/fresh-database-16k-32k-100k.log +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/multi/concurrent-users-1-process.log +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/multi/concurrent-users-4-workers.log +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/multi/multi.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/multi/neighbors-and-program-cpm.log +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/current-a/capacity-full_load.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/current-a/meminfo-after.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/current-a/meminfo-before.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/current-a/meta.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/current-b/capacity-full_load.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/current-b/meminfo-after.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/current-b/meminfo-before.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/current-b/meta.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/current-c/capacity-full_load.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/current-c/meminfo-after.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/current-c/meminfo-before.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/current-c/meta.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/current-jit-off/capacity-full_load.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/current-jit-off/meminfo-after.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/current-jit-off/meminfo-before.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/current-jit-off/meta.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/july-a/capacity-full_load.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/july-a/meminfo-after.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/july-a/meminfo-before.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/july-a/meta.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/july-b/capacity-full_load.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/july-b/meminfo-after.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/july-b/meminfo-before.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/july-b/meta.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/july-c/capacity-full_load.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/july-c/meminfo-after.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/july-c/meminfo-before.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/runs/july-c/meta.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/scale/scale.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/scale/scale.log +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/scripts/build-images.sh +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/scripts/compose-workers4.yml +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/scripts/compose.diff +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/scripts/diag-analyze.sh +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/scripts/diag.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/scripts/diag_multi.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/scripts/diag_scale.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/scripts/fresh_probe.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/2026-09-16-same-host/scripts/run-arm.sh +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/capacity-edges.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/capacity-full_load.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/capacity-tasks.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/results/capacity-workspace.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/capacity/run_capacity.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/perf/load.js +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/schemathesis.toml +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/apps.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/groups.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/management/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/management/commands/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/management/commands/migrate_locked.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/migrations/0001_initial.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/migrations/0001_squashed_0012_programmembership_role_title.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/migrations/0002_alter_projectmembership_id.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/migrations/0003_projectmembership_soft_delete.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/migrations/0004_alter_projectmembership_role.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/migrations/0005_program_entity_and_membership.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/migrations/0006_role_ordinal_spacing.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/migrations/0007_projectmembership_joined_at_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/migrations/0008_projectmembership_source_group.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/migrations/0009_projectmembership_pm_proj_serverver_idx.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/migrations/0010_programmembership_joined_at_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/migrations/0011_alter_programmembership_unique_together_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/migrations/0012_programmembership_role_title.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/migrations/0013_userdefinedmentiongroup.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/migrations/0014_programmembership_progm_serverver_idx.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/migrations/0015_programuserdefinedmentiongroup.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/migrations/0016_externalstakeholder.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/migrations/0017_viewer_ordinal_one.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/migrations/0018_programmembership_sync_seq_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/migrations/0019_programmembership_reinstated_at_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/migrations/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/models.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/signals.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/tasks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/throttles.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/access/urls.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/agents/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/agents/apps.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/agents/canonical.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/agents/deferred.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/agents/management/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/agents/management/commands/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/agents/management/commands/audit_prune.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/agents/management/commands/audit_verify.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/agents/middleware.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/agents/migrations/0001_initial.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/agents/migrations/0002_agentactioncheckpoint.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/agents/migrations/0003_agentactionrefusaldetail.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/agents/migrations/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/agents/models.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/agents/refusal.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/agents/serializers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/agents/services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/agents/signals.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/agents/urls.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/agents/views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/csvimport/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/csvimport/apps.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/csvimport/mapping.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/csvimport/migrations/0001_initial.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/csvimport/migrations/0002_schedule_outline_batch_operations.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/csvimport/migrations/0003_csvimportrequest_date_order_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/csvimport/migrations/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/csvimport/models.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/csvimport/parser.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/csvimport/services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/csvimport/template.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/csvimport/urls.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/csvimport/views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/history/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/history/apps.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/history/changelog.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/history/diff_policy.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/history/serializers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/history/signals.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/history/tasks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/history/urls.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/history/views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/idempotency/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/idempotency/apps.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/idempotency/migrations/0001_initial.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/idempotency/migrations/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/idempotency/mixins.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/idempotency/models.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/idempotency/tasks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/apps.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/connections.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/encryption.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/git_automation_services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/git_webhook_auth.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/http.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/me_work.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/migrations/0001_initial.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/migrations/0001_squashed_0006_tasklink_description_tasklink_preview_type_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/migrations/0002_tasklink.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/migrations/0003_tasklink_tasklink_serverver_idx.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/migrations/0004_tasklink_custom_title_tasklink_labels.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/migrations/0005_boardautomation.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/migrations/0006_tasklink_description_tasklink_preview_type_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/migrations/0007_tasklink_created_at.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/migrations/0008_integrationcredential_config_externalworkitem.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/migrations/0009_externalsyncrequest_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/migrations/0010_externalworkitem_due_date.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/migrations/0011_tasklink_sync_seq_tasklink_tasklink_syncseq_idx.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/migrations/0012_boardautomation_last_delivery_at_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/migrations/0013_externalsyncrequest_attempt_count_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/migrations/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/models.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/notification_channels.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/opengraph.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/outgoing.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/providers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/registry.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/serializers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/tasks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/throttles.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/urls.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/integrations/views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/jiraimport/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/jiraimport/apps.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/jiraimport/migrations/0001_initial.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/jiraimport/migrations/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/jiraimport/models.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/jiraimport/parser.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/jiraimport/services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/jiraimport/tasks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/jiraimport/urls.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/jiraimport/views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/msproject/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/msproject/apps.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/msproject/dataclasses.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/msproject/exporter.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/msproject/extended_attributes.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/msproject/importer.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/msproject/migrations/0001_import_request.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/msproject/migrations/0001_squashed_0002_importrequest_creates_project.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/msproject/migrations/0002_importrequest_creates_project.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/msproject/migrations/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/msproject/models.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/msproject/parser.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/msproject/serializers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/msproject/services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/msproject/tasks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/msproject/urls.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/msproject/views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/apps.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/backfill.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/categories.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/delivery_limits.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/digests.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/email_backend.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/email_health.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/migrations/0001_initial.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/migrations/0001_squashed_0006_notification_task.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/migrations/0002_project_notification_preference.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/migrations/0003_projectnotificationpreference_paused.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/migrations/0004_clean_unknown_matrix_keys.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/migrations/0005_notification_body_notification_event_type_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/migrations/0006_notification_task.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/migrations/0007_workspaceemailsettings.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/migrations/0008_notification_snoozed_until.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/migrations/0009_usernotificationsettings.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/migrations/0010_projectnotificationpreference_schema_version.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/migrations/0011_usernotificationsettings_digest_hour_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/migrations/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/models.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/receivers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/schema_migrations.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/serializers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/tasks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/throttles.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/urls.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/notifications/views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/apps.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/logging.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/migrations/0001_initial.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/migrations/0001_squashed_0003_alter_purgerun_trigger.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/migrations/0002_purgerun_retentionpolicy_retentionschedule.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/migrations/0003_alter_purgerun_trigger.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/migrations/0004_alter_retentionpolicy_key.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/migrations/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/models.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/otel/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/otel/attributes.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/otel/export_health.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/otel/instrumentation.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/otel/metrics.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/otel/provider.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/otel/request_attributes.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/purge_registry.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/retention.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/serializers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/tasks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/observability/urls.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/profiles/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/profiles/apps.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/profiles/constants.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/profiles/migrations/0001_initial.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/profiles/migrations/0001_squashed_0004_userprofile_role_context.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/profiles/migrations/0002_userprofile_hidden_views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/profiles/migrations/0003_projectvisit.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/profiles/migrations/0004_userprofile_role_context.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/profiles/migrations/0005_userprofile_schedule_in_deliver.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/profiles/migrations/0006_userprofile_date_format_userprofile_timezone.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/profiles/migrations/0007_userpin.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/profiles/migrations/0008_remove_userprofile_schedule_in_deliver.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/profiles/migrations/0009_auth_user_email_upper_idx.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/profiles/migrations/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/profiles/models.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/profiles/serializers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/profiles/services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/profiles/views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/actual_date_rules.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/amend.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/apps.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/asset_feed.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/asset_views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/attachment_policy.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/backfill.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/backlog_services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/backlog_views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/batch_operation_views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/blocker_services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/board_activity.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/board_activity_views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/board_lanes.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/bulk_settings.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/bundled_templates.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/calendar_settings.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/ceremony_views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/commit_moment.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/config_notice.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/custom_field_values.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/decisions_services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/decisions_views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/estimation_scale.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/export_bundle.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/fixtures/seeds/aurora-mobile-app.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/fixtures/seeds/bayside-civic-center.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/fixtures/seeds/ga-launch.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/fixtures/seeds/helios-crm-replacement.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/guardrail_policy_source.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/inbound_sync.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/iteration_label.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/lifecycle.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/management/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/management/commands/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/management/commands/backfill_in_progress_status.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/management/commands/create_demo_share_link.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/management/commands/export_program.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/management/commands/import_seed.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/management/commands/seed_capacity.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/management/commands/seed_integration_fixtures.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/management/commands/shift_sample_dates.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/mcp_settings.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/methodology.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0001_initial.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0001_squashed_0094_project_decisions_policy.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0002_alter_uuid_pk_serialize_false.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0003_rename_task_project_index.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0004_soft_delete_and_dependency_versioned.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0005_task_assignee.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0006_task_utilization_index.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0007_task_is_milestone.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0008_baseline.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0009_historicaldependency_historicalproject_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0010_risk.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0011_task_status.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0012_task_status.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0013_task_planned_start.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0014_short_hex_ids.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0015_backfill_short_ids.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0016_task_actual_dates.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0017_boardcolumnconfig.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0018_estimation_governance.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0019_backfill_wbs_paths.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0020_task_status_5col.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0021_boardsavedview.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0022_task_status_changed_at_priority_rank.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0023_risk_framework_fields.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0024_riskcomment.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0025_sprint.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0026_project_methodology.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0027_sprint_retro.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0028_normalize_notes_field.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0029_complete_implies_full_progress.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0030_review_implies_full_progress.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0031_task_remaining_points.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0032_task_is_subtask_and_sprint_scope_change.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0033_task_my_work_index.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0034_inbound_task_sync.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0035_retro_versioned_and_suggested_assignee.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0036_program_entity_and_membership.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0037_sprint_capacity_points.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0038_taskcomment_commentreaction_commentacknowledgement_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0039_apitoken_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0040_program_general_fields.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0041_ceremony_template_and_phase_gate_config.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0041_project_general_fields.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0042_merge_20260522_0410.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0042_program_rollup_config.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0042_workflow_color_and_custom_fields.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0043_merge_20260522_1118.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0044_merge_20260522_rollup.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0044_project_archive_program_close.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0045_program_risk_policy.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0046_merge_20260523_2248.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0047_apitokenauditentry_program_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0048_historicalprogram_color_program_color.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0049_backlog_item.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0050_backlog_item_trgm_search.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0051_alter_calendar_working_days_alter_dependency_lag_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0052_recurring_tasks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0053_dependency_dep_pred_serverver_idx_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0054_sprintscopechange_goal_impact_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0055_historicaltask_sprint_pending_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0056_historicalproject_prioritization_model_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0057_historicalsprint_binding_committed_snapshot_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0058_historicaltask_delivery_mode_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0059_forecastsnapshot.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0060_historicalprojectsignalprivacypolicy_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0061_baselinetask_story_points.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0062_project_is_sample.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0063_historicalsprint_wip_limit_sprint_wip_limit.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0064_sprinttaskoutcome.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0065_historicalsprint_goal_outcome_sprint_goal_outcome.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0066_historicalproject_lead_project_lead.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0067_sprint_exclude_from_velocity.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0068_project_recalculated_at.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0069_iteration_label.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0070_historicalprogram_iteration_label_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0071_backfill_iteration_label_inherit.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0072_pulseresponse_retroboarditem.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0073_sprinttaskoutcome_demo_ready.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0074_historicaltask_blocked_reason_task_blocked_reason.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0075_risk_decimal_short_id.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0076_sprinttaskoutcome_review_polish.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0077_task_blocker_fields.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0078_alter_risktask_unique_together_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0079_historicalproject_status_date_project_status_date.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0080_alter_historicaltask_type_alter_task_type.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0081_historicalprogram_allow_guests_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0082_project_last_sync_version.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0083_historicalprogram_mc_history_attribution_audience_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0084_tasknote.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0085_sprint_ix_sprint_velocity.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0086_board_card_search_trgm.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0087_historicalprogram_task_duration_change_percent_policy_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0088_historicalprogram_allowed_attachment_types_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0089_signalceilingraiseproposal_signalceilingraisevote_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0090_historicaltask_proj_histdate_index.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0091_project_board_cadence.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0092_program_target_date.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0093_cross_project_dependency_consent.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0094_project_decisions_policy.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0095_poker_session_vote.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0095_squashed_0097_release_0_3.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0096_crossprojectslipconflict.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0097_backlogitem_backlogitem_tags_gin_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0098_historicalproject_show_baselines_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0099_apitoken_scopes.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0100_task_dep_serverver_idx_concurrent.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0101_dependency_deleted_at_task_deleted_at.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0102_project_deleted_at_project_proj_isdel_deletedat_idx.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0103_taskdurationchangeevent_task_dur_evt_sprint_idx.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0104_historicalproject_stale_task_threshold_days_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0104_trash_restore_1113.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0105_historical_changelog_indexes.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0106_boardsavedview_schema_version.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0107_task_activity_event.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0108_remove_apitoken_api_token_scope_xor_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0109_projectexportjob.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0110_sharelink.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0111_projectcalendarlayer.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0112_sharelink_expires_at_alter_sharelink_content_kind.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0113_alter_historicaltask_percent_complete_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0114_historicalproject_default_member_role_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0115_historicalproject_end_date_shift_threshold_days_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0116_alter_taskactivityevent_event_type.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0117_label_tasklabel_label_tasks_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0118_programexportjob.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0119_historicalprogram_calendar_program_calendar.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0120_alter_backlogitem_item_type.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0121_task_three_point_estimate_ordered.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0122_task_relation.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0123_remove_historicalproject_agile_features_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0124_dependency_is_driving.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0125_historicalprogram_estimation_scale_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0126_projectcustomfield_show_on_card_taskcustomfieldvalue.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0127_historicalprogram_mcp_enabled_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0128_acceptancecriterion_sync_seq_apitoken_sync_seq_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0129_sharelink_show_milestone_dates.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0130_programimportjob.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0131_historicalprogram_sprint_picker_ready_only_default_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0132_task_scheduled_start.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0133_project_status_date_floor_armed_at.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0134_task_edited_at_task_seeded_at_task_source_id_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0135_projecttemplate_templateapplication_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0136_schedule_outline_batch_operations.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0137_collapse_dual_scope_api_tokens.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0138_apitokenauditentry_api_token_audit_owner_idx.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0139_historicaltask_duration_unit_task_duration_unit.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0140_historicaltask_auto_container_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0141_historicalproject_draft_started_at_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0142_baseline_calendar_hours_per_day_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0143_sprintcloserequest_failure_reason_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0144_projecttemplate_source_project_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0145_seed_bundled_templates.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0146_historicaltask_board_lane_task_board_lane.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0147_structuraloperation.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0148_task_unique_task_wbs_path_per_project_live.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0149_drop_workshops_tables.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0150_clear_uncommitted_cpm_output.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0151_config_notice_request.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0152_aggregate_task_wbs_name_idx.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/0153_program_sample_anchor_date.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/migrations/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/models.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/poker_services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/poker_views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/product_backlog_services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/program_label_services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/program_label_views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/program_rollup.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/program_schedule.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/program_views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/project_templates.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/receivers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/refusal_codes.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/reorder_services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/restructure_hooks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/retro_board_services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/retro_services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/risk_import.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/row_identity.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/schema_migrations.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/schemas/seed_v1.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/schemas/seed_v2.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/seed/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/seed/forecast_backfill.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/seed/reanchor.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/seed/reldates.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/seed/replace.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/seed/replay.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/seed/replay_ctx.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/seed/samples.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/share_serializers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/sharing_settings.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/signal_privacy_services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/signal_privacy_views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/signals.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/slip_conflict.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/sprint_cadence.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/sprint_picker_settings.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/standup.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/standup_views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/structural_operation_services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/structural_operation_views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/surface_visibility.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/task_batch_services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/task_classification.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/task_classification_defaults.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/task_duration_settings.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/task_grouping.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/tasks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/template_divergence.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/template_services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/template_tasks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/throttles.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/urls.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/projects/wbs_paths.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/apps.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/capacity.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/migrations/0001_initial.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/migrations/0001_squashed_0013_alter_projectresource_unique_together_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/migrations/0002_alter_uuid_pk_serialize_false.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/migrations/0003_resource_soft_delete.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/migrations/0004_add_taskresource_resource_index.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/migrations/0005_resource_job_role.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/migrations/0006_skill.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/migrations/0007_resource_skill.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/migrations/0008_project_resource.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/migrations/0009_task_skill_requirement.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/migrations/0010_alter_resourceskill_options_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/migrations/0011_alter_projectresource_notes.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/migrations/0012_add_resource_user_fk.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/migrations/0013_alter_projectresource_unique_together_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/migrations/0014_projectresource_sync_seq_resource_sync_seq_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/migrations/0015_projectresource_deactivated_with_resource.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/migrations/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/models.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/serializers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/urls.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/resources/views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/apps.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/calendars.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/deadletter.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/forecast_history_settings.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/forecast_staleness.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/graph_guard.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/management/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/management/commands/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/management/commands/prune_forecast_snapshots.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/migrations/0001_failed_task.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/migrations/0001_squashed_0007_projectforecastsnapshot.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/migrations/0002_schedulerequest.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/migrations/0003_add_schedule_request_reason.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/migrations/0004_velocity_suggestion.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/migrations/0005_montecarlorun.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/migrations/0006_montecarlorun_distribution.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/migrations/0007_projectforecastsnapshot.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/migrations/0008_alter_schedulerequest_reason.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/migrations/0008_folded_schedulerequest_reason.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/migrations/0009_alter_schedulerequest_reason.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/migrations/0010_failedtask_resolution_note_failedtask_resolved_at_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/migrations/0011_failedtask_project.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/migrations/0012_montecarlorun_diagnostic.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/migrations/0013_montecarlorun_status_date.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/migrations/0014_montecarlorun_plan_version.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/migrations/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/models.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/receivers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/risk_premium.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/signals.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/tasks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/telemetry.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/units.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/scheduling/urls.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sso/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sso/apps.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sso/extensions.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sso/management/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sso/management/commands/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sso/management/commands/seed_sso_keycloak.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sso/migrations/0001_initial.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sso/migrations/0002_remove_oidcprovider_workspace_ssoproviderpolicy_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sso/migrations/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sso/models.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sso/urls.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sso/views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sync/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sync/apps.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sync/backfill.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sync/broadcast.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sync/conflict.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sync/consumers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sync/migrations/0001_initial.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sync/migrations/0001_squashed_0002_remove_syncbatch_syncbatch_project_client_batch_uniq_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sync/migrations/0002_remove_syncbatch_syncbatch_project_client_batch_uniq_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sync/migrations/0003_boardevent.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sync/migrations/0004_seed_sync_seq.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sync/migrations/0005_program_sync_sequence.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sync/migrations/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sync/models.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sync/pagination.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sync/sequence.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sync/serializers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sync/tasks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sync/throttles.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sync/upload.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sync/urls.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sync/views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/sync/ws_auth.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/taskruns/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/taskruns/apps.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/taskruns/migrations/0001_initial.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/taskruns/migrations/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/taskruns/models.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/taskruns/serializers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/taskruns/tasks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/taskruns/tracker.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/taskruns/urls.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/taskruns/views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/teams/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/teams/apps.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/teams/migrations/0001_initial.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/teams/migrations/0001_squashed_0002_default_teams.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/teams/migrations/0002_default_teams.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/teams/migrations/0003_team_sync_seq_teammembership_sync_seq.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/teams/migrations/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/teams/models.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/teams/permissions.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/teams/serializers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/teams/services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/teams/signals.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/teams/urls.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/teams/views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/timetracking/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/timetracking/apps.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/timetracking/migrations/0001_initial.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/timetracking/migrations/0002_timesheetsubmission.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/timetracking/migrations/0003_timeentry_deleted_at_timeentry_deleted_by.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/timetracking/migrations/0004_timeentry_sync_seq_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/timetracking/migrations/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/timetracking/models.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/timetracking/serializers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/timetracking/services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/timetracking/urls.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/timetracking/views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/webhooks/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/webhooks/apps.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/webhooks/backfill.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/webhooks/dispatch.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/webhooks/migrations/0001_initial.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/webhooks/migrations/0001_squashed_0007_sprint_lifecycle_events.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/webhooks/migrations/0002_alter_webhook_events.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/webhooks/migrations/0003_delivery_status_created_idx.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/webhooks/migrations/0004_webhook_program_alter_webhook_project_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/webhooks/migrations/0005_webhook_delivery_sequence_numbers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/webhooks/migrations/0006_webhook_format_alter_webhook_events_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/webhooks/migrations/0007_sprint_lifecycle_events.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/webhooks/migrations/0008_risk_baseline_comment_events.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/webhooks/migrations/0009_encrypt_webhook_secret_and_failure_counters.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/webhooks/migrations/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/webhooks/models.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/webhooks/serializers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/webhooks/tasks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/webhooks/urls.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/webhooks/views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workflow_engine/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workflow_engine/apps.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workflow_engine/migrations/0001_initial.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workflow_engine/migrations/0001_squashed_0002_remove_workflowhistoryevent_workflow_history_lookup_idx.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workflow_engine/migrations/0002_remove_workflowhistoryevent_workflow_history_lookup_idx.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workflow_engine/migrations/0003_workflowoutboxrow_workflow_outbox_recovery_idx.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workflow_engine/migrations/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workflow_engine/models.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workflow_engine/tasks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/apps.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/backfill.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/export.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0001_initial.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0001_squashed_0014_workspacemembership_availability_effective_from_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0002_remove_workspace_fiscal_year_start_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0003_workspaceexportjob.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0004_alter_workspaceinvite_status.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0005_workspace_iteration_label_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0006_alter_groupmembership_unique_together_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0007_workspace_public_sharing_override_policy.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0008_workspace_mc_history_attribution_audience_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0009_workspace_methodology_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0010_workspace_logo.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0011_historicalworkspace_task_duration_change_percent_override_policy_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0012_historicalworkspace_allowed_attachment_types_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0013_auditevent.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0014_workspacemembership_availability_effective_from_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0015_trash_restore_1113.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0016_historicalworkspace_calendar_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0017_historicalworkspace_estimation_scale_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0018_historicalworkspace_feedback_enabled_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0019_historicalworkspace_mcp_enabled_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0020_viewer_ordinal_one.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0021_group_sync_seq_groupmembership_sync_seq_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0022_historicalworkspace_sprint_picker_ready_only_default_and_more.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0023_alter_auditevent_event_type.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0024_alter_auditevent_event_type.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0025_alter_auditevent_event_type.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0026_alter_auditevent_event_type.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/0027_alter_auditevent_event_type.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/migrations/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/permissions.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/serializers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/signals.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/tasks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/urls.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/apps/workspace/views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/asgi.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/admin_site.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/constant_time.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/csp.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/db.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/db_session.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/exception_handlers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/export_downloads.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/extension_providers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/extension_signals.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/idempotent.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/metadata.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/middleware.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/protect_conflict.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/ratelimit.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/redis_throttle.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/refresh_cookie_policy.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/request_body.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/storage_config.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/text_decode.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/valkey.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/valkey_cache.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/valkey_checks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/valkey_config.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/worker_broker_wait.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/core/worker_heartbeat.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/fields.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/permissions.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/py.typed +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/routing.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/settings/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/settings/dev.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/workflows/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/workflows/backends/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/workflows/backends/default.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/workflows/consumers/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/workflows/consumers/requeue_failed_task.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/workflows/interface.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/workflows/registry.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/workflows/services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/src/trueppm_api/wsgi.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/test-results/.last-run.json +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_archived_write_enforcement.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_auth_cookie.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_external_stakeholders.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_facet_live_membership_floor.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_groups.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_login_email_identifier.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_login_throttle.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_mcp_admin_controls.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_mcp_read_throttle.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_mcp_team_opt_out.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_membership_api.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_membership_eviction.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_mention_groups_api.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_migrate_locked.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_program_groups.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_program_membership_api.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_program_membership_live_floor.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_program_mention_groups_api.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_read_path_live_membership_floor.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_revoke_api_tokens_command.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_role_ordinals.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_role_route_matrix.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_route_table_invariants.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_unresolvable_scope_fails_closed.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/test_user_search.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/access/token_write_surface.txt +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/agents/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/agents/test_agent_action_audit.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/agents/test_agent_action_prune.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/agents/test_refusal_audit_durability.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/agents/test_refusal_disclosure.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/agents/test_refusal_telemetry.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/core/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/core/test_default_throttle.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/core/test_redis_throttle.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/csvimport/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/csvimport/files/README.md +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/csvimport/files/european_decimals.csv +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/csvimport/files/utf16_bom.csv +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/csvimport/files/utf16_no_bom.csv +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/csvimport/fixtures.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/csvimport/test_encoding_and_locale.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/csvimport/test_import.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/csvimport/test_mapping.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/csvimport/test_parser.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/csvimport/test_tasks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/history/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/history/test_changelog.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/history/test_diff_policy.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/history/test_history.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/idempotency/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/idempotency/test_idempotency.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/integrations/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/integrations/test_auth_guard_branches.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/integrations/test_base_url_allowlist.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/integrations/test_credential_verification.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/integrations/test_credentials_api.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/integrations/test_encryption.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/integrations/test_external_sources.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/integrations/test_external_sync.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/integrations/test_external_sync_outcome.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/integrations/test_external_sync_rate_limit.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/integrations/test_external_work_item_model.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/integrations/test_http_ssrf.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/integrations/test_me_connections.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/integrations/test_me_work_external_blocks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/integrations/test_opengraph.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/integrations/test_registry.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/integrations/test_task_link_providers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/integrations/test_task_links_api.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/integrations/test_throttle.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/jiraimport/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/jiraimport/fixtures.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/jiraimport/test_import.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/jiraimport/test_parser.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/jiraimport/test_parser_security.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/jiraimport/test_services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/jiraimport/test_tasks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/fixtures/README.md +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/fixtures/all_dependency_types.xml +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/fixtures/calendar_exceptions.xml +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/fixtures/cloud_migration.xml +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/fixtures/constraints_actuals_baselines.xml +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/fixtures/cross_project_link.xml +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/fixtures/deep_wbs.xml +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/fixtures/large_flat.xml +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/fixtures/milestones_only.xml +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/fixtures/minimal.xml +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/fixtures/recurring_task.xml +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/fixtures/resource_overallocation.xml +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/fixtures/sample.xml +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/fixtures/sample_2019.xml +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/fixtures/sample_legacy.xml +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/fixtures/unicode_names.xml +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/test_constraints_and_actuals.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/test_filename_sanitize.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/test_import_graph_guard.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/test_import_hardening.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/test_import_start_shift_broadcast.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/test_import_wbs_offset.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/test_msproject.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/test_parser_security.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/msproject/test_pert_mapping.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/notifications/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/notifications/test_ceiling_proposal_notifications.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/notifications/test_dnd.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/notifications/test_email_drain.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/notifications/test_event_notifications.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/notifications/test_models.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/notifications/test_project_notification_channel_coverage.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/notifications/test_project_notification_dispatch_coverage.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/notifications/test_project_preferences.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/notifications/test_scheduled_digests.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/notifications/test_schema_migrations.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/notifications/test_serializers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/notifications/test_services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/notifications/test_snooze_category.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/notifications/test_stale_task_detection.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/notifications/test_tasks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/notifications/test_throttles.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/notifications/test_views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/notifications/test_workspace_email_settings.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/observability/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/observability/test_beat_heartbeat.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/observability/test_dead_letter_metrics.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/observability/test_email_health_signals.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/observability/test_export_health.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/observability/test_helm_metric_name_sync.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/observability/test_otel_attribute_contract.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/observability/test_otel_instrumentation.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/observability/test_otel_metrics.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/observability/test_otel_provider.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/observability/test_readyz.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/observability/test_request_span_attributes.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/observability/test_retention.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/observability/test_structured_logging.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/observability/test_telemetry_test_export.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/profiles/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/profiles/test_auth_user_email_upper_index.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/profiles/test_hideable_views_contract.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/profiles/test_landing_resolution.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/profiles/test_profile_api.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/profiles/test_user_pins.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/files/README.md +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/files/risks_cp1252.csv +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/files/risks_utf16_bom.csv +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/files/risks_utf16_no_bom.csv +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/files/risks_utf8.csv +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/sample_sections.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_assignee_allocation.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_atlas_content_depth.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_atlas_demo.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_atlas_full_model_coverage.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_attachments_blockers_risk_notes.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_aurora_pivot.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_bayside_helios_constraints.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_creation_history_backdate.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_dead_keys_now_land.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_declared_keys_are_implemented.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_endpoints.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_export_email_redaction.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_exporter.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_exporter_v2.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_fixture_drift.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_import_replace_and_async.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_import_seed_command.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_importer.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_load_sample_throttle.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_prepare_sample_for_user.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_reanchor.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_reldates.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_replay.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_sample_collaboration_layer.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_sample_content.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_sample_download.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_sample_forecast_history.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_sample_history.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_seed_v21.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_seed_v21_depth.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/seed/test_validation.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_acceptance_result_ingest.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_actual_dates.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_amend.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_api_token_auth.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_api_token_scopes.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_asset_feed.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_attachment_policy.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_attachment_throttle.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_audit_log.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_backfill_in_progress_status.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_backlog.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_baselines.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_batch_operations_undo.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_blocker_notification.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_blocker_privacy.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_blocker_rollup_filters.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_board_activity.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_board_config.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_board_lanes.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_board_saved_views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_board_signals.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_board_status_lanes.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_bodyless_write_refusals.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_bulk_settings.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_bulk_update_ownership.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_burn.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_calendar_inheritance.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_commit_moment.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_committed_manager.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_config_change_notice.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_config_notice_outbox.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_create_demo_share_link.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_decisions.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_demo_readonly_posture.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_duration_change_percent_policy.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_duration_unit.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_estimation_governance.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_estimation_scale.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_external_link_summary.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_flow_analytics.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_guardrail_policy_source.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_guardrails.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_health_summary.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_heatmap.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_integrations_summary.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_iteration_label.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_iteration_label_inheritance.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_labels.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_lifecycle.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_me_active_sprints.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_me_recent_projects_view.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_me_search_view.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_me_work_grouping.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_me_work_signals.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_me_work_view.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_methodology.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_methodology_cascade.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_milestone_coupling.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_milestone_forecast_notify.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_milestone_reforecast.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_milestone_rollup.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_models.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_next_root_wbs_path_locks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_non_object_body_rejected.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_overview.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_perf_n_plus_one.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_personal_access_tokens.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_phase_rollup_locks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_planned_start_floor.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_poker.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_presence_access.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_product_backlog.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_program_api_tokens.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_program_ceremonies.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_program_defaults_seed.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_program_export_async.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_program_label_view.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_program_mention_reach.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_program_resource_contention.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_program_risk_policy.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_program_rollup.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_program_rollup_config.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_program_rollup_seed.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_program_schedule.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_program_search.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_program_task_search.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_programs.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_progress_gate.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_project_detail_demo_fields.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_project_export_async.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_project_lead.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_project_lifecycle.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_project_my_role.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_project_purge.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_project_server_date.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_project_span_write_boundary.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_project_update_permissions.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_project_visit_api.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_queue_reorder.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_recalc_gating.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_recurring_tasks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_refusal_vocabulary_contract.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_remaining_points.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_reorder_bulk.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_reschedule_notifications.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_resource_allocation.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_retro_board.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_retro_promote.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_risk_baseline_comment_webhook_events.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_risk_import.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_risk_import_encoding.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_risk_mitigation_due_date.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_risk_signals.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_risks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_rollup_engine.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_schedule_fetch_pagination.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_scheduler_input_validation.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_schema_migrations.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_scope_injection_approve_gate.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_seed_capacity.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_seed_integration_fixtures.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_serializer_validation_units.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_serverver_index_concurrent.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_services_units.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_settings_template.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_share_schedule.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_sharing_inheritance.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_short_hex_ids.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_signal_privacy.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_signal_privacy_ratification.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_signal_send_robust.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_slip_conflict.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_sprint_burndown.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_sprint_burndown_task.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_sprint_carry_over_status.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_sprint_close_carryover_notify.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_sprint_close_dedupe.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_sprint_close_drain.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_sprint_close_failed_broadcast.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_sprint_close_purge.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_sprint_close_retry.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_sprint_forecast.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_sprint_generate.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_sprint_health.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_sprint_membership_notify.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_sprint_milestone_promote.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_sprint_models.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_sprint_picker_settings.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_sprint_reforecast_preview.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_sprint_retro.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_sprint_velocity.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_sprint_views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_sprint_webhook_events.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_standup.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_status_summary.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_structural_undo.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_structure_declaration_on_bulk_writes.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_structure_role.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_subtasks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_summary_tasks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_surface_visibility.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_sync_conflict.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_assignee_membership.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_bulk_deferred_wbs_conflict.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_bulk_sprint_sovereignty.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_capabilities.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_classification_cascade.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_classification_methodology_defaults.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_collaboration.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_create_contract_fidelity.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_custom_field_values.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_date_filter.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_delete_untouched_seeded.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_disclosure_signals.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_entry_stamps.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_estimate_ordering_constraint.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_governance_fields.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_group_ungroup.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_id_in_filter.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_list_pagination_count.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_mine_filter.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_notes.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_owners_field.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_patch_conformance.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_placement_and_estimate_authority.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_planned_start.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_relations.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_resize_finish.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_restore.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_restore_wbs_collision.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_search.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_seed_provenance.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_spi.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_stalled.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_status.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_trash.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_updated_delta.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_wbs_auto_assign.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_task_webhook_events.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_tech_debt_type.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_template_divergence.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_token_management_is_session_only.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_trash_restore.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_units_override_capacity.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_utilization.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_visit_throttle.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_wave3_schedule.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_wbs_path_duplicate_repair.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_wbs_path_root_offset.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_workflow_settings.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/projects/test_writable_fk_bola.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/resources/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/resources/test_org_resources.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/resources/test_resource_assignments.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/resources/test_resource_deactivation_cascade.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/resources/test_resource_pool.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/resources/test_task_owner_write_batching.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/resources/test_task_resource_views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_auto_schedule.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_calendar_exceptions.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_cascade_chain.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_celery_hardening.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_children_map.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_cpm_output_cleared_on_exit.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_cpm_zero_float_writeback.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_driving_edges.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_engine_telemetry.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_failed_task_actions.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_failed_task_filters.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_forecast_diagnostic.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_forecast_history_config.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_forecast_snapshot.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_forecast_staleness.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_graph_guard.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_milestone_invariant.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_monte_carlo.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_monte_carlo_distribution.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_monte_carlo_history.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_monte_carlo_latest.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_monte_carlo_status_date.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_monte_carlo_summary_expansion.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_monte_carlo_velocity.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_monte_carlo_whatif.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_outbox.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_program_dispatch.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_project_end_date_shift_notify.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_recalc_settle_empty.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_risk_premium.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_sched_graph.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_schedule_shift_emit.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_schedule_shift_events.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_soft_deleted_dependency.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_status_date_floor_arming.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_summary_duration_field_contract.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_summary_rollup.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_unit_seam.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_velocity_suggestion_model.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_velocity_suggestion_service.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/scheduling/test_velocity_suggestion_views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sso/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sso/conftest.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sso/test_account_linked_email.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sso/test_flow_views.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sso/test_migration_wiring.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sso/test_provider_admin_is_session_only.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sso/test_provider_api.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sso/test_provider_audit.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sso/test_redirect_uri_view.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sso/test_seed_sso_keycloak.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sync/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sync/test_broadcast.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sync/test_broadcast_payload_shape.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sync/test_consumers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sync/test_program_sync_cursor.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sync/test_program_sync_pull.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sync/test_purge_board_events.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sync/test_reap_domain_tombstones.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sync/test_serializer_validators.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sync/test_sync_concurrency.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sync/test_sync_pull.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sync/test_sync_sequence.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sync/test_sync_upload.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sync/test_upload_throttle.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sync/test_ws_ticket.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sync/ws_event_scan.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/sync/ws_handler_waivers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/taskruns/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/taskruns/test_scheduler_runs.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/taskruns/test_taskruns.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/teams/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/teams/conftest.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/teams/test_teams_api.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/teams/test_teams_services.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/test_importer_percent_scale.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/timetracking/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/timetracking/test_can_log_time_and_sync.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/timetracking/test_me_time_entries.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/timetracking/test_time_entries.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/timetracking/test_time_log_on_phase.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/timetracking/test_timer.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/timetracking/test_timesheet_submission.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/webhooks/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/webhooks/test_program_webhooks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/webhooks/test_webhook_drain.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/webhooks/test_webhook_format.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/webhooks/test_webhook_purge.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/webhooks/test_webhook_reliability.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/webhooks/test_webhook_sequence.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/webhooks/test_webhook_ssrf.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/webhooks/test_webhooks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/workflow_engine/test_workflow_engine.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/workspace/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/workspace/test_audit_log.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/workspace/test_fiscal_migration.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/workspace/test_groups_cascade.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/workspace/test_invites_api.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/workspace/test_lifecycle_api.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/workspace/test_logo_api.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/workspace/test_members_api.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/workspace/test_owner_guard.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/apps/workspace/test_settings_api.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/core/__init__.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/core/test_capacity_harness.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/core/test_constant_time.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/core/test_csp.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/core/test_db_increment_returning.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/core/test_db_session_jit.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/core/test_django_admin_hardening.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/core/test_extension_signals.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/core/test_ratelimit.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/core/test_refresh_cookie_policy.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/core/test_request_body.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/core/test_request_hardening.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/core/test_uuid_exception_handler.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/on_commit.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_action_permission_chain.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_action_schema_contract.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_action_schema_coverage.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_allowed_hosts_check.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_attachment_media_root.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_capture_on_commit_callbacks.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_celery_beat_registration.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_conflict_response_schema_contract.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_constant_time_compare_sites.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_dev_settings_guard.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_dev_settings_test_db.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_email_settings.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_enqueue_dedupe_policy.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_env_namespace.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_extend_schema_placement.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_extension_providers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_get_or_create_uniqueness.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_idempotent.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_integration_encryption_key_check.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_openapi_contract.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_openapi_docs_ui.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_openapi_pagination_envelope.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_openapi_response_conformance.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_openapi_route_and_envelope_vocabulary.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_password_hashers.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_permission_name_widths.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_permissions_shim.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_prod_compose_contract.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_project_soft_delete_retention_check.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_s3_round_trip.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_s3_storage_options.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_scaffold.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_secret_key_check.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_service_credentials_check.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_session_cookie_hardening.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_signing_key_check.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_socket_ban.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_storage_backend_check.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_timezone_field_validators.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_untrusted_parser_security_coverage.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_uploaded_text_decode_sites.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_valkey_sentinel.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_worker_broker_wait.py +0 -0
- {trueppm_api-0.4.0b2 → trueppm_api-0.4.0b4}/tests/test_worker_heartbeat.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# ---------------------------------------------------------------------------
|
|
2
2
|
# Stage 1: builder — compile dependencies into a virtual environment
|
|
3
3
|
# ---------------------------------------------------------------------------
|
|
4
|
-
FROM python:3.11-slim AS builder
|
|
4
|
+
FROM python:3.11-slim@sha256:da047cb8f9d1d98e5c070f5300ba9f7274e33b8fc0e5be5ed88740aed1b95ba9 AS builder
|
|
5
5
|
|
|
6
6
|
# `apt-get upgrade` (not just `update`) so this layer carries the Debian
|
|
7
7
|
# security team's latest point-release patches even when the upstream
|
|
@@ -58,7 +58,7 @@ RUN pip install --no-cache-dir "/build/api[${PSYCOPG_EXTRA}]"
|
|
|
58
58
|
# ---------------------------------------------------------------------------
|
|
59
59
|
# Stage 2: runtime — lean image with only what is needed to run
|
|
60
60
|
# ---------------------------------------------------------------------------
|
|
61
|
-
FROM python:3.11-slim AS runtime
|
|
61
|
+
FROM python:3.11-slim@sha256:da047cb8f9d1d98e5c070f5300ba9f7274e33b8fc0e5be5ed88740aed1b95ba9 AS runtime
|
|
62
62
|
|
|
63
63
|
# See the matching comment in the builder stage above — this is the stage that
|
|
64
64
|
# actually ships, so this `upgrade` is the one that matters for the Trivy gate.
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: trueppm-api
|
|
3
|
+
Version: 0.4.0-beta.4
|
|
4
|
+
Summary: TruePPM Django REST API — projects, tasks, scheduling, real-time collaboration
|
|
5
|
+
Author: Kelly Hair
|
|
6
|
+
License-Expression: Apache-2.0
|
|
7
|
+
Requires-Python: >=3.11
|
|
8
|
+
Requires-Dist: boto3<2.0,>=1.35
|
|
9
|
+
Requires-Dist: celery<6.0,>=5.6
|
|
10
|
+
Requires-Dist: channels-redis<5.0,>=4.0
|
|
11
|
+
Requires-Dist: channels<5.0,>=4.0
|
|
12
|
+
Requires-Dist: cryptography<51,>=50.0.0
|
|
13
|
+
Requires-Dist: defusedxml<0.8,>=0.7
|
|
14
|
+
Requires-Dist: django-allauth<66.0,>=65.18.0
|
|
15
|
+
Requires-Dist: django-environ<1.0,>=0.11
|
|
16
|
+
Requires-Dist: django-simple-history<4.0,>=3.7
|
|
17
|
+
Requires-Dist: django-storages<2.0,>=1.14.6
|
|
18
|
+
Requires-Dist: django<6.0,>=5.2.17
|
|
19
|
+
Requires-Dist: djangorestframework-simplejwt<6.0,>=5.3
|
|
20
|
+
Requires-Dist: djangorestframework<3.18,>=3.17.2
|
|
21
|
+
Requires-Dist: dnspython<3.0,>=2.8.0
|
|
22
|
+
Requires-Dist: drf-spectacular[sidecar]==0.30.0
|
|
23
|
+
Requires-Dist: jsonschema<5.0,>=4.21
|
|
24
|
+
Requires-Dist: msgpack<2.0,>=1.2.1
|
|
25
|
+
Requires-Dist: openpyxl<4.0,>=3.1
|
|
26
|
+
Requires-Dist: opentelemetry-exporter-otlp<2,>=1.43
|
|
27
|
+
Requires-Dist: opentelemetry-instrumentation-asgi<1,>=0.64b0
|
|
28
|
+
Requires-Dist: opentelemetry-instrumentation-celery<1,>=0.64b0
|
|
29
|
+
Requires-Dist: opentelemetry-instrumentation-django<1,>=0.64b0
|
|
30
|
+
Requires-Dist: opentelemetry-instrumentation-psycopg<1,>=0.64b0
|
|
31
|
+
Requires-Dist: opentelemetry-sdk<2,>=1.43
|
|
32
|
+
Requires-Dist: packaging>=24.0
|
|
33
|
+
Requires-Dist: psycopg<4.0,>=3.1
|
|
34
|
+
Requires-Dist: pyjwt[crypto]<3.0,>=2.10
|
|
35
|
+
Requires-Dist: python-json-logger<3.0,>=2.0
|
|
36
|
+
Requires-Dist: redis<6.5,>=6.4
|
|
37
|
+
Requires-Dist: trueppm-scheduler<1,>=0.1.0a0
|
|
38
|
+
Requires-Dist: uvicorn[standard]<1.0,>=0.29
|
|
39
|
+
Requires-Dist: whitenoise<7.0,>=6.0
|
|
40
|
+
Provides-Extra: binary
|
|
41
|
+
Requires-Dist: psycopg[binary]<4.0,>=3.1; extra == 'binary'
|
|
42
|
+
Provides-Extra: c
|
|
43
|
+
Requires-Dist: psycopg[c]<4.0,>=3.1; extra == 'c'
|
|
44
|
+
Provides-Extra: dev
|
|
45
|
+
Requires-Dist: diff-cover<10.0,>=9.0; extra == 'dev'
|
|
46
|
+
Requires-Dist: django-stubs[compatible-mypy]==6.1.0; extra == 'dev'
|
|
47
|
+
Requires-Dist: djangorestframework-stubs[compatible-mypy]==3.18.1; extra == 'dev'
|
|
48
|
+
Requires-Dist: mypy==1.20.2; extra == 'dev'
|
|
49
|
+
Requires-Dist: psycopg[binary]<4.0,>=3.1; extra == 'dev'
|
|
50
|
+
Requires-Dist: pytest-asyncio<2.0,>=0.23; extra == 'dev'
|
|
51
|
+
Requires-Dist: pytest-cov<8.0,>=4.0; extra == 'dev'
|
|
52
|
+
Requires-Dist: pytest-django<5.0,>=4.8; extra == 'dev'
|
|
53
|
+
Requires-Dist: pytest-socket<1.0,>=0.8; extra == 'dev'
|
|
54
|
+
Requires-Dist: pytest-split<1.0,>=0.9; extra == 'dev'
|
|
55
|
+
Requires-Dist: pytest-timeout<3.0,>=2.4; extra == 'dev'
|
|
56
|
+
Requires-Dist: pytest-xdist<4.0,>=3.6; extra == 'dev'
|
|
57
|
+
Requires-Dist: pytest<10.0,>=8.0; extra == 'dev'
|
|
58
|
+
Requires-Dist: ruff<1.0,>=0.8; extra == 'dev'
|
|
59
|
+
Requires-Dist: testcontainers[postgres]<5.0,>=4.7; extra == 'dev'
|
|
60
|
+
Provides-Extra: fuzz
|
|
61
|
+
Requires-Dist: schemathesis<5.0,>=4.0; extra == 'fuzz'
|
|
62
|
+
Description-Content-Type: text/markdown
|
|
63
|
+
|
|
64
|
+
# trueppm-api
|
|
65
|
+
|
|
66
|
+
[](https://pypi.org/project/trueppm-api/)
|
|
67
|
+
[](https://pypi.org/project/trueppm-api/)
|
|
68
|
+
[](https://gitlab.com/trueppm/trueppm/-/pipelines)
|
|
69
|
+
[](https://www.apache.org/licenses/LICENSE-2.0)
|
|
70
|
+
|
|
71
|
+
Django REST + WebSocket backend for [TruePPM](https://trueppm.com) — projects, tasks,
|
|
72
|
+
critical-path scheduling, agile boards and sprints, offline sync, and real-time
|
|
73
|
+
collaboration.
|
|
74
|
+
|
|
75
|
+
## Is this package for you?
|
|
76
|
+
|
|
77
|
+
Most people should **not** `pip install` this directly. If you want to run TruePPM,
|
|
78
|
+
start from the [quickstart guide](https://docs.trueppm.com/getting-started/quickstart/)
|
|
79
|
+
(`docker compose up`) or the [Helm chart](https://gitlab.com/trueppm/trueppm/-/tree/main/packages/helm) —
|
|
80
|
+
both wire up PostgreSQL, Valkey, the web frontend, and a Celery worker for you.
|
|
81
|
+
|
|
82
|
+
This package exists on PyPI for two narrower audiences:
|
|
83
|
+
|
|
84
|
+
- **Downstream projects that depend on the OSS backend as a library** — most notably
|
|
85
|
+
[TruePPM Enterprise](https://trueppm.com) (proprietary, separate repo), which pins an
|
|
86
|
+
exact `trueppm-api` release instead of a git submodule or path dependency. See
|
|
87
|
+
[Using this as a dependency](#using-this-as-a-dependency).
|
|
88
|
+
- **Operators who want to run the API standalone** — against Postgres/Valkey you
|
|
89
|
+
already manage, without Docker Compose or the bundled frontend. See
|
|
90
|
+
[Standalone quickstart](#standalone-quickstart).
|
|
91
|
+
|
|
92
|
+
If neither of those is you, the linked quickstart is a better starting point.
|
|
93
|
+
|
|
94
|
+
## Requirements
|
|
95
|
+
|
|
96
|
+
- **Python 3.11+**
|
|
97
|
+
- **PostgreSQL 16+**, with the `ltree`, `pg_trgm`, and `btree_gist` extensions
|
|
98
|
+
installable by the connecting role (migrations run `CREATE EXTENSION IF NOT EXISTS`
|
|
99
|
+
for each — the role needs `CREATEDB`/superuser on a fresh database, or ask your DBA
|
|
100
|
+
to pre-create the extensions)
|
|
101
|
+
- **Valkey 8+** (or Redis 7+, wire-compatible) — backs the WebSocket channel layer and
|
|
102
|
+
the Celery broker/result backend
|
|
103
|
+
- **A Celery worker**, if you want anything that runs off the request/response cycle:
|
|
104
|
+
async schedule recalculation, notifications, MS Project/Jira/CSV import jobs. The
|
|
105
|
+
API serves reads and writes without one, but background jobs will queue and never run.
|
|
106
|
+
- **S3-compatible object storage**, in production only, for task attachments. Local
|
|
107
|
+
disk storage is the dev default and is explicitly refused at boot in
|
|
108
|
+
`trueppm_api.settings.prod` unless you opt in (fine for local/single-node
|
|
109
|
+
evaluation, not for anything you intend to keep).
|
|
110
|
+
|
|
111
|
+
## Install
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
# Development — precompiled psycopg wheel, no compiler or system libpq needed
|
|
115
|
+
pip install "trueppm-api[binary]"
|
|
116
|
+
|
|
117
|
+
# Production — links against the system libpq, so OS security patches reach
|
|
118
|
+
# the driver without a new release of this package
|
|
119
|
+
pip install "trueppm-api[c]"
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Extras:
|
|
123
|
+
|
|
124
|
+
| Extra | Use it for |
|
|
125
|
+
|---|---|
|
|
126
|
+
| `binary` | Local dev / quick-start psycopg (precompiled wheel, bundles its own libpq) |
|
|
127
|
+
| `c` | Production psycopg (compiled against the system libpq) |
|
|
128
|
+
| `dev` | Test tooling (pytest, mypy, ruff, testcontainers) — installed from a source checkout, not by consumers |
|
|
129
|
+
| `fuzz` | Schemathesis, for OpenAPI-schema-driven fuzz testing — installed from a source checkout, not by consumers |
|
|
130
|
+
|
|
131
|
+
Pick one of `binary`/`c`. The base install already pulls plain `psycopg`, whose
|
|
132
|
+
pure-Python core binds to `libpq` via `ctypes` at runtime — that only works if a
|
|
133
|
+
system `libpq` is already installed and discoverable, so `binary` (bundles its
|
|
134
|
+
own) or `c` (links the one you installed) is the reliable path.
|
|
135
|
+
|
|
136
|
+
## Standalone quickstart
|
|
137
|
+
|
|
138
|
+
This runs the API by itself against Postgres/Valkey instances you already have —
|
|
139
|
+
no Docker Compose, no frontend. Five minutes if those two services are already up.
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
pip install "trueppm-api[binary]"
|
|
143
|
+
|
|
144
|
+
export DJANGO_SETTINGS_MODULE=trueppm_api.settings.dev
|
|
145
|
+
export TRUEPPM_ALLOW_DEV_SETTINGS=1 # dev settings refuse to import without this
|
|
146
|
+
export SECRET_KEY="$(python3 -c 'import secrets; print(secrets.token_urlsafe(48))')"
|
|
147
|
+
export DATABASE_URL="postgres://trueppm:trueppm@localhost:5432/trueppm"
|
|
148
|
+
export REDIS_URL="redis://localhost:6379"
|
|
149
|
+
|
|
150
|
+
django-admin migrate
|
|
151
|
+
django-admin createsuperuser
|
|
152
|
+
django-admin runserver 0.0.0.0:8000
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Then:
|
|
156
|
+
|
|
157
|
+
- `http://localhost:8000/api/v1/health/` — liveness check, no auth
|
|
158
|
+
- `http://localhost:8000/api/docs/` — interactive Swagger UI (served from `[sidecar]`
|
|
159
|
+
static assets, so it works offline / behind a strict CSP)
|
|
160
|
+
- `http://localhost:8000/admin/` — Django admin, using the superuser you just created
|
|
161
|
+
|
|
162
|
+
`trueppm_api.settings.dev` hardcodes `ALLOWED_HOSTS = ["*"]` and open (`AllowAny`)
|
|
163
|
+
API permissions, so it refuses to even import without `TRUEPPM_ALLOW_DEV_SETTINGS=1`
|
|
164
|
+
set (or a test runner active) — that guard is what the env var above satisfies.
|
|
165
|
+
**Do not use it past localhost.** For anything reachable over a network, switch to
|
|
166
|
+
`trueppm_api.settings.prod`, which enforces `ALLOWED_HOSTS`, a real `SECRET_KEY`,
|
|
167
|
+
and durable attachment storage at import time — it refuses to boot rather than
|
|
168
|
+
silently run insecure. `manage.py` (the entry point the full repo uses) is a thin
|
|
169
|
+
wrapper around `django-admin` that defaults `DJANGO_SETTINGS_MODULE` to
|
|
170
|
+
`trueppm_api.settings.dev`; installed via pip you use `django-admin` directly, as
|
|
171
|
+
above, and set the setting explicitly.
|
|
172
|
+
|
|
173
|
+
For the full experience — the React frontend, a Celery worker, WebSocket
|
|
174
|
+
broadcasts, seeded demo data — use the [Docker Compose
|
|
175
|
+
quickstart](https://docs.trueppm.com/getting-started/quickstart/) instead; it
|
|
176
|
+
runs this same package, wired up for you.
|
|
177
|
+
|
|
178
|
+
Every environment variable this package reads, including production-only ones
|
|
179
|
+
(object storage, OIDC single sign-on, OpenTelemetry, rate limits) is documented at
|
|
180
|
+
**[docs.trueppm.com/administration/configuration](https://docs.trueppm.com/administration/configuration/)**.
|
|
181
|
+
`SECRET_KEY`, `DATABASE_URL`, and `REDIS_URL` above are the only three with no safe
|
|
182
|
+
default outside of `trueppm_api.settings.dev`.
|
|
183
|
+
|
|
184
|
+
## Using this as a dependency
|
|
185
|
+
|
|
186
|
+
Pin an exact release the same way you'd pin any other PyPI package:
|
|
187
|
+
|
|
188
|
+
```toml
|
|
189
|
+
# pyproject.toml
|
|
190
|
+
[project]
|
|
191
|
+
dependencies = [
|
|
192
|
+
"trueppm-api==0.4.0b4",
|
|
193
|
+
]
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
pip install "trueppm-api[c]==0.4.0b4"
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
`import trueppm_api; trueppm_api.__version__` reflects the installed distribution
|
|
201
|
+
version (read from package metadata, not a hand-maintained string), so it always
|
|
202
|
+
agrees with `pip show trueppm-api`.
|
|
203
|
+
|
|
204
|
+
`trueppm_api.settings.base` is written to be extended: a downstream project's own
|
|
205
|
+
settings module can do `from trueppm_api.settings.base import *` and layer
|
|
206
|
+
additional `INSTALLED_APPS`, middleware, or DRF settings on top, the same pattern
|
|
207
|
+
`trueppm_api.settings.prod` itself uses. This is how TruePPM Enterprise adds its
|
|
208
|
+
portfolio-governance apps without forking the OSS backend.
|
|
209
|
+
|
|
210
|
+
## Versioning and releases
|
|
211
|
+
|
|
212
|
+
**The version number tracks the whole TruePPM platform release, not this package
|
|
213
|
+
independently.** `0.4.0b4` on PyPI corresponds to git tag `v0.4.0-beta.4` in the
|
|
214
|
+
[trueppm-suite](https://gitlab.com/trueppm/trueppm) monorepo — the same release
|
|
215
|
+
that produced the `api`/`web` Docker images and the Helm chart at that version.
|
|
216
|
+
There is no separate changelog or release cadence for `trueppm-api` alone; see the
|
|
217
|
+
[root `CHANGELOG.md`](https://gitlab.com/trueppm/trueppm/-/blob/main/CHANGELOG.md)
|
|
218
|
+
for what changed in any given release.
|
|
219
|
+
|
|
220
|
+
Every `v*` tag publishes this package to PyPI automatically (CI job
|
|
221
|
+
`api:publish:pypi`), alongside the Docker images and the Helm chart. `@trueppm/web`
|
|
222
|
+
on npm is wired to the same tag (`web:publish:npm`) but is not live yet — see the
|
|
223
|
+
[root README's Published artifacts table](https://gitlab.com/trueppm/trueppm#published-artifacts)
|
|
224
|
+
for current status. As of #3943, this job authenticates via **PyPI Trusted
|
|
225
|
+
Publishing** (GitLab OIDC) and signs [PEP 740](https://peps.python.org/pep-0740/)
|
|
226
|
+
attestations, the same as `trueppm-scheduler` and `trueppm-mcp` — there is no
|
|
227
|
+
static upload token on the publish path. That release job is unproven until
|
|
228
|
+
the next `v*` tag, so versions through `0.4.0-beta.3` predate it and were
|
|
229
|
+
published with a static token, with no attestation. Pre-release versions (`aN`/`bN`/`rcN`) are real
|
|
230
|
+
releases of whatever that tag shipped, not throwaway snapshots — TruePPM is
|
|
231
|
+
pre-1.0 and ships its entire release line as alphas/betas/RCs, per
|
|
232
|
+
[SECURITY.md](https://gitlab.com/trueppm/trueppm/-/blob/main/SECURITY.md).
|
|
233
|
+
|
|
234
|
+
Before 1.0, breaking changes to this package's Python API (settings shape, model
|
|
235
|
+
fields, management commands) can happen between releases without a deprecation
|
|
236
|
+
window — the published contract that *is* stable pre-1.0 is the HTTP/WebSocket API
|
|
237
|
+
surface, documented at
|
|
238
|
+
[docs.trueppm.com/api/stability](https://docs.trueppm.com/api/stability/). If
|
|
239
|
+
you're pinning this package as a library dependency rather than talking to a
|
|
240
|
+
running instance over HTTP, expect to read the changelog on every bump.
|
|
241
|
+
|
|
242
|
+
## Documentation
|
|
243
|
+
|
|
244
|
+
- **Full docs**: [docs.trueppm.com](https://docs.trueppm.com)
|
|
245
|
+
- **API reference**: [docs.trueppm.com/api/reference](https://docs.trueppm.com/api/reference/)
|
|
246
|
+
- **Configuration reference**: [docs.trueppm.com/administration/configuration](https://docs.trueppm.com/administration/configuration/)
|
|
247
|
+
- **Source / issues**: [gitlab.com/trueppm/trueppm](https://gitlab.com/trueppm/trueppm)
|
|
248
|
+
|
|
249
|
+
## Tests
|
|
250
|
+
|
|
251
|
+
From a source checkout:
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
cd packages/api
|
|
255
|
+
pip install -e ".[binary,dev]"
|
|
256
|
+
pytest
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
Most tests need a real PostgreSQL (for `ltree`/`pg_trgm` queries) — the repo's
|
|
260
|
+
`docker compose up` provides one; `testcontainers[postgres]` (a `dev` extra) can
|
|
261
|
+
also spin one up ephemerally.
|
|
262
|
+
|
|
263
|
+
## License
|
|
264
|
+
|
|
265
|
+
Apache 2.0 — see [LICENSE](https://gitlab.com/trueppm/trueppm/-/blob/main/LICENSE).
|
|
266
|
+
Copyright MacroDream, LLC and contributors — see
|
|
267
|
+
[NOTICE](https://gitlab.com/trueppm/trueppm/-/blob/main/NOTICE).
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
# trueppm-api
|
|
2
|
+
|
|
3
|
+
[](https://pypi.org/project/trueppm-api/)
|
|
4
|
+
[](https://pypi.org/project/trueppm-api/)
|
|
5
|
+
[](https://gitlab.com/trueppm/trueppm/-/pipelines)
|
|
6
|
+
[](https://www.apache.org/licenses/LICENSE-2.0)
|
|
7
|
+
|
|
8
|
+
Django REST + WebSocket backend for [TruePPM](https://trueppm.com) — projects, tasks,
|
|
9
|
+
critical-path scheduling, agile boards and sprints, offline sync, and real-time
|
|
10
|
+
collaboration.
|
|
11
|
+
|
|
12
|
+
## Is this package for you?
|
|
13
|
+
|
|
14
|
+
Most people should **not** `pip install` this directly. If you want to run TruePPM,
|
|
15
|
+
start from the [quickstart guide](https://docs.trueppm.com/getting-started/quickstart/)
|
|
16
|
+
(`docker compose up`) or the [Helm chart](https://gitlab.com/trueppm/trueppm/-/tree/main/packages/helm) —
|
|
17
|
+
both wire up PostgreSQL, Valkey, the web frontend, and a Celery worker for you.
|
|
18
|
+
|
|
19
|
+
This package exists on PyPI for two narrower audiences:
|
|
20
|
+
|
|
21
|
+
- **Downstream projects that depend on the OSS backend as a library** — most notably
|
|
22
|
+
[TruePPM Enterprise](https://trueppm.com) (proprietary, separate repo), which pins an
|
|
23
|
+
exact `trueppm-api` release instead of a git submodule or path dependency. See
|
|
24
|
+
[Using this as a dependency](#using-this-as-a-dependency).
|
|
25
|
+
- **Operators who want to run the API standalone** — against Postgres/Valkey you
|
|
26
|
+
already manage, without Docker Compose or the bundled frontend. See
|
|
27
|
+
[Standalone quickstart](#standalone-quickstart).
|
|
28
|
+
|
|
29
|
+
If neither of those is you, the linked quickstart is a better starting point.
|
|
30
|
+
|
|
31
|
+
## Requirements
|
|
32
|
+
|
|
33
|
+
- **Python 3.11+**
|
|
34
|
+
- **PostgreSQL 16+**, with the `ltree`, `pg_trgm`, and `btree_gist` extensions
|
|
35
|
+
installable by the connecting role (migrations run `CREATE EXTENSION IF NOT EXISTS`
|
|
36
|
+
for each — the role needs `CREATEDB`/superuser on a fresh database, or ask your DBA
|
|
37
|
+
to pre-create the extensions)
|
|
38
|
+
- **Valkey 8+** (or Redis 7+, wire-compatible) — backs the WebSocket channel layer and
|
|
39
|
+
the Celery broker/result backend
|
|
40
|
+
- **A Celery worker**, if you want anything that runs off the request/response cycle:
|
|
41
|
+
async schedule recalculation, notifications, MS Project/Jira/CSV import jobs. The
|
|
42
|
+
API serves reads and writes without one, but background jobs will queue and never run.
|
|
43
|
+
- **S3-compatible object storage**, in production only, for task attachments. Local
|
|
44
|
+
disk storage is the dev default and is explicitly refused at boot in
|
|
45
|
+
`trueppm_api.settings.prod` unless you opt in (fine for local/single-node
|
|
46
|
+
evaluation, not for anything you intend to keep).
|
|
47
|
+
|
|
48
|
+
## Install
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# Development — precompiled psycopg wheel, no compiler or system libpq needed
|
|
52
|
+
pip install "trueppm-api[binary]"
|
|
53
|
+
|
|
54
|
+
# Production — links against the system libpq, so OS security patches reach
|
|
55
|
+
# the driver without a new release of this package
|
|
56
|
+
pip install "trueppm-api[c]"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Extras:
|
|
60
|
+
|
|
61
|
+
| Extra | Use it for |
|
|
62
|
+
|---|---|
|
|
63
|
+
| `binary` | Local dev / quick-start psycopg (precompiled wheel, bundles its own libpq) |
|
|
64
|
+
| `c` | Production psycopg (compiled against the system libpq) |
|
|
65
|
+
| `dev` | Test tooling (pytest, mypy, ruff, testcontainers) — installed from a source checkout, not by consumers |
|
|
66
|
+
| `fuzz` | Schemathesis, for OpenAPI-schema-driven fuzz testing — installed from a source checkout, not by consumers |
|
|
67
|
+
|
|
68
|
+
Pick one of `binary`/`c`. The base install already pulls plain `psycopg`, whose
|
|
69
|
+
pure-Python core binds to `libpq` via `ctypes` at runtime — that only works if a
|
|
70
|
+
system `libpq` is already installed and discoverable, so `binary` (bundles its
|
|
71
|
+
own) or `c` (links the one you installed) is the reliable path.
|
|
72
|
+
|
|
73
|
+
## Standalone quickstart
|
|
74
|
+
|
|
75
|
+
This runs the API by itself against Postgres/Valkey instances you already have —
|
|
76
|
+
no Docker Compose, no frontend. Five minutes if those two services are already up.
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
pip install "trueppm-api[binary]"
|
|
80
|
+
|
|
81
|
+
export DJANGO_SETTINGS_MODULE=trueppm_api.settings.dev
|
|
82
|
+
export TRUEPPM_ALLOW_DEV_SETTINGS=1 # dev settings refuse to import without this
|
|
83
|
+
export SECRET_KEY="$(python3 -c 'import secrets; print(secrets.token_urlsafe(48))')"
|
|
84
|
+
export DATABASE_URL="postgres://trueppm:trueppm@localhost:5432/trueppm"
|
|
85
|
+
export REDIS_URL="redis://localhost:6379"
|
|
86
|
+
|
|
87
|
+
django-admin migrate
|
|
88
|
+
django-admin createsuperuser
|
|
89
|
+
django-admin runserver 0.0.0.0:8000
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Then:
|
|
93
|
+
|
|
94
|
+
- `http://localhost:8000/api/v1/health/` — liveness check, no auth
|
|
95
|
+
- `http://localhost:8000/api/docs/` — interactive Swagger UI (served from `[sidecar]`
|
|
96
|
+
static assets, so it works offline / behind a strict CSP)
|
|
97
|
+
- `http://localhost:8000/admin/` — Django admin, using the superuser you just created
|
|
98
|
+
|
|
99
|
+
`trueppm_api.settings.dev` hardcodes `ALLOWED_HOSTS = ["*"]` and open (`AllowAny`)
|
|
100
|
+
API permissions, so it refuses to even import without `TRUEPPM_ALLOW_DEV_SETTINGS=1`
|
|
101
|
+
set (or a test runner active) — that guard is what the env var above satisfies.
|
|
102
|
+
**Do not use it past localhost.** For anything reachable over a network, switch to
|
|
103
|
+
`trueppm_api.settings.prod`, which enforces `ALLOWED_HOSTS`, a real `SECRET_KEY`,
|
|
104
|
+
and durable attachment storage at import time — it refuses to boot rather than
|
|
105
|
+
silently run insecure. `manage.py` (the entry point the full repo uses) is a thin
|
|
106
|
+
wrapper around `django-admin` that defaults `DJANGO_SETTINGS_MODULE` to
|
|
107
|
+
`trueppm_api.settings.dev`; installed via pip you use `django-admin` directly, as
|
|
108
|
+
above, and set the setting explicitly.
|
|
109
|
+
|
|
110
|
+
For the full experience — the React frontend, a Celery worker, WebSocket
|
|
111
|
+
broadcasts, seeded demo data — use the [Docker Compose
|
|
112
|
+
quickstart](https://docs.trueppm.com/getting-started/quickstart/) instead; it
|
|
113
|
+
runs this same package, wired up for you.
|
|
114
|
+
|
|
115
|
+
Every environment variable this package reads, including production-only ones
|
|
116
|
+
(object storage, OIDC single sign-on, OpenTelemetry, rate limits) is documented at
|
|
117
|
+
**[docs.trueppm.com/administration/configuration](https://docs.trueppm.com/administration/configuration/)**.
|
|
118
|
+
`SECRET_KEY`, `DATABASE_URL`, and `REDIS_URL` above are the only three with no safe
|
|
119
|
+
default outside of `trueppm_api.settings.dev`.
|
|
120
|
+
|
|
121
|
+
## Using this as a dependency
|
|
122
|
+
|
|
123
|
+
Pin an exact release the same way you'd pin any other PyPI package:
|
|
124
|
+
|
|
125
|
+
```toml
|
|
126
|
+
# pyproject.toml
|
|
127
|
+
[project]
|
|
128
|
+
dependencies = [
|
|
129
|
+
"trueppm-api==0.4.0b4",
|
|
130
|
+
]
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
pip install "trueppm-api[c]==0.4.0b4"
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
`import trueppm_api; trueppm_api.__version__` reflects the installed distribution
|
|
138
|
+
version (read from package metadata, not a hand-maintained string), so it always
|
|
139
|
+
agrees with `pip show trueppm-api`.
|
|
140
|
+
|
|
141
|
+
`trueppm_api.settings.base` is written to be extended: a downstream project's own
|
|
142
|
+
settings module can do `from trueppm_api.settings.base import *` and layer
|
|
143
|
+
additional `INSTALLED_APPS`, middleware, or DRF settings on top, the same pattern
|
|
144
|
+
`trueppm_api.settings.prod` itself uses. This is how TruePPM Enterprise adds its
|
|
145
|
+
portfolio-governance apps without forking the OSS backend.
|
|
146
|
+
|
|
147
|
+
## Versioning and releases
|
|
148
|
+
|
|
149
|
+
**The version number tracks the whole TruePPM platform release, not this package
|
|
150
|
+
independently.** `0.4.0b4` on PyPI corresponds to git tag `v0.4.0-beta.4` in the
|
|
151
|
+
[trueppm-suite](https://gitlab.com/trueppm/trueppm) monorepo — the same release
|
|
152
|
+
that produced the `api`/`web` Docker images and the Helm chart at that version.
|
|
153
|
+
There is no separate changelog or release cadence for `trueppm-api` alone; see the
|
|
154
|
+
[root `CHANGELOG.md`](https://gitlab.com/trueppm/trueppm/-/blob/main/CHANGELOG.md)
|
|
155
|
+
for what changed in any given release.
|
|
156
|
+
|
|
157
|
+
Every `v*` tag publishes this package to PyPI automatically (CI job
|
|
158
|
+
`api:publish:pypi`), alongside the Docker images and the Helm chart. `@trueppm/web`
|
|
159
|
+
on npm is wired to the same tag (`web:publish:npm`) but is not live yet — see the
|
|
160
|
+
[root README's Published artifacts table](https://gitlab.com/trueppm/trueppm#published-artifacts)
|
|
161
|
+
for current status. As of #3943, this job authenticates via **PyPI Trusted
|
|
162
|
+
Publishing** (GitLab OIDC) and signs [PEP 740](https://peps.python.org/pep-0740/)
|
|
163
|
+
attestations, the same as `trueppm-scheduler` and `trueppm-mcp` — there is no
|
|
164
|
+
static upload token on the publish path. That release job is unproven until
|
|
165
|
+
the next `v*` tag, so versions through `0.4.0-beta.3` predate it and were
|
|
166
|
+
published with a static token, with no attestation. Pre-release versions (`aN`/`bN`/`rcN`) are real
|
|
167
|
+
releases of whatever that tag shipped, not throwaway snapshots — TruePPM is
|
|
168
|
+
pre-1.0 and ships its entire release line as alphas/betas/RCs, per
|
|
169
|
+
[SECURITY.md](https://gitlab.com/trueppm/trueppm/-/blob/main/SECURITY.md).
|
|
170
|
+
|
|
171
|
+
Before 1.0, breaking changes to this package's Python API (settings shape, model
|
|
172
|
+
fields, management commands) can happen between releases without a deprecation
|
|
173
|
+
window — the published contract that *is* stable pre-1.0 is the HTTP/WebSocket API
|
|
174
|
+
surface, documented at
|
|
175
|
+
[docs.trueppm.com/api/stability](https://docs.trueppm.com/api/stability/). If
|
|
176
|
+
you're pinning this package as a library dependency rather than talking to a
|
|
177
|
+
running instance over HTTP, expect to read the changelog on every bump.
|
|
178
|
+
|
|
179
|
+
## Documentation
|
|
180
|
+
|
|
181
|
+
- **Full docs**: [docs.trueppm.com](https://docs.trueppm.com)
|
|
182
|
+
- **API reference**: [docs.trueppm.com/api/reference](https://docs.trueppm.com/api/reference/)
|
|
183
|
+
- **Configuration reference**: [docs.trueppm.com/administration/configuration](https://docs.trueppm.com/administration/configuration/)
|
|
184
|
+
- **Source / issues**: [gitlab.com/trueppm/trueppm](https://gitlab.com/trueppm/trueppm)
|
|
185
|
+
|
|
186
|
+
## Tests
|
|
187
|
+
|
|
188
|
+
From a source checkout:
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
cd packages/api
|
|
192
|
+
pip install -e ".[binary,dev]"
|
|
193
|
+
pytest
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Most tests need a real PostgreSQL (for `ltree`/`pg_trgm` queries) — the repo's
|
|
197
|
+
`docker compose up` provides one; `testcontainers[postgres]` (a `dev` extra) can
|
|
198
|
+
also spin one up ephemerally.
|
|
199
|
+
|
|
200
|
+
## License
|
|
201
|
+
|
|
202
|
+
Apache 2.0 — see [LICENSE](https://gitlab.com/trueppm/trueppm/-/blob/main/LICENSE).
|
|
203
|
+
Copyright MacroDream, LLC and contributors — see
|
|
204
|
+
[NOTICE](https://gitlab.com/trueppm/trueppm/-/blob/main/NOTICE).
|
|
@@ -19,7 +19,7 @@ name: trueppm-capacity
|
|
|
19
19
|
|
|
20
20
|
services:
|
|
21
21
|
db:
|
|
22
|
-
image: postgres:16-alpine
|
|
22
|
+
image: postgres:16-alpine@sha256:721873c34ceb9f8d8fc265984940dc982404c105f19ad51be9fdc5970a6080ea
|
|
23
23
|
environment:
|
|
24
24
|
POSTGRES_DB: trueppm
|
|
25
25
|
POSTGRES_USER: trueppm
|
|
@@ -45,7 +45,7 @@ services:
|
|
|
45
45
|
retries: 10
|
|
46
46
|
|
|
47
47
|
valkey:
|
|
48
|
-
image: valkey/valkey:8-alpine
|
|
48
|
+
image: valkey/valkey:8-alpine@sha256:081c2f5cb575efc901aa80ff9cdbd1ec6a301682fd35e1ebb4b0990a4a4a8507
|
|
49
49
|
healthcheck:
|
|
50
50
|
test: ["CMD", "valkey-cli", "ping"]
|
|
51
51
|
interval: 5s
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "trueppm-api"
|
|
7
|
-
version = "0.4.0-beta.
|
|
7
|
+
version = "0.4.0-beta.4"
|
|
8
8
|
description = "TruePPM Django REST API — projects, tasks, scheduling, real-time collaboration"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "Apache-2.0"
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""TruePPM Django REST API."""
|
|
2
|
+
|
|
3
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
4
|
+
|
|
5
|
+
# Loading the Celery app here is the standard Django+Celery integration:
|
|
6
|
+
# it forces ``app.set_default()`` at Django startup so ``shared_task.delay()``
|
|
7
|
+
# resolves to the configured trueppm_api app rather than an unconfigured
|
|
8
|
+
# default Celery instance with ``broker_url=None``. Without this,
|
|
9
|
+
# ``recalculate_schedule.delay()`` (and every other shared_task) raises
|
|
10
|
+
# ``OperationalError: Connection refused`` and the outbox row is silently
|
|
11
|
+
# left in PENDING — which is exactly what produced the cascade-not-firing
|
|
12
|
+
# regression in #314.
|
|
13
|
+
from .celery import app as celery_app
|
|
14
|
+
|
|
15
|
+
__all__ = ("celery_app",)
|
|
16
|
+
|
|
17
|
+
try:
|
|
18
|
+
# Read from installed distribution metadata rather than a hard-coded
|
|
19
|
+
# literal, so this can't drift from pyproject.toml the way it silently
|
|
20
|
+
# had (frozen at "0.1.0" while the package shipped 0.4.0-beta.3) — nothing
|
|
21
|
+
# in-tree reads __version__, so nothing caught it; an external consumer
|
|
22
|
+
# (e.g. trueppm-enterprise pinning this package) doing
|
|
23
|
+
# `import trueppm_api; trueppm_api.__version__` is the one this protects.
|
|
24
|
+
__version__ = version("trueppm-api")
|
|
25
|
+
except PackageNotFoundError:
|
|
26
|
+
# Source checkout that was never `pip install -e`'d has no metadata to read.
|
|
27
|
+
__version__ = "0.0.0.dev0"
|
|
@@ -12,6 +12,19 @@ reset. That is intended (it is how an operator recovers an install whose only
|
|
|
12
12
|
superuser was demoted), but it is a privilege grant, so it is announced on stdout
|
|
13
13
|
rather than reported as an ordinary create (#3175).
|
|
14
14
|
|
|
15
|
+
Concurrency
|
|
16
|
+
-----------
|
|
17
|
+
The Helm chart runs this as a **per-pod** ``bootstrap`` init container, so at
|
|
18
|
+
``replicaCount >= 2`` several pods run it against one database at once. Without
|
|
19
|
+
arbitration, every pod passes the "no superuser" check before any of them
|
|
20
|
+
commits, each mints its own password and writes it to its own pod-local file,
|
|
21
|
+
and the last ``save()`` wins — leaving the other pods holding a password that
|
|
22
|
+
does not work, with nothing to tell the operator which file is real (#4039).
|
|
23
|
+
The check-and-create therefore runs under a transaction-scoped PostgreSQL
|
|
24
|
+
advisory lock: the first pod creates the admin, the others block until it
|
|
25
|
+
commits and then see the superuser and skip. Exactly one pod ever holds the
|
|
26
|
+
password file.
|
|
27
|
+
|
|
15
28
|
Credential delivery
|
|
16
29
|
-------------------
|
|
17
30
|
The password is written to a file (default ``/tmp/trueppm_admin_password``)
|
|
@@ -50,6 +63,7 @@ import secrets
|
|
|
50
63
|
|
|
51
64
|
from django.contrib.auth import get_user_model
|
|
52
65
|
from django.core.management.base import BaseCommand
|
|
66
|
+
from django.db import connection, transaction
|
|
53
67
|
|
|
54
68
|
logger = logging.getLogger(__name__)
|
|
55
69
|
|
|
@@ -59,6 +73,12 @@ _PASSWORD_FILE = os.environ.get( # nosec B108
|
|
|
59
73
|
"TRUEPPM_ADMIN_PASSWORD_FILE", "/tmp/trueppm_admin_password"
|
|
60
74
|
)
|
|
61
75
|
|
|
76
|
+
#: Fixed advisory-lock key for the bootstrap, distinct from
|
|
77
|
+
#: ``migrate_locked.MIGRATION_ADVISORY_LOCK_KEY``. Every pod must use the same
|
|
78
|
+
#: literal or the lock arbitrates nothing; not derived from ``hash()``, which is
|
|
79
|
+
#: salted per process.
|
|
80
|
+
BOOTSTRAP_ADVISORY_LOCK_KEY = 4_113_188_002
|
|
81
|
+
|
|
62
82
|
|
|
63
83
|
class Command(BaseCommand):
|
|
64
84
|
"""Bootstrap a TruePPM superuser on first run; no-op if one already exists."""
|
|
@@ -78,9 +98,27 @@ class Command(BaseCommand):
|
|
|
78
98
|
"""
|
|
79
99
|
User = get_user_model()
|
|
80
100
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
101
|
+
with transaction.atomic():
|
|
102
|
+
if connection.vendor == "postgresql":
|
|
103
|
+
# xact-scoped: released at COMMIT, so a waiting pod only proceeds
|
|
104
|
+
# once the winner's superuser row is visible to it. SQLite has no
|
|
105
|
+
# advisory locks and is necessarily single-process.
|
|
106
|
+
with connection.cursor() as cursor:
|
|
107
|
+
cursor.execute(
|
|
108
|
+
"SELECT pg_advisory_xact_lock(%s)", [BOOTSTRAP_ADVISORY_LOCK_KEY]
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
if User.objects.filter(is_superuser=True).exists():
|
|
112
|
+
self.stdout.write("Admin user already exists — skipping bootstrap.")
|
|
113
|
+
return
|
|
114
|
+
|
|
115
|
+
email, username, password, created = self._bootstrap()
|
|
116
|
+
|
|
117
|
+
self._deliver(email, username, password, created)
|
|
118
|
+
|
|
119
|
+
def _bootstrap(self) -> tuple[str, str, str, bool]:
|
|
120
|
+
"""Create or promote the superuser. Caller holds the bootstrap lock."""
|
|
121
|
+
User = get_user_model()
|
|
84
122
|
|
|
85
123
|
email = os.environ.get("DJANGO_SUPERUSER_EMAIL", "admin@example.com").strip()
|
|
86
124
|
username = os.environ.get("DJANGO_SUPERUSER_USERNAME", "").strip() or email.split("@")[0]
|
|
@@ -103,7 +141,14 @@ class Command(BaseCommand):
|
|
|
103
141
|
user.is_staff = True
|
|
104
142
|
user.is_superuser = True
|
|
105
143
|
user.save()
|
|
144
|
+
return email, username, password, created
|
|
106
145
|
|
|
146
|
+
def _deliver(self, email: str, username: str, password: str, created: bool) -> None:
|
|
147
|
+
"""Announce the bootstrap and hand the password to the operator.
|
|
148
|
+
|
|
149
|
+
Runs after COMMIT, so a pod never writes a password file for a
|
|
150
|
+
transaction that rolled back.
|
|
151
|
+
"""
|
|
107
152
|
# An existing row being promoted is a privilege grant on an account the
|
|
108
153
|
# operator did not necessarily know was there — say so plainly rather than
|
|
109
154
|
# letting it read like a routine bootstrap line.
|