def order_detail_flush_delete(a_row, a_session: session): order = a_row.OrderHeader old_order = ObjectView(row2dict(order)) # hmm... key ShippedDate vs. "ShippedDate" order.AmountTotal -= a_row.Amount order_update(order, old_order, a_session) row_prt(order, "order_detail_flush_delete adjusted to: " + str(order.AmountTotal))
def customer_flush_dirty(a_row, a_session: session): """ Called from listeners.py on before_flush """ old_row = get_old_row(a_row) row_prt(a_row, "\ncustomer_flush_dirty") customer_update(a_row, old_row, a_session)
def order_flush_delete(a_row, a_session: session): # FIXME """ Called from module init on before_flush """ is_unshipped = (a_row.ShippedDate is None) or (a_row.ShippedDate == "") if is_unshipped: delta = a_row.AmountTotal customer = a_row.Customer customer.Balance -= delta # attach, update not req'd row_prt(customer, "order_upd adjusted Customer per delete") row_prt(a_row, "order_flush_delete - default values supplied")
def toggle_order_shipped(): """ toggle Shipped Date, to trigger balance adjustment """ """ also test join. session.query(Customer).join(Invoice).filter(Invoice.amount == 8500).all() """ pre_cust = session.query( models.Customer).filter(models.Customer.Id == "ALFKI").one() session.expunge(pre_cust) print("") test_order = session.query(models.Order).filter( models.Order.Id == 11011).join(models.Employee).one() if test_order.ShippedDate is None or test_order.ShippedDate == "": test_order.ShippedDate = str(datetime.now()) print( prt("Shipping order - ShippedDate: ['' -> " + test_order.ShippedDate + "]")) else: test_order.ShippedDate = None print(prt("Returning order - ShippedDate: [ -> None]")) insp = inspect(test_order) # session.commit() print("") post_cust = session.query( models.Customer).filter(models.Customer.Id == "ALFKI").one() logic_row = LogicRow(row=pre_cust, old_row=post_cust, ins_upd_dlt="*", nest_level=0, a_session=session, row_cache=None) if abs(post_cust.Balance - pre_cust.Balance) == 960: logic_row.log("Correct adjusted Customer Result") assert True else: row_prt(post_cust, "\nERROR - incorrect adjusted Customer Result") print("\n--> probable cause: Order customer update not written") row_prt(pre_cust, "\npre_alfki") assert False
def order_update(a_row, an_old_row, a_session): """ called either by order_flush_dirty, *or* by order_detail_code. to adjust order see order_detail_code.order_detail_flush_new """ row_prt(a_row, "\norder_flush_dirty") if a_row.ShippedDate != an_old_row.ShippedDate: is_unshipped = (a_row.ShippedDate is None) or (a_row.ShippedDate == "") delta = - a_row.AmountTotal # assume not changed!! if is_unshipped: delta = a_row.AmountTotal customer = a_row.Customer customer.Balance += delta # attach, update not req'd row_prt(customer, "order_upd adjusted per shipped change") if a_row.CustomerId != an_old_row.CustomerId: is_unshipped = (a_row.ShippedDate is None) or (a_row.ShippedDate == "") if is_unshipped: delta = a_row.AmountTotal customer = a_row.Customer customer.Balance += delta # attach, update not req'd row_prt(customer, "order_upd adjusted Customer per re-assignment") old_customer = a_session.query(models.Customer). \ filter(models.Customer.Id == an_old_row.CustomerId).one() # old_customer = ObjectView(row2dict(customer)) old_customer.Balance -= delta a_session.add(old_customer) customer_update(old_customer, old_customer, a_session) row_prt(customer, "order_upd adjusted Customer, per AmountTotal change") if a_row.AmountTotal != an_old_row.AmountTotal: # nice try: customer = a_row.Customer -- fails, since this is *adding* order customer = a_session.query(models.Customer). \ filter(models.Customer.Id == a_row.CustomerId).one() old_customer = ObjectView(row2dict(customer)) delta = a_row.AmountTotal - an_old_row.AmountTotal customer.Balance += delta # a_session.add(customer) customer_update(customer, old_customer, a_session) row_prt(customer, "order_upd adjusted Customer, per AmountTotal change")
def order_detail_flush_dirty(a_row: models.OrderDetail, a_session: session): old_row = get_old_row(a_row) # type: models.OrderDetail if a_row.OrderId == old_row.OrderId: if a_row.ProductId != old_row.ProductId: product = a_session.query(models.Product). \ filter(models.Product.Id == a_row.ProductId).one() a_row.UnitPrice = product.UnitPrice a_row.Amount = a_row.UnitPrice * a_row.Quantity if a_row.Amount != old_row.Amount: order = a_row.OrderHeader order.AmountTotal += a_row.Amount - old_row.Amount old_order = ObjectView(row2dict(order)) order_update(order, old_order, a_session) row_prt(order, "order_detail_flush_dirty adjusted to: " + str(order.AmountTotal)) else: # moved item to different order order = a_row.OrderHeader # reduce the old one order.AmountTotal -= old_row.Amount old_order = ObjectView(row2dict(order)) order_update(order, old_order, a_session) row_prt(order, "order_detail_flush_dirty adjusted to: " + str(order.AmountTotal)) if a_row.ProductId != old_row.ProductId: product = a_session.query(models.Product). \ filter(models.Product.Id == old_row.ProductId).one() a_row.UnitPrice = product.UnitPrice a_row.Amount = a_row.UnitPrice * a_row.Quantity order = a_session.query(models.Order). \ filter(models.Order.Id == a_row.OrderId).one() old_order = ObjectView(row2dict(order)) order.AmountTotal += a_row.Amount order_update(order, old_order, a_session) row_prt(order, "order_detail_flush_dirty adjusted to: " + str(order.AmountTotal))
def order_detail_flush_new(a_row: models.OrderDetail, a_session: session): """ OrderDetail before_flush, new rows compute amount, adjust Order.AmountTotal .. which adjusts Customer.balance) """ # no "old" in inserts... old_row = get_old_row(a_row) row_prt(a_row, "\norder_detail_flush_new") # readable log: curr/old values # nice try.. product = row.Product product = a_session.query(models.Product).\ filter(models.Product.Id == a_row.ProductId).one() a_row.UnitPrice = product.UnitPrice a_row.Amount = a_row.Quantity * a_row.UnitPrice order = a_row.OrderHeader """ 2 issues make this a little more complicated than expected: 1. can't just alter AmountTotal - does not trigger Order's before_flush 2. can't just call Order's before_flush - old values not available """ old_order = ObjectView(row2dict(order)) order.AmountTotal += a_row.Amount order_update(order, old_order, a_session) row_prt(order, "order_detail_flush_new adjusted to: " + str(order.AmountTotal))
print("") post_alfki = session.query( models.Customer).filter(models.Customer.Id == "ALFKI").one() logic_row = LogicRow(row=pre_alfki, old_row=post_alfki, ins_upd_dlt="*", nest_level=0, a_session=session, row_cache=None) if abs(post_alfki.Balance - pre_alfki.Balance) == 960: logic_row.log("Correct non-adjusted Customer Result") assert True else: row_prt(post_alfki, "\nERROR - incorrect adjusted Customer Result") print("\n--> probable cause: Order customer update not written") row_prt(pre_alfki, "\npre_alfki") assert False post_anatr = session.query( models.Customer).filter(models.Customer.Id == "ANATR").one() logic_row = LogicRow(row=pre_anatr, old_row=post_alfki, ins_upd_dlt="*", nest_level=0, a_session=session, row_cache=None) if abs(post_anatr.Balance - pre_anatr.Balance) == 960: logic_row.log("Correct non-adjusted Customer Result")
def order_detail_commit_dirty(a_row, a_session: session): old_row = get_old_row(a_row) row_prt(a_row, "\norder_detail_commit_dirty")
def order_flush_new(a_row, a_session: session): """ Called from module init on before_flush """ a_row.ShippedDate = "" # default value row_prt(a_row, "order_flush_new - default values supplied")
UnitPrice=18, Discount=0) new_order.OrderDetailList.append(new_item1) new_item2 = models.OrderDetail(ProductId=2, Amount=0, Quantity=2, UnitPrice=18, Discount=0) new_order.OrderDetailList.append(new_item2) session.commit() post_cust = session.query( models.Customer).filter(models.Customer.Id == "ALFKI").one() print("\nadd_order, update completed\n\n") row_prt(new_order, "\nnew Order Result") # $18 + $38 = $56 if new_order.AmountTotal != 56: print("==> ERROR - unexpected AmountTotal: " + str(new_order.AmountTotal) + "... expected 56") row_prt(new_item1, "\nnew Order Detail 1 Result") # 1 Chai @ $18 row_prt(new_item2, "\nnew Order Detail 2 Result") # 2 Chang @ $19 = $38 if post_cust.Balance == pre_cust.Balance + 56: row_prt(post_cust, "\nCorrect adjusted Customer Result") assert True else: row_prt(post_cust, "\nERROR - incorrect adjusted Customer Result") print("\n--> probable cause: Order customer update not written") row_prt(pre_cust, "\npre_alfki") assert False
def customer_commit_dirty(a_row, a_session: session): old_row = get_old_row(a_row) row_prt(a_row, "order_commit_dirty")
test_order.RequiredDate = str(datetime.now()) print( prt("Shipping order - RequiredDate: ['' -> " + test_order.RequiredDate + "]")) else: test_order.RequiredDate = None print(prt("Returning order - RequiredDate: [ -> None]")) insp = inspect(test_order) session.commit() print("") post_cust = session.query( models.Customer).filter(models.Customer.Id == "ALFKI").one() logic_row = LogicRow(row=pre_cust, old_row=post_cust, ins_upd_dlt="*", nest_level=0, a_session=session, row_cache=None) if abs(post_cust.Balance - pre_cust.Balance) == 0: logic_row.log("Correct non-adjusted Customer Result") assert True else: row_prt(post_cust, "\nERROR - incorrect adjusted Customer Result") print("\n--> probable cause: Order customer update not written") row_prt(pre_cust, "\npre_alfki") assert False print("\nupd_order_shipped, ran to completion")