def print_statistics(stop_event): """Thread that prints current event statsistics.""" from binascii import hexlify sum_key = keynamehelper.create_key_name("sales_summary") print("\n === START") print("{:8} | {:12} | {:3} | Histogram by hour".format( "T/S", "Event", "#"), end=' ') while not stop_event.is_set(): ts = time.strftime("%H:%M:%S") e_key = keynamehelper.create_key_name("event", "*") for event in redis.scan_iter(match=e_key): (_, event_sku) = event.rsplit(":", 1) field_key = keynamehelper.create_field_name( event_sku, "total_tickets_sold") t_tickets = redis.hget(sum_key, field_key) t_tickets = int(t_tickets) if t_tickets != None else 0 tod_hist_key = keynamehelper.create_key_name( "sales_histogram", "time_of_day", event_sku) hist = redis.get(tod_hist_key) if hist != None: hist_vals = [hist[i:i + 2] for i in range(0, len(hist), 2)] print("\n{:8} | {:12} | {:3d} | ".format( ts, event_sku, t_tickets), end=' ') for i in range(0, 24): num = int(hexlify(hist_vals[i].encode( encoding='utf-8')), 16) if i < len(hist_vals) else 0 print("{:02d}/{:03d}".format(i, num), end=' ') time.sleep(1) print("\n === END")
def create_event(event, venue, capacity=None, geo=None, add_faceted_search=False, add_hashed_search=False, add_seatmap=False): """Create event details""" sku = redisu.ru101.common.generate.sku() p.sadd(create_key_name("events"), sku) p.sadd(create_key_name("event", "skus", event), sku) p.sadd(create_key_name("venues", sku), venue) attrs = { 'name': event, 'venue': venue, 'medal_event': fake.random_element((True, False)), 'disabled_access': fake.random_element((True, False)) } if capacity is not None: event_capacity = random.randint(capacity / 10, capacity / 2) attrs['capacity'] = event_capacity tiers_availbale = random.randint(1, 3) tier_capacity = int(round(event_capacity / tiers_availbale)) for k in range(tiers_availbale, 0, -1): attrs[create_field_name('available', ticket_tiers[k])] = tier_capacity attrs[create_field_name('price', ticket_tiers[k])] =\ random.randint(10 * (k+1), 10 * (k+1) + 9) p.hmset(create_key_name("event", sku), attrs) if add_seatmap: create_seatmap(sku, tiers_availbale, tier_capacity) attrs['sku'] = sku if geo is not None: p.geoadd(create_key_name("geo", "venues", venue), geo['long'], geo['lat'], venue) p.geoadd(create_key_name("geo", "events", event), geo['long'], geo['lat'], venue) if add_faceted_search: create_faceted_search(attrs) if add_hashed_search: create_hashed_search(attrs) events.append(sku) return attrs
def listener_events_analytics(channel): """Listener to summarize total sales by ticket numbers and order value.""" l = redis.pubsub(ignore_subscribe_messages=True) c_key = keynamehelper.create_key_name(channel) l.subscribe(c_key) p = redis.pipeline() for message in l.listen(): order_id = message['data'] so_key = keynamehelper.create_key_name("sales_order", order_id) (cost, qty, event_sku) = redis.hmget(so_key, 'cost', 'qty', 'event') so_set_key = keynamehelper.create_key_name("sales", event_sku) p.sadd(so_set_key, order_id) sum_key = keynamehelper.create_key_name("sales_summary") p.hincrbyfloat(sum_key, keynamehelper.create_field_name(event_sku, "total_sales"), cost) p.hincrby(sum_key, keynamehelper.create_field_name(event_sku, "total_tickets_sold"), qty) p.execute()
def listener_ceremony_alerter(channel): """Listener that looks for either 'Opening Ceremony' or 'Closing Ceremony' events only. If then tracks a Lottery content, award a prize for every 5th order for this event only.""" l = redis.pubsub(ignore_subscribe_messages=True) c_key = keynamehelper.create_key_name(channel, "*Ceremony") l.psubscribe(c_key) for message in l.listen(): order_id = message['data'] _, event = message['channel'].rsplit(":", 1) sum_key = keynamehelper.create_key_name("sales_summary") field_key = keynamehelper.create_field_name(event, "total_orders") total_orders = redis.hincrby(sum_key, field_key, 1) if total_orders % 5 == 0: print("===> Winner!!!!! Ceremony Lottery - Order Id: {}"\ .format(order_id))
def create_orders(num_customers, max_orders_per_customer=20): """Create orders""" import time import datetime for _ in range(num_customers): print('.', end='', flush=True) num_orders = random.randint(1, max_orders_per_customer) customer_id = customers[random.randint(0, len(customers)-1)] customer_name = redis.hget(create_key_name("customer", customer_id), "customer_name") for _ in range(num_orders): order_id = redisu.ru101.common.generate.order_id() event_sku = events[random.randint(0, len(events)-1)] for k in range(len(ticket_tiers)-1, 0, -1): event_k = create_key_name("event", event_sku) ticket_tier = ticket_tiers[k] if redis.hexists(event_k, create_field_name("available", ticket_tier)): price = float(redis.hget(event_k, create_field_name("price", ticket_tier))) abailable = int(redis.hget(event_k, create_field_name("available", ticket_tier))) event_name = redis.hget(event_k, "name") if abailable > 1: qty = random.randint(1, min(75, abailable // 2)) elif abailable == 1: qty = 1 else: continue res = find_seats(event_sku, ticket_tiers[k], qty) ts = int(time.time()) qty_allocated = res['assigned'] order_total = qty_allocated * price purchase = {'customer': customer_id, 'customer_name': customer_name, 'order_id': order_id, 'event': event_sku, 'event_name': event_name, 'tier': ticket_tiers[k], 'qty': qty_allocated, 'cost': order_total, 'seats' : str(res['seats']), 'ts': ts} p.hmset(create_key_name("sales_order", order_id), purchase) inv = {'customer': customer_id, 'order_date': ts, 'due_date': str(datetime.date.fromtimestamp(ts) + datetime.timedelta(days=90)), 'amount_due': order_total, 'status': "Invoiced"} p.hmset(create_key_name("invoice", order_id), inv) p.rpush(create_key_name("invoices", customer_id), order_id) p.zadd(create_key_name("invoice_totals"), {order_id: order_total}) p.hincrby(create_key_name("event", event_sku), create_field_name("available", ticket_tiers[k]), -qty_allocated) p.sadd(create_key_name("event", event_sku, "sales_orders"), order_id) sum_key = create_key_name("sales_summary", event_name) p.hincrbyfloat(sum_key, "total_sales", order_total) p.hincrby(sum_key, "total_tickets_sold", qty_allocated) p.hincrbyfloat(sum_key, create_field_name("total_sales", ticket_tiers[k]), order_total) p.hincrby(sum_key, create_field_name("total_tickets_sold", ticket_tiers[k]), qty_allocated) sum_key = create_key_name("sales_summary") p.hincrbyfloat(sum_key, "total_sales", order_total) p.hincrby(sum_key, "total_tickets_sold", qty_allocated) p.hincrbyfloat(sum_key, create_field_name("total_sales", ticket_tiers[k]), order_total) p.hincrby(sum_key, create_field_name("total_tickets_sold", ticket_tiers[k]), qty_allocated) p.execute() break