Untitled

 avatar
unknown
python
a year ago
13 kB
5
Indexable
def get_menu_details(db: Session, menu_id: int, menu_temp_id: int, brand: str, concept_id: int):
    menu = db.query(models.Menu).filter(
        models.Menu.id == menu_id,
        models.Menu.menuTemplateId == menu_temp_id,
        models.Menu.brand == brand,
        models.Menu.conceptId == concept_id
    ).first()

    if not menu:
        return None

    categories = db.query(models.Category).filter(models.Category.menuId == menu_id).all()
    category_list = []
    for category in categories:
        category_dict = {
            "id": category.id,
            "title_en": category.titleEn,
            "title_ar": category.titleAr,
            "sequence": category.sequenceOrder,
            "products": []
        }
        category_products = db.query(models.Product).join(models.CategoryProduct).filter(models.CategoryProduct.category_id == category.id).all()
        for product in category_products:
            product_dict = {
                "id": product.id,
                "sequence": product.sequenceOrder,
                "title_en": product.titleEn,
                "title_ar": product.titleAr,
                "description_en": product.descriptionEn,
                "description_ar": product.descriptionAr,
                "itemType": product.itemType,
                "catId": category.id,
                "isCustomizable": product.customizable,
                "price": product.price,
                "specialPrice": product.specialPrice,
                "strikeOutPrice": product.strikeOutPrice,
                "discountPrecentage": product.discountPrecentage,
                "services": {service.name: service.active for service in product.services},
                "limited_offer": product.limited_offer,
                "display_day": {
                    day.day: [{"from": tr.startTime.strftime("%H:%M:%S"), "to": tr.endTime.strftime("%H:%M:%S")} for tr in day.time_ranges]
                    for day in product.display_times
                },
                "spicyOutConfig": product.spicyOutConfig,
                "taxClassId": product.taxClassId,
                "lucky_day": product.lucky_day,
                "lucky_date_everymonth": product.lucky_date_everymonth,
                "last_weak_everymonth": product.last_weak_everymonth,
                "lucky_type": product.lucky_type,
                "status": product.status,
                "qrcode": product.qrcode,
                "steps": [],
                "variants": [],
                "products": []
            }

            # Handle bundle products
            if product.itemType == "bundle":
                steps = db.query(models.Step).filter(models.Step.productId == product.id).all()
                for step in steps:
                    step_dict = {
                        "title_en": step.titleEn,
                        "title_ar": step.titleAr,
                        "compId": step.compId,
                        "subtitle_en": step.subtitleEn,
                        "subtitle_ar": step.subtitleAr,
                        "displayType": step.displayType,
                        "sequenceOrder": step.sequenceOrder,
                        "parseVg": step.parseVg,
                        "options": []
                    }
                    options = db.query(models.StepOption).filter(models.StepOption.stepId == step.id).all()
                    for option in options:
                        option_dict = {
                            "id": option.id,
                            "name_en": option.nameEn,
                            "name_ar": option.nameAr,
                            "price": option.price,
                            "selected": option.selected,
                            "displayType": option.displayType,
                            "sequence": option.sequence,
                            "modGroupId": option.modGroupId,
                            "modifiers": []
                        }
                        modifiers = db.query(models.Modifier).filter(models.Modifier.stepOptionId == option.id).all()
                        for modifier in modifiers:
                            modifier_dict = {
                                "isAddOn": modifier.isAddOn,
                                "title_en": modifier.titleEn,
                                "title_ar": modifier.titleAr,
                                "subtitle_en": modifier.subtitleEn,
                                "subtitle_ar": modifier.subtitleAr,
                                "maximum": modifier.maximum,
                                "minimum": modifier.minimum,
                                "displayType": modifier.displayType,
                                "itemStyle": modifier.itemStyle,
                                "ingredient": modifier.ingredient,
                                "options": []
                            }
                            mod_options = db.query(models.ModifierOption).filter(models.ModifierOption.modifierId == modifier.id).all()
                            for mod_option in mod_options:
                                mod_option_dict = {
                                    "id": mod_option.id,
                                    "name_en": mod_option.nameEn,
                                    "name_ar": mod_option.nameAr,
                                    "price": mod_option.price,
                                    "default": mod_option.default
                                }
                                modifier_dict["options"].append(mod_option_dict)
                            option_dict["modifiers"].append(modifier_dict)
                        step_dict["options"].append(option_dict)
                    product_dict["steps"].append(step_dict)

            # Handle bundle group products
            if product.itemType == "bundle_group":
                sub_products = db.query(models.Product).filter(models.Product.parent_product_id == product.id).all()
                for sub_product in sub_products:
                    sub_product_dict = {
                        "id": sub_product.id,
                        "sequence": sub_product.sequenceOrder,
                        "title_en": sub_product.titleEn,
                        "title_ar": sub_product.titleAr,
                        "description_en": sub_product.descriptionEn,
                        "description_ar": sub_product.descriptionAr,
                        "itemType": sub_product.itemType,
                        "catId": category.id,
                        "isCustomizable": sub_product.customizable,
                        "price": sub_product.price,
                        "specialPrice": sub_product.specialPrice,
                        "strikeOutPrice": sub_product.strikeOutPrice,
                        "discountPrecentage": sub_product.discountPrecentage,
                        "services": {service.name: service.active for service in sub_product.services},
                        "limited_offer": sub_product.limited_offer,
                        "display_day": {
                            day.day: [{"from": tr.startTime.strftime("%H:%M:%S"), "to": tr.endTime.strftime("%H:%M:%S")} for tr in day.time_ranges]
                            for day in sub_product.display_times
                        },
                        "spicyOutConfig": sub_product.spicyOutConfig,
                        "taxClassId": sub_product.taxClassId,
                        "lucky_day": sub_product.lucky_day,
                        "lucky_date_everymonth": sub_product.lucky_date_everymonth,
                        "last_weak_everymonth": sub_product.last_weak_everymonth,
                        "lucky_type": sub_product.lucky_type,
                        "status": sub_product.status,
                        "qrcode": sub_product.qrcode,
                        "steps": [],
                        "variants": []
                    }

                    # Add variants for sub-products
                    variants = db.query(models.Variant).filter(models.Variant.productId == sub_product.id).all()
                    for variant in variants:
                        variant_dict = {
                            "id": variant.id,
                            "title_en": variant.titleEn,
                            "title_ar": variant.titleAr,
                            "selIndex": variant.selIndex,
                            "subtitle_en": variant.subtitleEn,
                            "subtitle_ar": variant.subtitleAr,
                            "options": []
                        }
                        options = db.query(models.VariantOption).filter(models.VariantOption.variantId == variant.id).all()
                        for option in options:
                            option_dict = {
                                "id": option.id,
                                "title_en": option.titleEn,
                                "title_ar": option.titleAr,
                                "isSelected": option.isSelected
                            }
                            variant_dict["options"].append(option_dict)
                        sub_product_dict["variants"].append(variant_dict)

                    product_dict["products"].append(sub_product_dict)

            # Handle standalone group products
            if product.itemType == "standalone_group":
                # Add variants
                variants = db.query(models.Variant).filter(models.Variant.productId == product.id).all()
                for variant in variants:
                    variant_dict = {
                        "id": variant.id,
                        "title_en": variant.titleEn,
                        "title_ar": variant.titleAr,
                        "selIndex": variant.selIndex,
                        "subtitle_en": variant.subtitleEn,
                        "subtitle_ar": variant.subtitleAr,
                        "options": []
                    }
                    options = db.query(models.VariantOption).filter(models.VariantOption.variantId == variant.id).all()
                    for option in options:
                        option_dict = {
                            "id": option.id,
                        "title_en": option.titleEn,
                        "title_ar": option.titleAr,
                        "isSelected": option.isSelected
                    }
                    variant_dict["options"].append(option_dict)
                product_dict["variants"].append(variant_dict)

            # Add sub-products as variants
            sub_products = db.query(models.Product).filter(models.Product.parent_product_id == product.id).all()
            for sub_product in sub_products:
                sub_product_dict = {
                    "id": sub_product.id,
                    "sequence": sub_product.sequenceOrder,
                    "title_en": sub_product.titleEn,
                    "title_ar": sub_product.titleAr,
                    "description_en": sub_product.descriptionEn,
                    "description_ar": sub_product.descriptionAr,
                    "itemType": sub_product.itemType,
                    "catId": category.id,
                    "isCustomizable": sub_product.customizable,
                    "price": sub_product.price,
                    "specialPrice": sub_product.specialPrice,
                    "strikeOutPrice": sub_product.strikeOutPrice,
                    "discountPrecentage": sub_product.discountPrecentage,
                    "services": {service.name: service.active for service in sub_product.services},
                    "limited_offer": sub_product.limited_offer,
                    "display_day": {
                        day.day: [{"from": tr.startTime.strftime("%H:%M:%S"), "to": tr.endTime.strftime("%H:%M:%S")} for tr in day.time_ranges]
                        for day in sub_product.display_times
                    },
                    "spicyOutConfig": sub_product.spicyOutConfig,
                    "taxClassId": sub_product.taxClassId,
                    "lucky_day": sub_product.lucky_day,
                    "lucky_date_everymonth": sub_product.lucky_date_everymonth,
                    "last_weak_everymonth": sub_product.last_weak_everymonth,
                    "lucky_type": sub_product.lucky_type,
                    "status": sub_product.status,
                    "qrcode": sub_product.qrcode,
                    "steps": [],
                    "variants": []
                }
                product_dict["products"].append(sub_product_dict)

            category_dict["products"].append(product_dict)
        category_list.append(category_dict)

    result = {
        "requestId": menu.id,
        "brand": menu.brand,
        "conceptId": menu.conceptId,
        "menuId": menu.id,
        "menuTempId": menu.menuTemplateId,
        "updatedAt": menu.lastUpdateTimestamp,
        "categories": category_list
    }

    return result
Editor is loading...
Leave a Comment