def reserve_pending(): """ This action reserves a service requested for reservation. It is used by the operator to confirm manualy if he is willing to accept the reservation. """ if request.vars.eid: element = db(db.service_checkin.id == request.vars.eid).select().first() if element and element.status == "Pending": # Check if element belongs to the operator's services operator = db(db.operator.owner_id==auth.user.id).select().first() services = db(db.service.operator_id == operator.id).select(db.service.ALL) hit = False for service in services: if service.id == element.service_id: hit = True if hit == True: # Get client IP address if request.env.http_x_forwarded_for: remote_ip = request.env.http_x_forwarded_for else: remote_ip = request.env.remote_addr expire = request.now + datetime.timedelta(days=DAYS_TO_PAY) expire = datetime.datetime(expire.year, expire.month, expire.day, 23, 59, 59) # Correct for last minute Reservations expire = common_to_reservations.correct_expire_time(element, expire) # Record the next state in the database element.update_record(status="Reserved", reserved_timestamp=request.now, reserved_ip_addr=remote_ip, reserved_user_agent=request.user_agent(), expire_time=expire) # Send confirmation email send_reserved_email(element) # Update expire times of all "Reserved" elements #common_to_reservations.update_expire_times(element.user_id, expire, db) redirect(URL('show_pending')) return dict()
def pre_reservation(): """ This action checks the basket elements in the "Selected" state and performs the checkout. It passes the elements to the state "Reserved" if it is automatically booked or "Pending" if it needs confirmation. """ # Get client IP address if request.env.http_x_forwarded_for: remote_ip = request.env.http_x_forwarded_for else: remote_ip = request.env.remote_addr # Retrieve 'basket' cookie if available query = db.service_checkin.status == "Selected" query &= db.service_checkin.reserv_date >= request.now.date() if request.cookies.has_key('basket'): cookie = request.cookies['basket'].value query &= db.service_checkin.cookie == cookie else: # In case of purged cookies query &= db.service_checkin.user_id == auth.user.id basket_elements = db(query).select(orderby=db.service_checkin.reserv_date) for element in basket_elements: next_state, schedule, delay = analyze_element(element) expire = request.now + datetime.timedelta(days=delay) expire = datetime.datetime(expire.year, expire.month, expire.day, 23, 59, 59) # In case of database inconsistency if not element.service_id.reserv_confirm: element.service_id.reserv_confirm = "72 hours" # If next state is "Pending" if next_state == "Pending": # Correct expire time for last minute reservations expire = common_to_reservations.correct_expire_time(element, expire) # Record the next state in the database element.update_record(status=next_state, pending_timestamp=request.now, pending_ip_addr=remote_ip, pending_user_agent=request.user_agent(), expire_time=expire #expire_time=request.now + datetime.timedelta(minutes=3) ) # Send email to partner send_pending_email(element) # Start schedulled task #if schedule: # result = scheduler.queue_task('reject_pending', pvars=dict(eid=element.id)) elif next_state == "Reserved": # Correct expire time for last minute reservations expire = common_to_reservations.correct_expire_time(element, expire) # Record the next state in the database element.update_record(status=next_state, reserved_timestamp=request.now, reserved_ip_addr=remote_ip, reserved_user_agent=request.user_agent(), expire_time=expire) # Set the expire time of all the "Reserved" elements to the latest of them #common_to_reservations.update_expire_times(element.user_id, expire, db) redirect(URL('under_reservation')) return dict()