コード例 #1
0
 def _get_provider_charges(cls, backend_message_id, backend_instance, direction, couch_id, backend_api_id):
     if backend_message_id:
         if backend_api_id == SQLTwilioBackend.get_api_id():
             message = get_twilio_message(backend_instance, backend_message_id)
             status = message.status
             price = message.price
         elif backend_api_id == InfobipBackend.get_api_id():
             message = get_infobip_message(backend_instance, backend_message_id)
             status = message['status']['name']
             price = message['price']['pricePerMessage']
         else:
             raise ProviderFeeNotSupportedException("backend_message_id=%s" % backend_message_id)
         if status is None or status.lower() in [
             'accepted',
             'queued',
             'sending',
             'receiving',
         ] or price is None:
             raise RetryBillableTaskException("backend_message_id=%s" % backend_message_id)
         return _ProviderChargeInfo(
             abs(Decimal(price)),
             SmsGatewayFee.get_by_criteria(
                 backend_api_id,
                 direction,
             )
         )
     else:
         log_smsbillables_error(
             "Could not create gateway fee for message %s: no backend_message_id" % couch_id
         )
         return _ProviderChargeInfo(None, None)
コード例 #2
0
    def post(self, request, api_key, *args, **kwargs):
        request_body = json.loads(request.body)
        media_urls = []
        for message in request_body.get('results'):
            message_sid = message.get('messageId')
            from_ = message.get('from')
            message_content = message.get('message')
            if message_content.get('type') == 'TEXT':
                body = message_content.get('text', '')
            elif message_content.get('type') in ['IMAGE', 'AUDIO', 'VIDEO', 'DOCUMENT']:
                body = message_content.get('caption', '')
                media_url = message_content.get('url', None)
                if media_url:
                    media_urls.append(media_url)

            incoming_sms(
                from_,
                body,
                InfobipBackend.get_api_id(),
                backend_message_id=message_sid,
                domain_scope=self.domain,
                backend_id=self.backend_couch_id,
                media_urls=media_urls
            )
        return HttpResponse("")
コード例 #3
0
ファイル: generator.py プロジェクト: dankohn/commcare-hq
def _available_gateway_fee_backends():
    return [
        backend for backend in get_sms_backend_classes().values()
        if backend.get_api_id() not in
        [SQLTwilioBackend.get_api_id(),
         InfobipBackend.get_api_id()]
    ]
コード例 #4
0
ファイル: utils.py プロジェクト: dankohn/commcare-hq
def get_infobip_message(backend_instance, backend_message_id):
    from corehq.messaging.smsbackends.infobip.models import InfobipBackend
    try:
        infobip_backend = SQLMobileBackend.load(
            backend_instance,
            api_id=InfobipBackend.get_api_id(),
            is_couch_id=True,
            include_deleted=True,
        )
        config = infobip_backend.config
        api_channel = '/sms/1'
        api_suffix = '/reports'
        if config.scenario_key:
            api_channel = '/omni/1'

        headers = {
            'Authorization': f'App {config.auth_token}',
            'Content-Type': 'application/json',
            'Accept': 'application/json'
        }
        parameters = {'messageId': backend_message_id}
        messages = _get_infobip_message_details(api_channel, api_suffix,
                                                config, headers, parameters)
        if not messages:
            api_suffix = '/logs'
            messages = _get_infobip_message_details(api_channel, api_suffix,
                                                    config, headers,
                                                    parameters)
        return messages[0]
    except Exception as e:
        raise RetryBillableTaskException(str(e))
コード例 #5
0
def add_infobip_gateway_fee(apps):
    default_currency, _ = apps.get_model(
        'accounting', 'Currency'
    ).objects.get_or_create(
        code=settings.DEFAULT_CURRENCY
    )

    for direction in [INCOMING, OUTGOING]:
        SmsGatewayFee.create_new(
            InfobipBackend.get_api_id(),
            direction,
            None,
            fee_class=apps.get_model('smsbillables', 'SmsGatewayFee'),
            criteria_class=apps.get_model('smsbillables', 'SmsGatewayFeeCriteria'),
            currency=default_currency,
        )
コード例 #6
0
 def _get_multipart_count(cls, backend_api_id, backend_instance, backend_message_id, multipart_count):
     if backend_api_id == SQLTwilioBackend.get_api_id():
         twilio_message = get_twilio_message(backend_instance, backend_message_id)
         if twilio_message.num_segments is not None:
             return int(twilio_message.num_segments)
         else:
             raise RetryBillableTaskException("backend_message_id=%s" % backend_message_id)
     elif backend_api_id == InfobipBackend.get_api_id():
         infobip_message = get_infobip_message(backend_instance, backend_message_id)
         segments = infobip_message['messageCount'] \
             if 'messageCount' in infobip_message else infobip_message['smsCount']
         if segments is not None:
             return int(segments)
         else:
             raise RetryBillableTaskException("backend_message_id=%s" % backend_message_id)
     else:
         return multipart_count
コード例 #7
0
    def _get_gateway_fee(cls, backend_api_id, backend_instance,
                         phone_number, direction, couch_id, backend_message_id, domain):
        country_code, national_number = get_country_code_and_national_number(phone_number)
        is_gateway_billable = backend_instance is None or _sms_backend_is_global(
            backend_instance) or toggles.ENABLE_INCLUDE_SMS_GATEWAY_CHARGING.enabled(domain)

        if is_gateway_billable:
            if backend_api_id in [SQLTwilioBackend.get_api_id(), InfobipBackend.get_api_id()]:
                provider_charges = cls._get_provider_charges(
                    backend_message_id, backend_instance, direction, couch_id, backend_api_id
                )
                gateway_fee = provider_charges.gateway_fee
                direct_gateway_fee = provider_charges.provider_gateway_fee
            else:
                gateway_fee = SmsGatewayFee.get_by_criteria(
                    backend_api_id,
                    direction,
                    backend_instance=backend_instance,
                    country_code=country_code,
                    national_number=national_number,
                )
                direct_gateway_fee = None
            if gateway_fee:
                conversion_rate = gateway_fee.currency.rate_to_default
                if conversion_rate != 0:
                    return _GatewayChargeInfo(gateway_fee, conversion_rate, direct_gateway_fee)
                else:
                    log_smsbillables_error(
                        "Gateway fee conversion rate for currency %s is 0"
                        % gateway_fee.currency.code
                    )
                    return _GatewayChargeInfo(gateway_fee, None, direct_gateway_fee)
            else:
                log_smsbillables_error(
                    "No matching gateway fee criteria for SMS %s" % couch_id
                )
        return _GatewayChargeInfo(None, None, None)