mirror of
https://github.com/mealie-recipes/mealie.git
synced 2025-12-13 22:05:15 -05:00
chore: Remove Server Tasks (#3592)
This commit is contained in:
@@ -15,13 +15,19 @@ from .._model_utils import GUID, auto_init
|
||||
from ..group.invite_tokens import GroupInviteToken
|
||||
from ..group.webhooks import GroupWebhooksModel
|
||||
from ..recipe.category import Category, group_to_categories
|
||||
from ..server.task import ServerTaskModel
|
||||
from .cookbook import CookBook
|
||||
from .mealplan import GroupMealPlan
|
||||
from .preferences import GroupPreferencesModel
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from ..recipe import IngredientFoodModel, IngredientUnitModel, RecipeModel, Tag, Tool
|
||||
from ..recipe import (
|
||||
IngredientFoodModel,
|
||||
IngredientUnitModel,
|
||||
RecipeModel,
|
||||
Tag,
|
||||
Tool,
|
||||
)
|
||||
from ..server.task import ServerTaskModel
|
||||
from ..users import User
|
||||
from .events import GroupEventNotifierModel
|
||||
from .exports import GroupDataExportsModel
|
||||
@@ -67,7 +73,7 @@ class Group(SqlAlchemyBase, BaseMixins):
|
||||
webhooks: Mapped[list[GroupWebhooksModel]] = orm.relationship(GroupWebhooksModel, **common_args)
|
||||
recipe_actions: Mapped[list["GroupRecipeAction"]] = orm.relationship("GroupRecipeAction", **common_args)
|
||||
cookbooks: Mapped[list[CookBook]] = orm.relationship(CookBook, **common_args)
|
||||
server_tasks: Mapped[list[ServerTaskModel]] = orm.relationship(ServerTaskModel, **common_args)
|
||||
server_tasks: Mapped[list["ServerTaskModel"]] = orm.relationship("ServerTaskModel", **common_args)
|
||||
data_exports: Mapped[list["GroupDataExportsModel"]] = orm.relationship("GroupDataExportsModel", **common_args)
|
||||
shopping_lists: Mapped[list["ShoppingList"]] = orm.relationship("ShoppingList", **common_args)
|
||||
group_reports: Mapped[list["ReportModel"]] = orm.relationship("ReportModel", **common_args)
|
||||
|
||||
@@ -14,6 +14,8 @@ if TYPE_CHECKING:
|
||||
|
||||
|
||||
class ServerTaskModel(SqlAlchemyBase, BaseMixins):
|
||||
# Server Tasks are deprecated, but the table still exists in the database
|
||||
|
||||
__tablename__ = "server_tasks"
|
||||
name: Mapped[str] = mapped_column(String, nullable=False)
|
||||
completed_date: Mapped[datetime] = mapped_column(DateTime, nullable=True)
|
||||
|
||||
@@ -29,7 +29,6 @@ from mealie.db.models.recipe.recipe_timeline import RecipeTimelineEvent
|
||||
from mealie.db.models.recipe.shared import RecipeShareTokenModel
|
||||
from mealie.db.models.recipe.tag import Tag
|
||||
from mealie.db.models.recipe.tool import Tool
|
||||
from mealie.db.models.server.task import ServerTaskModel
|
||||
from mealie.db.models.users import LongLiveToken, User
|
||||
from mealie.db.models.users.password_reset import PasswordResetModel
|
||||
from mealie.db.models.users.user_to_recipe import UserToRecipe
|
||||
@@ -59,7 +58,6 @@ from mealie.schema.recipe.recipe_ingredient import IngredientFood, IngredientUni
|
||||
from mealie.schema.recipe.recipe_share_token import RecipeShareToken
|
||||
from mealie.schema.recipe.recipe_timeline_events import RecipeTimelineEventOut
|
||||
from mealie.schema.reports.reports import ReportEntryOut, ReportOut
|
||||
from mealie.schema.server import ServerTask
|
||||
from mealie.schema.user import GroupInDB, LongLiveTokenInDB, PrivateUser
|
||||
from mealie.schema.user.user import UserRatingOut
|
||||
from mealie.schema.user.user_passwords import PrivatePasswordResetToken
|
||||
@@ -162,10 +160,6 @@ class AllRepositories:
|
||||
# ================================================================
|
||||
# Group
|
||||
|
||||
@cached_property
|
||||
def server_tasks(self) -> RepositoryGeneric[ServerTask, ServerTaskModel]:
|
||||
return RepositoryGeneric(self.session, PK_ID, ServerTaskModel, ServerTask)
|
||||
|
||||
@cached_property
|
||||
def groups(self) -> RepositoryGroup:
|
||||
return RepositoryGroup(self.session, PK_ID, Group, GroupInDB)
|
||||
|
||||
@@ -8,7 +8,6 @@ from . import (
|
||||
admin_maintenance,
|
||||
admin_management_groups,
|
||||
admin_management_users,
|
||||
admin_server_tasks,
|
||||
)
|
||||
|
||||
router = AdminAPIRouter(prefix="/admin")
|
||||
@@ -17,7 +16,6 @@ router.include_router(admin_about.router, tags=["Admin: About"])
|
||||
router.include_router(admin_management_users.router, tags=["Admin: Manage Users"])
|
||||
router.include_router(admin_management_groups.router, tags=["Admin: Manage Groups"])
|
||||
router.include_router(admin_email.router, tags=["Admin: Email"])
|
||||
router.include_router(admin_server_tasks.router, tags=["Admin: Server Tasks"])
|
||||
router.include_router(admin_backups.router, tags=["Admin: Backups"])
|
||||
router.include_router(admin_maintenance.router, tags=["Admin: Maintenance"])
|
||||
router.include_router(admin_analytics.router, tags=["Admin: Analytics"])
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
from fastapi import BackgroundTasks, Depends
|
||||
|
||||
from mealie.routes._base import BaseAdminController, controller
|
||||
from mealie.routes._base.routers import UserAPIRouter
|
||||
from mealie.schema.response.pagination import PaginationQuery
|
||||
from mealie.schema.server.tasks import ServerTask, ServerTaskNames, ServerTaskPagination
|
||||
from mealie.services.server_tasks import BackgroundExecutor, test_executor_func
|
||||
|
||||
router = UserAPIRouter()
|
||||
|
||||
|
||||
@controller(router)
|
||||
class AdminServerTasksController(BaseAdminController):
|
||||
@router.get("/server-tasks", response_model=ServerTaskPagination)
|
||||
def get_all(self, q: PaginationQuery = Depends(PaginationQuery)):
|
||||
response = self.repos.server_tasks.page_all(
|
||||
pagination=q,
|
||||
override=ServerTask,
|
||||
)
|
||||
|
||||
response.set_pagination_guides(router.url_path_for("get_all"), q.model_dump())
|
||||
return response
|
||||
|
||||
@router.post("/server-tasks", response_model=ServerTask, status_code=201)
|
||||
def create_test_tasks(self, bg_tasks: BackgroundTasks):
|
||||
bg_executor = BackgroundExecutor(self.group.id, self.repos, bg_tasks)
|
||||
return bg_executor.dispatch(ServerTaskNames.default, test_executor_func)
|
||||
@@ -1,10 +0,0 @@
|
||||
# This file is auto-generated by gen_schema_exports.py
|
||||
from .tasks import ServerTask, ServerTaskCreate, ServerTaskNames, ServerTaskPagination, ServerTaskStatus
|
||||
|
||||
__all__ = [
|
||||
"ServerTask",
|
||||
"ServerTaskCreate",
|
||||
"ServerTaskNames",
|
||||
"ServerTaskPagination",
|
||||
"ServerTaskStatus",
|
||||
]
|
||||
@@ -1,50 +0,0 @@
|
||||
import datetime
|
||||
import enum
|
||||
from uuid import UUID
|
||||
|
||||
from pydantic import ConfigDict, Field
|
||||
|
||||
from mealie.schema._mealie import MealieModel
|
||||
from mealie.schema.response.pagination import PaginationBase
|
||||
|
||||
|
||||
class ServerTaskNames(str, enum.Enum):
|
||||
default = "Background Task"
|
||||
backup_task = "Database Backup"
|
||||
bulk_recipe_import = "Bulk Recipe Import"
|
||||
|
||||
|
||||
class ServerTaskStatus(str, enum.Enum):
|
||||
running = "running"
|
||||
finished = "finished"
|
||||
failed = "failed"
|
||||
|
||||
|
||||
class ServerTaskCreate(MealieModel):
|
||||
group_id: UUID
|
||||
name: ServerTaskNames = ServerTaskNames.default
|
||||
created_at: datetime.datetime = Field(default_factory=datetime.datetime.now)
|
||||
status: ServerTaskStatus = ServerTaskStatus.running
|
||||
log: str = ""
|
||||
|
||||
def set_running(self) -> None:
|
||||
self.status = ServerTaskStatus.running
|
||||
|
||||
def set_finished(self) -> None:
|
||||
self.status = ServerTaskStatus.finished
|
||||
|
||||
def set_failed(self) -> None:
|
||||
self.status = ServerTaskStatus.failed
|
||||
|
||||
def append_log(self, message: str) -> None:
|
||||
# Prefix with Timestamp and append new line and join to log
|
||||
self.log += f"{datetime.datetime.now()}: {message}\n"
|
||||
|
||||
|
||||
class ServerTask(ServerTaskCreate):
|
||||
id: int
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
class ServerTaskPagination(PaginationBase):
|
||||
items: list[ServerTask]
|
||||
@@ -1 +0,0 @@
|
||||
from .background_executory import *
|
||||
@@ -1,62 +0,0 @@
|
||||
from collections.abc import Callable
|
||||
from random import getrandbits
|
||||
from time import sleep
|
||||
from typing import Any
|
||||
|
||||
from fastapi import BackgroundTasks
|
||||
from pydantic import UUID4
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from mealie.repos.all_repositories import get_repositories
|
||||
from mealie.repos.repository_factory import AllRepositories
|
||||
from mealie.schema.server.tasks import ServerTask, ServerTaskCreate, ServerTaskNames
|
||||
|
||||
|
||||
class BackgroundExecutor:
|
||||
sleep_time = 60
|
||||
|
||||
def __init__(self, group_id: UUID4, repos: AllRepositories, bg: BackgroundTasks) -> None:
|
||||
self.group_id = group_id
|
||||
self.repos = repos
|
||||
self.background_tasks = bg
|
||||
|
||||
def dispatch(self, task_name: ServerTaskNames, func: Callable, *args: Any, **kwargs: Any) -> ServerTask:
|
||||
"""The dispatch function is a wrapper around the BackgroundTasks class in Starlett. It directly calls
|
||||
the add_task function and your task will be run in the background. This function all passes the id required
|
||||
to check on the server tasks in the database and provide updates.
|
||||
|
||||
Tasks that are dispachd by the Background executor should be designed to accept this key word argument
|
||||
and update the item in the database accordingly.
|
||||
"""
|
||||
|
||||
server_task = ServerTaskCreate(group_id=self.group_id, name=task_name)
|
||||
server_task = self.repos.server_tasks.create(server_task)
|
||||
|
||||
self.background_tasks.add_task(func, *args, **kwargs, task_id=server_task.id, session=self.repos.session)
|
||||
|
||||
return server_task
|
||||
|
||||
|
||||
def test_executor_func(task_id: int, session: Session) -> None:
|
||||
database = get_repositories(session)
|
||||
task = database.server_tasks.get_one(task_id)
|
||||
|
||||
task.append_log("test task has started")
|
||||
task.append_log("test task sleeping for 60 seconds")
|
||||
|
||||
sleep(BackgroundExecutor.sleep_time)
|
||||
|
||||
task.append_log("test task has finished sleep")
|
||||
|
||||
# Randomly Decide to set to failed or not
|
||||
|
||||
is_fail = bool(getrandbits(1))
|
||||
|
||||
if is_fail:
|
||||
task.append_log("test task has failed")
|
||||
task.set_failed()
|
||||
else:
|
||||
task.append_log("test task has succeeded")
|
||||
task.set_finished()
|
||||
|
||||
database.server_tasks.update(task.id, task)
|
||||
Reference in New Issue
Block a user