dataflow-core 2.1.31__tar.gz → 2.1.32__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/PKG-INFO +4 -2
  2. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/__init__.py +1 -0
  3. dataflow_core-2.1.32/dataflow/models/dbml_diagram.py +58 -0
  4. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/project_details.py +16 -1
  5. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/scripts/build_from_upper.sh +1 -1
  6. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow_core.egg-info/PKG-INFO +4 -2
  7. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow_core.egg-info/SOURCES.txt +3 -0
  8. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow_core.egg-info/requires.txt +3 -1
  9. dataflow_core-2.1.32/dfmigration/versions/028_create_diagram_table.py +60 -0
  10. dataflow_core-2.1.32/dfmigration/versions/029_project_studio_source.py +40 -0
  11. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/setup.py +4 -2
  12. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/README.md +0 -0
  13. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/authenticator/__init__.py +0 -0
  14. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/authenticator/dataflowairflowauthenticator.py +0 -0
  15. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/authenticator/dataflowhubauthenticator.py +0 -0
  16. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/authenticator/dataflowsupersetauthenticator.py +0 -0
  17. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/authenticator/utils/__init__.py +0 -0
  18. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/authenticator/utils/verify_email_domain.py +0 -0
  19. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/__init__.py +0 -0
  20. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/configuration.py +0 -0
  21. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/database_manager.py +0 -0
  22. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/dataflow.py +0 -0
  23. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/db.py +0 -0
  24. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/environment.py +0 -0
  25. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/active_server_view.py +0 -0
  26. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/ai_provider.py +0 -0
  27. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/app_types.py +0 -0
  28. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/blacklist_library.py +0 -0
  29. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/connection.py +0 -0
  30. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/connection_type.py +0 -0
  31. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/container.py +0 -0
  32. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/container_session_history.py +0 -0
  33. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/dataflow_setting.py +0 -0
  34. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/dataflow_zone.py +0 -0
  35. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/environment.py +0 -0
  36. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/environment_status.py +0 -0
  37. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/git_ssh.py +0 -0
  38. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/inference_service.py +0 -0
  39. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/onboarding_project.py +0 -0
  40. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/org_associations.py +0 -0
  41. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/organization.py +0 -0
  42. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/otp.py +0 -0
  43. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/pinned_projects.py +0 -0
  44. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/pod_activity.py +0 -0
  45. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/pod_session_history.py +0 -0
  46. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/recent_project_studio.py +0 -0
  47. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/recent_projects.py +0 -0
  48. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/role.py +0 -0
  49. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/role_server.py +0 -0
  50. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/role_zone.py +0 -0
  51. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/server_config.py +0 -0
  52. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/session.py +0 -0
  53. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/subscription.py +0 -0
  54. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/team.py +0 -0
  55. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/user.py +0 -0
  56. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/user_team.py +0 -0
  57. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/models/variables.py +0 -0
  58. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/schemas/__init__.py +0 -0
  59. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/schemas/ai_api_key.py +0 -0
  60. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/schemas/connection.py +0 -0
  61. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/schemas/git_ssh.py +0 -0
  62. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/schemas/secret.py +0 -0
  63. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/scripts/clone_environment.sh +0 -0
  64. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/scripts/create_environment.sh +0 -0
  65. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/secrets_manager/__init__.py +0 -0
  66. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/secrets_manager/factory.py +0 -0
  67. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/secrets_manager/interface.py +0 -0
  68. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/secrets_manager/providers/__init__.py +0 -0
  69. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/secrets_manager/providers/aws_manager.py +0 -0
  70. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/secrets_manager/providers/azure_manager.py +0 -0
  71. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/secrets_manager/providers/gcp_manager.py +0 -0
  72. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/secrets_manager/providers/infisical_manager.py +0 -0
  73. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/secrets_manager/providers/ovh_manager.py +0 -0
  74. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/secrets_manager/service.py +0 -0
  75. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/secrets_manager/utils.py +0 -0
  76. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/utils/__init__.py +0 -0
  77. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/utils/blocked_domains.py +0 -0
  78. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/utils/exceptions.py +0 -0
  79. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/utils/get_current_user.py +0 -0
  80. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/utils/local_env_validation.py +0 -0
  81. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow/utils/logger.py +0 -0
  82. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow_core.egg-info/dependency_links.txt +0 -0
  83. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow_core.egg-info/entry_points.txt +0 -0
  84. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dataflow_core.egg-info/top_level.txt +0 -0
  85. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/__init__.py +0 -0
  86. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/env.py +0 -0
  87. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/001_initial_baseline_migration.py +0 -0
  88. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/002_user_onboarding_migration.py +0 -0
  89. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/003_runtime_visibility.py +0 -0
  90. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/004_runtime_custom_image.py +0 -0
  91. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/005_session_table_migration.py +0 -0
  92. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/006_super_admin_migration.py +0 -0
  93. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/007_show_walkthrough_and_org_email_migration.py +0 -0
  94. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/008_costing_migration.py +0 -0
  95. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/009_session_migration.py +0 -0
  96. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/010_add_environment_job_table.py +0 -0
  97. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/011_connection_type_migration.py +0 -0
  98. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/012_app_type_public_and_project_description.py +0 -0
  99. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/013_add_container_table.py +0 -0
  100. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/014_active_server_view_can_spawn.py +0 -0
  101. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/015_add_agent_enabled_org.py +0 -0
  102. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/016_org_server_visibility_controls.py +0 -0
  103. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/017_add_created_at_to_user.py +0 -0
  104. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/018_add_inference_service_table.py +0 -0
  105. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/019_user_onboarding_demo_selection.py +0 -0
  106. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/020_create_onboarding_project_table.py +0 -0
  107. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/021_create_ai_byok_tables.py +0 -0
  108. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/022_shared_airflow_tenancy.py +0 -0
  109. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/023_session_history_table_update_container_table.py +0 -0
  110. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/024_add_status_reason_to_local_environment.py +0 -0
  111. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/025_add_project_preview_image.py +0 -0
  112. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/026_runtime_costing.py +0 -0
  113. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/027_local_environment_workset_columns.py +0 -0
  114. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/dfmigration/versions/__init__.py +0 -0
  115. {dataflow_core-2.1.31 → dataflow_core-2.1.32}/setup.cfg +0 -0
