示例#1
0
def incoming_call():
    response = twiml.Response()
    response.say('hello!')
    response.gather(action="/incoming/call", method=["GET"])
    return Response(str(response), mimetype='text/xml')
示例#2
0
def voice():
    response = twiml.Response()
    with response.dial(callerId=app.config['TWILIO_CALLER_ID'],
                       timeLimit="600") as dial:
        dial.number(request.form['PhoneNumber'])
    return str(response)
示例#3
0
def smsGet():
    response = twiml.Response()
    response.sms('Welcome to RootRec! Your number has been added to the list. Reply with "Stop" at any time to be removed from this service!')
    return str(response)
示例#4
0
文件: views.py 项目: branmcf/Barhop
def handle_sms(request):
    
    """
    :param request:
    :return:
    """
    trigger = None
    SEND_ERROR = False
    vendor_number = settings.BARHOP_NUMBER
    from_, body = parse_sms(request.POST)
    try:
        location = request.POST['FromCity']
    except:
        location = ''


    from_ = '+919946341903'


    if body:
        body = str(body)
        if body.find('-') != -1:
            trigger = body.split('-')[1]
            trigger = trigger.strip()
            client_message = trigger
        else:
            trigger = body
            client_message = body

    #====== Checks text or number ==========
    checkType = RepresentsInt(client_message)
    if checkType:
        client_message_number = int(client_message)
    else:
        client_message_number = client_message
    #=======================================

    r = twiml.Response()

    # ====================================== #
    # Get Customer data using mobile number  #
    # ====================================== #
    customer = get_user_by_mobile(from_)
    ref_user_obj = get_ref_user_by_mobile(from_)

    # ============================================ #
    # Check if the user already has a conversation #
    # ============================================ #
    
    try:
        conversation = Conversation.objects.get(customer=customer, closed=False,)
    except:
        conversation = None

    if not conversation:

        trigger_data = get_trigger_by_name(trigger)

        # ================================================== #
        # here we have to notify the client that there is no 
        # such trigger name.
        # ================================================== #
        if trigger_data is None:
            message = 'That was not a valid trigger word. Please text a valid trigger word.'
            send_message(vendor_number, from_, message)
            return HttpResponse(str(r))

        dealer = trigger_data.dealer

        try:
            trophy = TrophyModel.objects.get(dealer=dealer)
        except:
            trophy = None

        
        if customer is None:

            if ref_user_obj:
                # ================================================= #
                # Saving the current requested trigger for the user
                # ================================================= #
                ref_user_obj.current_trigger = trigger_data
                ref_user_obj.save()
                send_new_user_message(request, vendor_number, from_, ref_user_obj.id)
            else:
                ref_user = RefNewUser(dealer=dealer, dealer_mobile=vendor_number, mobile=from_, current_trigger=trigger_data)
                ref_user.save()
                #Send mail to user for signup
                send_new_user_message(request, vendor_number, from_, ref_user.id)

        else:            
            if customer.is_active:
                # ===================================================#
                # Saving the current requested trigger for the user #
                # =================================================#
                if ref_user_obj:
                    ref_user_obj.current_trigger = trigger_data
                    ref_user_obj.save()

                conversation = Conversation.objects.create(dealer=dealer, 
                    trigger=trigger_data, 
                    customer=customer, 
                    trophy=trophy,
                    process_stage=1)

                #==============================================#
                # Checking grid availability to place order   #
                # if grid full return a message to try again #
                #===========================================#                
                trigger_id = trigger_data.id
                grid_availability = check_grid_availability(trigger_id)

                if not grid_availability:
                    message_to_client = "Sorry, Barhop is a maximum capacity. Please try again in few minutes, thank you."
                    message_recieved_dealer = trigger_data.trigger_name

                    save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer)
                    send_message(vendor_number, from_, message_to_client)
                    conversation.closed = True
                    conversation.save()

                    return HttpResponse(str(r))

                #************************************#
                # random number creation order_code #
                #**********************************#
                # random_num = get_random_string(length=4, allowed_chars='QWERTYUIOP123ASDFGHJKL456ZXCVBNM7890')
                #order_code = str(random_num)+str(conversation.id)
                order_code = get_random_string(length=3, allowed_chars='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')

                purchaseOrder = PurchaseOrder.objects.create(order_code=order_code,
                    conversation=conversation,
                    dealer=dealer,
                    customer=customer,
                    trigger=trigger_data,
                    order_status='PENDING',
                    location = location
                    )

                # message_to_client = " Welcome to Barhop! Here is the menu for "+ str(trigger_data.trigger_name) +" Reply 'START' to start your order! "
                message_to_client = " Welcome to Barhop! Reply 'start' to start your order from "+ str(trigger_data.trigger_name) +"!"
                message_recieved_dealer = trigger_data.trigger_name
                save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer)
                send_message(vendor_number, from_, message_to_client)
                               

            else:
                message = 'Your account is not active yet. Please activate your account by following the link your in your email.'
                send_message(vendor_number, from_, message)
                return HttpResponse(str(r))

    else:
        trigger = conversation.trigger
        trigger_name = trigger.trigger_name
        process_stage = conversation.process_stage
        dealer = conversation.dealer
        customer = conversation.customer
        purchaseOrder = PurchaseOrder.objects.get(conversation=conversation)
        if not purchaseOrder.location:
            purchaseOrder.location = location
            purchaseOrder.save()

        if process_stage == 1 and client_message.lower() == "start" :
            

            #==============#
            # Menu list   #
            #============#
            try:
                # menu_image = MenuListImages.objects.get(trigger=trigger_data)
                
                menu_image = get_menu_image(trigger, customer)
                image_url = menu_image.image.url
                url = get_current_url(request)
                media_url = url+image_url
                print("\n Media_url :"+str(media_url))
            except:

                # old text
                # message_to_client = "Sorry for the inconvenience. No Menu added for this Bar. Thank you."

                message_to_client = "There is currently no menu for "+ str(trigger_name) +". Please try again later" 
                message_recieved_dealer = client_message

                save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer)
                send_message(vendor_number, from_, message_to_client)
                conversation.closed = True
                conversation.save()
                return HttpResponse(str(r))

            # sending menu as MMS
            message_to_client = "Here is the Menu for "+ str(trigger_name)+" "
            send_multimedia_message(vendor_number, from_, message_to_client, media_url)
            
            conversation.process_stage = 2
            conversation.save()

            message_to_client = "Text in the item number of the first item you want."
            message_recieved_dealer = client_message
            save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer)
            send_message(vendor_number, from_, message_to_client)
            return HttpResponse(str(r))

        elif process_stage == 2 and type(client_message_number) == int :

            #===========================#
            # Check menu item is valid #
            #=========================#
            try:
                menu_map_object = MenuCustomerMappping.objects.get(trigger=trigger,dealer=dealer,customer=customer)
                menu_data = menu_map_object.menu_data
                menu_id = menu_data[client_message_number]
                menu_object = MenuItems.objects.get(id=menu_id,dealer=dealer)

            except:
                menu_object = None

            if menu_object is None:
                # message_to_client = "Invalid input. Please check Item number"
                message_to_client = "Invalid input. Text in the item number of the item you want."
                message_recieved_dealer = client_message

                save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer)                
                send_message(vendor_number, from_, message_to_client)
                return HttpResponse(str(r))
            
            #==================================#
            # Update menu item in order table #
            #================================#
            purchaseOrder = PurchaseOrder.objects.get(conversation=conversation,dealer=dealer,customer=customer,trigger=trigger,order_status='PENDING')

            order_menu_mapping = OrderMenuMapping.objects.create(order=purchaseOrder,
                menu_item=menu_object)

            message_to_client = "How many '"+ str(menu_object.item_name) +"' do you want?"
            message_recieved_dealer = client_message

            save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer) 
            send_message(vendor_number, from_, message_to_client)

            conversation.process_stage = 3            
            conversation.save()

        elif process_stage == 3 and type(client_message_number) == int :

            
            if client_message_number > 0:
                
                #================================#
                # Update quantity in order table #
                #================================#
                purchaseOrder = PurchaseOrder.objects.get(conversation=conversation, dealer=dealer,customer=customer,trigger=trigger,order_status='PENDING')
                order_menu_mapping_obj = OrderMenuMapping.objects.filter(order=purchaseOrder)

                order_menu_mapping_list = [ each_order_item for each_order_item in order_menu_mapping_obj]
                for each_order in order_menu_mapping_list:
                    if not each_order.quantity:
                        order_menu_mapping = each_order

                # ====================================== #
                # Checking the available quantity
                # ====================================== #
                
                available_quantity = order_menu_mapping.menu_item.quantity_available

                if available_quantity == 0:
                    order_menu_mapping.delete()
                    conversation.process_stage = 2
                    conversation.save()

                    #===================#
                    # Latest Menu list #
                    #=================#
                    try:                        
                        menu_image = get_menu_image(trigger, customer)
                        image_url = menu_image.image.url
                        url = get_current_url(request)
                        media_url = url+image_url
                        print("\n Media_url :"+str(media_url))
                    except:

                        message_to_client = "There is currently no menu for "+ str(trigger_name) +". Please try again later" 
                        message_recieved_dealer = client_message

                        save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer)
                        send_message(vendor_number, from_, message_to_client)
                        conversation.closed = True
                        conversation.save()
                        return HttpResponse(str(r))
                        
                    message_to_client = "We're sorry, there are no more " + str(order_menu_mapping.menu_item.item_name) +". Enter the item number of the item you want."
                    message_recieved_dealer = client_message
                    save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer)
                    send_message(vendor_number, from_, message_to_client)

                    message_to_client = "check updated menu of "+ str(trigger_name)                    
                    send_multimedia_message(vendor_number, from_, message_to_client, media_url)
                    return HttpResponse(str(r))

                if available_quantity < client_message_number :
                    conversation.process_stage = 3
                    conversation.save()
                    
                    # message_to_client = "Sorry, your order is higher than available stock. Available quantity of " + str(order_menu_mapping.menu_item.item_name) +" is "+str(available_quantity)+ ". Please enter the number of quantity again."
                    message_to_client = "The quantity of '"+ str(order_menu_mapping.menu_item.item_name) +"'' is "+str(available_quantity)+ ", please text in the quantity of the item you want."
                    message_recieved_dealer = client_message

                    save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer)
                    send_message(vendor_number, from_, message_to_client)
                    return HttpResponse(str(r))    
                
                order_menu_mapping.quantity = client_message

                #=============================#
                # Toatal amount for each item #
                #=============================#
                price = order_menu_mapping.menu_item.item_price
                quantity = client_message
                total_amount = float(price) * float(quantity)

                order_menu_mapping.total_item_amount = total_amount
                order_menu_mapping.save()

                message_to_client = "Text in the item number of the next item you want, or reply 'done' to checkout!"
                message_recieved_dealer = client_message

                save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer)
                send_message(vendor_number, from_, message_to_client)

                conversation.process_stage = 4 
                conversation.save()
            else:
                message_to_client = "Please enter a valid quantity."
                message_recieved_dealer = client_message

                save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer)
                send_message(vendor_number, from_, message_to_client)

        elif process_stage == 4 and client_message.lower() == "done" :
            
            url = get_current_url(request)
            payment_url = str(url) +"/payment/purchase_invoice/"+str(purchaseOrder.id)
            url_shorten = shorten(payment_url)
            message_to_client = "Pay for your drinks here "+ str(url_shorten)
            message_recieved_dealer = client_message

            purchaseOrder = PurchaseOrder.objects.get(conversation=conversation, dealer=dealer, customer=customer,trigger=trigger,order_status='PENDING')
            order_menu_mapping = OrderMenuMapping.objects.filter(order=purchaseOrder)

            tottal_amount = 0
            for order_mapp in order_menu_mapping:
                
                #total amount 
                tottal_amount += order_mapp.total_item_amount

                #==================================#    
                #  Checking Item availability and  #
                #  Updating Item quantity          #
                #==================================#
                ordered_quantity = order_mapp.quantity
                item = MenuItems.objects.get(id=order_mapp.menu_item.id)

                available_quantity = item.quantity_available
                if available_quantity < ordered_quantity :
                    
                    # Updating conversation stage
                    conversation.process_stage = 3
                    conversation.save()
                    
                    # message_to_client = "Sorry, your order is higher than available stock. Available quantity of " + str(item.item_name) +" is "+str(available_quantity)+ ". Please enter the number of quantity again."
                    message_to_client = "The quantity of '"+ str(order_menu_mapping.menu_item.item_name) +"'' is "+str(available_quantity)+ ", please text in the quantity of the item you want"
                    message_recieved_dealer = client_message

                    save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer)
                    send_message(vendor_number, from_, message_to_client)
                    return HttpResponse(str(r))
                else:
                    item.quantity_available = available_quantity - ordered_quantity
                    item.save()

            purchaseOrder.total_amount_paid = tottal_amount
            purchaseOrder.save()

            save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer)
            send_message(vendor_number, from_, message_to_client)

            conversation.process_stage = 5
            conversation.save()
            # remove customer menu map
            MenuCustomerMappping.objects.filter(trigger=trigger,dealer=dealer,customer=customer).delete()
        
        elif process_stage == 4 and type(client_message_number) == int:

            # ========================= #
            # Check menu item is valid
            # ========================= #
            try:
                menu_map_object = MenuCustomerMappping.objects.get(trigger=trigger,dealer=dealer,customer=customer)
                menu_data = menu_map_object.menu_data
                menu_id = menu_data[client_message_number]
                menu_object = MenuItems.objects.get(id=menu_id)
            except:
                menu_object = None

            if menu_object is None:
                message_to_client = "Invalid input. Please check the item number."
                message_recieved_dealer = client_message

                save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer)                
                send_message(vendor_number, from_, message_to_client)

                return HttpResponse(str(r))

            #==================================#
            # Update menu item in order table #
            #================================#
            purchaseOrder = PurchaseOrder.objects.get(conversation=conversation,dealer=dealer,customer=customer,trigger=trigger,order_status='PENDING')

            order_menu_mapping = OrderMenuMapping.objects.create(order=purchaseOrder,
                menu_item=menu_object)


            message_to_client = "How many '"+ str(menu_object.item_name) +"' do you want?"
            message_recieved_dealer = client_message

            save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer) 
            send_message(vendor_number, from_, message_to_client)

            conversation.process_stage = 3            
            conversation.save()
        else:
            if process_stage == 5:
                message_to_client = "You have already one pending order to pay."
                message_recieved_dealer = client_message
                send_message(vendor_number, from_, message_to_client)
                save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer)
                return HttpResponse(str(r))

            message_to_client = "Invalid message. Please send the correct message."
            message_recieved_dealer = client_message

            send_message(vendor_number, from_, message_to_client)
            save_user_dealer_chat(conversation,message_to_client, message_recieved_dealer)
            return HttpResponse(str(r))

    return HttpResponse(str(r))
