Skip to content

Commit 9762203

Browse files
Small schedule fixes (#4561)
* Fix schedule snapshot detach * Remove some entitlement checks * Move analytics tracking * Fixes for triggers (#4562) * Update metadata instead of overwriting * Linting --------- Co-authored-by: Json-Andriopoulos <Json-Andriopoulos@users.noreply.github.com>
1 parent 0d00ffb commit 9762203

7 files changed

Lines changed: 40 additions & 34 deletions

File tree

src/zenml/analytics/utils.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,9 @@ def inner_func(*args: Any, **kwargs: Any) -> Any:
181181
try:
182182
for obj in list(args) + list(kwargs.values()):
183183
if isinstance(obj, AnalyticsTrackedModelMixin):
184-
handler.metadata = obj.get_analytics_metadata()
184+
handler.metadata.update(
185+
obj.get_analytics_metadata()
186+
)
185187
break
186188
except Exception as e:
187189
logger.debug(f"Analytics tracking failure for {func}: {e}")
@@ -190,7 +192,9 @@ def inner_func(*args: Any, **kwargs: Any) -> Any:
190192

191193
try:
192194
if isinstance(result, AnalyticsTrackedModelMixin):
193-
handler.metadata = result.get_analytics_metadata()
195+
handler.metadata.update(
196+
result.get_analytics_metadata()
197+
)
194198
except Exception as e:
195199
logger.debug(f"Analytics tracking failure for {func}: {e}")
196200

src/zenml/client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4024,7 +4024,7 @@ def list_schedule_triggers(
40244024
return self.zen_store.list_triggers(
40254025
triggers_filter_model=TriggerFilter(
40264026
project=project or self.active_project.id,
4027-
user=user or self.active_user.id,
4027+
user=user,
40284028
id=id,
40294029
created=created,
40304030
updated=updated,

src/zenml/models/v2/core/triggers.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
from abc import ABC, abstractmethod
1717
from datetime import datetime, timezone
18-
from typing import TYPE_CHECKING, Any, ClassVar, Literal, Optional, Type
18+
from typing import TYPE_CHECKING, Any, ClassVar, Dict, Literal, Optional, Type
1919

2020
from pydantic import BaseModel, Field, field_validator, model_validator
2121

@@ -80,6 +80,17 @@ def get_extra_fields(self) -> dict[str, Any]:
8080
"""
8181
pass
8282

83+
def get_analytics_metadata(self) -> Dict[str, Any]:
84+
"""Get the analytics metadata for the model.
85+
86+
Returns:
87+
Dict of analytics metadata.
88+
"""
89+
metadata = super().get_analytics_metadata()
90+
metadata["type"] = self.type.value
91+
metadata["flavor"] = self.flavor.value
92+
return metadata
93+
8394

8495
class TriggerUpdate(TriggerBase, BaseUpdate, ABC):
8596
"""Base trigger update class."""
@@ -434,6 +445,13 @@ class ScheduleTriggerResponseBody(ScheduleTrigger, TriggerResponseBody):
434445

435446
next_occurrence: datetime | None = None
436447

448+
@model_validator(mode="after")
449+
def _next_occurrence_for_inactive(self) -> "ScheduleTriggerResponseBody":
450+
if not (self.active and not self.is_archived):
451+
self.next_occurrence = None
452+
453+
return self
454+
437455
def get_extra_fields(self) -> list[str]:
438456
"""Returns the extra fields (e.g. next occurrence).
439457

src/zenml/pub_sub/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class SnapshotExecutionPayload(BaseModel):
2828
snapshot_id: UUID
2929
trigger_type: Literal["REST", "SCHEDULE", "WEBHOOK"]
3030
trigger_id: UUID | None = None
31+
scheduled_at: datetime | None = None
3132

3233

3334
class CriticalEventType(StrEnum):

src/zenml/zen_server/routers/trigger_endpoints.py

Lines changed: 10 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@
1717

1818
from fastapi import APIRouter, Depends, Security
1919

20-
from zenml.analytics.enums import AnalyticsEvent
21-
from zenml.analytics.utils import track_handler
2220
from zenml.constants import (
2321
API,
2422
PIPELINE_SNAPSHOTS,
@@ -80,18 +78,10 @@ def create_trigger(
8078
"""
8179
check_entitlement(feature=SCHEDULE_FEATURE)
8280

83-
with track_handler(
84-
event=AnalyticsEvent.CREATED_TRIGGER
85-
) as analytics_handler:
86-
analytics_handler.metadata = {
87-
"type": trigger.type.value,
88-
"flavor": trigger.flavor.value,
89-
}
90-
91-
return verify_permissions_and_create_entity(
92-
request_model=trigger,
93-
create_method=zen_store().create_trigger,
94-
)
81+
return verify_permissions_and_create_entity(
82+
request_model=trigger,
83+
create_method=zen_store().create_trigger,
84+
)
9585

9686

9787
@router.get(
@@ -117,8 +107,6 @@ def list_triggers(
117107
Returns:
118108
List of trigger objects.
119109
"""
120-
check_entitlement(feature=SCHEDULE_FEATURE)
121-
122110
return verify_permissions_and_list_entities(
123111
filter_model=trigger_filter_model,
124112
resource_type=ResourceType.TRIGGER,
@@ -147,8 +135,6 @@ def get_trigger(
147135
Returns:
148136
A specific trigger object.
149137
"""
150-
check_entitlement(feature=SCHEDULE_FEATURE)
151-
152138
return verify_permissions_and_get_entity(
153139
id=trigger_id,
154140
get_method=zen_store().get_trigger,
@@ -201,15 +187,12 @@ def delete_trigger(
201187
trigger_id: ID of the trigger to delete.
202188
soft: Soft deletion will archive the trigger.
203189
"""
204-
check_entitlement(feature=SCHEDULE_FEATURE)
205-
206-
with track_handler(event=AnalyticsEvent.DELETED_TRIGGER):
207-
verify_permissions_and_delete_entity(
208-
id=trigger_id,
209-
get_method=zen_store().get_trigger,
210-
delete_method=zen_store().delete_trigger,
211-
soft=soft,
212-
)
190+
verify_permissions_and_delete_entity(
191+
id=trigger_id,
192+
get_method=zen_store().get_trigger,
193+
delete_method=zen_store().delete_trigger,
194+
soft=soft,
195+
)
213196

214197

215198
@router.put(
@@ -280,8 +263,6 @@ def detach_trigger_from_snapshot(
280263
action=Action.READ,
281264
)
282265

283-
check_entitlement(feature=SCHEDULE_FEATURE)
284-
285266
zen_store().detach_trigger_from_snapshot(
286267
trigger_id=trigger_id,
287268
snapshot_id=snapshot_id,

src/zenml/zen_stores/rest_zen_store.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2282,7 +2282,7 @@ def detach_trigger_from_snapshot(
22822282
snapshot_id: The ID of the snapshot.
22832283
"""
22842284
self.delete(
2285-
path=f"{TRIGGERS}/{trigger_id}/{PIPELINE_SNAPSHOTS}/{snapshot_id}",
2285+
path=f"{TRIGGERS}/{trigger_id}{PIPELINE_SNAPSHOTS}/{snapshot_id}",
22862286
timeout=5,
22872287
)
22882288

src/zenml/zen_stores/sql_zen_store.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7002,6 +7002,7 @@ def create_run_metadata(self, run_metadata: RunMetadataRequest) -> None:
70027002

70037003
# -------------------- Triggers ---------------------
70047004

7005+
@track_decorator(AnalyticsEvent.CREATED_TRIGGER)
70057006
def create_trigger(
70067007
self, trigger: TriggerRequest
70077008
) -> TRIGGER_RETURN_TYPE_UNION:
@@ -7149,6 +7150,7 @@ def update_trigger(
71497150
include_metadata=True, include_resources=True
71507151
)
71517152

7153+
@track_decorator(event=AnalyticsEvent.DELETED_TRIGGER)
71527154
def delete_trigger(self, trigger_id: UUID, soft: bool = True) -> None:
71537155
"""Deletes a trigger.
71547156

0 commit comments

Comments
 (0)