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()