示例#5
0
 def post(self):
     r = twiml.Response()
     r.sms(
         "We will contact you when we are ready, do not text this number again"
     )
     self.response.out.write(str(r))
示例#6
0
def voice():
    response = twiml.Response()
    response.say("Welcome to RootRec. We do not support voice at this time. Sorry.")
    return str(response)
示例#7
0
def ProviderIVR_Main(request):
    """
	DEPRECATED - to be replaced by ProviderIVR_Main_New in views_provider_v2.py
	"""
    # TODO: This function needs to be broken down into sub-functions for both
    # maintenance, and so that we can sanely implement allowing users to check
    # their voicemail from foreign phones.

    # DEBUG:
    #if (not 'callCounts' in request.session):
    #	request.session['callCounts'] = dict()
    #if (not 'ProviderIVR_Main' in request.session['callCounts']):
    #	request.session['callCounts']['ProviderIVR_Main'] = 1
    #else:
    #	request.session['callCounts']['ProviderIVR_Main'] += 1
    logger.info('%s: ProviderIVR_Main POST data is %s' %
                (request.session.session_key, str(request.POST)))
    if ('CallStatus' in request.POST
            and request.POST['CallStatus'] == 'completed'):
        # call ended
        #raise Exception('Ending inappropriately. Call
        # stack is %s'%(str(request.session['ivr_call_stack']),))
        # Update the log entry with the duration of the call
        try:
            log = callLog.objects.get(callSID=request.POST['CallSid'])
            log.call_duration = None
            if ('Duration' in request.POST):
                log.call_duration = int(request.POST['Duration'])
        except ObjectDoesNotExist as odne:  # voicemail won't have a call
            logger.warning(
                'Call log does not exist for sid: %s. Caller may have '
                'hung up shortly after Twilio starts call process.' %
                str(odne))

        r = twilio.Response()
        return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
    elif (not 'CallStatus' in request.POST):
        # call ended
        #raise Exception('Ending inappropriately. Call
        # stack is %s'%(str(request.session['ivr_call_stack']),))
        r = twilio.Response()
        return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

    # ready to initialize this call, request.session[provider_id] in request stack
    provider, log = ProviderIVR_Init(request)

    # Check to see if the caller doesn't own this mailbox.
    # TODO: This is where we check to see which number of the user's we compare
    # against to assume that the user is calling in. (got it?)
    if (provider.user.mobile_phone != request.REQUEST['Caller']):
        return ProviderIVR_ForwardCall(request)

    log.call_source = 'VM'
    log.save()
    # Great, now we know that this is the owner calling in. First up, check to
    # see if the user has a configuration file and that they've completed setup.
    try:
        config = provider.vm_config.get()
    except MultipleObjectsReturned:
        raise Exception("Provider %s %s has multiple vm_config objects." %
                        (provider.user.first_name, provider.user.last_name))
    except ObjectDoesNotExist:
        request.session['ivr_call_stack'].append('ProviderIVR_Main')
        request.session.modified = True
        return ProviderIVR_Setup(request)
    else:
        request.session['config_id'] = config.id

    # Check to see if the PIN value exists in the configuration. If it doesn't,
    # then run the user through configuration.
    if (not config.pin):
        request.session['ivr_call_stack'].append('ProviderIVR_Main')
        request.session.modified = True
        return ProviderIVR_Setup(request)

    if (not 'authenticated' in request.session):
        request.session['ivr_call_stack'].append('ProviderIVR_Main')
        request.session.modified = True

        r = twilio.Response()
        #r.append(tts('Welcome to your voice mail box.')) # campy and wastes time.
        return authenticateSession(request, r)

    # Now, check to ensure that user voicemail configuration was completed successfully.
    if (not config.config_complete):
        request.session['ivr_call_stack'].append('ProviderIVR_Main')
        request.session.modified = True
        return ProviderIVR_Setup(request)

    return ProviderIVR_TreeRoot(request)
