예제 #1
0
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()
예제 #2
0
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()