@@ -1,14 +1,16 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataflow-core
3
- Version: 2.1.31
3
+ Version: 2.1.32
4
4
  Summary: Dataflow core package
5
5
  Author: Dataflow
6
6
  Author-email:
7
- Requires-Dist: sqlalchemy
7
+ Requires-Dist: sqlalchemy<2.1
8
8
  Requires-Dist: alembic
9
9
  Requires-Dist: boto3
10
10
  Requires-Dist: psycopg2-binary
11
11
  Requires-Dist: pymysql
12
+ Requires-Dist: pymssql<3,>=2.2.8
13
+ Requires-Dist: sqlalchemy-bigquery<2,>=1.12.1
12
14
  Requires-Dist: requests
13
15
  Requires-Dist: azure-identity
14
16
  Requires-Dist: azure-keyvault-secrets
@@ -36,3 +36,4 @@ from .active_server_view import ActiveServerView
36
36
  from .inference_service import InferenceService, InferenceStatus
37
37
  from .onboarding_project import OnboardingProject
38
38
  from .ai_provider import AIProvider, AIModel, AIUserProviderKey
39
+ from .dbml_diagram import Diagram
@@ -0,0 +1,58 @@
1
+ from sqlalchemy import Column, Integer, String, ForeignKey, Text, DateTime, func, Enum, Index, text
2
+ from sqlalchemy.dialects.postgresql import JSONB, UUID
3
+ from dataflow.db import Base
4
+ import uuid
5
+
6
+
7
+ class Diagram(Base):
8
+
9
+ """TABLE 'DBML_DIAGRAM'
10
+
11
+ Stores a user-authored database ER diagram. The DBML source is the single source of
12
+ truth for the schema itself (tables, columns, relationships, header colours); the
13
+ layout column only holds presentation state that DBML has no syntax for, i.e. where
14
+ each table sits on the canvas and the last viewport.
15
+
16
+ Attributes:
17
+ id (int): Primary key for the diagram entry.
18
+ uid (UUID): Public identifier used in URLs, so the internal id is never exposed.
19
+ name (str): Display name of the diagram, unique per user within an organization.
20
+ description (str): Optional description of the diagram.
21
+ org_id (int): Foreign key referencing the ORGANIZATION table.
22
+ user_id (int): Foreign key referencing the USER table (the owner).
23
+ dbml_source (str): The DBML document defining the schema.
24
+ layout (dict): Canvas presentation state. Shape:
25
+ {"tables": {"public.users": {"x": 40, "y": 120}}, "viewport": {"x": 0, "y": 0, "zoom": 1}}
26
+ visibility (str): 'PRIVATE' or 'ORG'. Reserved for org sharing; currently always PRIVATE.
27
+ created_at (datetime): Timestamp of when the diagram was created.
28
+ updated_at (datetime): Timestamp of the last update to the diagram.
29
+ deleted_at (datetime): Soft delete timestamp; NULL while the diagram is active.
30
+
31
+ Constraints:
32
+ Index: Partial unique index ensuring a user cannot have two active diagrams
33
+ with the same name in the same organization.
34
+ """
35
+
36
+ __tablename__ = 'DBML_DIAGRAM'
37
+
38
+ id = Column(Integer, primary_key=True, autoincrement=True, nullable=False)
39
+ uid = Column(UUID(as_uuid=True), default=uuid.uuid4, nullable=False, unique=True, server_default=text("gen_random_uuid()"))
40
+ name = Column(String, nullable=False)
41
+ description = Column(Text, nullable=True)
42
+ org_id = Column(Integer, ForeignKey("ORGANIZATION.id", ondelete="CASCADE"), index=True, nullable=False)
43
+ user_id = Column(Integer, ForeignKey("USER.user_id", ondelete="CASCADE"), index=True, nullable=False)
44
+ dbml_source = Column(Text, nullable=False, server_default='')
45
+ layout = Column(JSONB, nullable=True)
46
+ visibility = Column(Enum("PRIVATE", "ORG", name="diagram_visibility"), default="PRIVATE", server_default="PRIVATE", nullable=False)
47
+ created_at = Column(DateTime(timezone=True), server_default=func.now())
48
+ updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
49
+ deleted_at = Column(DateTime(timezone=True), nullable=True)
50
+
51
+ __table_args__ = (
52
+ Index(
53
+ 'uq_active_diagram_name',
54
+ 'name', 'user_id', 'org_id',
55
+ unique=True,
56
+ postgresql_where=deleted_at.is_(None)
57
+ ),
58
+ )
@@ -36,7 +36,13 @@ class ProjectDetails(Base):
36
36
  exposed_port (int): Port exposed by the custom image.