def call():
    r = twiml.Response()
    r.enqueue('', workflowSid=WORKFLOW_SID)
    return Response(str(r), content_type='application/xml')
示例#9
0
def ProviderIVR_ForwardCall(request):
    """Forward the call to the dialed user, as per the user's preferences.

	Uses the following session variables:
		ProviderIVR_ForwardCall_state: The most recent "state" of execution. May
			have the following values:
				- None/Undefined/Empty String: First execution of this function.
				- Getting_Name: Getting the caller's name, if one hasn't been
						defined.
				- Dialing: Phone(s) have been dialed, and waiting for a response Caller
	"""
    r = twilio.Response()
    request.session.modified = True
    provider = Provider.objects.get(id=request.session['provider_id'])

    if ('CallStatus' in request.POST
            and request.POST['CallStatus'] == 'completed'):
        if ('Duration' in request.POST):
            callSID = request.POST['CallSid']
            log = callLog.objects.get(callSID=callSID)
            log.call_duration = request.POST['Duration']
            log.save()

    if (not 'ProviderIVR_ForwardCall_forward' in request.session):
        request.session[
            'ProviderIVR_ForwardCall_forward'] = provider.forward_voicemail
    forward = provider.forward_voicemail
    if (forward == 'VM'):
        return ProviderIVR_LeaveMsg(request)

    if (not 'ProviderIVR_ForwardCall_state' in request.session
            or not request.session['ProviderIVR_ForwardCall_state']):
        # New call. First, check to see if we should go straight to voicemail

        # Okay, the call isn't going to voicemail directly. Now, set state.
        request.session['ProviderIVR_ForwardCall_state'] = 'Getting_Name'

        # Now, get the caller's name

        # Is the user a DoctorCom user with a recorded name?
        callSID = request.POST['CallSid']
        log = callLog.objects.get(callSID=callSID)

        if (log.mdcom_caller and isinstance(log.mdcom_caller, Provider)):
            if (log.mdcom_caller.vm_config.count()):
                prov_vmconfig = log.mdcom_caller.vm_config.get()
                if (prov_vmconfig.config_complete):
                    logger.debug('%s/%s: Found the caller\'s name!' % (
                        request.session.session_key,
                        request.session['ProviderIVR_ForwardCall_state'],
                    ))
                    log.caller_spoken_name = prov_vmconfig.name
                    log.save()
                    return ProviderIVR_ForwardCall(
                        request)  # restart execution of this function
                else:
                    logger.debug('%s/%s: Caller\'s vm_config incomplete!' % (
                        request.session.session_key,
                        request.session['ProviderIVR_ForwardCall_state'],
                    ))
            else:
                logger.debug(
                    '%s/%s: An unsuitable number of vm_config objects found: %i'
                    % (
                        request.session.session_key,
                        request.session['ProviderIVR_ForwardCall_state'],
                        log.mdcom_caller.vm_config.count(),
                    ))
        else:
            logger.debug(
                '%s/%s: mdcom_caller %s either isn\'t defined or doesn\'t '
                'seem to be a Provider' % (
                    request.session.session_key,
                    request.session['ProviderIVR_ForwardCall_state'],
                    str(log.mdcom_caller),
                ))

        # Okay, it's not a user with a name recording. Get one.
        request.session['ivr_call_stack'].append('ProviderIVR_ForwardCall')
        request.session['ivr_makeRecording_prompt'] = \
         tts('Please say your name after the tone.')
        request.session['ivr_makeRecording_maxLength'] = 4
        request.session['ivr_makeRecording_timeout'] = 2
        request.session['ivr_makeRecording_leadSilence'] = 1
        return getQuickRecording(request)

    if (request.session['ProviderIVR_ForwardCall_state'] == 'Getting_Name'):
        request.session['ProviderIVR_ForwardCall_state'] = 'Dialed'

        logger.debug('%s/%s: Set session to %s' % (
            request.session.session_key,
            request.session['ProviderIVR_ForwardCall_state'],
            request.session['ProviderIVR_ForwardCall_state'],
        ))

        callSID = request.POST['CallSid']
        log = callLog.objects.get(callSID=callSID)
        if (not log.caller_spoken_name):
            log.caller_spoken_name = request.session.pop(
                'ivr_makeRecording_recording')
            log.save()

        logger.debug('%s/%s: got provider \'%s\' \'%s\' with id %s' % (
            request.session.session_key,
            request.session['ProviderIVR_ForwardCall_state'],
            provider.first_name,
            provider.last_name,
            provider.pk,
        ))
        logger.debug(
            '%s/%s: Provider phone is \'%s\' and forward_other is \'%s\'' % (
                request.session.session_key,
                request.session['ProviderIVR_ForwardCall_state'],
                provider.user.phone,
                str(provider.forward_other),
            ))

        # Okay, let's dial!
        user_number = None
        if (forward == 'MO'):
            logger.debug('%s/%s: provider.forward_mobile True' % (
                request.session.session_key,
                request.session['ProviderIVR_ForwardCall_state'],
            ))
            user_number = provider.user.mobile_phone
            logger.debug('%s/%s: Setting user_number to \'%s\'' % (
                request.session.session_key,
                request.session['ProviderIVR_ForwardCall_state'],
                provider.user.mobile_phone,
            ))
        elif (forward == 'OF'):
            logger.debug('%s/%s: provider.forward_office True' % (
                request.session.session_key,
                request.session['ProviderIVR_ForwardCall_state'],
            ))
            user_number = provider.office_phone
            logger.debug('%s/%s: Setting user_number to \'%s\'' % (
                request.session.session_key,
                request.session['ProviderIVR_ForwardCall_state'],
                provider.office_phone,
            ))
        elif (forward == 'OT'):
            logger.debug('%s/%s: provider.forward_other True' % (
                request.session.session_key,
                request.session['ProviderIVR_ForwardCall_state'],
            ))
            user_number = provider.user.phone
            logger.debug('%s/%s: Setting user_number to \'%s\'' % (
                request.session.session_key,
                request.session['ProviderIVR_ForwardCall_state'],
                provider.user.phone,
            ))

        logger.debug('%s/%s: Tried to get called\'s number. Got \'%s\'' % (
            request.session.session_key,
            request.session['ProviderIVR_ForwardCall_state'],
            user_number,
        ))
        logger.debug(
            '%s/%s: Provider phone is \'%s\' and forward_other is \'%s\'' % (
                request.session.session_key,
                request.session['ProviderIVR_ForwardCall_state'],
                provider.user.phone,
                str(provider.forward_other),
            ))

        if (not user_number):
            # no flags were set.
            if (provider.user.mobile_phone):
                user_number = provider.user.mobile_phone
            else:
                return ProviderIVR_LeaveMsg(request)

        dial = twilio.Dial(
            action=reverse('ProviderIVR_ForwardCall'),
            timeout=22,
            timeLimit=14400,  # 4 hours
            callerId=request.session['Caller'])
        dial.append(
            twilio.Number(user_number,
                          url=reverse('ProviderIVR_ForwardCall_VetAnswer')))
        r.append(dial)
        r.append(twilio.Redirect(reverse('ProviderIVR_LeaveMsg')))
        return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

    if (request.session['ProviderIVR_ForwardCall_state'] == 'Dialed'):
        callSID = request.POST['CallSid']
        log = callLog.objects.get(callSID=callSID)

        if (log.call_connected):
            r.append(twilio.Hangup())
            return HttpResponse(str(r),
                                mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

        return ProviderIVR_LeaveMsg(request)

    r = twilio.Response()
    if (request.POST['DialStatus'] != 'answered'):
        if (request.POST['DialStatus'] == 'failed'):
            # TODO: Figure out how to deal with connection problems. Most
            # likely, send an email to the user and administrators.
            subject = 'ProviderIVR_ForwardCall Call Forward DialStatus Fail'
            message = 'ProviderIVR_ForwardCall got DialStatus failed. Post data: %s' % \
             (str(request.POST),)
            mail_admins(subject=subject, message=message, fail_silently=False)
        # else request.POST['DialStatus'] == 'busy' or request.POST['DialStatus'] == 'no-answer'
        return ProviderIVR_LeaveMsg(request)
    # else: Do nothing so that the call continues un-interrupted
    return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
示例#10
0
def ProviderIVR_Setup(request, config=None):
    """
	This function is heavily dependent upon request.session; Twilio is kind
	enough to keep session cookies for us.
	"""
    # DEBUG:
    #if (not 'ProviderIVR_Setup' in request.session['callCounts']):
    #   request.session['callCounts']['ProviderIVR_Setup'] = 1
    #else:
    #   request.session['callCounts']['ProviderIVR_Setup'] += 1

    # DEBUG:
    #if (not 'debug_semaphore' in request.session):
    #   request.session['ivr_setup_stage'] = 1
    #   request.session['debug_semaphore'] = True
    #else:
    #   raise Exception(request.session['ivr_call_stack'])
    if ('CallStatus' in request.POST
            and request.POST['CallStatus'] == 'completed'):
        # call ended
        #raise Exception('Ending inappropriately. Call stack is %s'%(str(
        # request.session['ivr_call_stack']),)) # DEBUG
        r = twilio.Response()
        return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
    elif (not 'CallStatus' in request.POST):
        # call ended
        #raise Exception('Ending inappropriately. Call stack is %s'%(str(
        # request.session['ivr_call_stack']),)) # DEBUG
        r = twilio.Response()
        return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

    if 'ivr_setup_stage' not in request.session:
        # Okay, this is the first time this function is being executed for this
        # call.
        #raise Exception(request.session['ivr_call_stack']) # DEBUG

        r = twilio.Response()

        # Set up our session variables.
        request.session['ivr_setup_stage'] = 1
        request.session['ivr_call_stack'].append('ProviderIVR_Setup')
        request.session.modified = True

        provider = Provider.objects.get(id=request.session['provider_id'])
        if (not provider.vm_config.count()):
            # This user needs a voicemailbox configuration object
            config = VMBox_Config()
            config.owner = provider
            config.save()
            request.session['config_id'] = config.id

        r.append(twilio.Pause(
        ))  # one second pause keeps the first words from getting cut off.
        r.append(
            tts("Welcome to your voicemail account. It looks like some "
                "setup is needed. Let's get started."))
        r.append(tts("First, we need to set up your pin number."))

        event = callEvent(callSID=request.POST['CallSid'], event='I_STR')
        event.save()

        #raise Exception(request.session['ivr_call_stack']) # DEBUG
        return changePin(request, r, True)

    elif (request.session['ivr_setup_stage'] == 1):  # Record name
        request.session['ivr_call_stack'].append('ProviderIVR_Setup')
        request.session.modified = True
        request.session['ivr_setup_stage'] = 2

        return changeName(request, 'Now, we need to record your name.')
    elif (request.session['ivr_setup_stage'] == 2):  # Record a greeting
        request.session['ivr_call_stack'].append('ProviderIVR_Setup')
        request.session.modified = True
        request.session['ivr_setup_stage'] = 3

        return changeGreeting(request,
                              'Finally, we need to set up a greeting.')
    elif (request.session['ivr_setup_stage'] == 3):  # Configuration complete!
        #raise Exception(request.session['ivr_call_stack']) # DEBUG
        #raise Exception(request.session['callCounts']) # DEBUG
        # Automatically "log" this user in.
        request.session['authenticated'] = True

        config = VMBox_Config.objects.get(id=request.session['config_id'])
        config.config_complete = True
        config.save()

        r = twilio.Response()
        r.append(
            tts('Your voice mail account is now set up. You may hang up '
                'now, or stay on the line to be taken to your voice mail box home.'
                ))

        event = callEvent(callSID=request.POST['CallSid'], event='I_FIN')
        event.save()

        r.append(
            twilio.Redirect(reverse(request.session['ivr_call_stack'].pop())))
        request.session.modified = True
        return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

    raise Exception(
        'Reached the end of ProviderIVR_Setup. This should never happen.')
示例#11
0
def ProviderIVR_LeaveMsg(request):
    """
	Records a voicemail message.

	Arguments:
		request - The standard Django request argument

	request.session Keys:
		provider_id - The ID of the Provider user who owns this voicemail box.
	"""
    # TODO: Update this code so that users can hit the pound key to
    # pop back and log into their own voicemail box.
    provider = Provider.objects.get(id=request.session['provider_id'])

    config = None
    config_complete = provider.vm_config.count(
    ) == 1 and provider.vm_config.get().config_complete
    if (config_complete):
        config = provider.vm_config.get()

    if ('CallStatus' in request.POST
            and request.POST['CallStatus'] == 'completed'):
        try:
            callSID = request.POST['CallSid']
            auth, uri, = client.auth, client.account_uri
            resp = make_twilio_request('GET',
                                       uri + '/Calls/%s' % callSID,
                                       auth=auth)
            content = json.loads(resp.content)
            log = callLog.objects.get(callSID=callSID)
            log.call_duration = content['TwilioResponse']['Call']['Duration']
            log.save()
        except:
            pass  # this is really ugly, but letting this exception fall through
            # destroys a message analytics will pick up the duration later on if it's missing

    if ('ivr_makeRecording_recording' in request.session):
        provider_qs = Provider.objects.filter(
            mobile_phone=request.session['Caller'])
        if (provider_qs):
            request.session['ivr_makeRecording_callbacknumber'] = provider_qs[
                0].mdcom_phone
            subject = "Voice Mail from %s %s" % (provider_qs[0].first_name,
                                                 provider_qs[0].last_name)
        else:
            request.session[
                'ivr_makeRecording_callbacknumber'] = request.session['Caller']
            subject = "Voice Mail from %s" % request.session[
                'ivr_makeRecording_callbacknumber']
        save_message(request, subject, [provider.user], None, "VM", False)
        request.session.pop('ivr_makeRecording_recording')

        r = twilio.Response()
        r.append(tts('Good bye'))
        r.append(twilio.Hangup())
        return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

    # Get the configuration file for this Provider
    if (not config_complete):
        # FIXME:
        # Probably not the best way to create the spoken number. We need to
        # break the number down so that there are spaces between each digit, and
        # so that there are commas after the third and sixth digits.
        if (not 'Called' in request.session
                or (not request.session['Called'])):
            # This will occur if click2call calls this function
            request.session['ivr_makeRecording_prompt'] = tts(
                'The user is not available. '
                'Please leave a message after the beep. Press pound when finished for options.'
            )
        else:
            number = request.session['Called']
            spoken_number = []
            [spoken_number.extend([i, ' ']) for i in number]
            spoken_number.pop()  # drop the last element
            spoken_number.insert(5, ',')
            spoken_number.insert(12, ',')
            request.session['ivr_makeRecording_prompt'] = tts(
                'The person at %s '
                'is not available. Please leave a message after the beep. Press pound '
                'when finished for options.' % (''.join(spoken_number), ))
    else:
        p = re.compile('http')
        if (p.match(config.greeting)):
            # This is a Twilio recording.
            request.session['ivr_makeRecording_prompt'] = twilio.Play(
                config.greeting)
        else:
            # TODO:
            raise Exception('Unimplemented playback of local files')

    request.session['ivr_makeRecording_maxLength'] = 120  # 2 minutes
    request.session['ivr_makeRecording_leadSilence'] = 2
    request.session['ivr_makeRecording_promptOnce'] = True
    request.session['ivr_makeRecording_returnOnHangup'] = \
     'MHLogin.DoctorCom.IVR.views_provider.ProviderIVR_LeaveMsg'
    request.session['ivr_call_stack'].append('ProviderIVR_LeaveMsg')
    request.session.modified = True

    # Pass off the recording action to the getRecording function.
    return getRecording(request)
示例#12
0
def ProviderIVR_TreeRoot(request):

    r = twilio.Response()
    provider = Provider.objects.get(id=request.session['provider_id'])

    if (request.method == 'POST' and 'Digits' in request.POST):
        digits = request.POST['Digits']
        p = re.compile('[0-9#*]$')
        if (not p.match(digits)):
            r.append(tts('I\'m sorry, I didn\'t understand that.'))
        elif (digits == '1'):
            # play messages
            request.session['ivr_call_stack'].append('ProviderIVR_TreeRoot')
            request.session.modified = True
            messages = MessageBodyUserStatus.objects.filter(
                user=provider.user,
                delete_flag=False,
                msg_body__message___resolved_by=None,
                msg_body__message__message_type__in=('ANS', 'VM'))
            return playMessages(request, messages, r)
        elif (digits == '2'):
            request.session['ivr_call_stack'].append('ProviderIVR_TreeRoot')
            request.session.modified = True
            messages = MessageBodyUserStatus.objects.filter(
                user=provider.user,
                delete_flag=False,
                msg_body__message___resolved_by=None,
                msg_body__message__message_type__in=('ANS', ))
            return playMessages(request, messages, r)
        elif (digits == '3'):
            request.session['ivr_call_stack'].append('ProviderIVR_TreeRoot')
            request.session.modified = True
            messages = MessageBodyUserStatus.objects.filter(
                user=provider.user,
                delete_flag=False,
                msg_body__message___resolved_by=None,
                msg_body__message__message_type__in=('VM', ))
            # fix for issue 2257 - if we go to playMessages, it will use 3 in its digit and try to replay
            # current message which fails if there are no messages
            if (messages == [] or len(messages) == 0):
                pass
            else:
                request.session['ivr_call_stack'].append(
                    'ProviderIVR_TreeRoot')
                return playMessages(request, messages, r)

        elif (digits == '4'):
            request.session['ivr_call_stack'].append('ProviderIVR_TreeRoot')
            request.session.modified = True
            return ProviderIVR_Options(request, True)
        elif (digits == '*'):
            pass
        else:
            r.append(tts('I\'m sorry, I didn\'t understand that.'))

    gather = twilio.Gather(finishOnKey='', numDigits=1)
    #	messages = MessageBodyUserStatus
    unread_anssvc_msg_count = MessageBodyUserStatus.objects.filter(
        user=provider.user,
        read_flag=False,
        delete_flag=False,
        msg_body__message___resolved_by=None,
        msg_body__message__message_type='ANS').count()
    unread_msg_count = MessageBodyUserStatus.objects.filter(
        user=provider.user,
        read_flag=False,
        delete_flag=False,
        msg_body__message___resolved_by=None,
        msg_body__message__message_type='VM').count()

    saved_msg_count = MessageBodyUserStatus.objects.filter(
        user=provider.user,
        read_flag=True,
        delete_flag=False,
        msg_body__message___resolved_by=None,
        msg_body__message__message_type='VM').count()
    saved_anssvc_msg_count = MessageBodyUserStatus.objects.filter(
        user=provider.user,
        read_flag=True,
        delete_flag=False,
        msg_body__message___resolved_by=None,
        msg_body__message__message_type='ANS').count()

    say_str = []

    say_str.append('You have %i new, and %i saved urgent messages,' %
                   (unread_anssvc_msg_count, saved_anssvc_msg_count))
    say_str.append(' ')
    say_str.append('and %i new, and %i saved voice messages,' %
                   (unread_msg_count, saved_msg_count))

    if (any((unread_msg_count, unread_anssvc_msg_count, saved_msg_count,
             saved_anssvc_msg_count))):
        say_str.append('To listen to all your messages, press one. ')
        say_str.append('To listen to your urgent messages, press two. ')
        say_str.append('To listen to your voice mail, press three. ')
    gather.append(tts(''.join(say_str)))

    gather.append(tts('To manage your voicemail settings, press four.'))
    gather.append(tts('To repeat this menu, press star.'))
    r.append(gather)

    return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
示例#13
0
def generate_twiml(message):
    response = twiml.Response()
    response.say(message)
    return str(response)
示例#14
0
def inbound():
    response = twiml.Response()
    response.play('/static/sounds/inbound.mp3')
    return str(response)
示例#15
0
def respond_sms():
    # Grab unix time
    epoch_time = int(time.time())
    # Store the message from the request sent by twilio
    i_msg = request.form.get("Body")
    # Store the number the message was sent from
    from_number = request.values.get("From")
    
    # The counter keeps track of the number of messages from this number in the
    # past 4 hours. If none, default to 0
    counter = session.get('counter', 0)
    counter += 1
    session['counter'] = counter
    # Retrieve the stored state from twilio's servers. Again, default to 0
    state = session.get('state', 0)
    # Record the message in the sqlite db
    sql_write(counter, epoch_time, from_number, i_msg)
    
    # The default message is ERROR. There should not be a point where there is
    # fall through and this happens
    msg = "ERROR"
    
    # If the person texts "RESET_ZER0", reset the state to zero. This is
    # just for debugging purposes
    if "RESET_ZER0" in i_msg:
        state = 0

    if "Call" in i_msg:
        msg = "Okay! A human will call you shortly. Thank you for checking in."
        state = 200  

    if state == 0:
        msg = "Hello. I see that you are currently not checked into the airport X for flight #YYY. Are you currently at the airport? Please reply with Y or N"
        state = 1

    # This is the state of responding to the inital text
    elif state == 1:
        if "Y" in i_msg:
            msg = "You have been checked in!"
            state = 200
        elif "N" in i_msg:
            msg = "Uh oh! Will you be making the flight?"
            state = 2
        else: 
            msg = "I did not understand that, sorry! Please reply with either Y if you will be making the flight, or N if you will not"

    # This is the state of Not checked in
    elif state == 2:
        if "Y" in i_msg:
            msg = "Thanks! If you are not checked in within the hour, a human will be in contact with you."
            state = 200
        elif "N" in i_msg:
            msg = "I'm sorry to hear that. A human will call you shortly in order to resolve any issue"
            state = 400
        else:
            msg = "I did not understand that, sorry! Please reply with either Y if you will be making the flight, or N if you will not"

    # This is the "failure state". This means we need to involve humans
    elif state == 400:
        msg = "There has been an issue with our system. A human will be in contact with you in order to resolve any issue."
        state = 0

    # Prepare and then send a twilio SMS respond
    resp = twiml.Response()
    resp.sms(msg)
    
    # This is the success state. Send a thank you text and switch back to the 
    # beginning state
    if state == 200:
        msg = "Thank you for flying for Southwest! If you have an unresolved issue, please contact (ZZZ)-XXX-YYYY"
        state = 0
        resp.sms(msg)

    # Store the state and time in the session cookie
    session['state'] = state
    session['time'] = epoch_time
    
    return str(resp)
# Download the Python helper library from twilio.com/docs/python/install
from twilio import twiml

r = twiml.Response()
with r.dial() as d:
    d.queue("Queue Demo")
print(str(r))
示例#17
0
def hello():
    response = twiml.Response()
    response.say('Hello there! You have successfully configured a web hook.')
    response.say('Good luck on your Twilio quest!', voice='woman')
    return Response(str(response), mimetype='text/xml')
示例#18
0
def get_text():

    team_leads = get_users_by_role('teamlead')
    state_leads = get_users_by_role('teamlead')
    regional_leads = get_teamleads_by_region("1")

    # Gets all members from database
    member = db.session.query(User).join(User.roles).filter(Role.name=="member").all()
    response = twiml.Response()

    # Save inbound number and message
    inbound_msg_body = request.form.get("Body")
    inbound_msg_from = request.form.get("From")

    # Menu /// Incomplete
    menu = "Press 1 to report an emergency \n Press 2 to report an emergency \n"
    
    # Gets callers role from the database
    # inc_msg_user_role = db.session.query(Role).join(User.roles).filter(User.phone_number==inbound_msg_from).first()
    # inc_msg_user_role = inc_msg_user_role.name
    
    # Gets caller's van number 
    # inc_msg_van = db.session.query(User).join(User.roles).filter(User.phone_number==inbound_msg_from).first()
    # inc_msg_van = inc_msg_van.van

    # Gets sessions 
    activate_session=session.get("activate_session")
    activation_step=session.get("activation_step")

    menu_session=session.get("menu_session")
    last_name_session = session.get("last_name_session")
    is_active = session.get("is_active")
    emergency = session.get("emergency_session")
    add_van = session.get("add_van_session")
   
    # session.pop("add_van_session")
    # session.pop("menu_session")
    # session.pop("activate_session")
   
   # Checks if the menu session is true and handles the responses

   # ========================================= #
   # ======= Emergencies and Alerts ========== #
   # ========================================= #

    menu = ["Press 1 for an emergency health care, residential, vehicle accident.",
            "Press 2 for a natural disaster tornadoes, thuderstorms, hailsotrms, extreme cold weather.",
            "Press 3 if violence or gunshot erupts.",
            "Press 4 for an accident or structual failure fire, building collapse, toll or bridge/tunnel accident.",
            "Press 5 for an utility incidents power outage, winter storms, severe cold/exposure."]

    if inbound_msg_body.replace(' ', '').lower()[:10]=="emergency":
        for x in menu:
            client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body=x)
        session['emergency_session'] = True

    elif emergency: 
        print "Runs"
        if inbound_msg_body.replace(' ', '')[:2] == "1":
            user = get_caller_by_phone_number(inbound_msg_from)
            team = get_region(user.region)
            for x in team:
                emergency_message = "emergency health care, residential, vehicle accident"
                if inbound_msg_from != x.phone_number:
                    message = client.messages.create(to=x.phone_number, 
                        from_=TWILIO_NUMBER, body="%s: Has issued an emergency alert due to an emergency health care, residential, vehicle accident\nPhone Number: %s" %(user.first_name, user.phone_number))
        
        elif inbound_msg_body.replace(' ', '')[:2] == "2":
            user = get_caller_by_phone_number(inbound_msg_from)
            team = get_region(user.region)
            for x in team:
                emergency_message = "natural disaster tornadoes, thuderstorms, hailsotrms, extreme cold weather"
                if inbound_msg_from != x.phone_number:
                    message = client.messages.create(to=x.phone_number, 
                        from_=TWILIO_NUMBER, body="%s: Has issued an emergency alert due to a natural disaster tornadoes, thuderstorms, hailsotrms, extreme cold weather. \nPhone Number: %s" %(user.first_name, user.phone_number))



        
        elif inbound_msg_body.replace(' ', '')[:2] == "3":
            user = get_caller_by_phone_number(inbound_msg_from)
            team = get_region(user.region)
            for x in team:
                emergency_message = "violence or gunshot erupts"
                if inbound_msg_from != x.phone_number:
                    message = client.messages.create(to=x.phone_number, 
                        from_=TWILIO_NUMBER, body="%s: Has issued an emergency alert due to an eruption of violence or gunshots\nPhone Number: %s" %(user.first_name, user.phone_number))


        elif inbound_msg_body.replace(' ', '')[:2] == "4":
            user = get_caller_by_phone_number(inbound_msg_from)
            team = get_region(user.region)
            for x in team:
                emergency_message = "accident or structual failure fire, building collapse, toll or bridge/tunnel accident"
                if inbound_msg_from != x.phone_number:
                    message = client.messages.create(to=x.phone_number, 
                        from_=TWILIO_NUMBER, body="%s: Has issued an emergency alert due to an accident or structual failure fire, building collapse, toll or bridge/tunnel accident.\nPhone Number: %s" %(user.first_name, user.phone_number))


        elif inbound_msg_body.replace(' ', '')[:2] == "5":
            user = get_caller_by_phone_number(inbound_msg_from)
            team = get_region(user.region)
            for x in team:
                emergency_message = "utility incidents power outage, winter storms, severe cold/exposure"
                if inbound_msg_from != x.phone_number:
                    message = client.messages.create(to=x.phone_number, 
                        from_=TWILIO_NUMBER, body="%s: Has issued an emergency alert due an utility incidents power outage, winter storms, severe cold/exposure.\nPhone Number: %s" %(user.first_name, user.phone_number))


        client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body="All regional staff have been notified of you emergency and will contact you shortly.")
        new_emergency = Emergency(msg=emergency_message,time=datetime.now(),phone_number=inbound_msg_from)
        db.session.add(new_emergency)
        db.session.commit()
        session.pop("emergency_session")

    elif inbound_msg_body.lower().replace(' ', '')[:7] == "urgent":

        inbound_msg_body = inbound_msg_body.lower().replace("urgent","")
        inbound_msg_body.capitalize()

        new_emergency = Emergency(msg=inbound_msg_body,time=datetime.now(),phone_number=inbound_msg_from)
        db.session.add(new_emergency)
        db.session.commit()

        user = db.session.query(User).filter(User.phone_number == inbound_msg_from).one()
        team = get_team(user.region, user.van)
        
        for x in team:
            print x.phone_number
            if inbound_msg_from != x.phone_number:
                message = client.messages.create(to=x.phone_number, from_=TWILIO_NUMBER,body="%s: URGENT %s" %(user.first_name,inbound_msg_body))



    # =========================================== #
    # ================ ACTIVATE ================= #
    # =========================================== #

    # If the caller text "Activate", a response will be sent         
    elif inbound_msg_body.lower().replace(" ","")[:9] == "activate":
        try:
            # Queries the User table 
            user = User.query.filter(User.phone_number == inbound_msg_from).one()
            on_shift = user.on_shift

            # If user has already activate their number of the shift we'll send a welcome messase
            if on_shift == True:
                client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body="Welcome back!")

            # Else if the caller is in the DB, but 'on_shift' is False, we'll will update the callers 
            # status in the database to True and welcome them caller and ask for their Van Number  
            else:
                db.session.query(User).filter(User.phone_number == inbound_msg_from).update({"on_shift":(True)})
                db.session.commit()
                client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body="You've been activated, what is your van number?")

                # Creates an 'add_van_session'
                session.get("add_van_session")
                session['add_van_session'] = True

        # If python throws an error, the caller's number isn't in our database and we begin the text-based registration 
        except:
            client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body="What is your first name?")

            #starts activate session
            session["activate_session"] = True
            session['activation_step'] = 1 




    # The callers first name response is handled
    elif activate_session:
        if activation_step == 1:

            #the msg received after the first name will be used as their first name
            user_first_name = inbound_msg_body.replace(" ","")
            first_name = [user_first_name] 

            session["last_name_session"] = first_name

            message = client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body="What is your Last name")
            session['activation_step'] = 2


        # The callers first name response is handled
        elif activation_step == 2:
            
            last_name = inbound_msg_body
            last_name_session.append(last_name)
        
            # Sends confromation text
            client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body="What is your FOUR digit van number? ")
            session["is_active"] = True
            session['activation_step'] = 3

        elif activation_step == 3: 
            region = inbound_msg_body.replace(' ','').lower()[:2]
            van = inbound_msg_body.replace(' ','').lower()[-2:]
            new_users = User(first_name=last_name_session[0], 
                             last_name=last_name_session[1], 
                             phone_number=inbound_msg_from,
                             van = van,
                             region = region,
                             on_shift=True)

            new_role = db.session.query(Role).filter_by(name="member").first()
            new_users.roles.append(new_role)
            db.session.add(new_users)
            db.session.commit()

            # Sends confromation text
            message = client.messages.create(to=inbound_msg_from,from_=TWILIO_NUMBER,body="You are now active")

            session.pop('activation_step')
            session.pop('activate_session')
            session.pop('last_name_session')

    

    # =========================================== #
    #  ============== DEACTIVATE ================ #
    # =========================================== #

    elif inbound_msg_body.lower().replace(" ","")[:11] == "deactivate":
        try:
            user = User.query.filter(User.phone_number== inbound_msg_from).one()
            if user.on_shift == True:
                db.session.query(User).filter(User.phone_number == inbound_msg_from).update({"on_shift":(False)})
                db.session.query(User).filter(User.phone_number == inbound_msg_from).update({"van":(0)})
                db.session.commit()
                client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body="Good Bye")
            else:
                message = client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body="You're not active.")
        except:
            message = client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body="This number is not registered in our system") 




    # ============================================ #
    # ========== TEAM LEADS MESSASING ============ #
    # ============================================ #

    elif (inbound_msg_body[:3].lower()).replace(" ","") == "tl":
        if get_caller_role(inbound_msg_from) == 'member':
            sender = get_caller_by_phone_number(inbound_msg_from)
            teamlead = get_teamlead(sender.region, sender.van)
            client.messages.create(to=teamlead.phone_number, from_=TWILIO_NUMBER,body=inbound_msg_body)

        elif get_caller_role(inbound_msg_from) == 'teamlead':
            teamleaders = get_teamleads_by_region(user.region)

            for leads in teamleaders:
                if leads.phone_number != inbound_msg_from:
                    client.messages.create(to=leads.phone_number, from_=TWILIO_NUMBER,body=inbound_msg_body)


    # ============================================= #
    # ======== Regional Leader Messaging ========== #
    # ============================================= #

        elif get_caller_role(inbound_msg_from) == 'regional':
            user = db.session.query(User).filter(User.phone_number == inbound_msg_from).one()
            team_leads = get_teamleads_by_region(user.region)
            for x in team_leads:
                client.messages.create(to=x.phone_number, from_=TWILIO_NUMBER,body="%s: %s" %(user.first_name,inbound_msg_body))




    # elif add_van == True:
    #     print "got to add van script"
    #     try:
    #         db.session.query(User).filter(User.phone_number==inbound_msg_from).update({'van':int(inbound_msg_body)})
    #         db.session.commit()
    #         session.pop("add_van_session")
    #     except:
    #         message = client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,
    #                                  body="Please provide us with the correct van number")
    #         session[add_van]= True            
    

    # elif inbound_msg_body[:7].lower().replace(" ","") == "roster" and inc_msg_user_role == "teamlead":
    #     roster = db.session.query(User).filter(User.van==inc_msg_van).filter(User.on_shift==True).all()
    #     roster_list = []
    #     for x in roster:
    #         print roster_list.append(x.first_name)
    #     message = client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body=("You're current van members are %s"%roster_list))

    #     message = client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body=menu)
    #     menu_session = session.get("menu_session")
        
    #     message = client.messages.create(to=inbound_msg_from, from_=TWILIO_NUMBER,body=["What is your emergency?"])
    #     session["menu_session"] = "save emergency"

    # elif menu_session == "save emergency":
    #     new_emergency = Emergency(msg=inbound_msg_body,time=datetime.now(),phone_number=inbound_msg_from)
    #     db.session.add(new_emergency)
    #     db.session.commit()
    #     session.pop("menu_session")
   
    else:
        if get_caller_role(inbound_msg_from) == 'state':
            user = get_caller_role(inbound_msg_from)
            team = get_state()
            for x in team:
                print x.phone_number
                if inbound_msg_from != x.phone_number:
                    message = client.messages.create(to=x.phone_number, from_=TWILIO_NUMBER,body="%s: %s" %(user.first_name,inbound_msg_body))

        elif get_caller_role(inbound_msg_from) == 'regional':
            user = get_caller_by_phone_number(inbound_msg_from)
            team = get_region(user.region)
            for x in team:
                print x.phone_number
                if inbound_msg_from != x.phone_number:
                    message = client.messages.create(to=x.phone_number, from_=TWILIO_NUMBER,body="%s: %s" %(user.first_name,inbound_msg_body))

        else:
            user = db.session.query(User).filter(User.phone_number == inbound_msg_from).one()
            team = get_team(user.region, user.van)
            for x in team:
                if inbound_msg_from != x.phone_number:
                    message = client.messages.create(to=x.phone_number, from_=TWILIO_NUMBER,body="%s: %s" %(user.first_name,inbound_msg_body))
    return "Done"
