mirror of
https://github.com/mealie-recipes/mealie.git
synced 2026-04-12 07:55:36 -04:00
fix: publish all mealplan create, update, and delete events (#7015)
Co-authored-by: Michael Genson <genson.michael@gmail.com> Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
This commit is contained in:
@@ -58,6 +58,8 @@ export interface GroupEventNotifierOptions {
|
|||||||
dataExport?: boolean;
|
dataExport?: boolean;
|
||||||
dataImport?: boolean;
|
dataImport?: boolean;
|
||||||
mealplanEntryCreated?: boolean;
|
mealplanEntryCreated?: boolean;
|
||||||
|
mealplanEntryUpdated?: boolean;
|
||||||
|
mealplanEntryDeleted?: boolean;
|
||||||
shoppingListCreated?: boolean;
|
shoppingListCreated?: boolean;
|
||||||
shoppingListUpdated?: boolean;
|
shoppingListUpdated?: boolean;
|
||||||
shoppingListDeleted?: boolean;
|
shoppingListDeleted?: boolean;
|
||||||
@@ -85,6 +87,8 @@ export interface GroupEventNotifierOptionsOut {
|
|||||||
dataExport?: boolean;
|
dataExport?: boolean;
|
||||||
dataImport?: boolean;
|
dataImport?: boolean;
|
||||||
mealplanEntryCreated?: boolean;
|
mealplanEntryCreated?: boolean;
|
||||||
|
mealplanEntryUpdated?: boolean;
|
||||||
|
mealplanEntryDeleted?: boolean;
|
||||||
shoppingListCreated?: boolean;
|
shoppingListCreated?: boolean;
|
||||||
shoppingListUpdated?: boolean;
|
shoppingListUpdated?: boolean;
|
||||||
shoppingListDeleted?: boolean;
|
shoppingListDeleted?: boolean;
|
||||||
@@ -113,6 +117,8 @@ export interface GroupEventNotifierOptionsSave {
|
|||||||
dataExport?: boolean;
|
dataExport?: boolean;
|
||||||
dataImport?: boolean;
|
dataImport?: boolean;
|
||||||
mealplanEntryCreated?: boolean;
|
mealplanEntryCreated?: boolean;
|
||||||
|
mealplanEntryUpdated?: boolean;
|
||||||
|
mealplanEntryDeleted?: boolean;
|
||||||
shoppingListCreated?: boolean;
|
shoppingListCreated?: boolean;
|
||||||
shoppingListUpdated?: boolean;
|
shoppingListUpdated?: boolean;
|
||||||
shoppingListDeleted?: boolean;
|
shoppingListDeleted?: boolean;
|
||||||
|
|||||||
@@ -293,9 +293,17 @@ const optionsSections: OptionSection[] = [
|
|||||||
text: i18n.t("events.mealplan-events"),
|
text: i18n.t("events.mealplan-events"),
|
||||||
options: [
|
options: [
|
||||||
{
|
{
|
||||||
text: i18n.t("events.when-a-user-in-your-group-creates-a-new-mealplan"),
|
text: i18n.t("general.create") as string,
|
||||||
key: "mealplanEntryCreated",
|
key: "mealplanEntryCreated",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
text: i18n.t("general.update") as string,
|
||||||
|
key: "mealplanEntryUpdated",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: i18n.t("general.delete") as string,
|
||||||
|
key: "mealplanEntryDeleted",
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,50 @@
|
|||||||
|
"""'Add mealplan updated and deleted to group notifier options'
|
||||||
|
|
||||||
|
Revision ID: cdc93edaf73d
|
||||||
|
Revises: a39c7f1826e3
|
||||||
|
Create Date: 2026-03-26 20:48:28.584661
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sqlalchemy as sa
|
||||||
|
from alembic import op
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = "cdc93edaf73d"
|
||||||
|
down_revision: str | None = "a39c7f1826e3"
|
||||||
|
branch_labels: str | tuple[str, ...] | None = None
|
||||||
|
depends_on: str | tuple[str, ...] | None = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
with op.batch_alter_table("group_events_notifier_options", schema=None) as batch_op:
|
||||||
|
batch_op.add_column(
|
||||||
|
sa.Column(
|
||||||
|
"mealplan_entry_updated",
|
||||||
|
sa.Boolean(),
|
||||||
|
nullable=False,
|
||||||
|
default=False,
|
||||||
|
server_default=sa.sql.expression.false(),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
batch_op.add_column(
|
||||||
|
sa.Column(
|
||||||
|
"mealplan_entry_deleted",
|
||||||
|
sa.Boolean(),
|
||||||
|
nullable=False,
|
||||||
|
default=False,
|
||||||
|
server_default=sa.sql.expression.false(),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
# ### end Alembic commands ###
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
with op.batch_alter_table("group_events_notifier_options", schema=None) as batch_op:
|
||||||
|
batch_op.drop_column("mealplan_entry_deleted")
|
||||||
|
batch_op.drop_column("mealplan_entry_updated")
|
||||||
|
|
||||||
|
# ### end Alembic commands ###
|
||||||
@@ -29,6 +29,8 @@ class GroupEventNotifierOptionsModel(SqlAlchemyBase, BaseMixins):
|
|||||||
data_import: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
|
data_import: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
|
||||||
|
|
||||||
mealplan_entry_created: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
|
mealplan_entry_created: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
|
||||||
|
mealplan_entry_updated: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
|
||||||
|
mealplan_entry_deleted: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
|
||||||
|
|
||||||
shopping_list_created: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
|
shopping_list_created: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
|
||||||
shopping_list_updated: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
|
shopping_list_updated: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
|
||||||
|
|||||||
@@ -17,7 +17,11 @@ from mealie.schema.meal_plan.plan_rules import PlanRulesDay
|
|||||||
from mealie.schema.recipe.recipe import Recipe
|
from mealie.schema.recipe.recipe import Recipe
|
||||||
from mealie.schema.response.pagination import PaginationQuery
|
from mealie.schema.response.pagination import PaginationQuery
|
||||||
from mealie.schema.response.responses import ErrorResponse
|
from mealie.schema.response.responses import ErrorResponse
|
||||||
from mealie.services.event_bus_service.event_types import EventMealplanCreatedData, EventTypes
|
from mealie.services.event_bus_service.event_types import (
|
||||||
|
EventMealplanData,
|
||||||
|
EventOperation,
|
||||||
|
EventTypes,
|
||||||
|
)
|
||||||
|
|
||||||
router = APIRouter(prefix="/households/mealplans", tags=["Households: Mealplans"])
|
router = APIRouter(prefix="/households/mealplans", tags=["Households: Mealplans"])
|
||||||
|
|
||||||
@@ -102,7 +106,8 @@ class GroupMealplanController(BaseCrudController):
|
|||||||
|
|
||||||
self.publish_event(
|
self.publish_event(
|
||||||
event_type=EventTypes.mealplan_entry_created,
|
event_type=EventTypes.mealplan_entry_created,
|
||||||
document_data=EventMealplanCreatedData(
|
document_data=EventMealplanData(
|
||||||
|
operation=EventOperation.create,
|
||||||
mealplan_id=result.id,
|
mealplan_id=result.id,
|
||||||
recipe_id=data.recipe_id,
|
recipe_id=data.recipe_id,
|
||||||
recipe_name=result.recipe.name if result.recipe else None,
|
recipe_name=result.recipe.name if result.recipe else None,
|
||||||
@@ -138,7 +143,7 @@ class GroupMealplanController(BaseCrudController):
|
|||||||
)
|
)
|
||||||
|
|
||||||
recipe = random_recipes[0]
|
recipe = random_recipes[0]
|
||||||
return self.mixins.create_one(
|
result = self.mixins.create_one(
|
||||||
SavePlanEntry(
|
SavePlanEntry(
|
||||||
date=data.date,
|
date=data.date,
|
||||||
entry_type=data.entry_type,
|
entry_type=data.entry_type,
|
||||||
@@ -148,14 +153,65 @@ class GroupMealplanController(BaseCrudController):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self.publish_event(
|
||||||
|
event_type=EventTypes.mealplan_entry_created,
|
||||||
|
document_data=EventMealplanData(
|
||||||
|
operation=EventOperation.create,
|
||||||
|
mealplan_id=result.id,
|
||||||
|
recipe_id=recipe.id,
|
||||||
|
recipe_name=recipe.name,
|
||||||
|
recipe_slug=recipe.slug,
|
||||||
|
date=data.date,
|
||||||
|
),
|
||||||
|
group_id=result.group_id,
|
||||||
|
household_id=result.household_id,
|
||||||
|
message=f"Mealplan entry created for {data.date} for {data.entry_type}",
|
||||||
|
)
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
@router.get("/{item_id}", response_model=ReadPlanEntry)
|
@router.get("/{item_id}", response_model=ReadPlanEntry)
|
||||||
def get_one(self, item_id: int):
|
def get_one(self, item_id: int):
|
||||||
return self.mixins.get_one(item_id)
|
return self.mixins.get_one(item_id)
|
||||||
|
|
||||||
@router.put("/{item_id}", response_model=ReadPlanEntry)
|
@router.put("/{item_id}", response_model=ReadPlanEntry)
|
||||||
def update_one(self, item_id: int, data: UpdatePlanEntry):
|
def update_one(self, item_id: int, data: UpdatePlanEntry):
|
||||||
return self.mixins.update_one(data, item_id)
|
result = self.mixins.update_one(data, item_id)
|
||||||
|
|
||||||
|
self.publish_event(
|
||||||
|
event_type=EventTypes.mealplan_entry_updated,
|
||||||
|
document_data=EventMealplanData(
|
||||||
|
operation=EventOperation.update,
|
||||||
|
mealplan_id=result.id,
|
||||||
|
recipe_id=result.recipe_id,
|
||||||
|
recipe_name=result.recipe.name if result.recipe else None,
|
||||||
|
recipe_slug=result.recipe.slug if result.recipe else None,
|
||||||
|
date=result.date,
|
||||||
|
),
|
||||||
|
group_id=result.group_id,
|
||||||
|
household_id=result.household_id,
|
||||||
|
message=f"Mealplan entry updated for {result.date} for {result.entry_type}",
|
||||||
|
)
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
@router.delete("/{item_id}", response_model=ReadPlanEntry)
|
@router.delete("/{item_id}", response_model=ReadPlanEntry)
|
||||||
def delete_one(self, item_id: int):
|
def delete_one(self, item_id: int):
|
||||||
return self.mixins.delete_one(item_id)
|
result = self.mixins.delete_one(item_id)
|
||||||
|
|
||||||
|
self.publish_event(
|
||||||
|
event_type=EventTypes.mealplan_entry_deleted,
|
||||||
|
document_data=EventMealplanData(
|
||||||
|
operation=EventOperation.delete,
|
||||||
|
mealplan_id=result.id,
|
||||||
|
recipe_id=result.recipe_id,
|
||||||
|
recipe_name=result.recipe.name if result.recipe else None,
|
||||||
|
recipe_slug=result.recipe.slug if result.recipe else None,
|
||||||
|
date=result.date,
|
||||||
|
),
|
||||||
|
group_id=result.group_id,
|
||||||
|
household_id=result.household_id,
|
||||||
|
message=f"Mealplan entry deleted for {result.date} for {result.entry_type}",
|
||||||
|
)
|
||||||
|
|
||||||
|
return result
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ class GroupEventNotifierOptions(MealieModel):
|
|||||||
data_import: bool = False
|
data_import: bool = False
|
||||||
|
|
||||||
mealplan_entry_created: bool = False
|
mealplan_entry_created: bool = False
|
||||||
|
mealplan_entry_updated: bool = False
|
||||||
|
mealplan_entry_deleted: bool = False
|
||||||
|
|
||||||
shopping_list_created: bool = False
|
shopping_list_created: bool = False
|
||||||
shopping_list_updated: bool = False
|
shopping_list_updated: bool = False
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ class EventTypes(Enum):
|
|||||||
data_import = auto()
|
data_import = auto()
|
||||||
|
|
||||||
mealplan_entry_created = auto()
|
mealplan_entry_created = auto()
|
||||||
|
mealplan_entry_updated = auto()
|
||||||
|
mealplan_entry_deleted = auto()
|
||||||
|
|
||||||
shopping_list_created = auto()
|
shopping_list_created = auto()
|
||||||
shopping_list_updated = auto()
|
shopping_list_updated = auto()
|
||||||
@@ -89,9 +91,8 @@ class EventDocumentDataBase(MealieModel):
|
|||||||
...
|
...
|
||||||
|
|
||||||
|
|
||||||
class EventMealplanCreatedData(EventDocumentDataBase):
|
class EventMealplanData(EventDocumentDataBase):
|
||||||
document_type: EventDocumentType = EventDocumentType.mealplan
|
document_type: EventDocumentType = EventDocumentType.mealplan
|
||||||
operation: EventOperation = EventOperation.create
|
|
||||||
mealplan_id: int
|
mealplan_id: int
|
||||||
date: date
|
date: date
|
||||||
recipe_id: UUID4 | None = None
|
recipe_id: UUID4 | None = None
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ def preferences_generator():
|
|||||||
data_export=random_bool(),
|
data_export=random_bool(),
|
||||||
data_import=random_bool(),
|
data_import=random_bool(),
|
||||||
mealplan_entry_created=random_bool(),
|
mealplan_entry_created=random_bool(),
|
||||||
|
mealplan_entry_updated=random_bool(),
|
||||||
|
mealplan_entry_deleted=random_bool(),
|
||||||
shopping_list_created=random_bool(),
|
shopping_list_created=random_bool(),
|
||||||
shopping_list_updated=random_bool(),
|
shopping_list_updated=random_bool(),
|
||||||
shopping_list_deleted=random_bool(),
|
shopping_list_deleted=random_bool(),
|
||||||
|
|||||||
Reference in New Issue
Block a user