On Wednesday, September 4, 2019 at 10:59:21 PM UTC-7, mostwanted wrote: > > I have a website where I am selling items, what I desperately want to > achieve is to be able to show the buyers the remaining number of each item. > I have 2 tables, the table that has all the items being sold & has a field > amount which is the current number of items in stock and the other table > which records sales as customers buy and has a field quantity which is > the quantity of items purchased. After a customer has made a purchase I > want to be able to subtract quantity from amount and have difference > update and be the new value for amount. > > I wrote some controller code which is not achieving this, it is instead > updating the amount field for all items with the same figure. > > > THE VIEW > > {{extend 'layout.html'}} > > <div class="row"> > {{for p in products:}} > {{if p.product_type=="Earrings":}} > <div class="clothes"> > <h4 style="color: #ff69b4;">{{=p.name}}</h4> > <h7 style="color: #ff69b4;">{{=p.amount}} available in stock</h7> > <h5> > <span style="color: aqua; font-weight: > bold;">{{=MoneyFormat(p.price)}}</span> > </h5> > <img class="magnify" src="{{=URL('download',args=p.image)}}" > height="200px"/> > <br /> > <span id="{{='item%s'%p.id}}" style="font-weight: bold; color: > red;">{{=session.cart.get(p.id,0)}}</span> in cart - {{=A('add to > cart',callback=URL('cart_callback',vars=dict(id=p.id,action='add')),target='item%s'%p.id,_class='button > pill')}} > <br /> > <span style="font-size:12px;font-weight: bold; color: #ff69b4;">Click the > image to enlarge</span> > <br /> > </div> > {{pass}} > > {{pass}} > </div> > > > THE CART_CALLBACK FUNCTION > > > def cart_callback(): > id = int(request.vars.id) > if request.vars.action == 'add': > session.cart[id]=session.cart.get(id,0)+1 > if request.vars.action == 'sub': > session.cart[id]=max(0,session.cart.get(id,0)-1) > return str(session.cart[id]) > > > MY FUNCTION FOR UPDATING AFTER PURCHASES > > def index(): > if not auth.user: > response.flash=T('PLEASE LOG IN FIRST TO BE ABLE TO GET THE MENU AND > BUY') > products = db(db.product).select(orderby=db.product.name) > num=db(db.sale).select() > for n in num: > quantity=n.quantity > if quantity is None: > quantity=0 > for p in products: > amount1=p.amount-quantity > db(db.product.amount).update(amount=amount1) > return locals() > > > What should happen is that every time a customer buys whatever number of > items a new figure showing reduction in number of items should be displayed. > > > Regards; > > > Mostwanted > > > index() looks like it spends a great deal of time subtracting everything in sales from everything in products.
I think you are recording the product id in the cart. Are you then (on check-out, I presume) recording the product id in db.sales? if so , then you don't need the select() on all products. Instead, use the product id in each row of db.sales to select the product entry to update. You probably want a way to identify which rows in db.sales have already been processed (that is, which quantities have already been subtracted from the the available in the corresponding product entry). /dps -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/web2py/0ceb49c1-a2e5-4609-a802-682014aa1732%40googlegroups.com.