list.py
5.1 kB · python · 155 lines
1import argparse2from catalog.helpers import all_ids, live_ids, load_product3from catalog.models import Product4from typing import Any, Callable56def listattr(ids: list[int], title: str, extractor: Callable[[Product], Any]):7 values = set()8 for id in ids:9 product = load_product(id)10 extracted = extractor(product)11 if isinstance(extracted, list):12 values.update(extracted)13 elif isinstance(extracted, set):14 values.update(extracted)15 elif extracted is not None:16 values.add(extracted)17 print(f"Unique {title} ({len(values)}):")18 try:19 sorted_values = sorted(list(values))20 except TypeError:21 sorted_values = list(values)22 for item in sorted_values:23 print(f"\"{item}\",")24 print()2526# PRODUCTS2728def list_titles(ids: list[int]):29 listattr(ids, "Product Titles", lambda p: p.title)3031def list_categories(ids: list[int]):32 listattr(ids, "Product Categories", lambda p: p.category)3334def list_techniques(ids: list[int]):35 listattr(ids, "Product Techniques", lambda p: p.technique)3637def list_stitch_colors(ids: list[int]):38 listattr(ids, "Stitch Colors", lambda p: p.stitch_colors)3940# VARIANTS4142def list_sizes(ids: list[int]):43 def extractor(p: Product):44 return {v.size for v in p.variants}45 listattr(ids, "Variant Sizes", extractor)4647def list_colors(ids: list[int]):48 def extractor(p: Product):49 return {v.color for v in p.variants}50 listattr(ids, "Variant Colors", extractor)5152def list_costs(ids: list[int]):53 def extractor(p: Product):54 return {v.cost for v in p.variants}55 listattr(ids, "Variant Costs", extractor)5657# PLACEMENTS5859def list_placements(ids: list[int]):60 def extractor(p: Product):61 return {placement.name for placement in p.placements if not placement.is_ignored}62 listattr(ids, "Placement Names", extractor)6364def list_dimensions(ids: list[int]):65 def extractor(p: Product):66 return {placement.dims for placement in p.placements if not placement.is_ignored}67 listattr(ids, "Placement Dimensions", extractor)6869def list_dpis(ids: list[int]):70 def extractor(p: Product):71 return {placement.dpi for placement in p.placements if not placement.is_ignored}72 listattr(ids, "Placement DPIs", extractor)7374def list_ids(ids: list[int]):75 def extractor(p: Product):76 return {placement.id for placement in p.placements if not placement.is_ignored}77 listattr(ids, "Placement IDs", extractor)7879# MOCKUPS8081def list_mockup_categories(ids: list[int]):82 def extractor(p: Product):83 return {m.category for m in p.mockups if not m.is_ignored}84 listattr(ids, "Mockup Categories", extractor)8586def list_mockup_titles(ids: list[int]):87 def extractor(p: Product):88 return {m.title for m in p.mockups if not m.is_ignored}89 listattr(ids, "Mockup Titles", extractor)9091# EXTRAS9293def list_variants(ids: list[int]):94 print(f"Listing variants for {len(ids)} products")95 for id in ids:96 product = load_product(id)97 print(f"{product.desc} - {len(product.variants)}")98 for i, variant in enumerate(product.variants):99 print(f"({i+1}) {variant.size} / {variant.color}")100 print()101102# AVERAGES103104def average_variants(ids: list[int]):105 average = sum(len(load_product(id).variants) for id in ids) / len(ids)106 print(f"Average variants per product: {average:.2f}")107108def average_costs(ids: list[int]):109 total_cost = 0110 variant_count = 0111 for id in ids:112 product = load_product(id)113 for variant in product.variants:114 total_cost += float(variant.cost)115 variant_count += 1116 average = total_cost / variant_count117 print(f"Average cost per variant: ${average:.2f}")118119def average_placements(ids: list[int]):120 average = sum(len(load_product(id).placements) for id in ids) / len(ids)121 print(f"Average placements per product: {average:.2f}")122123def average_mockups(ids: list[int]):124 average = sum(len(load_product(id).mockups) for id in ids) / len(ids)125 print(f"Average mockups per product: {average:.2f}")126127# COMMANDS128129GROUPS = {130 "products": [list_titles, list_categories, list_techniques, list_stitch_colors],131 "variants": [list_sizes, list_colors, list_costs],132 "placements": [list_placements, list_dimensions, list_dpis, list_ids],133 "mockups": [list_mockup_categories, list_mockup_titles],134 "extras": [list_variants],135 "averages": [average_variants, average_costs, average_placements, average_mockups],136}137138def run(groups: list[str], ids: list[int]):139 for group in groups:140 for fn in GROUPS[group]:141 fn(ids)142143def main():144 p = argparse.ArgumentParser(prog="catalog.list")145 p.add_argument("group", nargs="?", default="all", choices=["all"] + list(GROUPS))146 p.add_argument("--all", action="store_true")147 p.add_argument("--id", type=int, nargs="+")148 args = p.parse_args()149 ids = args.id or (all_ids() if args.all else live_ids())150 groups = list(GROUPS) if args.group == "all" else [args.group]151 print(f"Listing {groups} for {len(ids)} products")152 run(groups, ids)153154if __name__ == "__main__":155 main()