mirror of
https://github.com/mealie-recipes/mealie.git
synced 2026-02-06 07:53:11 -05:00
feat: mealplan-webhooks (#1403)
* fix type errors on event bus * webhooks fields required for new implementation * db migration * wip: webhook query + tests and stub function * ignore type checker error * type and method cleanup * datetime and time utc validator * update testing code for utc scheduled time * fix file cmp function call * update version_number * add support for translating "time" objects when restoring backup * bump recipe-scrapers * use specific import syntax * generate frontend types * utilize names exports * use utc times * add task to scheduler * implement new scheduler functionality * stub for type annotation * implement meal-plan data getter * add experimental banner
This commit is contained in:
@@ -1,6 +1,14 @@
|
||||
from .purge_group_exports import *
|
||||
from .purge_password_reset import *
|
||||
from .purge_registration import *
|
||||
from .post_webhooks import post_group_webhooks
|
||||
from .purge_group_exports import purge_group_data_exports
|
||||
from .purge_password_reset import purge_password_reset_tokens
|
||||
from .purge_registration import purge_group_registration
|
||||
|
||||
__all__ = [
|
||||
"post_group_webhooks",
|
||||
"purge_password_reset_tokens",
|
||||
"purge_group_data_exports",
|
||||
"purge_group_registration",
|
||||
]
|
||||
|
||||
"""
|
||||
Tasks Package
|
||||
|
||||
54
mealie/services/scheduler/tasks/post_webhooks.py
Normal file
54
mealie/services/scheduler/tasks/post_webhooks.py
Normal file
@@ -0,0 +1,54 @@
|
||||
from datetime import datetime, timezone
|
||||
|
||||
import requests
|
||||
from fastapi.encoders import jsonable_encoder
|
||||
from pydantic import UUID4
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from mealie.db.db_setup import create_session
|
||||
from mealie.db.models.group.webhooks import GroupWebhooksModel
|
||||
from mealie.repos.all_repositories import get_repositories
|
||||
|
||||
last_ran = datetime.now(timezone.utc)
|
||||
|
||||
|
||||
def get_scheduled_webhooks(session: Session, bottom: datetime, top: datetime) -> list[GroupWebhooksModel]:
|
||||
"""
|
||||
get_scheduled_webhooks queries the database for all webhooks scheduled between the bottom and
|
||||
top time ranges. It returns a list of GroupWebhooksModel objects.
|
||||
"""
|
||||
|
||||
return (
|
||||
session.query(GroupWebhooksModel)
|
||||
.where(
|
||||
GroupWebhooksModel.enabled == True, # noqa: E712 - required for SQLAlchemy comparison
|
||||
GroupWebhooksModel.scheduled_time > bottom.astimezone(timezone.utc).time(),
|
||||
GroupWebhooksModel.scheduled_time <= top.astimezone(timezone.utc).time(),
|
||||
)
|
||||
.all()
|
||||
)
|
||||
|
||||
|
||||
def post_group_webhooks() -> None:
|
||||
global last_ran
|
||||
session = create_session()
|
||||
results = get_scheduled_webhooks(session, last_ran, datetime.now())
|
||||
|
||||
last_ran = datetime.now(timezone.utc)
|
||||
|
||||
repos = get_repositories(session)
|
||||
|
||||
memo = {}
|
||||
|
||||
def get_meals(group_id: UUID4):
|
||||
if group_id not in memo:
|
||||
memo[group_id] = repos.meals.get_all(group_id=group_id)
|
||||
return memo[group_id]
|
||||
|
||||
for result in results:
|
||||
meals = get_meals(result.group_id)
|
||||
|
||||
if not meals:
|
||||
continue
|
||||
|
||||
requests.post(result.url, json=jsonable_encoder(meals))
|
||||
Reference in New Issue
Block a user