示例#19
0
def recognize():
    if 'RecordingUrl' in request.args:
        recording_url = request.args['RecordingUrl']
    else:
        recording_url = request.form['RecordingUrl']

    r = twiml.Response()
    try:
        text = _recognize(recording_url)
        name_matches = _lookup_name(text)
        district_matches = _lookup_district(text)
        name = None

        if u'老母' in text:
            _say(r, 'NO_MOTHER')

        if len(name_matches) > 0:
            name = name_matches[0]
            app.logger.info("evt=match_name sid=%s name=%s",
                            request.form['CallSid'], name)
            _say(r, 'WILL_CALL')
        elif len(district_matches) > 0:
            district = district_matches[0]
            name = random.choice(district_dir[district])
            app.logger.info("evt=match_district sid=%s district=%s name=%s",
                            request.form['CallSid'], district, name)
            _say(r, 'WILL_CALL')
            _say(r, district)
            _say(r, 'FROM_DISTRICT')

        if name is not None:
            attr = name_dir[name]
            desc = attr.get('desc', name)
            tel = attr.get('tel')

            _say(r, desc)
            _say(r, 'DONT_HANG_UP')

            if tel is not None and type(tel) is list and len(tel) > 0:
                if DEBUG_DIAL_NUMBER is None:
                    tel = tel[0]
                else:
                    tel = DEBUG_DIAL_NUMBER

                _say(r, 'THE_NUMBER_IS')
                _say(r, ''.join([' ' + d for d in tel]))
                tel_with_prefix = COUNTRY_PREFIX + tel
                app.logger.info("evt=dial_start sid=%s name=%s tel=%s",
                                request.form['CallSid'], name, tel_with_prefix)
                r.dial(tel_with_prefix, action=url_for('goodbye'))
            else:
                app.logger.info("evt=tel_not_found sid=%s name=%s",
                                request.form['CallSid'], name)
                _say(r, 'TEL_NOT_FOUND')
                r.redirect(url_for('retry'))

            r.hangup()
        else:
            app.logger.warn("evt=match_miss sid=%s text=%s",
                            request.form['CallSid'], text)
            _say(r, 'PLACE_NOT_FOUND')
            r.redirect(url_for('retry'))
    except ValueError:
        _say(r, 'CANNOT_HEAR')
        r.redirect(url_for('retry'))

    return str(r), 200, {'Content-Type': 'text/xml'}
