Skip to content

Commit 25e3421

Browse files
committed
make NotificationsConfig a separate table
1 parent 4458c9c commit 25e3421

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

jupyter_scheduler/models.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from enum import Enum
33
from typing import Dict, List, Optional, Type, Union
44

5-
from pydantic import BaseModel, root_validator
5+
from pydantic import BaseModel, root_validator, validator
66

77
Tags = List[str]
88
EnvironmentParameterValues = Union[int, float, bool, str]
@@ -38,7 +38,19 @@ class NotificationsConfig(BaseModel):
3838

3939
send_to: List[str]
4040
events: List[NotificationEvent]
41-
include_output: bool
41+
include_output: bool = False
42+
43+
@validator("send_to")
44+
def validate_send_to(self, send_to):
45+
if len(send_to) > 1000:
46+
raise ValueError("Too many email addresses. Maximum allowed is 1000.")
47+
return send_to
48+
49+
@validator("events")
50+
def validate_events(self, events):
51+
if len(events) > 1000:
52+
raise ValueError("Too many events. Maximum allowed is 1000.")
53+
return events
4254

4355

4456
class RuntimeEnvironment(BaseModel):

jupyter_scheduler/orm.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
from uuid import uuid4
55

66
import sqlalchemy.types as types
7-
from sqlalchemy import Boolean, Column, Integer, String, create_engine
8-
from sqlalchemy.orm import declarative_base, declarative_mixin, registry, sessionmaker
7+
from sqlalchemy import Boolean, Column, ForeignKey, Integer, String, create_engine
8+
from sqlalchemy.orm import declarative_base, declarative_mixin, registry, relationship, sessionmaker
99

1010
from jupyter_scheduler.models import EmailNotifications, Status
1111
from jupyter_scheduler.utils import get_utc_timestamp
@@ -67,6 +67,14 @@ def process_result_value(self, value, dialect):
6767
mapper_registry = registry()
6868

6969

70+
class NotificationsConfig(Base):
71+
__tablename__ = "notifications_config"
72+
id = Column(String(36), primary_key=True, default=generate_uuid)
73+
include_output = Column(Boolean, default=False)
74+
send_to = Column(JsonType, nullable=False)
75+
events = Column(JsonType, nullable=False)
76+
77+
7078
@declarative_mixin
7179
class CommonColumns:
7280
runtime_environment_name = Column(String(256), nullable=False)
@@ -98,7 +106,8 @@ class Job(CommonColumns, Base):
98106
url = Column(String(256), default=generate_jobs_url)
99107
pid = Column(Integer)
100108
idempotency_token = Column(String(256))
101-
notifications_config = Column(JsonType(1024), nullable=True)
109+
notifications_config_id = Column(String(36), ForeignKey("notifications_config.id"))
110+
notifications_config = relationship("NotificationsConfig")
102111

103112

104113
class JobDefinition(CommonColumns, Base):
@@ -109,7 +118,8 @@ class JobDefinition(CommonColumns, Base):
109118
url = Column(String(256), default=generate_job_definitions_url)
110119
create_time = Column(Integer, default=get_utc_timestamp)
111120
active = Column(Boolean, default=True)
112-
notifications_config = Column(JsonType(1024), nullable=True)
121+
notifications_config_id = Column(String(36), ForeignKey("notifications_config.id"))
122+
notifications_config = relationship("NotificationsConfig")
113123

114124

115125
def create_tables(db_url, drop_tables=False):

0 commit comments

Comments
 (0)