dataflow-core 2.1.5__py3-none-any.whl → 2.1.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of dataflow-core might be problematic. Click here for more details.

dataflow/db.py CHANGED
@@ -1,14 +1,20 @@
1
+ import dataflow
1
2
  from .database_manager import DatabaseManager
2
3
  from .configuration import ConfigurationManager
3
4
  from sqlalchemy.orm import declarative_base
4
5
  from sqlalchemy.exc import SQLAlchemyError
5
6
  from .utils.logger import CustomLogger
7
+ import os
8
+ import pwd
9
+ import grp
10
+ from urllib.parse import urlparse
6
11
 
7
12
  logger = CustomLogger().get_logger(__name__)
8
13
 
9
14
  dataflow_config = ConfigurationManager('/dataflow/app/config/dataflow.cfg')
15
+ dataflow_local_config = ConfigurationManager('/dataflow/app/auth_config/dataflow_auth.cfg')
10
16
  db_url = dataflow_config.get_config_value('database', 'database_url')
11
- local_db_url = dataflow_config.get_config_value('database', 'single_user_db_url')
17
+ local_db_url = dataflow_local_config.get_config_value('database', 'single_user_db_url')
12
18
 
13
19
  db_manager = DatabaseManager(db_url)
14
20
  local_db_manager = None
@@ -23,10 +29,44 @@ def create_tables(local_db=False):
23
29
  """
24
30
  try:
25
31
  if local_db:
26
- global local_db_manager
27
- if local_db_manager is None:
28
- local_db_manager = DatabaseManager(local_db_url)
29
- Local_Base.metadata.create_all(bind=local_db_manager.get_engine())
32
+ if local_db_url and local_db_url.startswith('sqlite:///'):
33
+ parsed_url = urlparse(local_db_url)
34
+ db_file_path = parsed_url.path
35
+ db_dir = os.path.dirname(db_file_path)
36
+ logger.info(f"Creating local database at: {db_file_path}")
37
+
38
+ if db_dir and not os.path.exists(db_dir):
39
+ os.makedirs(db_dir, exist_ok=True)
40
+ logger.info(f"Created directory for local database: {db_dir}")
41
+
42
+ # Set ownership for database directory and file
43
+ nb_user = os.environ.get("NB_USER")
44
+ if nb_user:
45
+ try:
46
+ uid = pwd.getpwnam(nb_user).pw_uid
47
+ gid = grp.getgrnam(nb_user).gr_gid
48
+
49
+ # Set ownership for database directory
50
+ if os.path.exists(db_dir):
51
+ os.chown(db_dir, uid, gid)
52
+
53
+ global local_db_manager
54
+ if local_db_manager is None:
55
+ local_db_manager = DatabaseManager(local_db_url)
56
+ Local_Base.metadata.create_all(bind=local_db_manager.get_engine())
57
+
58
+ if os.path.exists(db_file_path):
59
+ os.chown(db_file_path, uid, gid)
60
+ logger.info(f"Ownership set for local database files")
61
+ except (KeyError, OSError) as e:
62
+ logger.warning(f"Could not set ownership for database files: {e}")
63
+ else:
64
+ logger.error("NB_USER environment variable is not set. Cannot set ownership for local database files.")
65
+ raise ValueError("Can only use local database with a valid NB_USER environment variable")
66
+ else:
67
+ logger.error("Local database URL must be a valid SQLite URL starting with 'sqlite:///'")
68
+ raise ValueError("Local database URL must be a valid SQLite URL starting with 'sqlite:///'")
69
+
30
70
  else:
31
71
  Base.metadata.create_all(bind=db_manager.get_engine())
32
72
  logger.info("Database tables created successfully")
@@ -3,7 +3,7 @@
3
3
  from .role import Role
4
4
  from .user import User
5
5
  from .team import Team
6
- from .environment import Environment
6
+ from .environment import (Environment, LocalEnvironment, ArchivedEnvironment, JobLogs)
7
7
  from .project_details import ProjectDetails
8
8
  from .recent_projects import RecentProjects
9
9
  from .pinned_projects import PinnedProject
@@ -11,7 +11,7 @@ from .app_types import AppType
11
11
  from .blacklist_library import BlacklistedLibrary
12
12
  from .environment_status import EnvironmentStatus
13
13
  from .session import Session
14
- from .server_config import ServerConfig
14
+ from .server_config import ServerConfig, CustomServerConfig
15
15
  from .runtime import RuntimeZone
16
16
  from .environment_status import EnvironmentStatus
17
17
  from .user_team import UserTeam
@@ -1,8 +1,8 @@
1
1
  from sqlalchemy import Column, Integer, String, Boolean, Text, ForeignKey, DateTime
2
2
  from sqlalchemy.orm import relationship
3
3
  from sqlalchemy.sql import func
4
- from datetime import datetime
5
- from dataflow.db import Base
4
+ from datetime import datetime, timezone
5
+ from dataflow.db import Base, Local_Base
6
6
 
7
7
  class EnvironmentAttributes(Base):
8
8
  """
