| import json |
| from google.protobuf.json_format import MessageToDict |
| from google.protobuf.timestamp_pb2 import Timestamp |
| |
| |
| # Replace these imports with your actual generated proto package paths |
| from generated import offer_pb2 |
| from generated import money_pb2 |
| from generated import dayofweek_pb2 |
| from generated import timeofday_pb2 |
| |
| _MAX_BYTES_DATA_FILE = 200 * 1024 * 1024 |
| |
| def generate_offer_feed(): |
| |
| # Create OfferFeed |
| feed = offer_pb2.OfferFeed() |
| |
| # Build the offers |
| offer = offer_pb2.Offer( |
| offer_id="offer-1", |
| entity_ids=["dining-1"], |
| offer_source=offer_pb2.OFFER_SOURCE_AGGREGATOR, |
| action_type=offer_pb2.ACTION_TYPE_DINING, |
| offer_modes=[ |
| offer_pb2.OFFER_MODE_WALK_IN, |
| offer_pb2.OFFER_MODE_FREE_RESERVATION |
| ], |
| offer_category=offer_pb2.OFFER_CATEGORY_BASE_OFFER, |
| offer_details=offer_pb2.OfferDetails( |
| offer_display_text="₹100 off on your order", |
| # Note: If this is a 'oneof', you set the field name directly |
| discount_value=money_pb2.Money( |
| currency_code="INR", |
| units=100 |
| ) |
| ), |
| offer_restrictions=offer_pb2.OfferRestrictions( |
| combinable_with_other_offers=True, |
| combinable_offer_categories=[ |
| offer_pb2.OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER, |
| offer_pb2.OFFER_CATEGORY_ADD_ON_COUPON_OFFER |
| ] |
| ), |
| terms=offer_pb2.Terms( |
| restricted_to_certain_users=False, |
| terms_and_conditions="Valid on all menu items." |
| ), |
| validity_periods=[ |
| offer_pb2.ValidityPeriod( |
| valid_period=offer_pb2.ValidityRange( |
| valid_from_time=Timestamp(seconds=1687062000), |
| valid_through_time=Timestamp(seconds=1956556800) |
| ), |
| time_of_day=[ |
| # Monday - Thursday Window |
| offer_pb2.TimeOfDayWindow( |
| time_windows=offer_pb2.TimeOfDayRange( |
| open_time=timeofday_pb2.TimeOfDay(hours=13), |
| close_time=timeofday_pb2.TimeOfDay(hours=23) |
| ), |
| day_of_week=[ |
| dayofweek_pb2.DayOfWeek.MONDAY, |
| dayofweek_pb2.DayOfWeek.TUESDAY, |
| dayofweek_pb2.DayOfWeek.WEDNESDAY, |
| dayofweek_pb2.DayOfWeek.THURSDAY |
| ] |
| ), |
| # Friday - Sunday Window |
| offer_pb2.TimeOfDayWindow( |
| time_windows=offer_pb2.TimeOfDayRange( |
| open_time=timeofday_pb2.TimeOfDay(hours=13), |
| close_time=timeofday_pb2.TimeOfDay(hours=23, minutes=59, seconds=59) |
| ), |
| day_of_week=[ |
| dayofweek_pb2.DayOfWeek.FRIDAY, |
| dayofweek_pb2.DayOfWeek.SATURDAY, |
| dayofweek_pb2.DayOfWeek.SUNDAY |
| ] |
| ) |
| ] |
| ) |
| ], |
| offer_url="https://www.example-restaurant.com/offer/base_offer_1", |
| image_url="https://www.example-restaurant.com/images/offer_base.jpg" |
| ) |
| |
| # Example testing for menu feed size |
| # Protocol buffer message must be less than 2 GiB |
| # https://protobuf.dev/programming-guides/proto-limits/ |
| # It is recommended to not exceed 200 MB, as there is an Actions |
| # Center limit of 200 MB per file after compression. |
| if feed.ByteSize() + offer.ByteSize() < _MAX_BYTES_DATA_FILE: |
| feed.data.append(offer) |
| # else write current feed to file and start a new feed |
| |
| # Serialize to JSON |
| # preserving_proto_field_names=True ensures camelCase becomes snake_case if defined that way in .proto |
| json_output = json.dumps( |
| MessageToDict(feed, preserving_proto_field_name=True) |
| ) |
| |
| print(json_output) |
| |
| if __name__ == "__main__": |
| generate_offer_feed() |