You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
get_update_log_message: on SUCCESS, formats result_summary into a readable message, e.g. "Project import completed — created 5 features, 3 segments, 1 environment". On FAILED, returns "Project import failed".
get_audit_log_author returns self.created_by
_get_project returns self.project
Import serializers — mirror the export serializers but for deserialization:
Accept name-based references, resolve to DB objects.
Reuse FeatureStateValueSerializer for value deserialization.
Reuse SegmentRuleSerializer / ConditionSerializer for segment rule deserialization.
Entity resolution service, structured as clean functions with clear signatures for future extraction into a shared provisioning core (Spike: Unified provisioning system #6797):
SKIP: create if missing, leave existing unchanged.
OVERWRITE_DESTRUCTIVE: delete matched segment (cascade deletes rules, conditions, and all FeatureSegment/FeatureState overrides), recreate from data. Reuses SegmentRuleSerializer for nested rules.
SKIP: create if missing, leave existing unchanged.
OVERWRITE_DESTRUCTIVE: delete matched feature (cascade), recreate from data. If project uses feature versioning, create a new EnvironmentFeatureVersion via versioning_service.update_flag.
For project-level format, call the service functions above in order:
Segments
Features
Environments (+ feature states and feature segments per environment)
Tags
Silently ignores identity_overrides in the export data (handled separately).
Each step runs in its own DB transaction — if step 3 fails, segments and features from steps 1-2 are already committed. The result_summary tracks progress so partial imports are visible.
New views:
POST /projects/{project_id}/project-imports/ — upload JSON + strategy.
GET /projects/{project_id}/project-imports/ — list imports.
Request/response serializers for create (file upload + strategy) and list.
Scope
ProjectImportabstract_base_auditable_model_factory()for audit log entries.history_record_class_path,related_object_type(newRelatedObjectType.PROJECT_IMPORT)projectFKcreated_byFK toFFAdminUser(nullable)created_by_api_keyFK toMasterAPIKey(nullable)strategy(SKIP / OVERWRITE_DESTRUCTIVE)status(PROCESSING / SUCCESS / FAILED)data—TextField, 10MB max.result_summary—JSONField(nullable). Populated by the import task on completion:created_atget_create_log_message: "Project import requested (strategy: Skip)" or "Project import requested (strategy: Overwrite Destructive)"get_update_log_message: on SUCCESS, formatsresult_summaryinto a readable message, e.g. "Project import completed — created 5 features, 3 segments, 1 environment". On FAILED, returns "Project import failed".get_audit_log_authorreturnsself.created_by_get_projectreturnsself.projectFeatureStateValueSerializerfor value deserialization.SegmentRuleSerializer/ConditionSerializerfor segment rule deserialization.resolve_or_create_environment(project, name, settings, strategy) -> Environmentresolve_or_create_tag(project, label, defaults) -> Tagresolve_or_create_segment(project, name, rules_data, strategy) -> SegmentSegmentRuleSerializerfor nested rules.resolve_or_create_feature(project, name, feature_data, strategy) -> FeatureEnvironmentFeatureVersionviaversioning_service.update_flag.create_feature_state(environment, feature, state_data) -> FeatureStatecreate_feature_segment(environment, feature, segment, priority, state_data) -> FeatureSegmentimport_project(project_import_id)identity_overridesin the export data (handled separately).result_summarytracks progress so partial imports are visible.POST /projects/{project_id}/project-imports/— upload JSON + strategy.GET /projects/{project_id}/project-imports/— list imports.Acceptance criteria (write as tests first)
POSTwith file + strategy creates an async import, returns 202.identity_overrideskey in export data is silently ignored.