Spaces:
Build error
Build error
| import json | |
| import os | |
| from typing import List, Optional | |
| from models import Product, ProductCategory | |
| class ProductDatabase: | |
| def __init__(self, json_file: str = "products.json"): | |
| self.json_file = json_file | |
| self.products = self.load_products() | |
| def load_products(self) -> List[Product]: | |
| if os.path.exists(self.json_file): | |
| with open(self.json_file, 'r') as f: | |
| data = json.load(f) | |
| return [Product(**item) for item in data] | |
| return self.create_default_products() | |
| def create_default_products(self) -> List[Product]: | |
| products = [ | |
| # Personal Care Products | |
| Product( | |
| id=1, | |
| name="Regular Shampoo", | |
| category=ProductCategory.PERSONAL_CARE, | |
| ingredients=["sodium lauryl sulfate", "parabens", "fragrance", "sodium chloride"], | |
| packaging=["plastic bottle"], | |
| contains_chemicals=True, | |
| water_usage="medium", | |
| carbon_footprint="medium" | |
| ), | |
| Product( | |
| id=2, | |
| name="Organic Shampoo Bar", | |
| category=ProductCategory.PERSONAL_CARE, | |
| ingredients=["coconut oil", "shea butter", "essential oils", "clay"], | |
| packaging=["cardboard box"], | |
| is_organic=True, | |
| contains_chemicals=False, | |
| water_usage="low", | |
| carbon_footprint="low" | |
| ), | |
| Product( | |
| id=3, | |
| name="Plastic Toothbrush", | |
| category=ProductCategory.PERSONAL_CARE, | |
| materials=["plastic", "nylon"], | |
| packaging=["plastic blister pack"], | |
| contains_chemicals=True, | |
| is_recyclable=False, | |
| water_usage="low", | |
| carbon_footprint="medium" | |
| ), | |
| Product( | |
| id=4, | |
| name="Bamboo Toothbrush", | |
| category=ProductCategory.PERSONAL_CARE, | |
| materials=["bamboo", "nylon", "cardboard"], | |
| packaging=["cardboard box"], | |
| is_organic=True, | |
| is_recyclable=True, | |
| water_usage="low", | |
| carbon_footprint="low" | |
| ), | |
| Product( | |
| id=5, | |
| name="Plastic Deodorant", | |
| category=ProductCategory.PERSONAL_CARE, | |
| ingredients=["aluminum compounds", "parabens", "propylene glycol", "fragrance"], | |
| packaging=["plastic container"], | |
| contains_chemicals=True, | |
| water_usage="medium", | |
| carbon_footprint="medium" | |
| ), | |
| Product( | |
| id=6, | |
| name="Natural Crystal Deodorant", | |
| category=ProductCategory.PERSONAL_CARE, | |
| ingredients=["potassium alum", "mineral salts"], | |
| packaging=["cardboard box"], | |
| contains_chemicals=False, | |
| is_organic=True, | |
| water_usage="low", | |
| carbon_footprint="low" | |
| ), | |
| Product( | |
| id=7, | |
| name="Disposable Razor", | |
| category=ProductCategory.PERSONAL_CARE, | |
| materials=["plastic", "stainless steel"], | |
| packaging=["plastic packaging"], | |
| contains_chemicals=True, | |
| is_recyclable=False, | |
| water_usage="low", | |
| carbon_footprint="medium" | |
| ), | |
| Product( | |
| id=8, | |
| name="Safety Razor", | |
| category=ProductCategory.PERSONAL_CARE, | |
| materials=["stainless steel", "brass"], | |
| packaging=["cardboard box"], | |
| contains_chemicals=False, | |
| is_recyclable=True, | |
| water_usage="low", | |
| carbon_footprint="low" | |
| ), | |
| # Food Products | |
| Product( | |
| id=9, | |
| name="Palm Oil Cooking Oil", | |
| category=ProductCategory.FOOD, | |
| ingredients=["palm oil"], | |
| packaging=["plastic bottle"], | |
| contains_palm_oil=True, | |
| water_usage="high", | |
| carbon_footprint="high" | |
| ), | |
| Product( | |
| id=10, | |
| name="Olive Oil", | |
| category=ProductCategory.FOOD, | |
| ingredients=["olive oil"], | |
| packaging=["glass bottle"], | |
| contains_palm_oil=False, | |
| is_organic=True, | |
| water_usage="medium", | |
| carbon_footprint="medium" | |
| ), | |
| Product( | |
| id=11, | |
| name="Plastic-Wrapped Cucumber", | |
| category=ProductCategory.FOOD, | |
| ingredients=["cucumber"], | |
| packaging=["plastic wrap"], | |
| contains_chemicals=False, | |
| water_usage="medium", | |
| carbon_footprint="medium" | |
| ), | |
| Product( | |
| id=12, | |
| name="Loose Organic Cucumber", | |
| category=ProductCategory.FOOD, | |
| ingredients=["cucumber"], | |
| packaging=["none"], | |
| is_organic=True, | |
| water_usage="low", | |
| carbon_footprint="low" | |
| ), | |
| Product( | |
| id=13, | |
| name="Coffee Pods (Plastic)", | |
| category=ProductCategory.FOOD, | |
| ingredients=["coffee", "plastic"], | |
| packaging=["plastic pods", "cardboard box"], | |
| contains_chemicals=True, | |
| is_recyclable=False, | |
| water_usage="high", | |
| carbon_footprint="high" | |
| ), | |
| Product( | |
| id=14, | |
| name="Ground Coffee (Compostable Bag)", | |
| category=ProductCategory.FOOD, | |
| ingredients=["coffee"], | |
| packaging=["compostable paper bag"], | |
| is_organic=True, | |
| is_recyclable=True, | |
| water_usage="medium", | |
| carbon_footprint="medium" | |
| ), | |
| # Beverages | |
| Product( | |
| id=15, | |
| name="Plastic Water Bottle", | |
| category=ProductCategory.BEVERAGE, | |
| materials=["plastic"], | |
| packaging=["plastic bottle"], | |
| is_recyclable=True, | |
| water_usage="medium", | |
| carbon_footprint="high" | |
| ), | |
| Product( | |
| id=16, | |
| name="Reusable Stainless Steel Bottle", | |
| category=ProductCategory.BEVERAGE, | |
| materials=["stainless steel"], | |
| packaging=["cardboard box"], | |
| is_recyclable=True, | |
| water_usage="low", | |
| carbon_footprint="low" | |
| ), | |
| Product( | |
| id=17, | |
| name="Aluminum Soda Can", | |
| category=ProductCategory.BEVERAGE, | |
| materials=["aluminum"], | |
| packaging=["aluminum can"], | |
| is_recyclable=True, | |
| water_usage="medium", | |
| carbon_footprint="medium" | |
| ), | |
| Product( | |
| id=18, | |
| name="Plastic Soda Bottle", | |
| category=ProductCategory.BEVERAGE, | |
| materials=["plastic"], | |
| packaging=["plastic bottle"], | |
| is_recyclable=True, | |
| water_usage="medium", | |
| carbon_footprint="high" | |
| ), | |
| Product( | |
| id=19, | |
| name="Glass Milk Bottle", | |
| category=ProductCategory.BEVERAGE, | |
| materials=["glass"], | |
| packaging=["glass bottle"], | |
| is_recyclable=True, | |
| water_usage="medium", | |
| carbon_footprint="medium" | |
| ), | |
| Product( | |
| id=20, | |
| name="Tetra Pak Juice Box", | |
| category=ProductCategory.BEVERAGE, | |
| materials=["paper", "plastic", "aluminum"], | |
| packaging=["tetra pak"], | |
| is_recyclable=False, | |
| water_usage="medium", | |
| carbon_footprint="medium" | |
| ), | |
| # Clothing | |
| Product( | |
| id=21, | |
| name="Organic Cotton T-shirt", | |
| category=ProductCategory.CLOTHING, | |
| materials=["organic cotton"], | |
| packaging=["paper bag"], | |
| is_organic=True, | |
| water_usage="low", | |
| carbon_footprint="low" | |
| ), | |
| Product( | |
| id=22, | |
| name="Conventional Cotton T-shirt", | |
| category=ProductCategory.CLOTHING, | |
| materials=["cotton"], | |
| packaging=["plastic bag"], | |
| contains_chemicals=True, | |
| water_usage="high", | |
| carbon_footprint="medium" | |
| ), | |
| Product( | |
| id=23, | |
| name="Polyester Jacket", | |
| category=ProductCategory.CLOTHING, | |
| materials=["polyester", "nylon"], | |
| packaging=["plastic bag"], | |
| contains_chemicals=True, | |
| water_usage="medium", | |
| carbon_footprint="high" | |
| ), | |
| Product( | |
| id=24, | |
| name="Recycled Polyester Jacket", | |
| category=ProductCategory.CLOTHING, | |
| materials=["recycled polyester"], | |
| packaging=["recycled paper bag"], | |
| is_recyclable=True, | |
| water_usage="medium", | |
| carbon_footprint="low" | |
| ), | |
| Product( | |
| id=25, | |
| name="Leather Boots", | |
| category=ProductCategory.CLOTHING, | |
| materials=["leather", "rubber"], | |
| packaging=["cardboard box"], | |
| contains_chemicals=True, | |
| water_usage="high", | |
| carbon_footprint="high" | |
| ), | |
| Product( | |
| id=26, | |
| name="Vegan Leather Boots", | |
| category=ProductCategory.CLOTHING, | |
| materials=["polyurethane", "rubber"], | |
| packaging=["cardboard box"], | |
| contains_chemicals=True, | |
| water_usage="medium", | |
| carbon_footprint="medium" | |
| ), | |
| Product( | |
| id=27, | |
| name="Fast Fashion Dress", | |
| category=ProductCategory.CLOTHING, | |
| materials=["polyester", "spandex"], | |
| packaging=["plastic bag"], | |
| contains_chemicals=True, | |
| water_usage="high", | |
| carbon_footprint="high" | |
| ), | |
| Product( | |
| id=28, | |
| name="Vintage/Second-hand Dress", | |
| category=ProductCategory.CLOTHING, | |
| materials=["various"], | |
| packaging=["none"], | |
| is_organic=False, | |
| water_usage="low", | |
| carbon_footprint="very low" | |
| ), | |
| # Household Products | |
| Product( | |
| id=29, | |
| name="Plastic Dish Scourer", | |
| category=ProductCategory.HOUSEHOLD, | |
| materials=["plastic", "nylon"], | |
| packaging=["plastic packaging"], | |
| contains_chemicals=True, | |
| is_recyclable=False, | |
| water_usage="low", | |
| carbon_footprint="medium" | |
| ), | |
| Product( | |
| id=30, | |
| name="Natural Loofah Scourer", | |
| category=ProductCategory.HOUSEHOLD, | |
| materials=["loofah", "cotton"], | |
| packaging=["cardboard"], | |
| is_organic=True, | |
| is_recyclable=True, | |
| water_usage="low", | |
| carbon_footprint="low" | |
| ), | |
| Product( | |
| id=31, | |
| name="Chemical Cleaner (Bleach)", | |
| category=ProductCategory.HOUSEHOLD, | |
| ingredients=["sodium hypochlorite", "surfactants", "fragrance"], | |
| packaging=["plastic bottle"], | |
| contains_chemicals=True, | |
| water_usage="medium", | |
| carbon_footprint="medium" | |
| ), | |
| Product( | |
| id=32, | |
| name="Vinegar-Based Cleaner", | |
| category=ProductCategory.HOUSEHOLD, | |
| ingredients=["vinegar", "essential oils", "water"], | |
| packaging=["glass bottle"], | |
| contains_chemicals=False, | |
| is_organic=True, | |
| water_usage="low", | |
| carbon_footprint="low" | |
| ), | |
| Product( | |
| id=33, | |
| name="Plastic Trash Bags", | |
| category=ProductCategory.HOUSEHOLD, | |
| materials=["plastic"], | |
| packaging=["cardboard box"], | |
| contains_chemicals=True, | |
| is_recyclable=False, | |
| water_usage="low", | |
| carbon_footprint="medium" | |
| ), | |
| Product( | |
| id=34, | |
| name="Compostable Trash Bags", | |
| category=ProductCategory.HOUSEHOLD, | |
| materials=["corn starch", "plant materials"], | |
| packaging=["cardboard box"], | |
| is_organic=True, | |
| is_recyclable=True, | |
| water_usage="low", | |
| carbon_footprint="low" | |
| ), | |
| # Electronics | |
| Product( | |
| id=35, | |
| name="Smartphone", | |
| category=ProductCategory.ELECTRONICS, | |
| materials=["plastic", "glass", "lithium", "rare earth metals"], | |
| packaging=["cardboard box", "plastic"], | |
| contains_chemicals=True, | |
| is_recyclable=False, | |
| water_usage="high", | |
| carbon_footprint="high" | |
| ), | |
| Product( | |
| id=36, | |
| name="Refurbished Smartphone", | |
| category=ProductCategory.ELECTRONICS, | |
| materials=["plastic", "glass", "lithium", "rare earth metals"], | |
| packaging=["recycled cardboard"], | |
| contains_chemicals=True, | |
| is_recyclable=True, | |
| water_usage="low", | |
| carbon_footprint="low" | |
| ), | |
| Product( | |
| id=37, | |
| name="Single-use Batteries", | |
| category=ProductCategory.ELECTRONICS, | |
| materials=["zinc", "manganese", "plastic", "chemicals"], | |
| packaging=["plastic blister pack"], | |
| contains_chemicals=True, | |
| is_recyclable=False, | |
| water_usage="medium", | |
| carbon_footprint="high" | |
| ), | |
| Product( | |
| id=38, | |
| name="Rechargeable Batteries", | |
| category=ProductCategory.ELECTRONICS, | |
| materials=["lithium-ion", "nickel"], | |
| packaging=["cardboard box"], | |
| contains_chemicals=True, | |
| is_recyclable=True, | |
| water_usage="medium", | |
| carbon_footprint="medium" | |
| ), | |
| # Additional Food Products | |
| Product( | |
| id=39, | |
| name="Imported Avocados", | |
| category=ProductCategory.FOOD, | |
| ingredients=["avocados"], | |
| packaging=["none"], | |
| contains_palm_oil=False, | |
| water_usage="high", # High water usage | |
| carbon_footprint="high" # High transport emissions | |
| ), | |
| Product( | |
| id=40, | |
| name="Local Seasonal Vegetables", | |
| category=ProductCategory.FOOD, | |
| ingredients=["mixed vegetables"], | |
| packaging=["paper bag"], | |
| is_organic=True, | |
| water_usage="low", | |
| carbon_footprint="low" | |
| ), | |
| Product( | |
| id=41, | |
| name="Farmed Salmon", | |
| category=ProductCategory.FOOD, | |
| ingredients=["salmon"], | |
| packaging=["plastic tray", "plastic wrap"], | |
| contains_chemicals=True, | |
| water_usage="high", | |
| carbon_footprint="medium" | |
| ), | |
| Product( | |
| id=42, | |
| name="Wild Caught Salmon", | |
| category=ProductCategory.FOOD, | |
| ingredients=["salmon"], | |
| packaging=["paper"], | |
| is_organic=True, | |
| water_usage="low", | |
| carbon_footprint="low" | |
| ), | |
| Product( | |
| id=43, | |
| name="Beef (Feedlot)", | |
| category=ProductCategory.FOOD, | |
| ingredients=["beef"], | |
| packaging=["plastic wrap", "styrofoam"], | |
| contains_chemicals=True, | |
| water_usage="high", | |
| carbon_footprint="very high" | |
| ), | |
| Product( | |
| id=44, | |
| name="Grass-Fed Beef", | |
| category=ProductCategory.FOOD, | |
| ingredients=["beef"], | |
| packaging=["paper", "compostable wrap"], | |
| is_organic=True, | |
| water_usage="medium", | |
| carbon_footprint="high" | |
| ), | |
| Product( | |
| id=45, | |
| name="Plant-Based Burger", | |
| category=ProductCategory.FOOD, | |
| ingredients=["pea protein", "coconut oil", "potato starch"], | |
| packaging=["cardboard box"], | |
| contains_palm_oil=False, | |
| water_usage="low", | |
| carbon_footprint="low" | |
| ), | |
| # Household Paper Products | |
| Product( | |
| id=46, | |
| name="Virgin Paper Towels", | |
| category=ProductCategory.HOUSEHOLD, | |
| materials=["wood pulp"], | |
| packaging=["plastic wrap"], | |
| contains_palm_oil=False, | |
| water_usage="high", | |
| carbon_footprint="medium" | |
| ), | |
| Product( | |
| id=47, | |
| name="Recycled Paper Towels", | |
| category=ProductCategory.HOUSEHOLD, | |
| materials=["recycled paper"], | |
| packaging=["paper wrap"], | |
| is_recyclable=True, | |
| water_usage="low", | |
| carbon_footprint="low" | |
| ), | |
| Product( | |
| id=48, | |
| name="Bamboo Toilet Paper", | |
| category=ProductCategory.HOUSEHOLD, | |
| materials=["bamboo"], | |
| packaging=["paper wrap"], | |
| is_organic=True, | |
| water_usage="low", | |
| carbon_footprint="low" | |
| ), | |
| Product( | |
| id=49, | |
| name="Regular Toilet Paper", | |
| category=ProductCategory.HOUSEHOLD, | |
| materials=["wood pulp"], | |
| packaging=["plastic wrap"], | |
| contains_palm_oil=False, | |
| water_usage="high", | |
| carbon_footprint="medium" | |
| ), | |
| # Personal Care - Makeup | |
| Product( | |
| id=50, | |
| name="Conventional Lipstick", | |
| category=ProductCategory.PERSONAL_CARE, | |
| ingredients=["parabens", "petrolatum", "fragrance", "synthetic dyes"], | |
| packaging=["plastic tube"], | |
| contains_chemicals=True, | |
| water_usage="medium", | |
| carbon_footprint="medium" | |
| ), | |
| Product( | |
| id=51, | |
| name="Natural Lipstick", | |
| category=ProductCategory.PERSONAL_CARE, | |
| ingredients=["beeswax", "shea butter", "natural pigments"], | |
| packaging=["recycled cardboard"], | |
| is_organic=True, | |
| contains_chemicals=False, | |
| water_usage="low", | |
| carbon_footprint="low" | |
| ), | |
| Product( | |
| id=52, | |
| name="Plastic Makeup Wipes", | |
| category=ProductCategory.PERSONAL_CARE, | |
| ingredients=["polyester", "chemicals", "preservatives"], | |
| packaging=["plastic pouch"], | |
| contains_chemicals=True, | |
| is_recyclable=False, | |
| water_usage="medium", | |
| carbon_footprint="medium" | |
| ), | |
| Product( | |
| id=53, | |
| name="Reusable Cotton Rounds", | |
| category=ProductCategory.PERSONAL_CARE, | |
| materials=["organic cotton"], | |
| packaging=["cardboard box"], | |
| is_organic=True, | |
| is_recyclable=True, | |
| water_usage="low", | |
| carbon_footprint="low" | |
| ), | |
| # Baby Products | |
| Product( | |
| id=54, | |
| name="Disposable Diapers", | |
| category=ProductCategory.PERSONAL_CARE, | |
| materials=["plastic", "wood pulp", "superabsorbent polymers"], | |
| packaging=["plastic bag"], | |
| contains_chemicals=True, | |
| is_recyclable=False, | |
| water_usage="high", | |
| carbon_footprint="high" | |
| ), | |
| Product( | |
| id=55, | |
| name="Cloth Diapers", | |
| category=ProductCategory.PERSONAL_CARE, | |
| materials=["organic cotton", "bamboo"], | |
| packaging=["reusable bag"], | |
| is_organic=True, | |
| is_recyclable=True, | |
| water_usage="medium", | |
| carbon_footprint="low" | |
| ), | |
| # Pet Products | |
| Product( | |
| id=56, | |
| name="Plastic Pet Food Bowl", | |
| category=ProductCategory.HOUSEHOLD, | |
| materials=["plastic"], | |
| packaging=["plastic"], | |
| contains_chemicals=True, | |
| water_usage="low", | |
| carbon_footprint="medium" | |
| ), | |
| Product( | |
| id=57, | |
| name="Stainless Steel Pet Bowl", | |
| category=ProductCategory.HOUSEHOLD, | |
| materials=["stainless steel"], | |
| packaging=["cardboard"], | |
| is_recyclable=True, | |
| water_usage="low", | |
| carbon_footprint="low" | |
| ), | |
| Product( | |
| id=58, | |
| name="Conventional Cat Litter", | |
| category=ProductCategory.HOUSEHOLD, | |
| materials=["clay", "silica", "chemicals"], | |
| packaging=["plastic bag"], | |
| contains_chemicals=True, | |
| water_usage="medium", | |
| carbon_footprint="medium" | |
| ), | |
| Product( | |
| id=59, | |
| name="Biodegradable Cat Litter", | |
| category=ProductCategory.HOUSEHOLD, | |
| materials=["recycled paper", "wood", "corn"], | |
| packaging=["paper bag"], | |
| is_organic=True, | |
| is_recyclable=True, | |
| water_usage="low", | |
| carbon_footprint="low" | |
| ), | |
| # Office Supplies | |
| Product( | |
| id=60, | |
| name="Plastic Pens (Pack)", | |
| category=ProductCategory.OTHER, | |
| materials=["plastic", "ink"], | |
| packaging=["plastic blister pack"], | |
| contains_chemicals=True, | |
| is_recyclable=False, | |
| water_usage="medium", | |
| carbon_footprint="medium" | |
| ), | |
| Product( | |
| id=61, | |
| name="Refillable Bamboo Pen", | |
| category=ProductCategory.OTHER, | |
| materials=["bamboo", "metal", "ink"], | |
| packaging=["cardboard"], | |
| is_organic=True, | |
| is_recyclable=True, | |
| water_usage="low", | |
| carbon_footprint="low" | |
| ), | |
| Product( | |
| id=62, | |
| name="Plastic Stapler", | |
| category=ProductCategory.OTHER, | |
| materials=["plastic", "metal"], | |
| packaging=["plastic"], | |
| contains_chemicals=True, | |
| is_recyclable=False, | |
| water_usage="low", | |
| carbon_footprint="medium" | |
| ), | |
| Product( | |
| id=63, | |
| name="Metal Stapler", | |
| category=ProductCategory.OTHER, | |
| materials=["metal"], | |
| packaging=["cardboard"], | |
| is_recyclable=True, | |
| water_usage="low", | |
| carbon_footprint="low" | |
| ), | |
| ] | |
| # Save to JSON file | |
| with open(self.json_file, 'w') as f: | |
| json.dump([p.dict() for p in products], f, indent=2) | |
| return products | |
| def search_product(self, query: str) -> Optional[Product]: | |
| """Search for a product by name (partial match)""" | |
| query = query.lower() | |
| # First try exact match | |
| for product in self.products: | |
| if query == product.name.lower(): | |
| return product | |
| # Then try partial match | |
| for product in self.products: | |
| if query in product.name.lower(): | |
| return product | |
| # Try matching individual words | |
| query_words = query.split() | |
| best_match = None | |
| best_match_count = 0 | |
| for product in self.products: | |
| product_name_lower = product.name.lower() | |
| match_count = sum(1 for word in query_words if word in product_name_lower) | |
| if match_count > best_match_count: | |
| best_match_count = match_count | |
| best_match = product | |
| return best_match if best_match_count > 0 else None | |
| def get_products_by_category(self, category: ProductCategory) -> List[Product]: | |
| """Get all products in a specific category""" | |
| return [p for p in self.products if p.category == category] | |
| def get_all_products(self) -> List[Product]: | |
| """Get all products""" | |
| return self.products | |
| def get_alternatives(self, category: ProductCategory, exclude_id: int, limit: int = 3) -> List[Product]: | |
| """Get alternative products in the same category""" | |
| # Get products in same category with better eco characteristics | |
| alternatives = [] | |
| for product in self.products: | |
| if product.id != exclude_id and product.category == category: | |
| # Prioritize organic, recyclable, low-impact products | |
| score = 0 | |
| if product.is_organic: | |
| score += 3 | |
| if product.is_recyclable: | |
| score += 2 | |
| if not product.contains_chemicals: | |
| score += 2 | |
| if not product.contains_palm_oil: | |
| score += 1 | |
| if product.water_usage == 'low': | |
| score += 1 | |
| if product.carbon_footprint == 'low': | |
| score += 1 | |
| alternatives.append((score, product)) | |
| # Sort by score (higher is better) and return top alternatives | |
| alternatives.sort(key=lambda x: x[0], reverse=True) | |
| return [p for _, p in alternatives[:limit]] | |
| def add_product(self, product: Product) -> int: | |
| """Add a new product to the database""" | |
| # Generate new ID | |
| new_id = max([p.id for p in self.products if p.id is not None] + [0]) + 1 | |
| product.id = new_id | |
| self.products.append(product) | |
| # Save to JSON | |
| with open(self.json_file, 'w') as f: | |
| json.dump([p.dict() for p in self.products], f, indent=2) | |
| return new_id | |
| def get_product_summary(self) -> dict: | |
| """Get summary statistics about products""" | |
| summary = { | |
| 'total_products': len(self.products), | |
| 'by_category': {}, | |
| 'organic_count': 0, | |
| 'recyclable_count': 0, | |
| 'contains_palm_oil': 0, | |
| 'contains_chemicals': 0 | |
| } | |
| for product in self.products: | |
| # Count by category | |
| category = product.category.value | |
| summary['by_category'][category] = summary['by_category'].get(category, 0) + 1 | |
| # Count attributes | |
| if product.is_organic: | |
| summary['organic_count'] += 1 | |
| if product.is_recyclable: | |
| summary['recyclable_count'] += 1 | |
| if product.contains_palm_oil: | |
| summary['contains_palm_oil'] += 1 | |
| if product.contains_chemicals: | |
| summary['contains_chemicals'] += 1 | |
| return summary |