In your code:
form = SQLFORM(db.checkout, formstyle='divs')
if form.process(onvalidation=check_database_entry).accepted:
for key, value in session.cart.items():
db.checkout.insert(userinfo = auth.user.id,
product = key,
project = form.vars.project,
date_in = form.vars.date_in,
date_out = form.vars.date_out)
The function process() does a db.checkout.insert(**form.vars). You can
prevent it with dbio=False
form = SQLFORM(db.checkout, formstyle='divs')
if form.process(dbio=False,onvalidation=check_database_entry).accepted:
for key, value in session.cart.items():
db.checkout.insert(userinfo = auth.user.id,
product = key,
project = form.vars.project,
date_in = form.vars.date_in,
date_out = form.vars.date_out)
On Monday, 8 October 2012 11:33:20 UTC-5, Andrew Evans wrote:
>
> I am trying to solve an issue in my code and hoping some of you can help
>
> I have a cart functionality for *reserving* items based on a month / day
> / year reservation. The problem is an extra entry is being added to the
> database when I submit the form.
>
> Any ideas how to fix this also will my *check_database_entry *onvalidation
> method work if I am now adding the data using sessions?
>
> *cheers
>
> Below is my code
>
> def cart_callback():
> id = int(request.vars.id)
> if request.vars.action == 'add':
> session.cart[id] = session.cart.get(id,0)+1
> session.flash = 'Item added to Cart'
> if request.vars.action == 'sub':
> session.cart[id]=max(0,session.cart.get(id,0)-1)
> session.flash = 'Item removed from Cart'
> return redirect(URL('first_year', 'first_year'))
>
> def check_database_entry(form):
> prod_id = request.args(0)
> project_date = db(db.checkout.product == prod_id).select()
> for project in project_date:
> start = project.date_in
> end = project.date_out
> user_start = datetime.datetime.strptime(form.vars.date_in,
> '%Y-%m-%d').date()
> user_end = datetime.datetime.strptime(form.vars.date_out,
> '%Y-%m-%d').date()
> if start <= user_start <= end or start <= user_end <= end:
> session.flash = 'Those dates have been reserved for those
> items, please try another'
> redirect(URL('error', 'availability'))
>
> @auth.requires(auth.has_membership('first_year') or
> auth.has_membership('admin'))
> def cart_checkout():
> form = SQLFORM(db.checkout, formstyle='divs')
> if form.process(onvalidation=check_database_entry).accepted:
> for key, value in session.cart.items():
> db.checkout.insert(userinfo = auth.user.id,
> product = key,
> project = form.vars.project,
> date_in = form.vars.date_in,
> date_out = form.vars.date_out)
> session.cart.clear()
> session.flash = 'Your item(s) are Reserved'
> redirect(URL('default', 'next'))
> elif form.errors:
> response.flash = 'form has errors'
> else:
> response.flash = 'please fill the form'
> return dict(form=form)
>
>
>
--