trueppm-api 0.4.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- trueppm_api/__init__.py +27 -0
- trueppm_api/apps/access/__init__.py +0 -0
- trueppm_api/apps/access/apps.py +19 -0
- trueppm_api/apps/access/groups.py +518 -0
- trueppm_api/apps/access/management/__init__.py +0 -0
- trueppm_api/apps/access/management/commands/__init__.py +0 -0
- trueppm_api/apps/access/management/commands/create_admin.py +346 -0
- trueppm_api/apps/access/management/commands/migrate_locked.py +96 -0
- trueppm_api/apps/access/management/commands/revoke_api_tokens.py +483 -0
- trueppm_api/apps/access/migrations/0001_initial.py +61 -0
- trueppm_api/apps/access/migrations/0001_squashed_0012_programmembership_role_title.py +184 -0
- trueppm_api/apps/access/migrations/0002_alter_projectmembership_id.py +29 -0
- trueppm_api/apps/access/migrations/0003_projectmembership_soft_delete.py +24 -0
- trueppm_api/apps/access/migrations/0004_alter_projectmembership_role.py +34 -0
- trueppm_api/apps/access/migrations/0005_program_entity_and_membership.py +76 -0
- trueppm_api/apps/access/migrations/0006_role_ordinal_spacing.py +113 -0
- trueppm_api/apps/access/migrations/0007_projectmembership_joined_at_and_more.py +35 -0
- trueppm_api/apps/access/migrations/0008_projectmembership_source_group.py +25 -0
- trueppm_api/apps/access/migrations/0009_projectmembership_pm_proj_serverver_idx.py +20 -0
- trueppm_api/apps/access/migrations/0010_programmembership_joined_at_and_more.py +38 -0
- trueppm_api/apps/access/migrations/0011_alter_programmembership_unique_together_and_more.py +36 -0
- trueppm_api/apps/access/migrations/0012_programmembership_role_title.py +17 -0
- trueppm_api/apps/access/migrations/0013_squashed_0019_release_0_4.py +302 -0
- trueppm_api/apps/access/migrations/0013_userdefinedmentiongroup.py +82 -0
- trueppm_api/apps/access/migrations/0014_programmembership_progm_serverver_idx.py +19 -0
- trueppm_api/apps/access/migrations/0015_programuserdefinedmentiongroup.py +86 -0
- trueppm_api/apps/access/migrations/0016_externalstakeholder.py +67 -0
- trueppm_api/apps/access/migrations/0017_viewer_ordinal_one.py +143 -0
- trueppm_api/apps/access/migrations/0018_programmembership_sync_seq_and_more.py +52 -0
- trueppm_api/apps/access/migrations/0019_programmembership_reinstated_at_and_more.py +22 -0
- trueppm_api/apps/access/migrations/__init__.py +0 -0
- trueppm_api/apps/access/minter_role.py +38 -0
- trueppm_api/apps/access/models.py +588 -0
- trueppm_api/apps/access/permissions.py +3263 -0
- trueppm_api/apps/access/serializers.py +1007 -0
- trueppm_api/apps/access/services.py +878 -0
- trueppm_api/apps/access/signals.py +171 -0
- trueppm_api/apps/access/tasks.py +50 -0
- trueppm_api/apps/access/throttles.py +96 -0
- trueppm_api/apps/access/urls.py +191 -0
- trueppm_api/apps/access/views.py +1965 -0
- trueppm_api/apps/agents/__init__.py +6 -0
- trueppm_api/apps/agents/apps.py +11 -0
- trueppm_api/apps/agents/canonical.py +73 -0
- trueppm_api/apps/agents/deferred.py +108 -0
- trueppm_api/apps/agents/management/__init__.py +0 -0
- trueppm_api/apps/agents/management/commands/__init__.py +0 -0
- trueppm_api/apps/agents/management/commands/audit_prune.py +137 -0
- trueppm_api/apps/agents/management/commands/audit_verify.py +101 -0
- trueppm_api/apps/agents/middleware.py +44 -0
- trueppm_api/apps/agents/migrations/0001_initial.py +231 -0
- trueppm_api/apps/agents/migrations/0001_squashed_0003_release_0_4.py +344 -0
- trueppm_api/apps/agents/migrations/0002_agentactioncheckpoint.py +71 -0
- trueppm_api/apps/agents/migrations/0003_agentactionrefusaldetail.py +58 -0
- trueppm_api/apps/agents/migrations/__init__.py +0 -0
- trueppm_api/apps/agents/models.py +371 -0
- trueppm_api/apps/agents/refusal.py +103 -0
- trueppm_api/apps/agents/serializers.py +85 -0
- trueppm_api/apps/agents/services.py +397 -0
- trueppm_api/apps/agents/signals.py +30 -0
- trueppm_api/apps/agents/urls.py +15 -0
- trueppm_api/apps/agents/views.py +109 -0
- trueppm_api/apps/csvimport/__init__.py +12 -0
- trueppm_api/apps/csvimport/apps.py +11 -0
- trueppm_api/apps/csvimport/mapping.py +363 -0
- trueppm_api/apps/csvimport/migrations/0001_initial.py +74 -0
- trueppm_api/apps/csvimport/migrations/0001_squashed_0003_release_0_4.py +90 -0
- trueppm_api/apps/csvimport/migrations/0002_schedule_outline_batch_operations.py +37 -0
- trueppm_api/apps/csvimport/migrations/0003_csvimportrequest_date_order_and_more.py +26 -0
- trueppm_api/apps/csvimport/migrations/__init__.py +0 -0
- trueppm_api/apps/csvimport/models.py +111 -0
- trueppm_api/apps/csvimport/parser.py +1825 -0
- trueppm_api/apps/csvimport/services.py +48 -0
- trueppm_api/apps/csvimport/tasks.py +459 -0
- trueppm_api/apps/csvimport/template.py +37 -0
- trueppm_api/apps/csvimport/urls.py +50 -0
- trueppm_api/apps/csvimport/views.py +793 -0
- trueppm_api/apps/history/__init__.py +0 -0
- trueppm_api/apps/history/apps.py +12 -0
- trueppm_api/apps/history/changelog.py +359 -0
- trueppm_api/apps/history/diff_policy.py +178 -0
- trueppm_api/apps/history/serializers.py +104 -0
- trueppm_api/apps/history/signals.py +82 -0
- trueppm_api/apps/history/tasks.py +105 -0
- trueppm_api/apps/history/urls.py +38 -0
- trueppm_api/apps/history/views.py +443 -0
- trueppm_api/apps/idempotency/__init__.py +0 -0
- trueppm_api/apps/idempotency/apps.py +11 -0
- trueppm_api/apps/idempotency/migrations/0001_initial.py +71 -0
- trueppm_api/apps/idempotency/migrations/__init__.py +0 -0
- trueppm_api/apps/idempotency/mixins.py +226 -0
- trueppm_api/apps/idempotency/models.py +75 -0
- trueppm_api/apps/idempotency/tasks.py +61 -0
- trueppm_api/apps/integrations/__init__.py +13 -0
- trueppm_api/apps/integrations/apps.py +59 -0
- trueppm_api/apps/integrations/connections.py +806 -0
- trueppm_api/apps/integrations/encryption.py +92 -0
- trueppm_api/apps/integrations/external_sources.py +863 -0
- trueppm_api/apps/integrations/git_automation_services.py +231 -0
- trueppm_api/apps/integrations/git_webhook_auth.py +243 -0
- trueppm_api/apps/integrations/http.py +597 -0
- trueppm_api/apps/integrations/me_work.py +218 -0
- trueppm_api/apps/integrations/migrations/0001_initial.py +64 -0
- trueppm_api/apps/integrations/migrations/0001_squashed_0006_tasklink_description_tasklink_preview_type_and_more.py +187 -0
- trueppm_api/apps/integrations/migrations/0002_tasklink.py +67 -0
- trueppm_api/apps/integrations/migrations/0003_tasklink_tasklink_serverver_idx.py +17 -0
- trueppm_api/apps/integrations/migrations/0004_tasklink_custom_title_tasklink_labels.py +25 -0
- trueppm_api/apps/integrations/migrations/0005_boardautomation.py +56 -0
- trueppm_api/apps/integrations/migrations/0006_tasklink_description_tasklink_preview_type_and_more.py +40 -0
- trueppm_api/apps/integrations/migrations/0007_squashed_0014_release_0_4.py +225 -0
- trueppm_api/apps/integrations/migrations/0007_tasklink_created_at.py +23 -0
- trueppm_api/apps/integrations/migrations/0008_integrationcredential_config_externalworkitem.py +66 -0
- trueppm_api/apps/integrations/migrations/0009_externalsyncrequest_and_more.py +96 -0
- trueppm_api/apps/integrations/migrations/0010_externalworkitem_due_date.py +17 -0
- trueppm_api/apps/integrations/migrations/0011_tasklink_sync_seq_tasklink_tasklink_syncseq_idx.py +22 -0
- trueppm_api/apps/integrations/migrations/0012_boardautomation_last_delivery_at_and_more.py +42 -0
- trueppm_api/apps/integrations/migrations/0013_externalsyncrequest_attempt_count_and_more.py +26 -0
- trueppm_api/apps/integrations/migrations/0014_tasklink_created_by.py +27 -0
- trueppm_api/apps/integrations/migrations/__init__.py +0 -0
- trueppm_api/apps/integrations/models.py +635 -0
- trueppm_api/apps/integrations/notification_channels.py +57 -0
- trueppm_api/apps/integrations/opengraph.py +229 -0
- trueppm_api/apps/integrations/outgoing.py +201 -0
- trueppm_api/apps/integrations/providers.py +528 -0
- trueppm_api/apps/integrations/registry.py +345 -0
- trueppm_api/apps/integrations/serializers.py +453 -0
- trueppm_api/apps/integrations/services.py +171 -0
- trueppm_api/apps/integrations/tasks.py +734 -0
- trueppm_api/apps/integrations/throttles.py +165 -0
- trueppm_api/apps/integrations/urls.py +77 -0
- trueppm_api/apps/integrations/views.py +1158 -0
- trueppm_api/apps/jiraimport/__init__.py +8 -0
- trueppm_api/apps/jiraimport/apps.py +11 -0
- trueppm_api/apps/jiraimport/migrations/0001_initial.py +72 -0
- trueppm_api/apps/jiraimport/migrations/__init__.py +0 -0
- trueppm_api/apps/jiraimport/models.py +70 -0
- trueppm_api/apps/jiraimport/parser.py +350 -0
- trueppm_api/apps/jiraimport/services.py +46 -0
- trueppm_api/apps/jiraimport/tasks.py +280 -0
- trueppm_api/apps/jiraimport/urls.py +15 -0
- trueppm_api/apps/jiraimport/views.py +153 -0
- trueppm_api/apps/msproject/__init__.py +0 -0
- trueppm_api/apps/msproject/apps.py +11 -0
- trueppm_api/apps/msproject/dataclasses.py +153 -0
- trueppm_api/apps/msproject/exporter.py +551 -0
- trueppm_api/apps/msproject/extended_attributes.py +77 -0
- trueppm_api/apps/msproject/importer.py +1095 -0
- trueppm_api/apps/msproject/migrations/0001_import_request.py +77 -0
- trueppm_api/apps/msproject/migrations/0001_squashed_0002_importrequest_creates_project.py +80 -0
- trueppm_api/apps/msproject/migrations/0002_importrequest_creates_project.py +15 -0
- trueppm_api/apps/msproject/migrations/__init__.py +0 -0
- trueppm_api/apps/msproject/models.py +81 -0
- trueppm_api/apps/msproject/parser.py +1276 -0
- trueppm_api/apps/msproject/serializers.py +136 -0
- trueppm_api/apps/msproject/services.py +58 -0
- trueppm_api/apps/msproject/tasks.py +439 -0
- trueppm_api/apps/msproject/urls.py +39 -0
- trueppm_api/apps/msproject/views.py +531 -0
- trueppm_api/apps/notifications/__init__.py +7 -0
- trueppm_api/apps/notifications/apps.py +15 -0
- trueppm_api/apps/notifications/backfill.py +79 -0
- trueppm_api/apps/notifications/categories.py +112 -0
- trueppm_api/apps/notifications/delivery_limits.py +258 -0
- trueppm_api/apps/notifications/digests.py +462 -0
- trueppm_api/apps/notifications/email_backend.py +350 -0
- trueppm_api/apps/notifications/email_health.py +128 -0
- trueppm_api/apps/notifications/migrations/0001_initial.py +207 -0
- trueppm_api/apps/notifications/migrations/0001_squashed_0006_notification_task.py +299 -0
- trueppm_api/apps/notifications/migrations/0002_project_notification_preference.py +67 -0
- trueppm_api/apps/notifications/migrations/0003_projectnotificationpreference_paused.py +17 -0
- trueppm_api/apps/notifications/migrations/0004_clean_unknown_matrix_keys.py +30 -0
- trueppm_api/apps/notifications/migrations/0005_notification_body_notification_event_type_and_more.py +27 -0
- trueppm_api/apps/notifications/migrations/0006_notification_task.py +25 -0
- trueppm_api/apps/notifications/migrations/0007_squashed_0011_release_0_4.py +204 -0
- trueppm_api/apps/notifications/migrations/0007_workspaceemailsettings.py +80 -0
- trueppm_api/apps/notifications/migrations/0008_notification_snoozed_until.py +17 -0
- trueppm_api/apps/notifications/migrations/0009_usernotificationsettings.py +43 -0
- trueppm_api/apps/notifications/migrations/0010_projectnotificationpreference_schema_version.py +20 -0
- trueppm_api/apps/notifications/migrations/0011_usernotificationsettings_digest_hour_and_more.py +96 -0
- trueppm_api/apps/notifications/migrations/__init__.py +0 -0
- trueppm_api/apps/notifications/models.py +1148 -0
- trueppm_api/apps/notifications/receivers.py +155 -0
- trueppm_api/apps/notifications/schema_migrations.py +56 -0
- trueppm_api/apps/notifications/serializers.py +1094 -0
- trueppm_api/apps/notifications/services.py +1489 -0
- trueppm_api/apps/notifications/tasks.py +762 -0
- trueppm_api/apps/notifications/throttles.py +98 -0
- trueppm_api/apps/notifications/urls.py +97 -0
- trueppm_api/apps/notifications/views.py +919 -0
- trueppm_api/apps/observability/__init__.py +0 -0
- trueppm_api/apps/observability/apps.py +31 -0
- trueppm_api/apps/observability/logging.py +213 -0
- trueppm_api/apps/observability/migrations/0001_initial.py +35 -0
- trueppm_api/apps/observability/migrations/0001_squashed_0003_alter_purgerun_trigger.py +154 -0
- trueppm_api/apps/observability/migrations/0002_purgerun_retentionpolicy_retentionschedule.py +131 -0
- trueppm_api/apps/observability/migrations/0003_alter_purgerun_trigger.py +21 -0
- trueppm_api/apps/observability/migrations/0004_alter_retentionpolicy_key.py +28 -0
- trueppm_api/apps/observability/migrations/__init__.py +0 -0
- trueppm_api/apps/observability/models.py +141 -0
- trueppm_api/apps/observability/otel/__init__.py +45 -0
- trueppm_api/apps/observability/otel/attributes.py +247 -0
- trueppm_api/apps/observability/otel/export_health.py +533 -0
- trueppm_api/apps/observability/otel/instrumentation.py +351 -0
- trueppm_api/apps/observability/otel/metrics.py +566 -0
- trueppm_api/apps/observability/otel/provider.py +511 -0
- trueppm_api/apps/observability/otel/request_attributes.py +204 -0
- trueppm_api/apps/observability/purge_registry.py +124 -0
- trueppm_api/apps/observability/retention.py +139 -0
- trueppm_api/apps/observability/selectors.py +993 -0
- trueppm_api/apps/observability/serializers.py +142 -0
- trueppm_api/apps/observability/services.py +407 -0
- trueppm_api/apps/observability/tasks.py +266 -0
- trueppm_api/apps/observability/urls.py +27 -0
- trueppm_api/apps/observability/views.py +537 -0
- trueppm_api/apps/profiles/__init__.py +0 -0
- trueppm_api/apps/profiles/apps.py +15 -0
- trueppm_api/apps/profiles/constants.py +54 -0
- trueppm_api/apps/profiles/migrations/0001_initial.py +55 -0
- trueppm_api/apps/profiles/migrations/0001_squashed_0004_userprofile_role_context.py +125 -0
- trueppm_api/apps/profiles/migrations/0002_userprofile_hidden_views.py +17 -0
- trueppm_api/apps/profiles/migrations/0003_projectvisit.py +63 -0
- trueppm_api/apps/profiles/migrations/0004_userprofile_role_context.py +26 -0
- trueppm_api/apps/profiles/migrations/0005_squashed_0009_release_0_4.py +128 -0
- trueppm_api/apps/profiles/migrations/0005_userprofile_schedule_in_deliver.py +20 -0
- trueppm_api/apps/profiles/migrations/0006_userprofile_date_format_userprofile_timezone.py +36 -0
- trueppm_api/apps/profiles/migrations/0007_userpin.py +91 -0
- trueppm_api/apps/profiles/migrations/0008_remove_userprofile_schedule_in_deliver.py +71 -0
- trueppm_api/apps/profiles/migrations/0009_auth_user_email_upper_idx.py +81 -0
- trueppm_api/apps/profiles/migrations/__init__.py +0 -0
- trueppm_api/apps/profiles/models.py +276 -0
- trueppm_api/apps/profiles/serializers.py +199 -0
- trueppm_api/apps/profiles/services.py +541 -0
- trueppm_api/apps/profiles/views.py +124 -0
- trueppm_api/apps/projects/__init__.py +0 -0
- trueppm_api/apps/projects/actual_date_rules.py +163 -0
- trueppm_api/apps/projects/amend.py +133 -0
- trueppm_api/apps/projects/apps.py +38 -0
- trueppm_api/apps/projects/asset_feed.py +459 -0
- trueppm_api/apps/projects/asset_views.py +317 -0
- trueppm_api/apps/projects/attachment_policy.py +278 -0
- trueppm_api/apps/projects/authentication.py +458 -0
- trueppm_api/apps/projects/backfill.py +459 -0
- trueppm_api/apps/projects/backlog_services.py +324 -0
- trueppm_api/apps/projects/backlog_views.py +302 -0
- trueppm_api/apps/projects/batch_operation_views.py +264 -0
- trueppm_api/apps/projects/blocker_services.py +510 -0
- trueppm_api/apps/projects/board_activity.py +462 -0
- trueppm_api/apps/projects/board_activity_views.py +186 -0
- trueppm_api/apps/projects/board_lanes.py +134 -0
- trueppm_api/apps/projects/bulk_settings.py +194 -0
- trueppm_api/apps/projects/bundled_templates.py +215 -0
- trueppm_api/apps/projects/calendar_settings.py +180 -0
- trueppm_api/apps/projects/ceremony_views.py +244 -0
- trueppm_api/apps/projects/commit_moment.py +212 -0
- trueppm_api/apps/projects/config_notice.py +1330 -0
- trueppm_api/apps/projects/custom_field_values.py +266 -0
- trueppm_api/apps/projects/decisions_services.py +132 -0
- trueppm_api/apps/projects/decisions_views.py +97 -0
- trueppm_api/apps/projects/estimation_scale.py +126 -0
- trueppm_api/apps/projects/export_bundle.py +423 -0
- trueppm_api/apps/projects/fixtures/seeds/atlas-platform-launch.json +4278 -0
- trueppm_api/apps/projects/fixtures/seeds/aurora-mobile-app.json +2001 -0
- trueppm_api/apps/projects/fixtures/seeds/bayside-civic-center.json +1827 -0
- trueppm_api/apps/projects/fixtures/seeds/ga-launch.json +1909 -0
- trueppm_api/apps/projects/fixtures/seeds/helios-crm-replacement.json +1410 -0
- trueppm_api/apps/projects/guardrail_policy_source.py +269 -0
- trueppm_api/apps/projects/inbound_sync.py +555 -0
- trueppm_api/apps/projects/iteration_label.py +85 -0
- trueppm_api/apps/projects/key_views.py +468 -0
- trueppm_api/apps/projects/keys.py +205 -0
- trueppm_api/apps/projects/lifecycle.py +191 -0
- trueppm_api/apps/projects/management/__init__.py +0 -0
- trueppm_api/apps/projects/management/commands/__init__.py +0 -0
- trueppm_api/apps/projects/management/commands/backfill_in_progress_status.py +92 -0
- trueppm_api/apps/projects/management/commands/create_demo_share_link.py +368 -0
- trueppm_api/apps/projects/management/commands/export_program.py +50 -0
- trueppm_api/apps/projects/management/commands/import_seed.py +165 -0
- trueppm_api/apps/projects/management/commands/load_sample_project.py +514 -0
- trueppm_api/apps/projects/management/commands/seed_capacity.py +406 -0
- trueppm_api/apps/projects/management/commands/seed_integration_fixtures.py +192 -0
- trueppm_api/apps/projects/management/commands/shift_sample_dates.py +120 -0
- trueppm_api/apps/projects/mcp_settings.py +305 -0
- trueppm_api/apps/projects/methodology.py +178 -0
- trueppm_api/apps/projects/migration_helpers.py +75 -0
- trueppm_api/apps/projects/migrations/0001_initial.py +208 -0
- trueppm_api/apps/projects/migrations/0001_squashed_0094_project_decisions_policy.py +5659 -0
- trueppm_api/apps/projects/migrations/0002_alter_uuid_pk_serialize_false.py +57 -0
- trueppm_api/apps/projects/migrations/0003_rename_task_project_index.py +25 -0
- trueppm_api/apps/projects/migrations/0004_soft_delete_and_dependency_versioned.py +70 -0
- trueppm_api/apps/projects/migrations/0005_task_assignee.py +33 -0
- trueppm_api/apps/projects/migrations/0006_task_utilization_index.py +31 -0
- trueppm_api/apps/projects/migrations/0007_task_is_milestone.py +28 -0
- trueppm_api/apps/projects/migrations/0008_baseline.py +119 -0
- trueppm_api/apps/projects/migrations/0009_historicaldependency_historicalproject_and_more.py +210 -0
- trueppm_api/apps/projects/migrations/0010_risk.py +229 -0
- trueppm_api/apps/projects/migrations/0011_task_status.py +27 -0
- trueppm_api/apps/projects/migrations/0012_task_status.py +27 -0
- trueppm_api/apps/projects/migrations/0013_task_planned_start.py +24 -0
- trueppm_api/apps/projects/migrations/0014_short_hex_ids.py +74 -0
- trueppm_api/apps/projects/migrations/0015_backfill_short_ids.py +48 -0
- trueppm_api/apps/projects/migrations/0016_task_actual_dates.py +42 -0
- trueppm_api/apps/projects/migrations/0017_boardcolumnconfig.py +43 -0
- trueppm_api/apps/projects/migrations/0018_estimation_governance.py +62 -0
- trueppm_api/apps/projects/migrations/0019_backfill_wbs_paths.py +28 -0
- trueppm_api/apps/projects/migrations/0020_task_status_5col.py +65 -0
- trueppm_api/apps/projects/migrations/0021_boardsavedview.py +64 -0
- trueppm_api/apps/projects/migrations/0022_task_status_changed_at_priority_rank.py +35 -0
- trueppm_api/apps/projects/migrations/0023_risk_framework_fields.py +96 -0
- trueppm_api/apps/projects/migrations/0024_riskcomment.py +52 -0
- trueppm_api/apps/projects/migrations/0025_sprint.py +352 -0
- trueppm_api/apps/projects/migrations/0026_project_methodology.py +30 -0
- trueppm_api/apps/projects/migrations/0027_sprint_retro.py +89 -0
- trueppm_api/apps/projects/migrations/0028_normalize_notes_field.py +42 -0
- trueppm_api/apps/projects/migrations/0029_complete_implies_full_progress.py +38 -0
- trueppm_api/apps/projects/migrations/0030_review_implies_full_progress.py +37 -0
- trueppm_api/apps/projects/migrations/0031_task_remaining_points.py +22 -0
- trueppm_api/apps/projects/migrations/0032_task_is_subtask_and_sprint_scope_change.py +90 -0
- trueppm_api/apps/projects/migrations/0033_task_my_work_index.py +38 -0
- trueppm_api/apps/projects/migrations/0034_inbound_task_sync.py +313 -0
- trueppm_api/apps/projects/migrations/0035_retro_versioned_and_suggested_assignee.py +173 -0
- trueppm_api/apps/projects/migrations/0036_program_entity_and_membership.py +157 -0
- trueppm_api/apps/projects/migrations/0037_sprint_capacity_points.py +20 -0
- trueppm_api/apps/projects/migrations/0038_taskcomment_commentreaction_commentacknowledgement_and_more.py +233 -0
- trueppm_api/apps/projects/migrations/0039_apitoken_and_more.py +88 -0
- trueppm_api/apps/projects/migrations/0040_program_general_fields.py +119 -0
- trueppm_api/apps/projects/migrations/0041_ceremony_template_and_phase_gate_config.py +210 -0
- trueppm_api/apps/projects/migrations/0041_project_general_fields.py +106 -0
- trueppm_api/apps/projects/migrations/0042_merge_20260522_0410.py +12 -0
- trueppm_api/apps/projects/migrations/0042_program_rollup_config.py +95 -0
- trueppm_api/apps/projects/migrations/0042_workflow_color_and_custom_fields.py +94 -0
- trueppm_api/apps/projects/migrations/0043_merge_20260522_1118.py +10 -0
- trueppm_api/apps/projects/migrations/0044_merge_20260522_rollup.py +10 -0
- trueppm_api/apps/projects/migrations/0044_project_archive_program_close.py +119 -0
- trueppm_api/apps/projects/migrations/0045_program_risk_policy.py +78 -0
- trueppm_api/apps/projects/migrations/0046_merge_20260523_2248.py +12 -0
- trueppm_api/apps/projects/migrations/0047_apitokenauditentry_program_and_more.py +55 -0
- trueppm_api/apps/projects/migrations/0048_historicalprogram_color_program_color.py +32 -0
- trueppm_api/apps/projects/migrations/0049_backlog_item.py +112 -0
- trueppm_api/apps/projects/migrations/0050_backlog_item_trgm_search.py +26 -0
- trueppm_api/apps/projects/migrations/0051_alter_calendar_working_days_alter_dependency_lag_and_more.py +144 -0
- trueppm_api/apps/projects/migrations/0052_recurring_tasks.py +278 -0
- trueppm_api/apps/projects/migrations/0053_dependency_dep_pred_serverver_idx_and_more.py +56 -0
- trueppm_api/apps/projects/migrations/0054_sprintscopechange_goal_impact_and_more.py +117 -0
- trueppm_api/apps/projects/migrations/0055_historicaltask_sprint_pending_and_more.py +51 -0
- trueppm_api/apps/projects/migrations/0056_historicalproject_prioritization_model_and_more.py +276 -0
- trueppm_api/apps/projects/migrations/0057_historicalsprint_binding_committed_snapshot_and_more.py +58 -0
- trueppm_api/apps/projects/migrations/0058_historicaltask_delivery_mode_and_more.py +72 -0
- trueppm_api/apps/projects/migrations/0059_forecastsnapshot.py +80 -0
- trueppm_api/apps/projects/migrations/0060_historicalprojectsignalprivacypolicy_and_more.py +90 -0
- trueppm_api/apps/projects/migrations/0061_baselinetask_story_points.py +17 -0
- trueppm_api/apps/projects/migrations/0062_project_is_sample.py +22 -0
- trueppm_api/apps/projects/migrations/0063_historicalsprint_wip_limit_sprint_wip_limit.py +22 -0
- trueppm_api/apps/projects/migrations/0064_sprinttaskoutcome.py +97 -0
- trueppm_api/apps/projects/migrations/0065_historicalsprint_goal_outcome_sprint_goal_outcome.py +32 -0
- trueppm_api/apps/projects/migrations/0066_historicalproject_lead_project_lead.py +38 -0
- trueppm_api/apps/projects/migrations/0067_sprint_exclude_from_velocity.py +22 -0
- trueppm_api/apps/projects/migrations/0068_project_recalculated_at.py +23 -0
- trueppm_api/apps/projects/migrations/0069_iteration_label.py +22 -0
- trueppm_api/apps/projects/migrations/0070_historicalprogram_iteration_label_and_more.py +32 -0
- trueppm_api/apps/projects/migrations/0071_backfill_iteration_label_inherit.py +35 -0
- trueppm_api/apps/projects/migrations/0072_pulseresponse_retroboarditem.py +129 -0
- trueppm_api/apps/projects/migrations/0073_sprinttaskoutcome_demo_ready.py +17 -0
- trueppm_api/apps/projects/migrations/0074_historicaltask_blocked_reason_task_blocked_reason.py +30 -0
- trueppm_api/apps/projects/migrations/0075_risk_decimal_short_id.py +42 -0
- trueppm_api/apps/projects/migrations/0076_sprinttaskoutcome_review_polish.py +45 -0
- trueppm_api/apps/projects/migrations/0077_task_blocker_fields.py +111 -0
- trueppm_api/apps/projects/migrations/0078_alter_risktask_unique_together_and_more.py +22 -0
- trueppm_api/apps/projects/migrations/0079_historicalproject_status_date_project_status_date.py +22 -0
- trueppm_api/apps/projects/migrations/0080_alter_historicaltask_type_alter_task_type.py +46 -0
- trueppm_api/apps/projects/migrations/0081_historicalprogram_allow_guests_and_more.py +52 -0
- trueppm_api/apps/projects/migrations/0082_project_last_sync_version.py +90 -0
- trueppm_api/apps/projects/migrations/0083_historicalprogram_mc_history_attribution_audience_and_more.py +108 -0
- trueppm_api/apps/projects/migrations/0084_tasknote.py +71 -0
- trueppm_api/apps/projects/migrations/0085_sprint_ix_sprint_velocity.py +33 -0
- trueppm_api/apps/projects/migrations/0086_board_card_search_trgm.py +33 -0
- trueppm_api/apps/projects/migrations/0087_historicalprogram_task_duration_change_percent_policy_and_more.py +155 -0
- trueppm_api/apps/projects/migrations/0088_historicalprogram_allowed_attachment_types_and_more.py +61 -0
- trueppm_api/apps/projects/migrations/0089_signalceilingraiseproposal_signalceilingraisevote_and_more.py +157 -0
- trueppm_api/apps/projects/migrations/0090_historicaltask_proj_histdate_index.py +59 -0
- trueppm_api/apps/projects/migrations/0091_project_board_cadence.py +39 -0
- trueppm_api/apps/projects/migrations/0092_program_target_date.py +22 -0
- trueppm_api/apps/projects/migrations/0093_cross_project_dependency_consent.py +58 -0
- trueppm_api/apps/projects/migrations/0094_project_decisions_policy.py +90 -0
- trueppm_api/apps/projects/migrations/0095_poker_session_vote.py +127 -0
- trueppm_api/apps/projects/migrations/0095_squashed_0097_release_0_3.py +225 -0
- trueppm_api/apps/projects/migrations/0096_crossprojectslipconflict.py +91 -0
- trueppm_api/apps/projects/migrations/0097_backlogitem_backlogitem_tags_gin_and_more.py +32 -0
- trueppm_api/apps/projects/migrations/0098_historicalproject_show_baselines_and_more.py +52 -0
- trueppm_api/apps/projects/migrations/0099_apitoken_scopes.py +48 -0
- trueppm_api/apps/projects/migrations/0100_task_dep_serverver_idx_concurrent.py +75 -0
- trueppm_api/apps/projects/migrations/0101_dependency_deleted_at_task_deleted_at.py +22 -0
- trueppm_api/apps/projects/migrations/0102_project_deleted_at_project_proj_isdel_deletedat_idx.py +25 -0
- trueppm_api/apps/projects/migrations/0103_taskdurationchangeevent_task_dur_evt_sprint_idx.py +18 -0
- trueppm_api/apps/projects/migrations/0104_historicalproject_stale_task_threshold_days_and_more.py +32 -0
- trueppm_api/apps/projects/migrations/0104_trash_restore_1113.py +38 -0
- trueppm_api/apps/projects/migrations/0105_historical_changelog_indexes.py +76 -0
- trueppm_api/apps/projects/migrations/0106_boardsavedview_schema_version.py +20 -0
- trueppm_api/apps/projects/migrations/0106_squashed_0158_release_0_4.py +2357 -0
- trueppm_api/apps/projects/migrations/0107_task_activity_event.py +70 -0
- trueppm_api/apps/projects/migrations/0108_remove_apitoken_api_token_scope_xor_and_more.py +117 -0
- trueppm_api/apps/projects/migrations/0109_projectexportjob.py +82 -0
- trueppm_api/apps/projects/migrations/0110_sharelink.py +123 -0
- trueppm_api/apps/projects/migrations/0111_projectcalendarlayer.py +67 -0
- trueppm_api/apps/projects/migrations/0112_sharelink_expires_at_alter_sharelink_content_kind.py +31 -0
- trueppm_api/apps/projects/migrations/0113_alter_historicaltask_percent_complete_and_more.py +35 -0
- trueppm_api/apps/projects/migrations/0114_historicalproject_default_member_role_and_more.py +28 -0
- trueppm_api/apps/projects/migrations/0115_historicalproject_end_date_shift_threshold_days_and_more.py +22 -0
- trueppm_api/apps/projects/migrations/0116_alter_taskactivityevent_event_type.py +28 -0
- trueppm_api/apps/projects/migrations/0117_label_tasklabel_label_tasks_and_more.py +126 -0
- trueppm_api/apps/projects/migrations/0118_programexportjob.py +82 -0
- trueppm_api/apps/projects/migrations/0119_historicalprogram_calendar_program_calendar.py +36 -0
- trueppm_api/apps/projects/migrations/0120_alter_backlogitem_item_type.py +29 -0
- trueppm_api/apps/projects/migrations/0121_task_three_point_estimate_ordered.py +64 -0
- trueppm_api/apps/projects/migrations/0122_task_relation.py +173 -0
- trueppm_api/apps/projects/migrations/0123_remove_historicalproject_agile_features_and_more.py +20 -0
- trueppm_api/apps/projects/migrations/0124_dependency_is_driving.py +17 -0
- trueppm_api/apps/projects/migrations/0125_historicalprogram_estimation_scale_and_more.py +68 -0
- trueppm_api/apps/projects/migrations/0126_projectcustomfield_show_on_card_taskcustomfieldvalue.py +80 -0
- trueppm_api/apps/projects/migrations/0127_historicalprogram_mcp_enabled_and_more.py +32 -0
- trueppm_api/apps/projects/migrations/0128_acceptancecriterion_sync_seq_apitoken_sync_seq_and_more.py +192 -0
- trueppm_api/apps/projects/migrations/0129_sharelink_show_milestone_dates.py +20 -0
- trueppm_api/apps/projects/migrations/0130_programimportjob.py +85 -0
- trueppm_api/apps/projects/migrations/0131_historicalprogram_sprint_picker_ready_only_default_and_more.py +32 -0
- trueppm_api/apps/projects/migrations/0132_task_scheduled_start.py +17 -0
- trueppm_api/apps/projects/migrations/0133_project_status_date_floor_armed_at.py +17 -0
- trueppm_api/apps/projects/migrations/0134_task_edited_at_task_seeded_at_task_source_id_and_more.py +65 -0
- trueppm_api/apps/projects/migrations/0135_projecttemplate_templateapplication_and_more.py +175 -0
- trueppm_api/apps/projects/migrations/0136_schedule_outline_batch_operations.py +118 -0
- trueppm_api/apps/projects/migrations/0137_collapse_dual_scope_api_tokens.py +54 -0
- trueppm_api/apps/projects/migrations/0138_apitokenauditentry_api_token_audit_owner_idx.py +18 -0
- trueppm_api/apps/projects/migrations/0139_historicaltask_duration_unit_task_duration_unit.py +32 -0
- trueppm_api/apps/projects/migrations/0140_historicaltask_auto_container_and_more.py +113 -0
- trueppm_api/apps/projects/migrations/0141_historicalproject_draft_started_at_and_more.py +44 -0
- trueppm_api/apps/projects/migrations/0142_baseline_calendar_hours_per_day_and_more.py +31 -0
- trueppm_api/apps/projects/migrations/0143_sprintcloserequest_failure_reason_and_more.py +42 -0
- trueppm_api/apps/projects/migrations/0144_projecttemplate_source_project_and_more.py +35 -0
- trueppm_api/apps/projects/migrations/0145_seed_bundled_templates.py +65 -0
- trueppm_api/apps/projects/migrations/0146_historicaltask_board_lane_task_board_lane.py +32 -0
- trueppm_api/apps/projects/migrations/0147_structuraloperation.py +128 -0
- trueppm_api/apps/projects/migrations/0148_task_unique_task_wbs_path_per_project_live.py +76 -0
- trueppm_api/apps/projects/migrations/0149_drop_workshops_tables.py +42 -0
- trueppm_api/apps/projects/migrations/0150_clear_uncommitted_cpm_output.py +130 -0
- trueppm_api/apps/projects/migrations/0151_config_notice_request.py +70 -0
- trueppm_api/apps/projects/migrations/0152_aggregate_task_wbs_name_idx.py +20 -0
- trueppm_api/apps/projects/migrations/0153_program_sample_anchor_date.py +22 -0
- trueppm_api/apps/projects/migrations/0154_object_keys.py +184 -0
- trueppm_api/apps/projects/migrations/0155_task_milestone_at_day_end.py +20 -0
- trueppm_api/apps/projects/migrations/0156_program_import_job_replaced_project_ids.py +17 -0
- trueppm_api/apps/projects/migrations/0157_forecastsnapshot_cpm_finish_at_day_start.py +17 -0
- trueppm_api/apps/projects/migrations/0158_baselinetask_finish_at_day_start.py +17 -0
- trueppm_api/apps/projects/migrations/__init__.py +0 -0
- trueppm_api/apps/projects/models.py +9209 -0
- trueppm_api/apps/projects/poker_services.py +154 -0
- trueppm_api/apps/projects/poker_views.py +398 -0
- trueppm_api/apps/projects/product_backlog_services.py +450 -0
- trueppm_api/apps/projects/program_label_services.py +94 -0
- trueppm_api/apps/projects/program_label_views.py +189 -0
- trueppm_api/apps/projects/program_rollup.py +903 -0
- trueppm_api/apps/projects/program_schedule.py +767 -0
- trueppm_api/apps/projects/program_views.py +3445 -0
- trueppm_api/apps/projects/project_templates.py +422 -0
- trueppm_api/apps/projects/receivers.py +234 -0
- trueppm_api/apps/projects/refusal_codes.py +140 -0
- trueppm_api/apps/projects/reorder_services.py +145 -0
- trueppm_api/apps/projects/restructure_hooks.py +54 -0
- trueppm_api/apps/projects/retro_board_services.py +368 -0
- trueppm_api/apps/projects/retro_services.py +285 -0
- trueppm_api/apps/projects/risk_import.py +396 -0
- trueppm_api/apps/projects/row_identity.py +113 -0
- trueppm_api/apps/projects/schema_migrations.py +228 -0
- trueppm_api/apps/projects/schemas/seed_v1.json +492 -0
- trueppm_api/apps/projects/schemas/seed_v2.json +891 -0
- trueppm_api/apps/projects/seed/__init__.py +61 -0
- trueppm_api/apps/projects/seed/demo_landing_overlay.py +532 -0
- trueppm_api/apps/projects/seed/exporter.py +1717 -0
- trueppm_api/apps/projects/seed/forecast_backfill.py +247 -0
- trueppm_api/apps/projects/seed/importer.py +2764 -0
- trueppm_api/apps/projects/seed/reanchor.py +551 -0
- trueppm_api/apps/projects/seed/reldates.py +126 -0
- trueppm_api/apps/projects/seed/replace.py +128 -0
- trueppm_api/apps/projects/seed/replay.py +1695 -0
- trueppm_api/apps/projects/seed/replay_ctx.py +41 -0
- trueppm_api/apps/projects/seed/samples.py +427 -0
- trueppm_api/apps/projects/seed/validation.py +1169 -0
- trueppm_api/apps/projects/serializers.py +12904 -0
- trueppm_api/apps/projects/services.py +7525 -0
- trueppm_api/apps/projects/share_serializers.py +142 -0
- trueppm_api/apps/projects/share_services.py +373 -0
- trueppm_api/apps/projects/share_views.py +395 -0
- trueppm_api/apps/projects/sharing_settings.py +187 -0
- trueppm_api/apps/projects/signal_privacy_services.py +910 -0
- trueppm_api/apps/projects/signal_privacy_views.py +485 -0
- trueppm_api/apps/projects/signals.py +132 -0
- trueppm_api/apps/projects/slip_conflict.py +288 -0
- trueppm_api/apps/projects/sprint_cadence.py +453 -0
- trueppm_api/apps/projects/sprint_picker_settings.py +132 -0
- trueppm_api/apps/projects/standup.py +304 -0
- trueppm_api/apps/projects/standup_views.py +99 -0
- trueppm_api/apps/projects/structural_operation_services.py +727 -0
- trueppm_api/apps/projects/structural_operation_views.py +311 -0
- trueppm_api/apps/projects/surface_visibility.py +126 -0
- trueppm_api/apps/projects/task_batch_services.py +379 -0
- trueppm_api/apps/projects/task_bulk.py +1244 -0
- trueppm_api/apps/projects/task_classification.py +561 -0
- trueppm_api/apps/projects/task_classification_defaults.py +95 -0
- trueppm_api/apps/projects/task_duration_settings.py +142 -0
- trueppm_api/apps/projects/task_grouping.py +754 -0
- trueppm_api/apps/projects/tasks.py +1979 -0
- trueppm_api/apps/projects/template_divergence.py +168 -0
- trueppm_api/apps/projects/template_services.py +160 -0
- trueppm_api/apps/projects/template_tasks.py +261 -0
- trueppm_api/apps/projects/template_views.py +829 -0
- trueppm_api/apps/projects/throttles.py +311 -0
- trueppm_api/apps/projects/urls.py +1016 -0
- trueppm_api/apps/projects/utilization.py +909 -0
- trueppm_api/apps/projects/views.py +21225 -0
- trueppm_api/apps/projects/wbs_paths.py +119 -0
- trueppm_api/apps/resources/__init__.py +0 -0
- trueppm_api/apps/resources/apps.py +8 -0
- trueppm_api/apps/resources/capacity.py +121 -0
- trueppm_api/apps/resources/migrations/0001_initial.py +68 -0
- trueppm_api/apps/resources/migrations/0001_squashed_0013_alter_projectresource_unique_together_and_more.py +281 -0
- trueppm_api/apps/resources/migrations/0002_alter_uuid_pk_serialize_false.py +36 -0
- trueppm_api/apps/resources/migrations/0003_resource_soft_delete.py +30 -0
- trueppm_api/apps/resources/migrations/0004_add_taskresource_resource_index.py +25 -0
- trueppm_api/apps/resources/migrations/0005_resource_job_role.py +20 -0
- trueppm_api/apps/resources/migrations/0006_skill.py +34 -0
- trueppm_api/apps/resources/migrations/0007_resource_skill.py +63 -0
- trueppm_api/apps/resources/migrations/0008_project_resource.py +63 -0
- trueppm_api/apps/resources/migrations/0009_task_skill_requirement.py +60 -0
- trueppm_api/apps/resources/migrations/0010_alter_resourceskill_options_and_more.py +20 -0
- trueppm_api/apps/resources/migrations/0011_alter_projectresource_notes.py +17 -0
- trueppm_api/apps/resources/migrations/0012_add_resource_user_fk.py +26 -0
- trueppm_api/apps/resources/migrations/0013_alter_projectresource_unique_together_and_more.py +53 -0
- trueppm_api/apps/resources/migrations/0014_projectresource_sync_seq_resource_sync_seq_and_more.py +37 -0
- trueppm_api/apps/resources/migrations/0014_squashed_0015_release_0_4.py +47 -0
- trueppm_api/apps/resources/migrations/0015_projectresource_deactivated_with_resource.py +17 -0
- trueppm_api/apps/resources/migrations/__init__.py +0 -0
- trueppm_api/apps/resources/models.py +298 -0
- trueppm_api/apps/resources/serializers.py +426 -0
- trueppm_api/apps/resources/services.py +465 -0
- trueppm_api/apps/resources/urls.py +28 -0
- trueppm_api/apps/resources/views.py +1752 -0
- trueppm_api/apps/scheduling/__init__.py +0 -0
- trueppm_api/apps/scheduling/apps.py +153 -0
- trueppm_api/apps/scheduling/calendars.py +144 -0
- trueppm_api/apps/scheduling/deadletter.py +91 -0
- trueppm_api/apps/scheduling/finish_reading.py +198 -0
- trueppm_api/apps/scheduling/forecast_history_settings.py +215 -0
- trueppm_api/apps/scheduling/forecast_staleness.py +313 -0
- trueppm_api/apps/scheduling/graph_guard.py +263 -0
- trueppm_api/apps/scheduling/management/__init__.py +0 -0
- trueppm_api/apps/scheduling/management/commands/__init__.py +0 -0
- trueppm_api/apps/scheduling/management/commands/prune_forecast_snapshots.py +53 -0
- trueppm_api/apps/scheduling/mc_admission.py +181 -0
- trueppm_api/apps/scheduling/migrations/0001_failed_task.py +62 -0
- trueppm_api/apps/scheduling/migrations/0001_squashed_0007_projectforecastsnapshot.py +309 -0
- trueppm_api/apps/scheduling/migrations/0002_schedulerequest.py +78 -0
- trueppm_api/apps/scheduling/migrations/0003_add_schedule_request_reason.py +27 -0
- trueppm_api/apps/scheduling/migrations/0004_velocity_suggestion.py +94 -0
- trueppm_api/apps/scheduling/migrations/0005_montecarlorun.py +61 -0
- trueppm_api/apps/scheduling/migrations/0006_montecarlorun_distribution.py +17 -0
- trueppm_api/apps/scheduling/migrations/0007_projectforecastsnapshot.py +65 -0
- trueppm_api/apps/scheduling/migrations/0008_alter_schedulerequest_reason.py +28 -0
- trueppm_api/apps/scheduling/migrations/0008_folded_schedulerequest_reason.py +34 -0
- trueppm_api/apps/scheduling/migrations/0009_alter_schedulerequest_reason.py +29 -0
- trueppm_api/apps/scheduling/migrations/0010_failedtask_resolution_note_failedtask_resolved_at_and_more.py +43 -0
- trueppm_api/apps/scheduling/migrations/0010_squashed_0016_release_0_4.py +106 -0
- trueppm_api/apps/scheduling/migrations/0011_failedtask_project.py +26 -0
- trueppm_api/apps/scheduling/migrations/0012_montecarlorun_diagnostic.py +17 -0
- trueppm_api/apps/scheduling/migrations/0013_montecarlorun_status_date.py +17 -0
- trueppm_api/apps/scheduling/migrations/0014_montecarlorun_plan_version.py +17 -0
- trueppm_api/apps/scheduling/migrations/0015_projectforecastsnapshot_cpm_finish_at_day_start.py +17 -0
- trueppm_api/apps/scheduling/migrations/0016_montecarlorun_finish_readings.py +32 -0
- trueppm_api/apps/scheduling/migrations/__init__.py +0 -0
- trueppm_api/apps/scheduling/models.py +542 -0
- trueppm_api/apps/scheduling/receivers.py +160 -0
- trueppm_api/apps/scheduling/risk_premium.py +334 -0
- trueppm_api/apps/scheduling/serializers.py +723 -0
- trueppm_api/apps/scheduling/services.py +1251 -0
- trueppm_api/apps/scheduling/signals.py +56 -0
- trueppm_api/apps/scheduling/tasks.py +2248 -0
- trueppm_api/apps/scheduling/telemetry.py +80 -0
- trueppm_api/apps/scheduling/units.py +35 -0
- trueppm_api/apps/scheduling/urls.py +57 -0
- trueppm_api/apps/scheduling/views.py +2908 -0
- trueppm_api/apps/sso/__init__.py +0 -0
- trueppm_api/apps/sso/apps.py +19 -0
- trueppm_api/apps/sso/extensions.py +130 -0
- trueppm_api/apps/sso/management/__init__.py +0 -0
- trueppm_api/apps/sso/management/commands/__init__.py +0 -0
- trueppm_api/apps/sso/management/commands/seed_sso_keycloak.py +172 -0
- trueppm_api/apps/sso/migrations/0001_initial.py +119 -0
- trueppm_api/apps/sso/migrations/0002_remove_oidcprovider_workspace_ssoproviderpolicy_and_more.py +169 -0
- trueppm_api/apps/sso/migrations/__init__.py +0 -0
- trueppm_api/apps/sso/models.py +148 -0
- trueppm_api/apps/sso/serializers.py +446 -0
- trueppm_api/apps/sso/services.py +1473 -0
- trueppm_api/apps/sso/urls.py +47 -0
- trueppm_api/apps/sso/views.py +935 -0
- trueppm_api/apps/sync/__init__.py +0 -0
- trueppm_api/apps/sync/apps.py +15 -0
- trueppm_api/apps/sync/backfill.py +208 -0
- trueppm_api/apps/sync/broadcast.py +369 -0
- trueppm_api/apps/sync/conflict.py +262 -0
- trueppm_api/apps/sync/consumers.py +548 -0
- trueppm_api/apps/sync/migrations/0001_initial.py +59 -0
- trueppm_api/apps/sync/migrations/0001_squashed_0002_remove_syncbatch_syncbatch_project_client_batch_uniq_and_more.py +77 -0
- trueppm_api/apps/sync/migrations/0002_remove_syncbatch_syncbatch_project_client_batch_uniq_and_more.py +41 -0
- trueppm_api/apps/sync/migrations/0003_boardevent.py +46 -0
- trueppm_api/apps/sync/migrations/0003_squashed_0005_release_0_4.py +77 -0
- trueppm_api/apps/sync/migrations/0004_seed_sync_seq.py +24 -0
- trueppm_api/apps/sync/migrations/0005_program_sync_sequence.py +35 -0
- trueppm_api/apps/sync/migrations/0006_boardevent_per_project_seq.py +77 -0
- trueppm_api/apps/sync/migrations/__init__.py +0 -0
- trueppm_api/apps/sync/models.py +272 -0
- trueppm_api/apps/sync/pagination.py +231 -0
- trueppm_api/apps/sync/sequence.py +488 -0
- trueppm_api/apps/sync/serializers.py +688 -0
- trueppm_api/apps/sync/tasks.py +260 -0
- trueppm_api/apps/sync/throttles.py +175 -0
- trueppm_api/apps/sync/upload.py +556 -0
- trueppm_api/apps/sync/urls.py +17 -0
- trueppm_api/apps/sync/views.py +957 -0
- trueppm_api/apps/sync/ws_auth.py +193 -0
- trueppm_api/apps/taskruns/__init__.py +0 -0
- trueppm_api/apps/taskruns/apps.py +11 -0
- trueppm_api/apps/taskruns/migrations/0001_initial.py +92 -0
- trueppm_api/apps/taskruns/migrations/__init__.py +0 -0
- trueppm_api/apps/taskruns/models.py +68 -0
- trueppm_api/apps/taskruns/serializers.py +92 -0
- trueppm_api/apps/taskruns/tasks.py +60 -0
- trueppm_api/apps/taskruns/tracker.py +286 -0
- trueppm_api/apps/taskruns/urls.py +46 -0
- trueppm_api/apps/taskruns/views.py +195 -0
- trueppm_api/apps/teams/__init__.py +8 -0
- trueppm_api/apps/teams/apps.py +16 -0
- trueppm_api/apps/teams/migrations/0001_initial.py +139 -0
- trueppm_api/apps/teams/migrations/0001_squashed_0002_default_teams.py +159 -0
- trueppm_api/apps/teams/migrations/0002_default_teams.py +62 -0
- trueppm_api/apps/teams/migrations/0003_team_sync_seq_teammembership_sync_seq.py +22 -0
- trueppm_api/apps/teams/migrations/0004_backfill_default_teams_on_upgrade.py +49 -0
- trueppm_api/apps/teams/migrations/__init__.py +0 -0
- trueppm_api/apps/teams/models.py +145 -0
- trueppm_api/apps/teams/permissions.py +149 -0
- trueppm_api/apps/teams/serializers.py +95 -0
- trueppm_api/apps/teams/services.py +440 -0
- trueppm_api/apps/teams/signals.py +61 -0
- trueppm_api/apps/teams/urls.py +34 -0
- trueppm_api/apps/teams/views.py +201 -0
- trueppm_api/apps/timetracking/__init__.py +0 -0
- trueppm_api/apps/timetracking/apps.py +9 -0
- trueppm_api/apps/timetracking/migrations/0001_initial.py +117 -0
- trueppm_api/apps/timetracking/migrations/0001_squashed_0004_release_0_4.py +167 -0
- trueppm_api/apps/timetracking/migrations/0002_timesheetsubmission.py +46 -0
- trueppm_api/apps/timetracking/migrations/0003_timeentry_deleted_at_timeentry_deleted_by.py +31 -0
- trueppm_api/apps/timetracking/migrations/0004_timeentry_sync_seq_and_more.py +24 -0
- trueppm_api/apps/timetracking/migrations/__init__.py +0 -0
- trueppm_api/apps/timetracking/models.py +178 -0
- trueppm_api/apps/timetracking/serializers.py +175 -0
- trueppm_api/apps/timetracking/services.py +211 -0
- trueppm_api/apps/timetracking/urls.py +47 -0
- trueppm_api/apps/timetracking/views.py +597 -0
- trueppm_api/apps/webhooks/__init__.py +0 -0
- trueppm_api/apps/webhooks/apps.py +8 -0
- trueppm_api/apps/webhooks/backfill.py +90 -0
- trueppm_api/apps/webhooks/dispatch.py +279 -0
- trueppm_api/apps/webhooks/migrations/0001_initial.py +146 -0
- trueppm_api/apps/webhooks/migrations/0001_squashed_0007_sprint_lifecycle_events.py +249 -0
- trueppm_api/apps/webhooks/migrations/0002_alter_webhook_events.py +32 -0
- trueppm_api/apps/webhooks/migrations/0003_delivery_status_created_idx.py +17 -0
- trueppm_api/apps/webhooks/migrations/0004_webhook_program_alter_webhook_project_and_more.py +64 -0
- trueppm_api/apps/webhooks/migrations/0005_webhook_delivery_sequence_numbers.py +30 -0
- trueppm_api/apps/webhooks/migrations/0006_webhook_format_alter_webhook_events_and_more.py +61 -0
- trueppm_api/apps/webhooks/migrations/0007_sprint_lifecycle_events.py +63 -0
- trueppm_api/apps/webhooks/migrations/0008_risk_baseline_comment_events.py +73 -0
- trueppm_api/apps/webhooks/migrations/0009_encrypt_webhook_secret_and_failure_counters.py +100 -0
- trueppm_api/apps/webhooks/migrations/0010_alter_webhook_disabled_at.py +21 -0
- trueppm_api/apps/webhooks/migrations/0011_webhookeditor.py +48 -0
- trueppm_api/apps/webhooks/migrations/0012_alter_webhook_disabled_at.py +21 -0
- trueppm_api/apps/webhooks/migrations/__init__.py +0 -0
- trueppm_api/apps/webhooks/models.py +437 -0
- trueppm_api/apps/webhooks/serializers.py +326 -0
- trueppm_api/apps/webhooks/tasks.py +680 -0
- trueppm_api/apps/webhooks/urls.py +22 -0
- trueppm_api/apps/webhooks/views.py +533 -0
- trueppm_api/apps/workflow_engine/__init__.py +0 -0
- trueppm_api/apps/workflow_engine/apps.py +23 -0
- trueppm_api/apps/workflow_engine/migrations/0001_initial.py +230 -0
- trueppm_api/apps/workflow_engine/migrations/0001_squashed_0002_remove_workflowhistoryevent_workflow_history_lookup_idx.py +234 -0
- trueppm_api/apps/workflow_engine/migrations/0002_remove_workflowhistoryevent_workflow_history_lookup_idx.py +16 -0
- trueppm_api/apps/workflow_engine/migrations/0003_workflowoutboxrow_workflow_outbox_recovery_idx.py +21 -0
- trueppm_api/apps/workflow_engine/migrations/__init__.py +0 -0
- trueppm_api/apps/workflow_engine/models.py +265 -0
- trueppm_api/apps/workflow_engine/tasks.py +371 -0
- trueppm_api/apps/workspace/__init__.py +0 -0
- trueppm_api/apps/workspace/apps.py +10 -0
- trueppm_api/apps/workspace/backfill.py +111 -0
- trueppm_api/apps/workspace/export.py +254 -0
- trueppm_api/apps/workspace/migrations/0001_initial.py +326 -0
- trueppm_api/apps/workspace/migrations/0001_squashed_0014_workspacemembership_availability_effective_from_and_more.py +829 -0
- trueppm_api/apps/workspace/migrations/0002_remove_workspace_fiscal_year_start_and_more.py +85 -0
- trueppm_api/apps/workspace/migrations/0003_workspaceexportjob.py +73 -0
- trueppm_api/apps/workspace/migrations/0004_alter_workspaceinvite_status.py +27 -0
- trueppm_api/apps/workspace/migrations/0005_workspace_iteration_label_and_more.py +26 -0
- trueppm_api/apps/workspace/migrations/0006_alter_groupmembership_unique_together_and_more.py +45 -0
- trueppm_api/apps/workspace/migrations/0007_workspace_public_sharing_override_policy.py +21 -0
- trueppm_api/apps/workspace/migrations/0008_workspace_mc_history_attribution_audience_and_more.py +44 -0
- trueppm_api/apps/workspace/migrations/0009_workspace_methodology_and_more.py +186 -0
- trueppm_api/apps/workspace/migrations/0010_workspace_logo.py +38 -0
- trueppm_api/apps/workspace/migrations/0011_historicalworkspace_task_duration_change_percent_override_policy_and_more.py +56 -0
- trueppm_api/apps/workspace/migrations/0012_historicalworkspace_allowed_attachment_types_and_more.py +64 -0
- trueppm_api/apps/workspace/migrations/0013_auditevent.py +70 -0
- trueppm_api/apps/workspace/migrations/0014_workspacemembership_availability_effective_from_and_more.py +39 -0
- trueppm_api/apps/workspace/migrations/0015_squashed_0027_release_0_4.py +199 -0
- trueppm_api/apps/workspace/migrations/0015_trash_restore_1113.py +34 -0
- trueppm_api/apps/workspace/migrations/0016_historicalworkspace_calendar_and_more.py +55 -0
- trueppm_api/apps/workspace/migrations/0017_historicalworkspace_estimation_scale_and_more.py +38 -0
- trueppm_api/apps/workspace/migrations/0018_historicalworkspace_feedback_enabled_and_more.py +32 -0
- trueppm_api/apps/workspace/migrations/0019_historicalworkspace_mcp_enabled_and_more.py +22 -0
- trueppm_api/apps/workspace/migrations/0020_viewer_ordinal_one.py +34 -0
- trueppm_api/apps/workspace/migrations/0021_group_sync_seq_groupmembership_sync_seq_and_more.py +27 -0
- trueppm_api/apps/workspace/migrations/0022_historicalworkspace_sprint_picker_ready_only_default_and_more.py +22 -0
- trueppm_api/apps/workspace/migrations/0023_alter_auditevent_event_type.py +32 -0
- trueppm_api/apps/workspace/migrations/0024_alter_auditevent_event_type.py +33 -0
- trueppm_api/apps/workspace/migrations/0025_alter_auditevent_event_type.py +36 -0
- trueppm_api/apps/workspace/migrations/0026_alter_auditevent_event_type.py +37 -0
- trueppm_api/apps/workspace/migrations/0027_alter_auditevent_event_type.py +42 -0
- trueppm_api/apps/workspace/migrations/__init__.py +0 -0
- trueppm_api/apps/workspace/models.py +857 -0
- trueppm_api/apps/workspace/permissions.py +187 -0
- trueppm_api/apps/workspace/serializers.py +590 -0
- trueppm_api/apps/workspace/services.py +967 -0
- trueppm_api/apps/workspace/signals.py +37 -0
- trueppm_api/apps/workspace/tasks.py +616 -0
- trueppm_api/apps/workspace/urls.py +113 -0
- trueppm_api/apps/workspace/views.py +1581 -0
- trueppm_api/asgi.py +49 -0
- trueppm_api/celery.py +40 -0
- trueppm_api/core/__init__.py +0 -0
- trueppm_api/core/admin_site.py +206 -0
- trueppm_api/core/auth_views.py +934 -0
- trueppm_api/core/constant_time.py +51 -0
- trueppm_api/core/csp.py +54 -0
- trueppm_api/core/db.py +87 -0
- trueppm_api/core/db_session.py +37 -0
- trueppm_api/core/demo_read_only.py +314 -0
- trueppm_api/core/exception_handlers.py +157 -0
- trueppm_api/core/export_downloads.py +56 -0
- trueppm_api/core/extension_providers.py +56 -0
- trueppm_api/core/extension_signals.py +147 -0
- trueppm_api/core/idempotent.py +260 -0
- trueppm_api/core/metadata.py +42 -0
- trueppm_api/core/middleware.py +51 -0
- trueppm_api/core/openapi.py +1221 -0
- trueppm_api/core/password_reset.py +513 -0
- trueppm_api/core/protect_conflict.py +100 -0
- trueppm_api/core/ratelimit.py +148 -0
- trueppm_api/core/redis_throttle.py +82 -0
- trueppm_api/core/refresh_cookie_policy.py +156 -0
- trueppm_api/core/request_body.py +86 -0
- trueppm_api/core/security_checks.py +1034 -0
- trueppm_api/core/storage_config.py +105 -0
- trueppm_api/core/text_decode.py +168 -0
- trueppm_api/core/throttling.py +514 -0
- trueppm_api/core/valkey.py +214 -0
- trueppm_api/core/valkey_cache.py +66 -0
- trueppm_api/core/valkey_checks.py +104 -0
- trueppm_api/core/valkey_config.py +39 -0
- trueppm_api/core/worker_broker_wait.py +149 -0
- trueppm_api/core/worker_heartbeat.py +134 -0
- trueppm_api/core/worker_selfheal.py +205 -0
- trueppm_api/fields.py +36 -0
- trueppm_api/permissions.py +30 -0
- trueppm_api/py.typed +0 -0
- trueppm_api/routing.py +11 -0
- trueppm_api/settings/__init__.py +0 -0
- trueppm_api/settings/base.py +2605 -0
- trueppm_api/settings/dev.py +296 -0
- trueppm_api/settings/prod.py +265 -0
- trueppm_api/urls.py +217 -0
- trueppm_api/workflows/__init__.py +38 -0
- trueppm_api/workflows/backends/__init__.py +6 -0
- trueppm_api/workflows/backends/default.py +297 -0
- trueppm_api/workflows/consumers/__init__.py +11 -0
- trueppm_api/workflows/consumers/requeue_failed_task.py +65 -0
- trueppm_api/workflows/interface.py +148 -0
- trueppm_api/workflows/registry.py +106 -0
- trueppm_api/workflows/services.py +90 -0
- trueppm_api/wsgi.py +11 -0
- trueppm_api-0.4.0.dist-info/METADATA +273 -0
- trueppm_api-0.4.0.dist-info/RECORD +799 -0
- trueppm_api-0.4.0.dist-info/WHEEL +4 -0
- trueppm_api-0.4.0.dist-info/licenses/LICENSE +201 -0
- trueppm_api-0.4.0.dist-info/licenses/NOTICE +7 -0
- trueppm_api-0.4.0.dist-info/licenses/NOTICES +104 -0
- trueppm_api-0.4.0.dist-info/licenses/licenses/GPL-3.0.txt +674 -0
- trueppm_api-0.4.0.dist-info/licenses/licenses/LGPL-3.0.txt +165 -0
- trueppm_api-0.4.0.dist-info/licenses/licenses/MPL-2.0.txt +373 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"""Models for Beat liveness observability (ADR-0081) and the retention policy
|
|
2
|
+
editor + purge-run history (ADR-0173)."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import uuid
|
|
7
|
+
from datetime import time
|
|
8
|
+
|
|
9
|
+
from django.db import models
|
|
10
|
+
from django.utils import timezone
|
|
11
|
+
|
|
12
|
+
from trueppm_api.apps.observability.retention import RETENTION_KEY_CHOICES
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class BeatHeartbeat(models.Model):
|
|
16
|
+
"""Single-row liveness marker upserted by the ``beat.heartbeat`` task.
|
|
17
|
+
|
|
18
|
+
A live Celery Beat process refreshes ``last_heartbeat`` every 30 s. A stale
|
|
19
|
+
value means Beat (or the worker draining its queue) has stopped — every drain
|
|
20
|
+
and purge runs from that single Beat process, so its death is a silent SPOF.
|
|
21
|
+
Staleness is surfaced by ``GET /api/v1/health/beat/`` (primary, external) and
|
|
22
|
+
the ``beat.check_stale_heartbeat`` WARNING log (secondary, in-cluster).
|
|
23
|
+
|
|
24
|
+
The ``singleton_key`` unique constraint enforces exactly one row: every upsert
|
|
25
|
+
targets ``singleton_key=1``, so concurrent heartbeats update rather than insert.
|
|
26
|
+
Not a synced model — it carries no ``server_version`` and never reaches clients.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
|
30
|
+
singleton_key = models.PositiveSmallIntegerField(unique=True, default=1, editable=False)
|
|
31
|
+
last_heartbeat = models.DateTimeField()
|
|
32
|
+
|
|
33
|
+
def __str__(self) -> str:
|
|
34
|
+
return f"BeatHeartbeat(last_heartbeat={self.last_heartbeat.isoformat()})"
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class RetentionPolicy(models.Model):
|
|
38
|
+
"""Operator override for one ADR-0081 retention window (ADR-0173 §A).
|
|
39
|
+
|
|
40
|
+
A row is an *override* layered over the ``settings.*`` default — its absence
|
|
41
|
+
means "use the default", so a deployment that never opens the editor behaves
|
|
42
|
+
exactly as before. ``enabled=False`` disables the purge (unbounded retention),
|
|
43
|
+
mirroring the settings ``None`` semantics. ``value`` is in the window's native
|
|
44
|
+
unit (days for four tables, hours for sync batches). Resolution goes through
|
|
45
|
+
:func:`trueppm_api.apps.observability.retention.resolve_retention`.
|
|
46
|
+
|
|
47
|
+
Not a synced model — operator config, never reaches clients, no
|
|
48
|
+
``server_version``. ``updated_at`` is a last-writer timestamp only; the full
|
|
49
|
+
policy-change *audit trail* is the Enterprise overlay (trueppm-enterprise#137).
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
|
53
|
+
key = models.CharField(max_length=64, unique=True, choices=RETENTION_KEY_CHOICES)
|
|
54
|
+
enabled = models.BooleanField(default=True)
|
|
55
|
+
value = models.PositiveIntegerField()
|
|
56
|
+
updated_at = models.DateTimeField(auto_now=True)
|
|
57
|
+
|
|
58
|
+
class Meta:
|
|
59
|
+
verbose_name_plural = "retention policies"
|
|
60
|
+
|
|
61
|
+
def __str__(self) -> str:
|
|
62
|
+
state = f"{self.value}" if self.enabled else "disabled"
|
|
63
|
+
return f"RetentionPolicy({self.key}={state})"
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class RetentionSchedule(models.Model):
|
|
67
|
+
"""Singleton config for when the consolidated purge coordinator runs (ADR-0173 §D).
|
|
68
|
+
|
|
69
|
+
A single row (``singleton_key=1``) the coordinator self-gates on: it skips when
|
|
70
|
+
``frequency='off'``, before the configured ``time_of_day_utc`` window, or (when
|
|
71
|
+
``weekly``) on the wrong ``day_of_week``. ``on_failure`` decides whether a
|
|
72
|
+
table error aborts the run (``stop``) or flags the table and continues
|
|
73
|
+
(``continue``). All times are UTC with no DST shift — surfaced in the UI copy.
|
|
74
|
+
Not a synced model.
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
class Frequency(models.TextChoices):
|
|
78
|
+
DAILY = "daily", "Daily"
|
|
79
|
+
WEEKLY = "weekly", "Weekly"
|
|
80
|
+
OFF = "off", "Off"
|
|
81
|
+
|
|
82
|
+
class OnFailure(models.TextChoices):
|
|
83
|
+
CONTINUE = "continue", "Continue and flag the failed table"
|
|
84
|
+
STOP = "stop", "Stop the run on first error"
|
|
85
|
+
|
|
86
|
+
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
|
87
|
+
singleton_key = models.PositiveSmallIntegerField(unique=True, default=1, editable=False)
|
|
88
|
+
frequency = models.CharField(max_length=8, choices=Frequency.choices, default=Frequency.DAILY)
|
|
89
|
+
time_of_day_utc = models.TimeField(default=time(2, 0))
|
|
90
|
+
# 0=Monday … 6=Sunday, matching datetime.weekday(). Only meaningful when weekly.
|
|
91
|
+
day_of_week = models.PositiveSmallIntegerField(null=True, blank=True)
|
|
92
|
+
on_failure = models.CharField(
|
|
93
|
+
max_length=8, choices=OnFailure.choices, default=OnFailure.CONTINUE
|
|
94
|
+
)
|
|
95
|
+
updated_at = models.DateTimeField(auto_now=True)
|
|
96
|
+
|
|
97
|
+
def __str__(self) -> str:
|
|
98
|
+
return f"RetentionSchedule({self.frequency} @ {self.time_of_day_utc} UTC)"
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class PurgeRun(models.Model):
|
|
102
|
+
"""One unified retention-purge run across the six operational tables (ADR-0173 §B).
|
|
103
|
+
|
|
104
|
+
The coordinator records a row per run — scheduled, manual, or dry-run — with a
|
|
105
|
+
per-table breakdown in ``tables``. This is the backing for the "recent purges"
|
|
106
|
+
log and flips the System Health Retention-purge card off ``unknown``
|
|
107
|
+
(resolves ADR-0172 §3). The table is self-bounding: the coordinator trims to
|
|
108
|
+
the most recent rows after each run, so it needs no separate retention knob.
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
class Trigger(models.TextChoices):
|
|
112
|
+
SCHEDULED = "scheduled", "Scheduled"
|
|
113
|
+
MANUAL = "manual", "Manual"
|
|
114
|
+
DRY_RUN = "dry_run", "Dry run"
|
|
115
|
+
|
|
116
|
+
class State(models.TextChoices):
|
|
117
|
+
RUNNING = "running", "Running"
|
|
118
|
+
OK = "ok", "OK"
|
|
119
|
+
PARTIAL = "partial", "Partial"
|
|
120
|
+
FAILED = "failed", "Failed"
|
|
121
|
+
|
|
122
|
+
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
|
123
|
+
started_at = models.DateTimeField(default=timezone.now, db_index=True)
|
|
124
|
+
finished_at = models.DateTimeField(null=True, blank=True)
|
|
125
|
+
# default=SCHEDULED is self-documenting: every PurgeRun is written by the
|
|
126
|
+
# coordinator, which always sets ``trigger`` explicitly, but the field-level
|
|
127
|
+
# default makes the most common case (the periodic Celery beat run) obvious
|
|
128
|
+
# without reading the writer (#841).
|
|
129
|
+
trigger = models.CharField(max_length=10, choices=Trigger.choices, default=Trigger.SCHEDULED)
|
|
130
|
+
state = models.CharField(max_length=8, choices=State.choices, default=State.RUNNING)
|
|
131
|
+
# [{"key","label","rows","bytes","state","error"}] — one entry per attempted table.
|
|
132
|
+
tables = models.JSONField(default=list)
|
|
133
|
+
rows_deleted = models.PositiveIntegerField(default=0)
|
|
134
|
+
bytes_freed = models.PositiveBigIntegerField(null=True, blank=True)
|
|
135
|
+
error = models.TextField(blank=True, default="")
|
|
136
|
+
|
|
137
|
+
class Meta:
|
|
138
|
+
ordering = ["-started_at"]
|
|
139
|
+
|
|
140
|
+
def __str__(self) -> str:
|
|
141
|
+
return f"PurgeRun({self.trigger} {self.state} @ {self.started_at.isoformat()})"
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"""OpenTelemetry foundation for the OSS API (ADR-0223, epic #707, issue #708).
|
|
2
|
+
|
|
3
|
+
Public surface — stable across releases (additive-only), imported by OSS Phase
|
|
4
|
+
1/2 instrumentation and by the proprietary ``trueppm-enterprise`` edition. OSS
|
|
5
|
+
never imports enterprise; enterprise imports this module (one-way boundary).
|
|
6
|
+
|
|
7
|
+
* :func:`bootstrap` — install the providers at startup (called from the app's
|
|
8
|
+
``ready()``); a strict no-op unless an OTLP endpoint is configured.
|
|
9
|
+
* :func:`register_provider_hook` / :class:`OTelBootstrapContext` — the enterprise
|
|
10
|
+
extension point.
|
|
11
|
+
* :func:`get_tracer` / :func:`get_meter` — stable accessors over the OTel API.
|
|
12
|
+
* :func:`is_enabled` — whether export is active.
|
|
13
|
+
* :func:`instrument` / :func:`wrap_asgi_app` — Phase 1 auto-instrumentation (#709).
|
|
14
|
+
* :func:`install_metrics` — Phase 2 native metric emission (#710).
|
|
15
|
+
* :mod:`attributes` — the ``trueppm.*`` attribute-key convention.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
from . import attributes
|
|
21
|
+
from .instrumentation import instrument, wrap_asgi_app
|
|
22
|
+
from .metrics import install_metrics
|
|
23
|
+
from .provider import (
|
|
24
|
+
OTelBootstrapContext,
|
|
25
|
+
ProviderHook,
|
|
26
|
+
bootstrap,
|
|
27
|
+
get_meter,
|
|
28
|
+
get_tracer,
|
|
29
|
+
is_enabled,
|
|
30
|
+
register_provider_hook,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
__all__ = [
|
|
34
|
+
"OTelBootstrapContext",
|
|
35
|
+
"ProviderHook",
|
|
36
|
+
"attributes",
|
|
37
|
+
"bootstrap",
|
|
38
|
+
"get_meter",
|
|
39
|
+
"get_tracer",
|
|
40
|
+
"install_metrics",
|
|
41
|
+
"instrument",
|
|
42
|
+
"is_enabled",
|
|
43
|
+
"register_provider_hook",
|
|
44
|
+
"wrap_asgi_app",
|
|
45
|
+
]
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
"""Canonical ``trueppm.*`` OpenTelemetry attribute-key convention (ADR-0223).
|
|
2
|
+
|
|
3
|
+
This module is the single source of truth for the span- and resource-attribute
|
|
4
|
+
key strings TruePPM emits. Every emitter — the OSS Phase 1/2 instrumentation and
|
|
5
|
+
the proprietary enterprise edition alike — imports these constants instead of
|
|
6
|
+
hand-typing the strings, so the namespace stays consistent and collision-free
|
|
7
|
+
across the two repositories.
|
|
8
|
+
|
|
9
|
+
Namespace ownership (ADR-0223 §3):
|
|
10
|
+
|
|
11
|
+
* **OSS-owned** sub-namespaces: ``trueppm.project.*``, ``trueppm.program.*``,
|
|
12
|
+
``trueppm.task.*``, ``trueppm.board.*``, ``trueppm.user.*``,
|
|
13
|
+
``trueppm.schedule.*``, ``trueppm.request.*``, and ``trueppm.edition``.
|
|
14
|
+
* **Enterprise-reserved** sub-namespaces (OSS never emits these, so there is no
|
|
15
|
+
collision): ``trueppm.portfolio.*``, ``trueppm.governance.*``,
|
|
16
|
+
``trueppm.tenant.*``.
|
|
17
|
+
|
|
18
|
+
Attributes that are not a business fact TruePPM owns MUST use the appropriate
|
|
19
|
+
OTel semantic-convention key (``http.*``, ``db.*``, ``messaging.*``) rather than
|
|
20
|
+
being forced under ``trueppm.*``.
|
|
21
|
+
|
|
22
|
+
The contract is **additive-only**: new keys may be added, but existing keys are
|
|
23
|
+
never renamed or removed, because the enterprise edition depends on them.
|
|
24
|
+
|
|
25
|
+
Emitted vs reserved (#2880)
|
|
26
|
+
---------------------------
|
|
27
|
+
Additive-only makes the key set a promise, so the promise has to distinguish a key
|
|
28
|
+
OSS actually writes from one it merely owns. Seven of the eight original span keys
|
|
29
|
+
had **zero** emit sites — a collector-side processor keyed on ``trueppm.task.id``
|
|
30
|
+
silently never fired, and the only test covering them asserted that the strings
|
|
31
|
+
started with ``trueppm.``, which is coverage of the constant rather than of
|
|
32
|
+
emission. :data:`EMITTED_SPAN_ATTRIBUTES` and :data:`RESERVED_SPAN_ATTRIBUTES`
|
|
33
|
+
partition :data:`SPAN_ATTRIBUTES` so the distinction is machine-checkable: a new
|
|
34
|
+
constant that lands in neither set fails ``test_otel_attribute_contract``, and every
|
|
35
|
+
emitted key is asserted against a span the real consumer produced.
|
|
36
|
+
|
|
37
|
+
Reserved keys are kept (removing a constant would break an enterprise import) but
|
|
38
|
+
carry the reason they are not emitted, next to the constant. Do not read a reserved
|
|
39
|
+
key as "not implemented yet" — two of the three name a fact this data model does not
|
|
40
|
+
have, and the third duplicates a resource attribute.
|
|
41
|
+
|
|
42
|
+
Actor attributes and privacy
|
|
43
|
+
----------------------------
|
|
44
|
+
``trueppm.user.*`` is the only part of the namespace that attributes a span to a
|
|
45
|
+
person. The policy, enforced by :mod:`.request_attributes`, is: the opaque primary
|
|
46
|
+
key and the symbolic project role, and **nothing else** — never an email, username,
|
|
47
|
+
display name, or client IP, which is why no key for them exists here. Operators who
|
|
48
|
+
must not export a per-user identifier at all set
|
|
49
|
+
``TRUEPPM_OTEL_ACTOR_ATTRIBUTES_ENABLED=false`` (Helm:
|
|
50
|
+
``observability.otlp.actorAttributes``); resource identity is unaffected.
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
from __future__ import annotations
|
|
54
|
+
|
|
55
|
+
# Root namespace for every TruePPM-owned attribute and the resource namespace.
|
|
56
|
+
NAMESPACE = "trueppm"
|
|
57
|
+
"""Root prefix for all TruePPM-owned OpenTelemetry attributes."""
|
|
58
|
+
|
|
59
|
+
# --- Resource attributes (set once, at provider build time) ----------------
|
|
60
|
+
# service.name / service.version / service.namespace are OTel-standard resource
|
|
61
|
+
# keys; trueppm.edition is our own, so a backend can split OSS vs enterprise
|
|
62
|
+
# traffic without parsing anything else.
|
|
63
|
+
RESOURCE_SERVICE_NAME = "service.name"
|
|
64
|
+
RESOURCE_SERVICE_VERSION = "service.version"
|
|
65
|
+
RESOURCE_SERVICE_NAMESPACE = "service.namespace"
|
|
66
|
+
RESOURCE_EDITION = "trueppm.edition"
|
|
67
|
+
|
|
68
|
+
# --- Span attributes (OSS-owned) -------------------------------------------
|
|
69
|
+
PROJECT_ID = "trueppm.project.id"
|
|
70
|
+
"""Project UUID. On the HTTP server span for any project-scoped route, and on the
|
|
71
|
+
CPM / Monte Carlo engine spans."""
|
|
72
|
+
PROJECT_KEY = "trueppm.project.key"
|
|
73
|
+
"""RESERVED — not emitted. There is no ``Project.key``: the human-readable short
|
|
74
|
+
code is ``Project.code``, which is blank by default and not an identifier. The
|
|
75
|
+
additive-only rule forbids renaming this to ``trueppm.project.code``, so the key is
|
|
76
|
+
kept and left unwritten rather than filled with something it does not name. Use
|
|
77
|
+
``trueppm.project.id``."""
|
|
78
|
+
PROGRAM_ID = "trueppm.program.id"
|
|
79
|
+
"""Program UUID. On the HTTP server span for any program-scoped route."""
|
|
80
|
+
TASK_ID = "trueppm.task.id"
|
|
81
|
+
"""Task UUID. On the HTTP server span for a task-scoped route."""
|
|
82
|
+
BOARD_ID = "trueppm.board.id"
|
|
83
|
+
"""RESERVED — not emitted. TruePPM has no board entity to identify: a board is a
|
|
84
|
+
view of a project (``BoardColumnConfig`` / ``BoardSavedView`` are project-scoped
|
|
85
|
+
config rows), and the board WebSocket group and ``broadcast_board_event()`` both fan
|
|
86
|
+
out on the *project* id. A board-scoped consumer keys on ``trueppm.project.id``."""
|
|
87
|
+
USER_ID = "trueppm.user.id"
|
|
88
|
+
"""Acting user's primary key, on the HTTP server span. Opaque UUID only — see the
|
|
89
|
+
actor-attribute policy in this module's docstring. Suppressed by
|
|
90
|
+
``TRUEPPM_OTEL_ACTOR_ATTRIBUTES_ENABLED=false``."""
|
|
91
|
+
USER_ROLE = "trueppm.user.role"
|
|
92
|
+
"""Symbolic project role the request was authorized under (``VIEWER`` | ``MEMBER`` |
|
|
93
|
+
``SCHEDULER`` | ``ADMIN`` | ``OWNER``), on the HTTP server span.
|
|
94
|
+
|
|
95
|
+
Only set when it is well defined: TruePPM roles are PROJECT-scoped (ADR-0072), so a
|
|
96
|
+
request that resolved exactly one project carries that project's role and a list
|
|
97
|
+
endpoint spanning many projects carries none — an arbitrary pick would be worse than
|
|
98
|
+
absent. Read from the RBAC layer's per-request role cache, so it costs no extra
|
|
99
|
+
query. Suppressed by ``TRUEPPM_OTEL_ACTOR_ATTRIBUTES_ENABLED=false``."""
|
|
100
|
+
SCHEDULE_RECOMPUTE_REASON = "trueppm.schedule.recompute_reason"
|
|
101
|
+
# CPM / Monte Carlo engine-span sizing attributes (Phase 1, #709). These are the
|
|
102
|
+
# few low-cardinality shape facts worth attaching to a scheduling-engine span so an
|
|
103
|
+
# operator can correlate latency with graph size without opening the payload.
|
|
104
|
+
SCHEDULE_TASK_COUNT = "trueppm.schedule.task_count"
|
|
105
|
+
SCHEDULE_DEPENDENCY_COUNT = "trueppm.schedule.dependency_count"
|
|
106
|
+
SCHEDULE_CRITICAL_COUNT = "trueppm.schedule.critical_count"
|
|
107
|
+
SCHEDULE_SIMULATION_COUNT = "trueppm.schedule.simulation_count"
|
|
108
|
+
REQUEST_EDITION = "trueppm.request.edition"
|
|
109
|
+
"""RESERVED — not emitted. Duplicates :data:`RESOURCE_EDITION` (``trueppm.edition``),
|
|
110
|
+
which the provider sets on the ``Resource`` and every backend therefore attaches to
|
|
111
|
+
every span from the process. Edition cannot vary between two requests to the same
|
|
112
|
+
process, so a per-span copy carries no information and only multiplies payload. Group
|
|
113
|
+
by ``trueppm.edition``."""
|
|
114
|
+
|
|
115
|
+
# --- Metric-dimension attributes (Phase 2, #710) ---------------------------
|
|
116
|
+
# Low-cardinality dimensions on the native OTLP metrics. These are TruePPM-owned
|
|
117
|
+
# facts (which outbox, which lifecycle state, which server-side connection state),
|
|
118
|
+
# so they live under trueppm.* rather than a semantic-convention key. The metric
|
|
119
|
+
# names themselves (e.g. ``trueppm.outbox.depth``) are a separate namespace owned
|
|
120
|
+
# by ``otel.metrics`` and are documented there.
|
|
121
|
+
OUTBOX_NAME = "trueppm.outbox.name"
|
|
122
|
+
"""Which transactional outbox a measurement is for: ``schedule`` | ``workflow``."""
|
|
123
|
+
OUTBOX_STATE = "trueppm.outbox.state"
|
|
124
|
+
"""The outbox-row lifecycle state a depth measurement counts: ``pending`` | ``dispatched``."""
|
|
125
|
+
DB_STATE = "trueppm.db.state"
|
|
126
|
+
"""PostgreSQL backend state bucket: ``active`` | ``idle`` | ``idle_in_transaction`` | ``other``."""
|
|
127
|
+
BROKER_QUEUE = "messaging.destination.name"
|
|
128
|
+
"""Celery broker queue name a depth measurement is for (e.g. ``celery``).
|
|
129
|
+
|
|
130
|
+
A broker queue is not a TruePPM-owned business fact, so per the namespace rule at
|
|
131
|
+
the top of this module it uses the OTel ``messaging.*`` semantic-convention key
|
|
132
|
+
rather than being forced under ``trueppm.*``."""
|
|
133
|
+
# Distinct from TASK_ID (``trueppm.task.id``, a domain project Task row) — these
|
|
134
|
+
# dimension a Celery task *execution*, not a project Task (#1917).
|
|
135
|
+
CELERY_TASK_NAME = "trueppm.celery.task_name"
|
|
136
|
+
"""Celery task's registered name, e.g. ``scheduling.recalculate``."""
|
|
137
|
+
CELERY_TASK_OUTCOME = "trueppm.celery.outcome"
|
|
138
|
+
"""Lower-cased terminal Celery state for one execution: ``success`` | ``failure`` |
|
|
139
|
+
``retry`` | etc."""
|
|
140
|
+
|
|
141
|
+
# --- Agent / MCP span attributes (OSS-owned, ADR-0112 RC1, #1805) ----------
|
|
142
|
+
# Set on the request span when an MCP/agent token acts, so an operator can attribute
|
|
143
|
+
# a read (or a refusal) to a token + scope + actor kind without opening the payload.
|
|
144
|
+
# NEVER carries token material — only the 8-char prefix.
|
|
145
|
+
AGENT_TOKEN_PREFIX = "trueppm.agent.token_prefix"
|
|
146
|
+
"""First 8 hex chars of the acting API token — never the token itself."""
|
|
147
|
+
AGENT_CAPABILITY = "trueppm.agent.capability"
|
|
148
|
+
"""The scope/capability that authorized (or was checked for) the action, e.g. ``mcp:read``."""
|
|
149
|
+
AGENT_ACTOR_KIND = "trueppm.agent.actor_kind"
|
|
150
|
+
"""The actor kind, e.g. ``mcp_token`` (ADR-0112 §1)."""
|
|
151
|
+
AGENT_VERDICT = "trueppm.agent.verdict"
|
|
152
|
+
"""The decision outcome: ``allowed`` | ``refused`` | ``requires_approval``."""
|
|
153
|
+
|
|
154
|
+
# --- Emitted / reserved partition (#2880) ----------------------------------
|
|
155
|
+
# Every span-attribute key this module owns, and the two-way split that says which
|
|
156
|
+
# of them OSS actually writes. `test_otel_attribute_contract` asserts (a) the split
|
|
157
|
+
# partitions SPAN_ATTRIBUTES exactly — so a new constant that is classified in
|
|
158
|
+
# neither set fails the suite rather than joining the published surface unnoticed —
|
|
159
|
+
# and (b) each EMITTED key appears on a span produced by RUNNING its consumer, not
|
|
160
|
+
# merely that the string is well formed. Metric dimensions are a separate surface
|
|
161
|
+
# (their emission is covered by test_otel_metrics) and are deliberately not listed.
|
|
162
|
+
SPAN_ATTRIBUTES: tuple[str, ...] = (
|
|
163
|
+
PROJECT_ID,
|
|
164
|
+
PROJECT_KEY,
|
|
165
|
+
PROGRAM_ID,
|
|
166
|
+
TASK_ID,
|
|
167
|
+
BOARD_ID,
|
|
168
|
+
USER_ID,
|
|
169
|
+
USER_ROLE,
|
|
170
|
+
SCHEDULE_RECOMPUTE_REASON,
|
|
171
|
+
SCHEDULE_TASK_COUNT,
|
|
172
|
+
SCHEDULE_DEPENDENCY_COUNT,
|
|
173
|
+
SCHEDULE_CRITICAL_COUNT,
|
|
174
|
+
SCHEDULE_SIMULATION_COUNT,
|
|
175
|
+
REQUEST_EDITION,
|
|
176
|
+
AGENT_TOKEN_PREFIX,
|
|
177
|
+
AGENT_CAPABILITY,
|
|
178
|
+
AGENT_ACTOR_KIND,
|
|
179
|
+
AGENT_VERDICT,
|
|
180
|
+
)
|
|
181
|
+
"""Every ``trueppm.*`` span-attribute key this module publishes."""
|
|
182
|
+
|
|
183
|
+
EMITTED_SPAN_ATTRIBUTES: frozenset[str] = frozenset(
|
|
184
|
+
{
|
|
185
|
+
PROJECT_ID,
|
|
186
|
+
PROGRAM_ID,
|
|
187
|
+
TASK_ID,
|
|
188
|
+
USER_ID,
|
|
189
|
+
USER_ROLE,
|
|
190
|
+
SCHEDULE_RECOMPUTE_REASON,
|
|
191
|
+
SCHEDULE_TASK_COUNT,
|
|
192
|
+
SCHEDULE_DEPENDENCY_COUNT,
|
|
193
|
+
SCHEDULE_CRITICAL_COUNT,
|
|
194
|
+
SCHEDULE_SIMULATION_COUNT,
|
|
195
|
+
AGENT_TOKEN_PREFIX,
|
|
196
|
+
AGENT_CAPABILITY,
|
|
197
|
+
AGENT_ACTOR_KIND,
|
|
198
|
+
AGENT_VERDICT,
|
|
199
|
+
}
|
|
200
|
+
)
|
|
201
|
+
"""Keys OSS writes to a real span. A backend processor may key on these."""
|
|
202
|
+
|
|
203
|
+
RESERVED_SPAN_ATTRIBUTES: frozenset[str] = frozenset(
|
|
204
|
+
{
|
|
205
|
+
PROJECT_KEY,
|
|
206
|
+
BOARD_ID,
|
|
207
|
+
REQUEST_EDITION,
|
|
208
|
+
}
|
|
209
|
+
)
|
|
210
|
+
"""Keys the namespace owns but OSS never writes. Each constant's docstring gives the
|
|
211
|
+
reason, and none of them is "not yet implemented": two name a fact this data model
|
|
212
|
+
does not have, and the third duplicates a resource attribute. A processor keyed on
|
|
213
|
+
one of these will never fire."""
|
|
214
|
+
|
|
215
|
+
__all__ = [
|
|
216
|
+
"AGENT_ACTOR_KIND",
|
|
217
|
+
"AGENT_CAPABILITY",
|
|
218
|
+
"AGENT_TOKEN_PREFIX",
|
|
219
|
+
"AGENT_VERDICT",
|
|
220
|
+
"BOARD_ID",
|
|
221
|
+
"BROKER_QUEUE",
|
|
222
|
+
"CELERY_TASK_NAME",
|
|
223
|
+
"CELERY_TASK_OUTCOME",
|
|
224
|
+
"DB_STATE",
|
|
225
|
+
"EMITTED_SPAN_ATTRIBUTES",
|
|
226
|
+
"NAMESPACE",
|
|
227
|
+
"OUTBOX_NAME",
|
|
228
|
+
"OUTBOX_STATE",
|
|
229
|
+
"PROGRAM_ID",
|
|
230
|
+
"PROJECT_ID",
|
|
231
|
+
"PROJECT_KEY",
|
|
232
|
+
"REQUEST_EDITION",
|
|
233
|
+
"RESERVED_SPAN_ATTRIBUTES",
|
|
234
|
+
"RESOURCE_EDITION",
|
|
235
|
+
"RESOURCE_SERVICE_NAME",
|
|
236
|
+
"RESOURCE_SERVICE_NAMESPACE",
|
|
237
|
+
"RESOURCE_SERVICE_VERSION",
|
|
238
|
+
"SCHEDULE_CRITICAL_COUNT",
|
|
239
|
+
"SCHEDULE_DEPENDENCY_COUNT",
|
|
240
|
+
"SCHEDULE_RECOMPUTE_REASON",
|
|
241
|
+
"SCHEDULE_SIMULATION_COUNT",
|
|
242
|
+
"SCHEDULE_TASK_COUNT",
|
|
243
|
+
"SPAN_ATTRIBUTES",
|
|
244
|
+
"TASK_ID",
|
|
245
|
+
"USER_ID",
|
|
246
|
+
"USER_ROLE",
|
|
247
|
+
]
|