@@ -61,3 +61,15 @@ class JobLogs(Base):
61
61
  status = Column(String)
62
62
  created_by = Column(String)
63
63
 
64
+
65
+ class LocalEnvironment(Local_Base):
66
+ __tablename__ = "LOCAL_ENVIRONMENT"
67
+
68
+ id = Column(Integer, primary_key=True, autoincrement=True)
69
+ name = Column(String, nullable=False)
70
+ py_version = Column(String)
71
+ pip_libraries = Column(Text)
72
+ conda_libraries = Column(Text)
73
+ status = Column(String, default="Created")
74
+ updated_at = Column(DateTime, default=datetime.now(timezone.utc), onupdate=datetime.now(timezone.utc))
75
+ need_refresh = Column(Boolean, default=False)
@@ -6,8 +6,8 @@ class PinnedProject(Base):
6
6
  __tablename__ = "PINNED_PROJECT"
7
7
 
8
8
  id = Column(Integer, primary_key=True)
9
- user_id = Column(Integer, ForeignKey('USER.user_id'), index=True)
10
- project_id = Column(Integer, ForeignKey('PROJECT_DETAIL.project_id'), index=True)
9
+ user_id = Column(Integer, ForeignKey('USER.user_id', ondelete="CASCADE"), index=True)
10
+ project_id = Column(Integer, ForeignKey('PROJECT_DETAIL.project_id', ondelete="CASCADE"), index=True)
11
11
  pinned_at = Column(DateTime, default=datetime.utcnow)
12
12
 