示例#20
0
def _appointment_error(language):
    resp = twiml.Response()
    resp.play(audio_filename('registration_id_error', language))
    resp.redirect(url_with_params('ivr/registration', language=language))
    return HttpResponse(resp)
示例#21
0
def get_text():
    from flask import Flask, request, session, Response
    from twilio import twiml
    from twilio.rest import TwilioRestClient

    SECRET_KEY = "u092i3049034"

    app = Flask(__name__)
    app.config.from_object(__name__)

    # Find these values at https://twilio.com/user/account
    account_sid = "ACaaaadf1975e4dcc6dde6d42ddda6743e"
    auth_token = "8b17826f30ea9747c8a3c381e198b196"
    client = TwilioRestClient(account_sid, auth_token)

    TWILIO_NUMBER = "+13474078862"

    team_leads_contact = db.session.query(User).join(
        User.roles).filter(Role.name == "team lead").all()
    # print team_leads_contact
    state_leader = db.session.query(User).join(
        User.roles).filter(Role.name == "state").all()
    team_lead = db.session.query(User).join(
        User.roles).filter(Role.name == "teamlead").all()
    # print team_lead

    reg_lead = db.session.query(User).join(
        User.roles).filter(Role.name == "regional").all()
    if len(reg_lead) >= 1:
        for x in reg_lead:
            reg_lead_numbers = []
            reg_lead_numbers.append(x.phone_number)
            print reg_lead_numbers
    else:
        print "there are no reg_lead"
    member = db.session.query(User).join(
        User.roles).filter(Role.name == "member").all()
    response = twiml.Response()
    inbound_msg_body = request.form.get("Body")
    inbound_msg_from = request.form.get("From")
    menu = "Press 1 to report an emergency \n Press 2 to report an emergency \n"

    inc_msg_user_role = db.session.query(Role).join(
        User.roles).filter(User.phone_number == inbound_msg_from).first()
    inc_msg_user_role = inc_msg_user_role.name

    inc_msg_van = db.session.query(User).join(
        User.roles).filter(User.phone_number == inbound_msg_from).first()
    inc_msg_van = inc_msg_van.van

    activate_session = session.get("activate_session")
    menu_session = session.get("menu_session")
    last_name_session = session.get("last_name_session")
    is_active = session.get("is_active")
    emergency = session.get("emergency_session")
    add_van = session.get("add_van_session")
    # session.pop("add_van_session")
    # session.pop("menu_session")
    # session.pop("activate_session")
    # ACTIVATE SESSION BEGINS HERE
    if menu_session == True:
        if inbound_msg_body == "1":
            session.get("emergency_session")
    elif inbound_msg_body[:9].lower().replace(" ", "") == "activate":
        try:
            user = User.query.filter(
                User.phone_number == inbound_msg_from).one()
            on_shift = user.on_shift
            if on_shift == True:
                message = client.messages.create(to=inbound_msg_from,
                                                 from_=TWILIO_NUMBER,
                                                 body="Welcome back!")
            else:
                db.session.query(User).filter(
                    User.phone_number == inbound_msg_from).update(
                        {"on_shift": (True)})
                db.session.commit()
                message = client.messages.create(
                    to=inbound_msg_from,
                    from_=TWILIO_NUMBER,
                    body="You've been activated, what is your van number?")
                a = True
                session.get("add_van_session")
                session['add_van_session'] = a
                print a
        except:
            message = client.messages.create(to=inbound_msg_from,
                                             from_=TWILIO_NUMBER,
                                             body="What is your first name?")
            #starts activate session
            activate_session = True
            session["activate_session"] = activate_session
    elif inc_msg_user_role == "teamlead" and inbound_msg_body[:3] == "tl":
        fellow_tl = db.session.query(User).join(User.roles).filter(
            Role.name == "teamlead").filter(User.van == inc_msg_van).all()
    elif add_van == True:
        print "got to add van script"
        try:
            db.session.query(User).filter(
                User.phone_number == inbound_msg_from).update(
                    {'van': int(inbound_msg_body)})
            db.session.commit()
            session.pop("add_van_session")
        except:
            message = client.messages.create(
                to=inbound_msg_from,
                from_=TWILIO_NUMBER,
                body="Please provide us with the correct van number")
            session[add_van] = True
    elif activate_session == True:
        a = []
        #the msg received after the first name will be used as their first name
        user_first_name = inbound_msg_body.replace(" ", "")

        user_phone = inbound_msg_from
        #Starts session to get last name
        activate_last_name_session = True
        a.append(user_first_name)
        #takes list and saves it in session
        session["last_name_session"] = a
        message = client.messages.create(to=inbound_msg_from,
                                         from_=TWILIO_NUMBER,
                                         body="What is your Last name")
        session.pop("activate_session")
    elif last_name_session:
        if len(last_name_session) == 1:
            print "*****SESION RAN"
            user_last_name = inbound_msg_body
            user_first_name = session["last_name_session"][0]
            user_phone = inbound_msg_from
            new_users = User(first_name=user_first_name,
                             last_name=user_last_name,
                             phone_number=user_phone,
                             on_shift=True)
            new_role = db.session.query(Role).filter_by(name="member").first()
            new_users.roles.append(new_role)
            db.session.add(new_users)
            db.session.commit()
            message = client.messages.create(to=inbound_msg_from,
                                             from_=TWILIO_NUMBER,
                                             body="You are now active")
            session.pop("last_name_session")
            session["is_active"] = True
    elif (inbound_msg_body[:11].lower()).replace(" ", "") == "deactivate":
        try:
            user = User.query.filter(
                User.phone_number == inbound_msg_from).one()
            if user.on_shift == True:
                db.session.query(User).filter(
                    User.phone_number == inbound_msg_from).update(
                        {"on_shift": (False)})
                db.session.query(User).filter(
                    User.phone_number == inbound_msg_from).update({"van": (0)})
                db.session.commit()
                message = client.messages.create(to=inbound_msg_from,
                                                 from_=TWILIO_NUMBER,
                                                 body="Good Bye")
            else:
                message = client.messages.create(to=inbound_msg_from,
                                                 from_=TWILIO_NUMBER,
                                                 body="You're not active.")
        except:
            message = client.messages.create(
                to=inbound_msg_from,
                from_=TWILIO_NUMBER,
                body="This number is not registered in our system")
    elif inbound_msg_body[:5].lower() == "menu":

        message = client.messages.create(to=inbound_msg_from,
                                         from_=TWILIO_NUMBER,
                                         body=menu)
        menu_session = session.get("menu_session")

        print menu_session
        message = client.messages.create(to=inbound_msg_from,
                                         from_=TWILIO_NUMBER,
                                         body=["What is your emergency?"])
        a = "save emergency"
        session["menu_session"] = a
    elif menu_session == "save emergency":
        # session["emergency_session"] = inbound_msg_body
        new_emergency = Emergency(msg=inbound_msg_body,
                                  time=datetime.now(),
                                  phone_number=inbound_msg_from)
        db.session.add(new_emergency)
        db.session.commit()
        session.pop("menu_session")
    elif (inbound_msg_body[:7].lower()) == "urgent":
        print "*****caught emergency msg"
        inbound_msg_body = inbound_msg_body.lower().replace("urgent", "")
        inbound_msg_body.capitalize()
        print inbound_msg_body
        new_emergency = Emergency(msg=inbound_msg_body,
                                  time=datetime.now(),
                                  phone_number=inbound_msg_from)
        db.session.add(new_emergency)
        db.session.commit()
        user = db.session.query(User).filter(
            User.phone_number == inbound_msg_from).one()
        team_members = db.session.query(User).filter(
            User.van == user.van).all()

        for x in team_members:
            print x.phone_number
            if inbound_msg_from != x.phone_number:
                message = client.messages.create(
                    to=x.phone_number,
                    from_=TWILIO_NUMBER,
                    body="%s: %s" % (user.first_name, inbound_msg_body))
    elif inbound_msg_body[:7].lower().replace(
            " ", "") == "roster" and inc_msg_user_role == "teamlead":
        roster = db.session.query(User).filter(User.van == inc_msg_van).filter(
            User.on_shift == True).all()
        roster_list = []
        for x in roster:
            print roster_list.append(x.first_name)
        message = client.messages.create(
            to=inbound_msg_from,
            from_=TWILIO_NUMBER,
            body=("You're current van members are %s" % roster_list))
    #For Regional Managers to send msgs to respective TLs & Members
    elif inbound_msg_from in reg_lead_numbers:
        if inbound_msg_body[:2].lower() == "tl":
            user = db.session.query(User).filter(
                User.phone_number == inbound_msg_from).one()
            print user.phone_number
            team_leads = db.session.query(User).filter(
                User.van == user.van).join(
                    User.roles).filter(Role.name == "teamlead").all()
            for x in team_leads:
                print x.van
                message = client.messages.create(
                    to=x.phone_number,
                    from_=TWILIO_NUMBER,
                    body="%s: %s" % (user.first_name, inbound_msg_body))
        else:
            user = db.session.query(User).filter(
                User.phone_number == inbound_msg_from).one()
            team_members = db.session.query(User).filter(
                User.van == user.van).all()
            for x in team_members:
                print x.phone_number
                if inbound_msg_from != x.phone_number:
                    message = client.messages.create(
                        to=x.phone_number,
                        from_=TWILIO_NUMBER,
                        body="%s: %s" % (user.first_name, inbound_msg_body))
    # elif inbound_msg_body[:2].lower()=="tl":
    #     team_leads_contact = db.session.query(User).filter(team_number).join(User.roles).filter(Role.name=="teamlead").all()
    #     for number in leads_numbers:
    #         if inbound_msg_from != number:
    #             message = client.messages.create(to=number, from_=TWILIO_NUMBER,
    #                                               body="%s: %s" %(team_leads[inbound_msg_from],inbound_msg_body))
    else:
        user = db.session.query(User).filter(
            User.phone_number == inbound_msg_from).one()
        team_members = db.session.query(User).filter(
            User.van == user.van).all()
        for x in team_members:
            print x.phone_number
            if inbound_msg_from != x.phone_number:
                message = client.messages.create(
                    to=x.phone_number,
                    from_=TWILIO_NUMBER,
                    body="%s: %s" % (user.first_name, inbound_msg_body))
    return "Done"
