mirror of
https://github.com/hay-kot/mealie.git
synced 2025-08-22 06:23:34 -07:00
meal migration
This commit is contained in:
parent
17537bf43a
commit
74ff14ae73
7 changed files with 141 additions and 119 deletions
|
@ -23,7 +23,7 @@ export default {
|
||||||
let response = await apiReq.post(recipeURLs.createByURL, {
|
let response = await apiReq.post(recipeURLs.createByURL, {
|
||||||
url: recipeURL,
|
url: recipeURL,
|
||||||
});
|
});
|
||||||
|
|
||||||
store.dispatch("requestRecentRecipes");
|
store.dispatch("requestRecentRecipes");
|
||||||
return response;
|
return response;
|
||||||
},
|
},
|
||||||
|
@ -51,8 +51,9 @@ export default {
|
||||||
async update(data) {
|
async update(data) {
|
||||||
const recipeSlug = data.slug;
|
const recipeSlug = data.slug;
|
||||||
|
|
||||||
apiReq.post(recipeURLs.update(recipeSlug), data);
|
let response = await apiReq.post(recipeURLs.update(recipeSlug), data);
|
||||||
store.dispatch("requestRecentRecipes");
|
store.dispatch("requestRecentRecipes");
|
||||||
|
return response.data;
|
||||||
},
|
},
|
||||||
|
|
||||||
async delete(recipeSlug) {
|
async delete(recipeSlug) {
|
||||||
|
|
|
@ -130,7 +130,7 @@ export default {
|
||||||
api.recipes.delete(this.recipeDetails.slug);
|
api.recipes.delete(this.recipeDetails.slug);
|
||||||
},
|
},
|
||||||
async saveRecipe() {
|
async saveRecipe() {
|
||||||
await api.recipes.update(this.recipeDetails);
|
let slug = await api.recipes.update(this.recipeDetails);
|
||||||
|
|
||||||
if (this.fileObject) {
|
if (this.fileObject) {
|
||||||
await api.recipes.updateImage(this.recipeDetails.slug, this.fileObject);
|
await api.recipes.updateImage(this.recipeDetails.slug, this.fileObject);
|
||||||
|
@ -138,6 +138,7 @@ export default {
|
||||||
|
|
||||||
this.form = false;
|
this.form = false;
|
||||||
this.imageKey += 1;
|
this.imageKey += 1;
|
||||||
|
this.$router.push(`/recipe/${slug}`);
|
||||||
},
|
},
|
||||||
showForm() {
|
showForm() {
|
||||||
this.form = true;
|
this.form = true;
|
||||||
|
|
|
@ -1,30 +1,33 @@
|
||||||
{
|
{
|
||||||
"@context": "http://schema.org",
|
"@context": "http://schema.org",
|
||||||
"@type": "Recipe",
|
"@type": "Recipe",
|
||||||
"articleBody": "In this brothy beans recipe, caramelizing fennel, shallots, and lemon builds a base layer that is sweet, tangy, and bright. Tinned sardines add briney flavor (and protein!)\u2014leave them whole or break them up and fold them into the soup. \u00a0And chopped celery or mushrooms work just as well as fennel if you want to swap. This recipe is part of the 2021\u00a0Feel Good Food Plan, our eight-day dinner plan for starting the year off right.",
|
"articleBody": "With plenty of protein, a double punch of acid from citrus and vinegar, and a garlicky chili oil, this salad is made for dinner. While your chicken is getting toasty in the oven, make your chile crisp-inspired dressing with garlic, paprika, cracked coriander, and red pepper flakes. If you have leftovers (or want to make extra for a bit of meal prep), keep all of your ingredients separate in the fridge so that they stay fresher for longer. \u00a0This recipe is part of the 2021\u00a0Feel Good Food Plan, our eight-day dinner plan for starting the year off right.",
|
||||||
"alternativeHeadline": "Tinned sardines add briney flavor (and protein!)\u2014leave them whole or break them up and fold them into the soup.",
|
"alternativeHeadline": "With plenty of protein, a double punch of acid from citrus and vinegar, and a garlicky chili oil, this salad is made for dinner.",
|
||||||
"dateModified": "2021-01-10 13:22:02.933000",
|
"dateModified": "2021-01-11 11:51:19.699000",
|
||||||
"datePublished": "2021-01-01 06:00:00",
|
"datePublished": "2021-01-01 06:00:00",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"recipes",
|
"recipes",
|
||||||
"healthyish",
|
"healthyish",
|
||||||
"fennel",
|
"salad",
|
||||||
"lemon",
|
"chicken recipes",
|
||||||
"olive oil",
|
|
||||||
"shallot",
|
|
||||||
"garlic",
|
|
||||||
"herb",
|
|
||||||
"white wine",
|
|
||||||
"chicken broth",
|
|
||||||
"cannellini beans",
|
|
||||||
"sardine",
|
|
||||||
"parsley",
|
|
||||||
"kosher salt",
|
"kosher salt",
|
||||||
|
"pepper",
|
||||||
|
"olive oil",
|
||||||
|
"garlic",
|
||||||
|
"paprika",
|
||||||
|
"coriander",
|
||||||
|
"endive",
|
||||||
|
"radicchio",
|
||||||
|
"blood orange",
|
||||||
|
"orange",
|
||||||
|
"vinegar",
|
||||||
|
"red wine vinegar",
|
||||||
|
"sesame seed",
|
||||||
"feel good food plan",
|
"feel good food plan",
|
||||||
"feel good food plan 2021",
|
"feel good food plan 2021",
|
||||||
"web"
|
"web"
|
||||||
],
|
],
|
||||||
"thumbnailUrl": "https://assets.bonappetit.com/photos/5fdbe3ac045c6b67ead1938c/1:1/w_2880,h_2880,c_limit/BA0221feelgood06_web.jpg",
|
"thumbnailUrl": "https://assets.bonappetit.com/photos/5fdbe110607088d75a57bc54/1:1/w_3142,h_3142,c_limit/BA0221coverfinal01_rev.jpg",
|
||||||
"publisher": {
|
"publisher": {
|
||||||
"@context": "https://schema.org",
|
"@context": "https://schema.org",
|
||||||
"@type": "Organization",
|
"@type": "Organization",
|
||||||
|
@ -54,52 +57,51 @@
|
||||||
],
|
],
|
||||||
"aggregateRating": {
|
"aggregateRating": {
|
||||||
"@type": "AggregateRating",
|
"@type": "AggregateRating",
|
||||||
"ratingValue": 4.1,
|
"ratingValue": 4.89,
|
||||||
"ratingCount": 12
|
"ratingCount": 12
|
||||||
},
|
},
|
||||||
"description": "Tinned sardines add briney flavor (and protein!)\u2014leave them whole or break them up and fold them into the soup.",
|
"description": "With plenty of protein, a double punch of acid from citrus and vinegar, and a garlicky chili oil, this salad is made for dinner.",
|
||||||
"image": "braised-beans-and-sardines-with-fennel.jpg",
|
"image": "chicken-salad-with-citrus-and-chile-oil.jpg",
|
||||||
"headline": "Braised Beans and Sardines With Fennel",
|
"headline": "Chicken Salad With Citrus and Chile Oil",
|
||||||
"name": "Braised Beans and Sardines With Fennel",
|
"name": "Chicken Salad With Citrus and Chile Oil",
|
||||||
"recipeIngredient": [
|
"recipeIngredient": [
|
||||||
"1 fennel bulb with fronds, stalks and fronds removed",
|
"3 skin-on, bone-in chicken breasts\u00a0 (about 1\u00bd lb. total)",
|
||||||
"1 lemon, halved",
|
"Kosher salt, freshly ground pepper",
|
||||||
"\u00bc cup extra-virgin olive oil",
|
"2 Tbsp. plus \u2153 cup extra-virgin olive oil",
|
||||||
"2 medium shallots, thinly sliced",
|
"3 garlic cloves, thinly sliced",
|
||||||
"6 garlic cloves, thinly sliced",
|
"2 tsp. paprika",
|
||||||
"Small handful of mixed hardy herb sprigs (such as bay leaves, thyme, and/or rosemary)",
|
"1 tsp. coriander seeds, coarsely\u00a0crushed",
|
||||||
"\u00bd tsp. crushed red pepper flakes",
|
"\u00bd tsp. crushed red pepper flakes",
|
||||||
"\u00bc cup dry white wine",
|
"2 medium endive, leaves separated",
|
||||||
"6 cups low-sodium chicken broth",
|
"1 large head of radicchio, leaves\u00a0 separated, torn if large",
|
||||||
"2 15-oz. cans cannellini (white kidney) or cranberry beans, rinsed1 4.4-oz. tin oil-packed sardines, drained",
|
"4 satsumas or blood oranges or 3 medium oranges, peeled, sliced into rounds, seeds removed",
|
||||||
"1 (loosely packed) cup very coarsely chopped parsley",
|
"2 Tbsp. white wine vinegar or red wine vinegar",
|
||||||
"Kosher salt",
|
"2 tsp. toasted sesame seeds, lightly crushed"
|
||||||
"Toasted seeded bread (for serving)"
|
|
||||||
],
|
],
|
||||||
"recipeInstructions": [
|
"recipeInstructions": [
|
||||||
{
|
{
|
||||||
"text": "Slice fennel bulb in half lengthwise and cut each half lengthwise into 3 wedges. Thinly slice 1 lemon half into rounds and wriggle out and discard any seeds; leave remaining half intact and set aside."
|
"text": "Preheat oven to 450\u00b0. Pat chicken breasts dry with paper towels; season on all sides with salt and pepper, then rub with 2 Tbsp. oil."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"text": "Heat oil in a medium pot over medium-high. Add fennel, shallots, garlic, hardy herbs, lemon rounds, and red pepper flakes and cook, stirring occasionally, until fennel and lemon are softened slightly and golden brown in spots, 5\u20137 minutes."
|
"text": "Heat a large ovenproof skillet over medium-high. Arrange chicken, skin side down, in pan and cook, undisturbed, until skin is deep golden brown, about 3 minutes. Turn chicken over with tongs and transfer skillet to oven. Roast chicken until cooked all the way through, 15\u201317 minutes. Transfer to a cutting board and let cool 10 minutes."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"text": "Using tongs, transfer lemon rounds to a small bowl; set aside. Add wine to pot and cook until reduced by half, about\u00a0 2 minutes. Pour in broth and bring to a boil. Reduce heat to medium-low and simmer, stirring occasionally, until fennel is tender, about 5 minutes. Add beans and simmer until beans soak up some of the broth and are warmed through, 8\u201310 minutes."
|
"text": "Meanwhile, cook garlic and remaining \u2153 cup oil in a small skillet over medium heat, stirring occasionally, until garlic is fragrant and pale golden, about 4 minutes. Immediately pour garlic oil into a small bowl and stir in paprika, coriander seeds, and red pepper flakes; season with salt."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"text": "Meanwhile, working one at a time, slice open each sardine with the tip of a paring knife and remove any visible bones; discard. Separate fillets from one another and place in a small bowl. Squeeze juice from remaining reserved lemon half over fillets."
|
"text": "Cut chicken off the bone, then slice\u00a0 \u00bd\" thick; discard bones."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"text": "Fish out and discard any hardy herbs and stems you can from braise. Stir in parsley; taste and season broth with more salt if needed."
|
"text": "Toss endive, radicchio, and satsumas with vinegar and half of spiced garlic oil in a large bowl to combine; season salad with salt and pepper."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"text": "Divide braise among bowls; top with reserved lemon slices and sardines. Serve with bread alongside."
|
"text": "Divide salad among plates or shallow bowls; top with chicken and drizzle with more spiced garlic oil. Sprinkle sesame seeds over."
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"recipeYield": "4 servings",
|
"recipeYield": "4 servings",
|
||||||
"url": "https://www.bonappetit.com/recipe/braised-beans-and-sardines-with-fennel",
|
"url": "https://www.bonappetit.com/recipe/chicken-salad-with-citrus-and-chile-oil",
|
||||||
"slug": "braised-beans-and-sardines-with-fennel",
|
"slug": "chicken-salad-with-citrus-and-chile-oil",
|
||||||
"orgURL": "https://www.bonappetit.com/recipe/braised-beans-and-sardines-with-fennel",
|
"orgURL": "https://www.bonappetit.com/recipe/chicken-salad-with-citrus-and-chile-oil",
|
||||||
"categories": [],
|
"categories": [],
|
||||||
"tags": [],
|
"tags": [],
|
||||||
"dateAdded": null,
|
"dateAdded": null,
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import json
|
import json
|
||||||
|
from typing import List
|
||||||
|
|
||||||
import mongoengine
|
import mongoengine
|
||||||
from settings import USE_MONGO, USE_TINYDB
|
from settings import USE_MONGO, USE_TINYDB
|
||||||
|
|
||||||
from db.mongo.meal_models import MealPlanDocument
|
from db.mongo.meal_models import MealDocument, MealPlanDocument
|
||||||
from db.mongo.recipe_models import RecipeDocument
|
from db.mongo.recipe_models import RecipeDocument
|
||||||
from db.mongo.settings_models import SiteSettingsDocument, SiteThemeDocument
|
from db.mongo.settings_models import SiteSettingsDocument, SiteThemeDocument
|
||||||
from db.tinydb.baseclass import StoreBase
|
from db.tinydb.baseclass import StoreBase
|
||||||
|
@ -44,25 +45,48 @@ class BaseDocument:
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
self.primary_key: str
|
self.primary_key: str
|
||||||
self.store: StoreBase
|
self.store: StoreBase
|
||||||
self._document: mongoengine.Document
|
self.document: mongoengine.Document
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _unpack_mongo(document) -> dict:
|
def _unpack_mongo(document) -> dict:
|
||||||
document = json.loads(document.to_json())
|
document = json.loads(document.to_json())
|
||||||
del document["_id"]
|
del document["_id"]
|
||||||
|
|
||||||
document["dateAdded"] = document["dateAdded"]["$date"]
|
# Recipe Cleanup
|
||||||
|
try:
|
||||||
|
document["dateAdded"] = document["dateAdded"]["$date"]
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
try:
|
||||||
|
document["uid"] = document["uid"]["$uuid"]
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Meal Plan
|
||||||
|
try:
|
||||||
|
document["startDate"] = document["startDate"]["$date"]
|
||||||
|
document["endDate"] = document["endDate"]["$date"]
|
||||||
|
|
||||||
|
meals = []
|
||||||
|
for meal in document["meals"]:
|
||||||
|
meal["date"] = meal["date"]["$date"]
|
||||||
|
meals.append(meal)
|
||||||
|
document["meals"] = meals
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
return document
|
return document
|
||||||
|
|
||||||
def get_all(self, limit: int = None, order_by: str = "dateAdded") -> list[dict]:
|
def get_all(self, limit: int = None, order_by: str = "dateAdded") -> list[dict]:
|
||||||
if USE_MONGO:
|
if USE_MONGO:
|
||||||
documents = self._document.objects.order_by(str(order_by)).limit(limit)
|
documents = self.document.objects.order_by(str(order_by)).limit(limit)
|
||||||
docs = []
|
docs = []
|
||||||
for item in documents:
|
for item in documents:
|
||||||
doc = BaseDocument._unpack_mongo(item)
|
doc = BaseDocument._unpack_mongo(item)
|
||||||
docs.append(doc)
|
docs.append(doc)
|
||||||
|
if limit == 1:
|
||||||
|
return docs[0]
|
||||||
return docs
|
return docs
|
||||||
|
|
||||||
elif USE_TINYDB:
|
elif USE_TINYDB:
|
||||||
|
@ -70,7 +94,7 @@ class BaseDocument:
|
||||||
|
|
||||||
def get(self, match_value: str, match_key: str = None, limit=1) -> dict:
|
def get(self, match_value: str, match_key: str = None, limit=1) -> dict:
|
||||||
if USE_MONGO:
|
if USE_MONGO:
|
||||||
document = self._document.objects.get(**{str(match_key): match_value})
|
document = self.document.objects.get(**{str(match_key): match_value})
|
||||||
return BaseDocument._unpack_mongo(document)
|
return BaseDocument._unpack_mongo(document)
|
||||||
|
|
||||||
elif USE_TINYDB:
|
elif USE_TINYDB:
|
||||||
|
@ -78,17 +102,15 @@ class BaseDocument:
|
||||||
|
|
||||||
def save_new(self, document: dict) -> str:
|
def save_new(self, document: dict) -> str:
|
||||||
if USE_MONGO:
|
if USE_MONGO:
|
||||||
new_document = self._document(**document)
|
new_document = self.document(**document)
|
||||||
new_document.save()
|
new_document.save()
|
||||||
return new_document.slug
|
return new_document
|
||||||
elif USE_TINYDB:
|
elif USE_TINYDB:
|
||||||
return self.store.save(document)
|
return self.store.save(document)
|
||||||
|
|
||||||
def delete(self, primary_key) -> dict:
|
def delete(self, primary_key) -> dict:
|
||||||
if USE_MONGO:
|
if USE_MONGO:
|
||||||
document = self._document.objects.get(
|
document = self.document.objects.get(**{str(self.primary_key): primary_key})
|
||||||
**{str(self.primary_key): primary_key}
|
|
||||||
)
|
|
||||||
|
|
||||||
if document:
|
if document:
|
||||||
document.delete()
|
document.delete()
|
||||||
|
@ -109,11 +131,11 @@ class Database:
|
||||||
self.primary_key = "slug"
|
self.primary_key = "slug"
|
||||||
if USE_TINYDB:
|
if USE_TINYDB:
|
||||||
self.store = tiny_db.recipes
|
self.store = tiny_db.recipes
|
||||||
self._document = RecipeDocument
|
self.document = RecipeDocument
|
||||||
|
|
||||||
def update(self, slug: str, new_data: dict) -> None:
|
def update(self, slug: str, new_data: dict) -> None:
|
||||||
if USE_MONGO:
|
if USE_MONGO:
|
||||||
document = self._document.objects.get(slug=slug)
|
document = self.document.objects.get(slug=slug)
|
||||||
|
|
||||||
if document:
|
if document:
|
||||||
document.update(set__name=new_data.get("name"))
|
document.update(set__name=new_data.get("name"))
|
||||||
|
@ -128,6 +150,7 @@ class Database:
|
||||||
)
|
)
|
||||||
document.update(set__totalTime=new_data.get("totalTime"))
|
document.update(set__totalTime=new_data.get("totalTime"))
|
||||||
|
|
||||||
|
document.update(set__slug=new_data.get("slug"))
|
||||||
document.update(set__categories=new_data.get("categories"))
|
document.update(set__categories=new_data.get("categories"))
|
||||||
document.update(set__tags=new_data.get("tags"))
|
document.update(set__tags=new_data.get("tags"))
|
||||||
document.update(set__notes=new_data.get("notes"))
|
document.update(set__notes=new_data.get("notes"))
|
||||||
|
@ -135,12 +158,15 @@ class Database:
|
||||||
document.update(set__rating=new_data.get("rating"))
|
document.update(set__rating=new_data.get("rating"))
|
||||||
document.update(set__extras=new_data.get("extras"))
|
document.update(set__extras=new_data.get("extras"))
|
||||||
document.save()
|
document.save()
|
||||||
|
|
||||||
|
return new_data.get("slug")
|
||||||
elif USE_TINYDB:
|
elif USE_TINYDB:
|
||||||
self.store.update_doc(slug, new_data)
|
self.store.update_doc(slug, new_data)
|
||||||
|
return new_data.get("slug")
|
||||||
|
|
||||||
def update_image(self, slug: str, extension: str) -> None:
|
def update_image(self, slug: str, extension: str) -> None:
|
||||||
if USE_MONGO:
|
if USE_MONGO:
|
||||||
document = self._document.objects.get(slug=slug)
|
document = self.document.objects.get(slug=slug)
|
||||||
|
|
||||||
if document:
|
if document:
|
||||||
document.update(set__image=f"{slug}.{extension}")
|
document.update(set__image=f"{slug}.{extension}")
|
||||||
|
@ -154,24 +180,40 @@ class Database:
|
||||||
self.store = tiny_db.meals
|
self.store = tiny_db.meals
|
||||||
self.document = MealPlanDocument
|
self.document = MealPlanDocument
|
||||||
|
|
||||||
def update(self, key: str, new_data: dict) -> dict:
|
def update(self, uid: str, new_meals: List[MealDocument]) -> dict:
|
||||||
if USE_MONGO:
|
if USE_MONGO:
|
||||||
pass
|
document = self.document.objects.get(uid=uid)
|
||||||
elif USE_TINYDB:
|
if document:
|
||||||
pass
|
document.update(set__meals=new_meals)
|
||||||
|
document.save()
|
||||||
|
elif USE_TINYDB:
|
||||||
|
pass
|
||||||
|
|
||||||
class _Settings(BaseDocument):
|
class _Settings(BaseDocument):
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
|
|
||||||
self.primary_key = "name"
|
self.primary_key = "name"
|
||||||
|
|
||||||
if USE_TINYDB:
|
if USE_TINYDB:
|
||||||
self.store = tiny_db.settings
|
self.store = tiny_db.settings
|
||||||
|
|
||||||
self.document = SiteSettingsDocument
|
self.document = SiteSettingsDocument
|
||||||
|
|
||||||
def update(self, key: str, new_data: dict) -> dict:
|
def save_new(self, main: dict, webhooks: dict) -> str:
|
||||||
if USE_MONGO:
|
|
||||||
pass
|
if USE_MONGO:
|
||||||
elif USE_TINYDB:
|
new_doc = self.document(**main)
|
||||||
pass
|
return new_doc.save()
|
||||||
|
|
||||||
|
elif USE_TINYDB:
|
||||||
|
main["webhooks"] = webhooks
|
||||||
|
return self.store.save(main)
|
||||||
|
|
||||||
|
def update(self, key: str, new_data: dict) -> dict:
|
||||||
|
if USE_MONGO:
|
||||||
|
pass
|
||||||
|
elif USE_TINYDB:
|
||||||
|
pass
|
||||||
|
|
||||||
class _Themes(BaseDocument):
|
class _Themes(BaseDocument):
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
|
|
|
@ -98,11 +98,11 @@ def update_recipe_image(
|
||||||
|
|
||||||
@router.post("/api/recipe/{recipe_slug}/update/", tags=["Recipes"])
|
@router.post("/api/recipe/{recipe_slug}/update/", tags=["Recipes"])
|
||||||
async def update_recipe(recipe_slug: str, data: Recipe):
|
async def update_recipe(recipe_slug: str, data: Recipe):
|
||||||
""" Updates a recipe by existing slug and data. Data should containt """
|
""" Updates a recipe by existing slug and data. """
|
||||||
|
|
||||||
data.update(recipe_slug)
|
new_slug = data.update(recipe_slug)
|
||||||
|
|
||||||
return {"message": "PLACEHOLDER"}
|
return new_slug
|
||||||
|
|
||||||
|
|
||||||
@router.delete("/api/recipe/{recipe_slug}/delete/", tags=["Recipes"])
|
@router.delete("/api/recipe/{recipe_slug}/delete/", tags=["Recipes"])
|
||||||
|
|
|
@ -3,7 +3,8 @@ from datetime import date, timedelta
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import List, Optional
|
from typing import List, Optional
|
||||||
|
|
||||||
from db.mongo.meal_models import MealDocument, MealPlanDocument
|
from db.db_setup import db
|
||||||
|
from db.mongo.meal_models import MealDocument
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
from services.recipe_services import Recipe
|
from services.recipe_services import Recipe
|
||||||
|
@ -80,6 +81,7 @@ class MealPlan(BaseModel):
|
||||||
self.meals = meals
|
self.meals = meals
|
||||||
|
|
||||||
def save_to_db(self):
|
def save_to_db(self):
|
||||||
|
|
||||||
meal_docs = []
|
meal_docs = []
|
||||||
for meal in self.meals:
|
for meal in self.meals:
|
||||||
meal = meal.dict()
|
meal = meal.dict()
|
||||||
|
@ -87,22 +89,16 @@ class MealPlan(BaseModel):
|
||||||
meal_docs.append(meal_doc)
|
meal_docs.append(meal_doc)
|
||||||
|
|
||||||
self.meals = meal_docs
|
self.meals = meal_docs
|
||||||
|
db.meals.save_new(self.dict())
|
||||||
meal_plan = MealPlanDocument(**self.dict())
|
|
||||||
|
|
||||||
meal_plan.save()
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_all() -> List:
|
def get_all() -> List:
|
||||||
all_meals = []
|
|
||||||
for plan in MealPlanDocument.objects.order_by("startDate"):
|
|
||||||
all_meals.append(MealPlan._unpack_doc(plan))
|
|
||||||
|
|
||||||
print(all_meals)
|
all_meals = [MealPlan(**x) for x in db.meals.get_all(order_by="startDate")]
|
||||||
|
|
||||||
return all_meals
|
return all_meals
|
||||||
|
|
||||||
def update(self, uid):
|
def update(self, uid):
|
||||||
document = MealPlanDocument.objects.get(uid=uid)
|
|
||||||
|
|
||||||
meal_docs = []
|
meal_docs = []
|
||||||
for meal in self.meals:
|
for meal in self.meals:
|
||||||
|
@ -110,43 +106,24 @@ class MealPlan(BaseModel):
|
||||||
meal_doc = MealDocument(**meal)
|
meal_doc = MealDocument(**meal)
|
||||||
meal_docs.append(meal_doc)
|
meal_docs.append(meal_doc)
|
||||||
|
|
||||||
self.meals = meal_docs
|
db.meals.update(uid, meal_docs)
|
||||||
if document:
|
|
||||||
document.update(set__meals=self.meals)
|
|
||||||
document.save()
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def delete(uid):
|
def delete(uid):
|
||||||
document = MealPlanDocument.objects.get(uid=uid)
|
db.meals.delete(uid)
|
||||||
|
|
||||||
if document:
|
|
||||||
document.delete()
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _unpack_doc(document: MealPlanDocument):
|
|
||||||
meal_plan = json.loads(document.to_json())
|
|
||||||
del meal_plan["_id"]["$oid"]
|
|
||||||
print(meal_plan)
|
|
||||||
meal_plan["uid"] = meal_plan["uid"]["$uuid"]
|
|
||||||
|
|
||||||
meal_plan["startDate"] = meal_plan["startDate"]["$date"]
|
|
||||||
meal_plan["endDate"] = meal_plan["endDate"]["$date"]
|
|
||||||
|
|
||||||
meals = []
|
|
||||||
for meal in meal_plan["meals"]:
|
|
||||||
meal["date"] = meal["date"]["$date"]
|
|
||||||
meals.append(Meal(**meal))
|
|
||||||
|
|
||||||
meal_plan["meals"] = meals
|
|
||||||
return MealPlan(**meal_plan)
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def today() -> str:
|
def today() -> str:
|
||||||
""" Returns the meal slug for Today """
|
""" Returns the meal slug for Today """
|
||||||
meal_plan = MealPlanDocument.objects.order_by("startDate").limit(1)
|
meal_plan = db.meals.get_all(limit=1, order_by="startDate")
|
||||||
meal_plan = MealPlan._unpack_doc(meal_plan[0])
|
|
||||||
|
|
||||||
for meal in meal_plan.meals:
|
meal_docs = []
|
||||||
|
for meal in meal_plan["meals"]:
|
||||||
|
print(meal)
|
||||||
|
meal_doc = Meal(**meal)
|
||||||
|
meal_docs.append(meal_doc)
|
||||||
|
|
||||||
|
for meal in meal_docs:
|
||||||
if meal.date == date.today():
|
if meal.date == date.today():
|
||||||
return meal.slug
|
return meal.slug
|
||||||
|
|
||||||
|
@ -154,7 +131,6 @@ class MealPlan(BaseModel):
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def this_week():
|
def this_week():
|
||||||
meal_plan = MealPlanDocument.objects.order_by("startDate").limit(1)
|
meal_plan = db.meals.get_all(limit=1, order_by="startDate")
|
||||||
meal_plan = MealPlan._unpack_doc(meal_plan[0])
|
|
||||||
|
|
||||||
return meal_plan
|
return meal_plan
|
||||||
|
|
|
@ -4,7 +4,6 @@ from pathlib import Path
|
||||||
from typing import Any, List, Optional
|
from typing import Any, List, Optional
|
||||||
|
|
||||||
from db.db_setup import db
|
from db.db_setup import db
|
||||||
from db.mongo.recipe_models import RecipeDocument
|
|
||||||
from pydantic import BaseModel, validator
|
from pydantic import BaseModel, validator
|
||||||
from slugify import slugify
|
from slugify import slugify
|
||||||
|
|
||||||
|
@ -93,12 +92,12 @@ class Recipe(BaseModel):
|
||||||
return cls(**document)
|
return cls(**document)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_by_slug(_cls, slug: str):
|
def get_by_slug(cls, slug: str):
|
||||||
""" Returns a recipe dictionary from the slug """
|
""" Returns a Recipe Object by Slug """
|
||||||
|
|
||||||
document = db.recipes.get(slug, "slug")
|
document = db.recipes.get(slug, "slug")
|
||||||
|
|
||||||
return document
|
return cls(**document)
|
||||||
|
|
||||||
def save_to_db(self) -> str:
|
def save_to_db(self) -> str:
|
||||||
recipe_dict = self.dict()
|
recipe_dict = self.dict()
|
||||||
|
@ -115,9 +114,9 @@ class Recipe(BaseModel):
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
recipe_slug = db.recipes.save_new(recipe_dict)
|
recipe_doc = db.recipes.save_new(recipe_dict)
|
||||||
|
|
||||||
return recipe_slug
|
return recipe_doc.slug
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def delete(recipe_slug: str) -> str:
|
def delete(recipe_slug: str) -> str:
|
||||||
|
@ -128,7 +127,8 @@ class Recipe(BaseModel):
|
||||||
|
|
||||||
def update(self, recipe_slug: str):
|
def update(self, recipe_slug: str):
|
||||||
""" Updates the recipe from the database by slug"""
|
""" Updates the recipe from the database by slug"""
|
||||||
db.recipes.update(recipe_slug, self.dict())
|
updated_slug = db.recipes.update(recipe_slug, self.dict())
|
||||||
|
return updated_slug
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def update_image(slug: str, extension: str):
|
def update_image(slug: str, extension: str):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue