from api.dtos import MemberRef class MemberRefs: # Fixture MemberRef objects (id/display_name). Backcompat: .name property returns display_name. jacob = MemberRef(id=1, display_name="Jacob") ryan = MemberRef(id=2, display_name="Ryan") ellie = MemberRef(id=3, display_name="Ellie") chris = MemberRef(id=4, display_name="Chris") import products class Products: broccoli = products.Product( id=0, shop_code="woolworths", name="Fresh Broccoli", product_id="134681", quantity=1, unit="Items", link="https://www.woolworths.com.au/shop/productdetails/134681/fresh-broccoli", img_small="https://cdn0.woolworths.media/content/wowproductimages/small/134681.jpg", img_large="https://cdn0.woolworths.media/content/wowproductimages/large/134681.jpg", ) garlic_bread = products.Product( id=0, shop_code="woolworths", name="La Famiglia Garlic Bread", product_id="294517", quantity=1, unit="Loaf", link="https://www.woolworths.com.au/shop/productdetails/294517/la-famiglia-garlic-bread", img_small="https://cdn0.woolworths.media/content/wowproductimages/small/294517.jpg", img_large="https://cdn0.woolworths.media/content/wowproductimages/large/294517.jpg", ) beans_round = products.Product( id=0, shop_code="woolworths", name="Beans Round", product_id="134072", quantity=1, unit="kg", link="https://www.woolworths.com.au/shop/productdetails/134072/beans-round", img_small="https://cdn0.woolworths.media/content/wowproductimages/small/134072.jpg", img_large="https://cdn0.woolworths.media/content/wowproductimages/large/134072.jpg", ) western_star_unsalted_butter_chefs_choice = products.Product( id=0, shop_code="woolworths", name="Western Star Unsalted Butter Chef's Choice", product_id="712251", quantity=500, unit="g", link="https://www.woolworths.com.au/shop/productdetails/712251/western-star-unsalted-butter-chef-s-choice", img_small="https://cdn0.woolworths.media/content/wowproductimages/small/712251.jpg", img_large="https://cdn0.woolworths.media/content/wowproductimages/large/712251.jpg", ) saxa_iodised_table_salt_shaker = products.Product( id=0, shop_code="woolworths", name="Saxa Iodised Table Salt Shaker", quantity=750, unit="g", product_id="33245", link="https://www.woolworths.com.au/shop/productdetails/33245/saxa-iodised-table-salt-shaker", img_small="https://cdn0.woolworths.media/content/wowproductimages/small/033245.jpg", img_large="https://cdn0.woolworths.media/content/wowproductimages/large/033245.jpg", ) mckenzies_pepper_black_ground = products.Product( id=0, shop_code="woolworths", name="Mckenzie's Pepper Black Ground", quantity=100, unit="g", product_id="75194", link="https://www.woolworths.com.au/shop/productdetails/75194/mckenzie-s-pepper-black-ground", img_small="https://cdn0.woolworths.media/content/wowproductimages/small/075194.jpg", img_large="https://cdn0.woolworths.media/content/wowproductimages/large/075194.jpg", ) apple = products.Product( id=0, shop_code="woolworths", name="Apple", product_id="3542", quantity=1, unit="Items", link="https://www.woolworths.com.au/shop/productdetails/0/apple", img_small="https://cdn0.woolworths.media/content/wowproductimages/small/0.jpg", img_large="https://cdn0.woolworths.media/content/wowproductimages/large/0.jpg", ) banana = products.Product( id=0, shop_code="woolworths", name="Banana", product_id="214", quantity=1, unit="Items", link="https://www.woolworths.com.au/shop/productdetails/0/banana", img_small="https://cdn0.woolworths.media/content/wowproductimages/small/0.jpg", img_large="https://cdn0.woolworths.media/content/wowproductimages/large/0.jpg", ) _tags = { apple.product_id: ["apple", "fruit", "fresh fruit"], banana.product_id: ["banana", "fruit", "fresh fruit"], broccoli.product_id: ["broccoli", "fresh broccoli"], garlic_bread.product_id: ["garlic bread", "bread", "garlic", "frozen garlic bread"], beans_round.product_id: ["beans", "green beans", "fresh green beans", "fresh beans"], western_star_unsalted_butter_chefs_choice.product_id: [ "butter", "unsalted butter", "salted butter", ], saxa_iodised_table_salt_shaker.product_id: ["salt", "iodised salt", "kosher salt"], mckenzies_pepper_black_ground.product_id: [ "pepper", "black pepper", "ground pepper", "fresh ground pepper", ], } import ingredients class Ingredients: one_apple = ingredients.Ingredient( id=0, line="1 Apple", name="Apple", unit="Items", quantity=1.0, preparation="", product=Products.apple, ) broccoli_chopped_1kg = ingredients.Ingredient( id=0, line="1kg Broccoli, Chopped", name="Broccoli", unit="kg", quantity=1.0, preparation="Chopped", product=Products.broccoli, ) garlic_bread_1_loaf = ingredients.Ingredient( id=0, line="1 Loaf Garlic Bread", name="Garlic Bread", unit="Loaf", quantity=1.0, preparation="", product=Products.garlic_bread, ) green_beans = ingredients.Ingredient( id=0, line="1 pound green beans (fresh)", name="green beans", unit="Pound", quantity=1.0, preparation="", product=Products.beans_round, ) butter = ingredients.Ingredient( id=0, line="1 to 2 tablespoons butter", name="butter", unit="Tablespoon", quantity=1.0, preparation="", product=Products.western_star_unsalted_butter_chefs_choice, ) salt = ingredients.Ingredient( id=0, line="Salt (to taste)", name="Salt", unit="Items", quantity=1.0, preparation="", product=Products.saxa_iodised_table_salt_shaker, ) freshly_ground_black_pepper = ingredients.Ingredient( id=0, line="Freshly ground black pepper (to taste)", name="Freshly ground black pepper", unit="Items", quantity=1.0, preparation="", product=Products.mckenzies_pepper_black_ground, ) import recipes class Recipes: broccoli_soup = recipes.Recipe( id=0, name="Broccoli Soup", link="https://www.bbcgoodfood.com/recipes/broccoli-soup", serves=4, image_urls=[ "https://www.bbcgoodfood.com/sites/default/files/styles/recipe/public/recipe/recipe-image/2018/10/broccoli-soup.jpg" ], ingredients=[Ingredients.broccoli_chopped_1kg], created_by_id=MemberRefs.jacob.id, ) how_to_steam_green_beans = recipes.Recipe( id=0, name="How to Steam Green Beans", link="https://www.thespruceeats.com/steamed-green-beans-3057051", serves=4, image_urls=[ "https://www.thespruceeats.com/thmb/CLROdq9dlYbjKjlOlA_kmFdunTY=/1500x0/filters:no_upscale():max_bytes(150000):strip_icc()/steamed-green-beans-3057051-hero-01-b1c4f894da5b4bc0a01cd43886df0100.jpg" ], ingredients=[ Ingredients.green_beans, Ingredients.butter, Ingredients.salt, Ingredients.freshly_ground_black_pepper, ], created_by_id=MemberRefs.jacob.id, ) from meals import repository as meals_db from datetime import datetime class Meals: broccoli_soup_for_jacob = meals_db.Meal( id=0, suggested_date=datetime(2021, 12, 25), chefs=[MemberRef(id=MemberRefs.jacob.id, display_name=MemberRefs.jacob.name)], cleanup=[MemberRef(id=MemberRefs.ryan.id, display_name=MemberRefs.ryan.name)], consumers=[ MemberRef(id=MemberRefs.ellie.id, display_name=MemberRefs.ellie.name), MemberRef(id=MemberRefs.chris.id, display_name=MemberRefs.chris.name), ], recipes=[ meals_db.MealRecipe(meal_id=-1, recipe_id=-1, servings=2, recipe=Recipes.broccoli_soup) ], extra_ingredients=[Ingredients.garlic_bread_1_loaf], ) def class_fields(obj): return {k: v for k, v in obj.__dict__.items() if not k.startswith("_")} async def create_persons(conn): # Seed explicit User rows for fixture MemberRefs (ids 1..4) without any legacy Person references try: from users.repository import insert_user_with_id users = [ (MemberRefs.jacob.id, MemberRefs.jacob.display_name), (MemberRefs.ryan.id, MemberRefs.ryan.display_name), (MemberRefs.ellie.id, MemberRefs.ellie.display_name), (MemberRefs.chris.id, MemberRefs.chris.display_name), ] for uid, name in users: await insert_user_with_id(conn, uid, f"{name.lower()}@example.com", name) except Exception: # If users repo/tables aren't available in some minimal contexts, ignore pass async def create_test_data(conn): await create_persons(conn) for product in class_fields(Products).values(): await products.insert_product(conn, product, {}) await products.add_missing_tags(conn, product, Products._tags[product.product_id]) for recipe in class_fields(Recipes).values(): await recipes.insert_recipe(conn, recipe) for ingredient in recipe.ingredients: ingredient.recipe_id = recipe.id ingredient.product_id = ingredient.product.id await ingredients.insert_ingredient(conn, ingredient) for meal in class_fields(Meals).values(): await meals_db.insert_meal(conn, meal) """ import re def to_name(thing): return re.sub(r"\\W", "", thing["name"].lower().replace(" ", "_")) products_order= ['id', 'name', 'product_id', 'link', 'tags', 'img_small', 'img_large', 'raw_data'] ingredients_order = 'id line name unit quantity preparation product'.split(' ') def stringify(k: str, v) -> str: if k == 'id': return '0' if k == 'ingredients' and isinstance(v, dict): return f'Ingredients.{to_name(v)}' if k == 'product': return f'Products.{to_name(v)}' if k == 'created_by_id': names = ['jacob', 'ryan', 'ellie', 'chris'] return f'Persons.{names[v - 1]}.id' if v is None: if k == 'raw_data': return '{}' if k == 'tags': return '[]' return 'None' if isinstance(v, str): return f'"{v}"' if isinstance(v, list): return f'[{",".join([stringify(k, x) for x in v])}]' return str(v) def to_param_list(item, order): results = [] for k in order: v = item[k] if k in item else None results.append(f'{k}={stringify(k, v)}') return results def to_create_statements(items, type_name, order): s = [] for item in items: name = to_name(item) params = to_param_list(item, order) s.append(f'{name} = {type_name}(') for p in params: s.append(f'\t{p},') s.append(')') s.append('') return '\n'.join(s) """