import persons class Persons: jacob = persons.Person( id=1, name='Jacob') ryan = persons.Person( id=2, name='Ryan') ellie = persons.Person( id=3, name='Ellie') chris = persons.Person( id=4, name='Chris') import products class Products: broccoli = products.Product( id=0, name="Fresh Broccoli", product_id="134681", 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", raw_data={}, ) garlic_bread = products.Product( id=0, name="La Famiglia Garlic Bread", product_id="294517", 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", raw_data={}, ) beans_round = products.Product( id=0, name="Beans Round", product_id="134072", 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", raw_data={}, ) western_star_unsalted_butter_chefs_choice = products.Product( id=0, name="Western Star Unsalted Butter Chef's Choice", product_id="712251", 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", raw_data={}, ) saxa_iodised_table_salt_shaker = products.Product( id=0, name="Saxa Iodised Table Salt Shaker", 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", raw_data={}, ) mckenzies_pepper_black_ground = products.Product( id=0, name="Mckenzie's Pepper Black Ground", 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", raw_data={}, ) apple = products.Product( id=0, name="Apple", product_id="0", 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", raw_data={}, ) banana = products.Product( id=0, name="Banana", product_id="0", 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", raw_data={}, ) _tags = { 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', preparation='', product=Products.apple, ) broccoli_chopped_1kg = ingredients.Ingredient( id=0, line='1kg Broccoli, Chopped', name='Broccoli', unit='1kg', quantity='1', 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', 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', 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=Persons.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", 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=Persons.jacob.id, ) from meals import db as meals_db from datetime import datetime class Meals: broccoli_soup_for_jacob = meals_db.Meal( id=0, create_date=datetime(2021, 12, 25), created_by=Persons.jacob, meal_date=datetime(2021, 12, 25), chefs=[Persons.jacob], cleanup=[Persons.ryan], consumers=[Persons.ellie, Persons.chris], recipes=[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): for person in class_fields(Persons).values(): await persons.insert_person(conn, person) if __name__ == '__main__': import asyncio from db import connect, create async def initdb(): conn = await connect() await create(conn) await conn.commit() 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) await conn.commit() await conn.close() asyncio.run(initdb()) """ 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) """