示例#22
0
def sms():
    response = twiml.Response()
    response.sms("Nothing here")
    return str(response)
示例#23
0
def respond_with_sms(to, message):
    resp = twiml.Response()
    resp.message('Hello {}: {}'.format(number, message_body))
示例#24
0
def hello_monkey():
    """Respond to incoming calls with a simple text message."""

    resp = twiml.Response()
    resp.say("""Hello. It's me. I've been wondering if after this guide you'd like to meet.""")
    return str(resp)
示例#25
0
def sms():
    response = twiml.Response()
    response.sms("Congratulations! You deployed the Twilio Hackpack "
                 "for Heroku and Flask.")
    return str(response)
示例#26
0
    if __name__ == "__main__":
        app.run(debug=True)

# Message 8, 9 (continuation of Mesasage 6, or 7 if message9 == 3)
elif messagecount == 5 and message9 == 3:
        def incoming_sms():
            body = request.values.get('Body', None)

        savings_balance = 1200
        goal_achievement_ratio = (savings_balance / goal_amount * 100)
        point_balance = 260
        jackpot_amount = 80
        bigmac_cost = 3
        bigmac_number = jackpot_amount / bigmac_cost

        resp=twiml.Response()

        resp.message("You've saved $%r: %r of the way to that %r you wanted." % (savings_balance, goal_achievement_ratio, goal_name))

        resp.message("You have %r money.days and have about the same chance of winning the jackpot as a grown-up ordering a big-mac when he goes to Micky Dees! Incidentally, you could buy %r Big Macs with that Jackpot, but don't!" % (point_balance, bigmac_number))

        return str(resp)

    if __name__ == "__main__":
        app.run(debug=True)

# alt

elif messagecount == 4 and message9 != 3:
        def incoming_sms():
            body = request.values.get('Body', None)
示例#27
0
def incoming_message():
    response = twiml.Response()
    response.sms('I just responded to a text message. Huzzah!')
    return Response(str(response), mimetype='text/xml')