13
13
  __table_args__ = (
@@ -10,7 +10,7 @@ class ProjectDetails(Base):
10
10
  git_url = Column(String)
11
11
  git_branch = Column(String, nullable=True)
12
12
  git_folder = Column(String, nullable=True)
13
- type = Column(String, ForeignKey('RUNTIME_APP_TYPE.name'), nullable=False)
13
+ type = Column(String, ForeignKey('RUNTIME_APP_TYPE.name', ondelete="CASCADE"), nullable=False)
14
14
  slug = Column(String, nullable=False, unique=True)
15
15
  runtime = Column(String, nullable=False)
16
16
  py_env = Column(String, nullable=True)
@@ -5,5 +5,5 @@ class RecentProjects(Base):
5
5
  __tablename__ = "RECENT_PROJECT"
6
6
 
7
7
  id = Column(Integer, primary_key=True, autoincrement=True)
8
- project_id = Column(Integer, ForeignKey('PROJECT_DETAIL.project_id'), nullable=False)
8
+ project_id = Column(Integer, ForeignKey('PROJECT_DETAIL.project_id', ondelete="CASCADE"), nullable=False)
9
9
 
@@ -24,7 +24,7 @@ class CustomServerConfig(Base):
24
24
  __tablename__ = "CUSTOM_SERVER"
25
25
 
26
26
  id = Column(Integer, primary_key=True, autoincrement=True)
27
- base_server_id = Column(Integer, ForeignKey(ServerConfig.id), nullable=False)
27
+ base_server_id = Column(Integer, ForeignKey(ServerConfig.id, ondelete="CASCADE"), nullable=False)
28
28
  display_name = Column(String, nullable=False, unique=True, index=True)
29
29
  description = Column(Text, nullable=True)
30
30
 
dataflow/models/user.py CHANGED
@@ -20,7 +20,8 @@ class User(Base):
20
20
  image_url = Column(String, nullable=True)
21
21
  active = Column(Enum('N', 'Y', name='active_field'), nullable=False, server_default=str("N"))
22
22
  password = Column(String, nullable=False)
23
- active_env = Column(String, ForeignKey('ENVIRONMENT.short_name'))
23
+ active_env = Column(String)
24
+ active_env_type = Column(String, nullable=True)
24
25
  current_server = Column(String)
25
26
  show_server_page = Column(Boolean, default = True)
26
27
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataflow-core
3
- Version: 2.1.5
3
+ Version: 2.1.6
4
4
  Summary: Dataflow core package
5
5
  Author: Dataflow
6
6
  Author-email:
@@ -6,26 +6,26 @@ dataflow/__init__.py,sha256=WTRg8HMpMWSgxYJ9ZGVldx4k07fAbta3mBmZ1hG9mWE,30
6
6
  dataflow/configuration.py,sha256=7To6XwH1eESiYp39eqPcswXWwrdBUdPF6xN6WnazOF0,663
7
7
  dataflow/database_manager.py,sha256=tJHMuOZ9Muskrh9t4uLRlTuFU0VkHAzoHlGP5DORIC4,899
8
8
  dataflow/dataflow.py,sha256=-UYZst7EO1GgaOjlAkKu-tu7RC6XsgadGeDp1MOvZiA,7439
9
- dataflow/db.py,sha256=5UwE4w5Vn9RqFIhr8ARlu2haZX-PtHDLRPjmn5BG2m8,1649
9
+ dataflow/db.py,sha256=73ojGqpCTRVTlPszD73Ozhjih_BI2KTHmazqxxL6iWk,3780
10
10
  dataflow/environment.py,sha256=05F-dBRyZu2mr26vuiuJU13pfgtRpA9yW69bk83HGUw,27239
11
- dataflow/models/__init__.py,sha256=QMLiKj8BMhfScWMm8kgHkMjwAlFeg5Cym3_AI1NvBUA,783
11
+ dataflow/models/__init__.py,sha256=7Wnx1_8eRd5QW07QlcY4-Pdt_3OD7dXm2-CcV0S6uy4,853
12
12
  dataflow/models/app_types.py,sha256=yE_ZB13lhpK7AZ7PyBwnQlf0RlIHYs_-vdMKx7_RMlY,379
13
13
  dataflow/models/blacklist_library.py,sha256=B2oi3Z8GcR_glhLAyinFk0W8c9txXvm3uOER6dY-q7I,991
14
14
  dataflow/models/connection.py,sha256=_VJL3KuIrm8t4lJmtunIL3-AXF9Yvi5wUolzdR3tE0E,1017
15
- dataflow/models/environment.py,sha256=Vg-4vQe_cHIfOX-kPJWd6SIEapPJcgxoCITgdRrqT_o,2107
15
+ dataflow/models/environment.py,sha256=300CUwx7d7bjadrMsTch7NSRYLCuf9AK9WVzlT26CAc,2616
16
16
  dataflow/models/environment_status.py,sha256=lvPDNUsUoTW9D97B07aKqJQHRKp4LvPM28pQDMPH1ac,536
17
17
  dataflow/models/git_ssh.py,sha256=W15SDypxzGOz_aZkHEnVZ6DIMVsjAsbSIXVIEt2mPYU,694
18
- dataflow/models/pinned_projects.py,sha256=rkpPX_f2U9HjmrRo7_K8rnZIeXuQKGq6hYTrtLmu21c,566
19
- dataflow/models/project_details.py,sha256=94wTygXv9iGB0w8g_6vtkB5ZqIzpEv1W9uWwCA4hM0Y,1078
18
+ dataflow/models/pinned_projects.py,sha256=I-XMQq7__XJJi2lyOdEvQEfhPRz8D6KHA6Cbavbf05o,606
19
+ dataflow/models/project_details.py,sha256=iNb95L3UGjcC_Ws6FiUTDANCUFhYWpnsKraS6rmCyRU,1098
20
20
  dataflow/models/recent_project_studio.py,sha256=m12KGCsv453C1ijHjfVD8E7cJ7Og_0N8uc7_9VlfkYw,812
21
- dataflow/models/recent_projects.py,sha256=QqDlk3ll7tBaQl5hqvRarlB9_SUBuN44muLIuTVbPe0,301
21
+ dataflow/models/recent_projects.py,sha256=OFd5MSRXVRHs9UbvUNoJBBnh9rgsJ0lwE23wm5_Hc5w,321
22
22
  dataflow/models/role.py,sha256=_I5F2TFox_k2-LGgjVuO2PIW9-gpwpoX8Te7m024A8k,693
23
23
  dataflow/models/role_server.py,sha256=mMcfjsGX1cY8hOAOBBmrZgw8ozdfuvjKJoBlR6F0Kdc,689
24
24
  dataflow/models/runtime.py,sha256=OiuBfZTMg81U10GS00DxfhiAmHlcyQUw5LBR8RaPl7s,415
25
- dataflow/models/server_config.py,sha256=GTMtQfgtuvKUbxV16VhEpKGhYoNISFLRWdUPqBJmYbM,1365
25
+ dataflow/models/server_config.py,sha256=8ocKT8tPen9tedO8BLPEfkWxUEIHaqvA2L-qEhrFND0,1385
26
26
  dataflow/models/session.py,sha256=c8TI6qXsM8utzp5vSQtAOXJSbgasnyu-a0qSAvA-rWs,459
27
27
  dataflow/models/team.py,sha256=fjkqF0N4PSwSYTgHjEQl9wuC7yumd0iOb5nNFePI6q4,488
28
- dataflow/models/user.py,sha256=PT-zwZj7NWUubIj_7EY2EsjduMbI_42EyMclWMLESGk,1073
28
+ dataflow/models/user.py,sha256=agxhZkkJ6C6_ZqNX-ISTBySeBz5kPw-OM_POMn_MESU,1086
29
29
  dataflow/models/user_environment.py,sha256=yI9NutULcLiwlycuEin6ROe6o1Sjdv_sgw2MEkJFeYg,568
30
30
  dataflow/models/user_team.py,sha256=r_fmKvf6JuGgiiI9TXWjVG2QZ3WOvDrOwYWVQ3r8oWo,659
31
31
  dataflow/models/variables.py,sha256=Sinvv3zFYni5i_GrL69cVfhCh4tOOaIHiEzWYRJ-i10,1132
@@ -37,8 +37,8 @@ dataflow/utils/aws_secrets_manager.py,sha256=A_fNs9VNah9dDdl9NhqizJamYU7xr2v_GXl
37
37
  dataflow/utils/get_current_user.py,sha256=akjcUyTpmMdAZj9LFGSTs76hjBRjltNk9hLUqC_BdkA,1140
38
38
  dataflow/utils/json_handler.py,sha256=5_7WdypegRBDe2HSqBXyrJAdd92wsha8qRcmQvCj1TA,782
39
39
  dataflow/utils/logger.py,sha256=7BFrOq5Oiqn8P4XZbgJzMP5O07d2fpdECbbfsjrUuHw,1213
40
- dataflow_core-2.1.5.dist-info/METADATA,sha256=8UhovnGu3NJ6b4wK-xBK7QBkr17y3O96P_RGTJHf8XY,301
41
- dataflow_core-2.1.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
42
- dataflow_core-2.1.5.dist-info/entry_points.txt,sha256=ppj_EIbYrJJwCPg1kfdsZk5q1N-Ejfis1neYrnjhO8o,117
43
- dataflow_core-2.1.5.dist-info/top_level.txt,sha256=SZsUOpSCK9ntUy-3Tusxzf5A2e8ebwD8vouPb1dPt_8,23
44
- dataflow_core-2.1.5.dist-info/RECORD,,
40
+ dataflow_core-2.1.6.dist-info/METADATA,sha256=riTs6HqJEWRlVFoaXya_aF98d_tJgB6TbuBBpIaTABo,301
41
+ dataflow_core-2.1.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
42
+ dataflow_core-2.1.6.dist-info/entry_points.txt,sha256=ppj_EIbYrJJwCPg1kfdsZk5q1N-Ejfis1neYrnjhO8o,117
43
+ dataflow_core-2.1.6.dist-info/top_level.txt,sha256=SZsUOpSCK9ntUy-3Tusxzf5A2e8ebwD8vouPb1dPt_8,23
44
+ dataflow_core-2.1.6.dist-info/RECORD,,