Refactor/group page (#666)

* refactor(backend): ♻️ Refactor base class to be abstract and create a router factory method

* feat(frontend):  add group edit

* refactor(backend):  add group edit support

Co-authored-by: hay-kot <hay-kot@pm.me>
This commit is contained in:
Hayden
2021-09-01 21:39:40 -08:00
committed by GitHub
parent 9b1bf56a5d
commit 990244e37e
37 changed files with 749 additions and 196 deletions

View File

@@ -6,6 +6,7 @@ from mealie.db.data_access_layer.group_access_model import GroupDataAccessModel
from mealie.db.models.cookbook import CookBook
from mealie.db.models.event import Event, EventNotification
from mealie.db.models.group import Group
from mealie.db.models.group.webhooks import GroupWebhooksModel
from mealie.db.models.mealplan import MealPlan
from mealie.db.models.recipe.category import Category
from mealie.db.models.recipe.comment import RecipeComment
@@ -19,6 +20,7 @@ from mealie.schema.admin import SiteSettings as SiteSettingsSchema
from mealie.schema.cookbook import ReadCookBook
from mealie.schema.events import Event as EventSchema
from mealie.schema.events import EventNotificationIn
from mealie.schema.group.webhook import ReadWebhook
from mealie.schema.meal_plan import MealPlanOut, ShoppingListOut
from mealie.schema.recipe import (
CommentOut,
@@ -42,7 +44,6 @@ DEFAULT_PK = "id"
class CategoryDataAccessModel(BaseAccessModel):
def get_empty(self, session: Session):
self.schema
return session.query(Category).filter(~Category.recipes.any()).all()
@@ -77,10 +78,13 @@ class DatabaseAccessLayer:
self.event_notifications = BaseAccessModel(DEFAULT_PK, EventNotification, EventNotificationIn)
self.events = BaseAccessModel(DEFAULT_PK, Event, EventSchema)
# Users / Groups
# Users
self.users = UserDataAccessModel(DEFAULT_PK, User, PrivateUser)
self.api_tokens = BaseAccessModel(DEFAULT_PK, LongLiveToken, LongLiveTokenInDB)
# Group Data
self.groups = GroupDataAccessModel(DEFAULT_PK, Group, GroupInDB)
self.meals = BaseAccessModel(DEFAULT_PK, MealPlan, MealPlanOut)
self.webhooks = BaseAccessModel(DEFAULT_PK, GroupWebhooksModel, ReadWebhook)
self.shopping_lists = BaseAccessModel(DEFAULT_PK, ShoppingList, ShoppingListOut)
self.cookbooks = BaseAccessModel(DEFAULT_PK, CookBook, ReadCookBook)

View File

@@ -9,7 +9,7 @@ def handle_one_to_many_list(get_attr, relation_cls, all_elements: list[dict]):
updated_elems = []
for elem in all_elements:
elem_id = elem.get("id", None)
elem_id = elem.get(get_attr, None)
existing_elem = relation_cls.get_ref(match_value=elem_id)

View File

@@ -0,0 +1 @@
from .group import *

View File

@@ -5,14 +5,10 @@ from sqlalchemy.orm.session import Session
from mealie.core.config import settings
from mealie.db.models._model_base import BaseMixins, SqlAlchemyBase
from mealie.db.models.cookbook import CookBook
from mealie.db.models.group.webhooks import GroupWebhooksModel
from mealie.db.models.recipe.category import Category, group2categories
class WebhookURLModel(SqlAlchemyBase):
__tablename__ = "webhook_urls"
id = sa.Column(sa.Integer, primary_key=True)
url = sa.Column(sa.String)
parent_id = sa.Column(sa.Integer, sa.ForeignKey("groups.id"))
from .._model_utils import auto_init
class Group(SqlAlchemyBase, BaseMixins):
@@ -20,25 +16,17 @@ class Group(SqlAlchemyBase, BaseMixins):
id = sa.Column(sa.Integer, primary_key=True)
name = sa.Column(sa.String, index=True, nullable=False, unique=True)
users = orm.relationship("User", back_populates="group")
categories = orm.relationship(Category, secondary=group2categories, single_parent=True)
# CRUD From Others
mealplans = orm.relationship("MealPlan", back_populates="group", single_parent=True, order_by="MealPlan.start_date")
shopping_lists = orm.relationship("ShoppingList", back_populates="group", single_parent=True)
webhooks = orm.relationship(GroupWebhooksModel, uselist=True, cascade="all, delete-orphan")
cookbooks = orm.relationship(CookBook, back_populates="group", single_parent=True)
categories = orm.relationship("Category", secondary=group2categories, single_parent=True)
shopping_lists = orm.relationship("ShoppingList", back_populates="group", single_parent=True)
# Webhook Settings
webhook_enable = sa.Column(sa.Boolean, default=False)
webhook_time = sa.Column(sa.String, default="00:00")
webhook_urls = orm.relationship("WebhookURLModel", uselist=True, cascade="all, delete-orphan")
def __init__(
self, name, categories=[], session=None, webhook_enable=False, webhook_time="00:00", webhook_urls=[], **_
) -> None:
self.name = name
self.categories = [Category.get_ref(session=session, slug=cat.get("slug")) for cat in categories]
self.webhook_enable = webhook_enable
self.webhook_time = webhook_time
self.webhook_urls = [WebhookURLModel(url=x) for x in webhook_urls]
@auto_init({"users", "webhooks", "shopping_lists", "cookbooks"})
def __init__(self, **_) -> None:
pass
@staticmethod
def get_ref(session: Session, name: str):

View File

@@ -0,0 +1,20 @@
from sqlalchemy import Boolean, Column, ForeignKey, Integer, String
from mealie.db.models._model_base import BaseMixins, SqlAlchemyBase
from .._model_utils import auto_init
class GroupWebhooksModel(SqlAlchemyBase, BaseMixins):
__tablename__ = "webhook_urls"
id = Column(Integer, primary_key=True)
group_id = Column(Integer, ForeignKey("groups.id"), index=True)
enabled = Column(Boolean, default=False)
name = Column(String)
url = Column(String)
time = Column(String, default="00:00")
@auto_init()
def __init__(self, **_) -> None:
pass

View File

@@ -61,7 +61,6 @@ class Category(SqlAlchemyBase, BaseMixins):
if not session or not match_value:
return None
print(match_value)
slug = slugify(match_value)
result = session.query(Category).filter(Category.slug == slug).one_or_none()