37
37
  private_repo (bool): Whether the image repository is private.
38
38
  registry_secret_id (int): Foreign key referencing the VARIABLE table for registry credentials.
39
-
39
+ source_type (str): Where the project's code comes from: GIT (cloned from git_url) or STUDIO
40
+ (synced from the creator's Studio folder into the runtime's projects volume).
41
+ studio_source_path (str): For STUDIO projects, the source folder relative to the creator's
42
+ /home/jovyan.
43
+ last_synced_at (datetime): For STUDIO projects, when files were last synced from Studio.
44
+ synced_by (str): For STUDIO projects, the user who ran the last sync.
45
+
40
46
  Relationships:
41
47
  app_type: Relationship to the AppType model.
42
48
  """
@@ -87,6 +93,15 @@ class ProjectDetails(Base):
87
93
  resource_config = Column(JSONB, nullable=True)
88
94
  cost_incurred = Column(JSONB, nullable=True)
89
95
  runtime_cost_state = Column(JSONB, nullable=True)
96
+ source_type = Column(
97
+ Enum("GIT", "STUDIO", name="project_source_type"),
98
+ nullable=False,
99
+ default="GIT",
100
+ server_default="GIT",
101
+ )
102
+ studio_source_path = Column(String, nullable=True)
103
+ last_synced_at = Column(DateTime(timezone=True), nullable=True)
104
+ synced_by = Column(String, nullable=True)
90
105
 
91
106
  __table_args__ = (
92
107
  Index(
@@ -81,7 +81,7 @@ if [ "$base_prefix" = "$target_prefix" ]; then
81
81
  # mounted. Squash it as-is.
82
82
  squashfs_source="$merged_dir"
83
83
  else
84
- echo "base_prefix} to ${target_prefix}; cloning environment"
84
+ echo "${base_prefix} to ${target_prefix}; cloning environment"
85
85
 
86
86
  export PIP_NO_CACHE_DIR=1
87
87
  export CONDA_PKGS_DIRS="${scratch_dir}/pkgs/${env_name_with_version}/"
@@ -1,14 +1,16 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataflow-core
3
- Version: 2.1.31
3
+ Version: 2.1.32
4
4
  Summary: Dataflow core package
5
5
  Author: Dataflow
6
6
  Author-email:
7
- Requires-Dist: sqlalchemy
7
+ Requires-Dist: sqlalchemy<2.1
8
8
  Requires-Dist: alembic
9
9
  Requires-Dist: boto3
10
10
  Requires-Dist: psycopg2-binary
11
11
  Requires-Dist: pymysql
12
+ Requires-Dist: pymssql<3,>=2.2.8
13
+ Requires-Dist: sqlalchemy-bigquery<2,>=1.12.1
12
14
  Requires-Dist: requests
13
15
  Requires-Dist: azure-identity
14
16
  Requires-Dist: azure-keyvault-secrets
@@ -23,6 +23,7 @@ dataflow/models/container.py
23
23
  dataflow/models/container_session_history.py
24
24
  dataflow/models/dataflow_setting.py
25
25
  dataflow/models/dataflow_zone.py
26
+ dataflow/models/dbml_diagram.py
26
27
  dataflow/models/environment.py
27
28
  dataflow/models/environment_status.py
28
29
  dataflow/models/git_ssh.py
@@ -107,4 +108,6 @@ dfmigration/versions/024_add_status_reason_to_local_environment.py
107
108
  dfmigration/versions/025_add_project_preview_image.py
108
109
  dfmigration/versions/026_runtime_costing.py
109
110
  dfmigration/versions/027_local_environment_workset_columns.py
111
+ dfmigration/versions/028_create_diagram_table.py
112
+ dfmigration/versions/029_project_studio_source.py
110
113
  dfmigration/versions/__init__.py
@@ -1,8 +1,10 @@
1
- sqlalchemy
1
+ sqlalchemy<2.1
2
2
  alembic
3
3
  boto3
4
4
  psycopg2-binary
5
5
  pymysql
6
+ pymssql<3,>=2.2.8
7
+ sqlalchemy-bigquery<2,>=1.12.1
6
8
  requests
7
9
  azure-identity
8
10
  azure-keyvault-secrets
@@ -0,0 +1,60 @@
1
+ """Create DBML_DIAGRAM table for DBML ER diagrams
2
+
3
+ Revision ID: 028
4
+ Revises: 027
5
+ Create Date: 2026-08-17
6
+ """
7
+ from alembic import op
8
+ import sqlalchemy as sa
9
+ from sqlalchemy.dialects import postgresql
10
+
11
+ revision = "028"
12
+ down_revision = "027"
13
+ branch_labels = None
14
+ depends_on = None
15
+
16
+
17
+ def upgrade():
18
+ op.create_table(
19
+ "DBML_DIAGRAM",
20
+ sa.Column("id", sa.Integer(), autoincrement=True, nullable=False),
21
+ sa.Column("uid", postgresql.UUID(as_uuid=True), server_default=sa.text("gen_random_uuid()"), nullable=False),
22
+ sa.Column("name", sa.String(), nullable=False),
23
+ sa.Column("description", sa.Text(), nullable=True),
24
+ sa.Column("org_id", sa.Integer(), sa.ForeignKey("ORGANIZATION.id", ondelete="CASCADE"), nullable=False),
25
+ sa.Column("user_id", sa.Integer(), sa.ForeignKey("USER.user_id", ondelete="CASCADE"), nullable=False),
26
+ sa.Column("dbml_source", sa.Text(), server_default=sa.text("''"), nullable=False),
27
+ sa.Column("layout", postgresql.JSONB(), nullable=True),
28
+ sa.Column(
29
+ "visibility",
30
+ sa.Enum("PRIVATE", "ORG", name="diagram_visibility"),
31
+ server_default=sa.text("'PRIVATE'"),
32
+ nullable=False,
33
+ ),
34
+ sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False),
35
+ sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False),
36
+ sa.Column("deleted_at", sa.DateTime(timezone=True), nullable=True),
37
+ sa.PrimaryKeyConstraint("id"),
38
+ sa.UniqueConstraint("uid", name="uq_diagram_uid"),
39
+ )
40
+
41
+ op.create_index("ix_DBML_DIAGRAM_org_id", "DBML_DIAGRAM", ["org_id"], unique=False)
42
+ op.create_index("ix_DBML_DIAGRAM_user_id", "DBML_DIAGRAM", ["user_id"], unique=False)
43
+
44
+ # A user cannot have two ACTIVE diagrams with the same name in the same org.
45
+ # Soft-deleted rows are excluded so a name can be reused after deletion.
46
+ op.create_index(
47
+ "uq_active_diagram_name",
48
+ "DBML_DIAGRAM",
49
+ ["name", "user_id", "org_id"],
50
+ unique=True,
51
+ postgresql_where=sa.text("deleted_at IS NULL"),
52
+ )
53
+
54
+
55
+ def downgrade():
56
+ op.drop_index("uq_active_diagram_name", table_name="DBML_DIAGRAM")
57
+ op.drop_index("ix_DBML_DIAGRAM_user_id", table_name="DBML_DIAGRAM")
58
+ op.drop_index("ix_DBML_DIAGRAM_org_id", table_name="DBML_DIAGRAM")
59
+ op.drop_table("DBML_DIAGRAM")
60
+ op.execute("DROP TYPE IF EXISTS diagram_visibility")
@@ -0,0 +1,40 @@
1
+ """add studio source columns to project details
2
+
3
+ Revision ID: 029
4
+ Revises: 028
5
+ Create Date: 2026-10-13
6
+
7
+ Lets a project deployed to a runtime take its code from the creator's Studio folder
8
+ (synced into the runtime's projects volume) instead of a Git repository.
9
+ """
10
+
11
+ from alembic import op
12
+ import sqlalchemy as sa
13
+
14
+
15
+ revision = "029"
16
+ down_revision = "028"
17
+ branch_labels = None
18
+ depends_on = None
19
+
20
+
21
+ project_source_type = sa.Enum("GIT", "STUDIO", name="project_source_type")
22
+
23
+
24
+ def upgrade() -> None:
25
+ project_source_type.create(op.get_bind(), checkfirst=True)
26
+ op.add_column(
27
+ 'PROJECT_DETAIL',
28
+ sa.Column('source_type', project_source_type, nullable=False, server_default='GIT'),
29
+ )
30
+ op.add_column('PROJECT_DETAIL', sa.Column('studio_source_path', sa.String(), nullable=True))
31
+ op.add_column('PROJECT_DETAIL', sa.Column('last_synced_at', sa.DateTime(timezone=True), nullable=True))
32
+ op.add_column('PROJECT_DETAIL', sa.Column('synced_by', sa.String(), nullable=True))
33
+
34
+
35
+ def downgrade() -> None:
36
+ op.drop_column('PROJECT_DETAIL', 'synced_by')
37
+ op.drop_column('PROJECT_DETAIL', 'last_synced_at')
38
+ op.drop_column('PROJECT_DETAIL', 'studio_source_path')
39
+ op.drop_column('PROJECT_DETAIL', 'source_type')
40
+ project_source_type.drop(op.get_bind(), checkfirst=True)
@@ -14,18 +14,20 @@ class PostInstall(install):
14
14
 
15
15
  setup(
16
16
  name="dataflow-core",
17
- version="2.1.31",
17
+ version="2.1.32",
18
18
  packages=find_packages(include=["dataflow", "dataflow.*", "authenticator", "authenticator.*", "dfmigration", "dfmigration.*"]),
19
19
  include_package_data=True,
20
20
  package_data={
21
21
  "dataflow": ["scripts/*.sh"],
22
22
  },
23
23
  install_requires=[
24
- 'sqlalchemy',
24
+ 'sqlalchemy<2.1',
25
25
  'alembic',
26
26
  'boto3',
27
27
  'psycopg2-binary',
28
28
  'pymysql',
29
+ 'pymssql>=2.2.8,<3',
30
+ 'sqlalchemy-bigquery>=1.12.1,<2',
29
31
  'requests',
30
32
  'azure-identity',
31
33
  'azure-keyvault-secrets',
File without changes
File without changes