Beispiel #1
0
    def track_api_call(self,
                       remote_addr,
                       s_req,
                       s_resp,
                       action_name,
                       processed_data,
                       curs=None):
        super(HelixbillingApplication,
              self).track_api_call(remote_addr, s_req, s_resp, action_name,
                                   processed_data)

        actor_user_id = processed_data.get('actor_user_id')
        custom_actor_info = processed_data.get('custom_actor_info')
        environment_id = processed_data.get('environment_id')
        users_ids = processed_data.get('subject_users_ids', [])
        session_id = processed_data.get('session_id')

        data = {
            'environment_id': environment_id,
            'session_id': session_id,
            'custom_actor_info': custom_actor_info,
            'actor_user_id': actor_user_id,
            'subject_users_ids': users_ids,
            'action': action_name,
            'remote_addr': remote_addr,
            'request': s_req,
            'response': s_resp,
        }
        mapping.insert(curs, ActionLog(**data))
Beispiel #2
0
    def add_tariff(self, data, session, curs=None):
        # checking parent tariff exist
        pt_id = data['parent_tariff_id']
        currency = data.get('currency', None)
        t_data = {
            'environment_id': session.environment_id,
            'parent_tariff_id': pt_id,
            'name': data['name'],
            'type': data['type'],
            'status': data['status']
        }
        if pt_id is not None:
            if currency is not None:
                raise NonParentTariffWithCurrency
            else:
                t_f = TariffFilter(session, {'id': pt_id}, {}, None)
                t_f.filter_one_obj(curs)
        elif currency is None:
            raise ParentTariffWithoutCurrency
        else:
            c_f = CurrencyFilter({'code': currency}, {}, None)
            c = c_f.filter_one_obj(curs)
            t_data['currency_id'] = c.id

        t = Tariff(**t_data)

        mapping.insert(curs, t)
        return response_ok(id=t.id)
Beispiel #3
0
    def _process_lock(self, session, curs, data, operation, balance_updater):
        lock_f = BalanceLockFilter(session, {
            'id': data['lock_id'],
            'balance_id': data['balance_id']
        }, {}, None)
        lock = lock_f.filter_one_obj(curs)

        balance = self._get_active_balance(session, curs, data)

        currs_id_idx = self._get_currs_idx(curs, 'id')
        currency = currs_id_idx[balance.currency_id]

        info = data.get('info', {})

        trans_data = {
            'environment_id': session.environment_id,
            'user_id': balance.user_id,
            'balance_id': balance.id,
            'currency_code': currency.code,
            'type': operation,
            'real_amount': cents_to_decimal(currency, lock.real_amount),
            'virtual_amount': cents_to_decimal(currency, lock.virtual_amount),
            'order_id': lock.order_id,
            'info': info
        }

        balance_updater(balance, lock)
        mapping.update(curs, balance)

        trans = Transaction(**trans_data)
        mapping.delete(curs, lock)
        mapping.insert(curs, trans)
        return response_ok(transaction_id=trans.id)
Beispiel #4
0
    def _process_lock(self, session, curs, data, operation, balance_updater):
        lock_f = BalanceLockFilter(session, {'id': data['lock_id'],
            'balance_id': data['balance_id']}, {}, None)
        lock = lock_f.filter_one_obj(curs)

        balance = self._get_active_balance(session, curs, data)

        currs_id_idx = self._get_currs_idx(curs, 'id')
        currency = currs_id_idx[balance.currency_id]

        info = data.get('info', {})

        trans_data = {'environment_id': session.environment_id, 'user_id': balance.user_id,
            'balance_id': balance.id, 'currency_code': currency.code, 'type': operation,
            'real_amount': cents_to_decimal(currency, lock.real_amount),
            'virtual_amount': cents_to_decimal(currency, lock.virtual_amount),
            'order_id': lock.order_id, 'info': info}

        balance_updater(balance, lock)
        mapping.update(curs, balance)

        trans = Transaction(**trans_data)
        mapping.delete(curs, lock)
        mapping.insert(curs, trans)
        return response_ok(transaction_id=trans.id)
Beispiel #5
0
    def _make_income_transaction(self, curs, data, session, transaction_type):
        balance = self._get_active_balance(session, curs, data)

        currs_id_idx = self._get_currs_idx(curs, 'id')
        currency = currs_id_idx[balance.currency_id]

        amount_dec = Decimal(data['amount'])
        amount = decimal_to_cents(currency, amount_dec)
        enrolled_amount_dec = cents_to_decimal(currency, amount)

        if amount < 0:
            amount *= -1

        trans_data = {'environment_id': session.environment_id,
            'user_id': balance.user_id, 'balance_id': balance.id,
            'currency_code': currency.code, 'real_amount': 0, 'virtual_amount': 0,
            'type': transaction_type, 'info': data.get('info', {})}

        if transaction_type == 'receipt':
            balance.real_amount += amount
            trans_data['real_amount'] = enrolled_amount_dec
        elif transaction_type == 'bonus':
            balance.virtual_amount += amount
            trans_data['virtual_amount'] = enrolled_amount_dec
        else:
            raise HelixbillingError('Unhandled income transaction type: %s' %
                transaction_type)
        mapping.update(curs, balance)

        trans = Transaction(**trans_data)
        mapping.insert(curs, trans)
        return trans.id
Beispiel #6
0
 def add_tariffication_object(self, data, session, curs=None):
     name = data['name']
     to_data = {'environment_id': session.environment_id, 'name': name}
     to = TarifficationObject(**to_data)
     try:
         mapping.insert(curs, to)
     except ObjectCreationError:
         raise TarifficationObjectAlreadyExsits(name)
     return response_ok(id=to.id)
Beispiel #7
0
 def add_tariffication_object(self, data, session, curs=None):
     name = data['name']
     to_data = {'environment_id': session.environment_id,
         'name': name}
     to = TarifficationObject(**to_data)
     try:
         mapping.insert(curs, to)
     except ObjectCreationError:
         raise TarifficationObjectAlreadyExsits(name)
     return response_ok(id=to.id)
Beispiel #8
0
    def lock(self, data, session, curs=None):
        balance = self._get_active_balance(session, curs, data)

        currs_id_idx = self._get_currs_idx(curs, 'id')
        currency = currs_id_idx[balance.currency_id]

        lock_amount_dec = Decimal(data['amount'])
        lock_amount = decimal_to_cents(currency, lock_amount_dec)

        if lock_amount < 0:
            lock_amount *= -1

        locking_order = data['locking_order']
        amounts_to_lock = compute_locks(balance, lock_amount, locking_order)
        lock_real = amounts_to_lock.get('real_amount', 0)
        lock_virtual = amounts_to_lock.get('virtual_amount', 0)
        order_id = data['order_id']
        info = data.get('info', {})
        info['locking_order'] = locking_order

        trans_data = {
            'environment_id': session.environment_id,
            'user_id': balance.user_id,
            'balance_id': balance.id,
            'currency_code': currency.code,
            'type': 'lock',
            'real_amount': cents_to_decimal(currency, lock_real),
            'virtual_amount': cents_to_decimal(currency, lock_virtual),
            'order_id': order_id,
            'info': info
        }
        lock_data = {
            'environment_id': session.environment_id,
            'user_id': balance.user_id,
            'balance_id': balance.id,
            'real_amount': lock_real,
            'locking_order': locking_order,
            'order_id': order_id,
            'currency_id': currency.id,
            'virtual_amount': lock_virtual,
            'info': info
        }

        lock = BalanceLock(**lock_data)
        balance.real_amount -= lock_real
        balance.virtual_amount -= lock_virtual
        balance.locked_amount += lock_real + lock_virtual
        mapping.update(curs, balance)

        trans = Transaction(**trans_data)
        mapping.insert(curs, lock)
        mapping.insert(curs, trans)
        return response_ok(transaction_id=trans.id, lock_id=lock.id)
Beispiel #9
0
    def add_tariff_viewing_context(self, data, session, curs=None):
        # checking parent tariff exist
        t_id = data['tariff_id']
        t_f = TariffFilter(session, {'id': t_id}, {}, None)
        t_f.filter_one_obj(curs)

        raw_ctx = data['context']
        ctx = self._collapse_context(raw_ctx)
        t_v_data = {'environment_id': session.environment_id,
            'tariff_id': t_id, 'name': data['name'],
            'view_order': data['view_order'], 'context': ctx}

        t_v_ctx = TariffViewingContext(**t_v_data)
        mapping.insert(curs, t_v_ctx)
        return response_ok(id=t_v_ctx.id)
Beispiel #10
0
    def add_user_tariff(self, data, session, curs=None):
        # checking tariff exist
        t_id = data['tariff_id']
        u_id = data['user_id']
        if t_id:
            t_f = TariffFilter(session, {'id': t_id}, {}, None)
            t_f.filter_one_obj(curs)

        ut_data = {'environment_id': session.environment_id,
            'tariff_id': t_id, 'user_id': u_id}
        ut = UserTariff(**ut_data)
        try:
            mapping.insert(curs, ut)
        except ObjectCreationError:
            raise UserTariffAlreadyExsits(tariff_id=t_id, user_id=u_id)
        return response_ok(id=ut.id)
Beispiel #11
0
    def add_tariff_viewing_context(self, data, session, curs=None):
        # checking parent tariff exist
        t_id = data['tariff_id']
        t_f = TariffFilter(session, {'id': t_id}, {}, None)
        t_f.filter_one_obj(curs)

        raw_ctx = data['context']
        ctx = self._collapse_context(raw_ctx)
        t_v_data = {
            'environment_id': session.environment_id,
            'tariff_id': t_id,
            'name': data['name'],
            'view_order': data['view_order'],
            'context': ctx
        }

        t_v_ctx = TariffViewingContext(**t_v_data)
        mapping.insert(curs, t_v_ctx)
        return response_ok(id=t_v_ctx.id)
Beispiel #12
0
    def add_user_tariff(self, data, session, curs=None):
        # checking tariff exist
        t_id = data['tariff_id']
        u_id = data['user_id']
        if t_id:
            t_f = TariffFilter(session, {'id': t_id}, {}, None)
            t_f.filter_one_obj(curs)

        ut_data = {
            'environment_id': session.environment_id,
            'tariff_id': t_id,
            'user_id': u_id
        }
        ut = UserTariff(**ut_data)
        try:
            mapping.insert(curs, ut)
        except ObjectCreationError:
            raise UserTariffAlreadyExsits(tariff_id=t_id, user_id=u_id)
        return response_ok(id=ut.id)
Beispiel #13
0
    def lock(self, data, session, curs=None):
        balance = self._get_active_balance(session, curs, data)

        currs_id_idx = self._get_currs_idx(curs, 'id')
        currency = currs_id_idx[balance.currency_id]

        lock_amount_dec = Decimal(data['amount'])
        lock_amount = decimal_to_cents(currency, lock_amount_dec)

        if lock_amount < 0:
            lock_amount *= -1

        locking_order = data['locking_order']
        amounts_to_lock = compute_locks(balance, lock_amount, locking_order)
        lock_real = amounts_to_lock.get('real_amount', 0)
        lock_virtual = amounts_to_lock.get('virtual_amount', 0)
        order_id = data['order_id']
        info = data.get('info', {})
        info['locking_order'] = locking_order

        trans_data = {'environment_id': session.environment_id, 'user_id': balance.user_id,
            'balance_id': balance.id, 'currency_code': currency.code,
            'type': 'lock', 'real_amount': cents_to_decimal(currency, lock_real),
            'virtual_amount': cents_to_decimal(currency, lock_virtual),
            'order_id': order_id, 'info': info}
        lock_data = {'environment_id': session.environment_id, 'user_id': balance.user_id,
            'balance_id': balance.id, 'real_amount': lock_real, 'locking_order': locking_order,
            'order_id': order_id, 'currency_id': currency.id, 'virtual_amount': lock_virtual,
            'info': info}

        lock = BalanceLock(**lock_data)
        balance.real_amount -= lock_real
        balance.virtual_amount -= lock_virtual
        balance.locked_amount += lock_real + lock_virtual
        mapping.update(curs, balance)

        trans = Transaction(**trans_data)
        mapping.insert(curs, lock)
        mapping.insert(curs, trans)
        return response_ok(transaction_id=trans.id, lock_id=lock.id)
Beispiel #14
0
    def _make_income_transaction(self, curs, data, session, transaction_type):
        balance = self._get_active_balance(session, curs, data)

        currs_id_idx = self._get_currs_idx(curs, 'id')
        currency = currs_id_idx[balance.currency_id]

        amount_dec = Decimal(data['amount'])
        amount = decimal_to_cents(currency, amount_dec)
        enrolled_amount_dec = cents_to_decimal(currency, amount)

        if amount < 0:
            amount *= -1

        trans_data = {
            'environment_id': session.environment_id,
            'user_id': balance.user_id,
            'balance_id': balance.id,
            'currency_code': currency.code,
            'real_amount': 0,
            'virtual_amount': 0,
            'type': transaction_type,
            'info': data.get('info', {})
        }

        if transaction_type == 'receipt':
            balance.real_amount += amount
            trans_data['real_amount'] = enrolled_amount_dec
        elif transaction_type == 'bonus':
            balance.virtual_amount += amount
            trans_data['virtual_amount'] = enrolled_amount_dec
        else:
            raise HelixbillingError('Unhandled income transaction type: %s' %
                                    transaction_type)
        mapping.update(curs, balance)

        trans = Transaction(**trans_data)
        mapping.insert(curs, trans)
        return trans.id
Beispiel #15
0
    def track_api_call(self, remote_addr, s_req, s_resp,
        action_name, processed_data, curs=None):
        super(HelixauthApplication, self).track_api_call(remote_addr, s_req, s_resp,
            action_name, processed_data)

        actor_user_id = processed_data.get('actor_user_id')
        custom_actor_info = processed_data.get('custom_actor_info')
        environment_id = processed_data.get('environment_id')
        users_ids = processed_data.get('subject_users_ids', [])
        session_id = processed_data.get('session_id')

        data = {
            'environment_id': environment_id,
            'session_id': session_id,
            'custom_actor_info': custom_actor_info,
            'actor_user_id': actor_user_id,
            'subject_users_ids': users_ids,
            'action': action_name,
            'remote_addr': remote_addr,
            'request': s_req,
            'response': s_resp,
        }
        mapping.insert(curs, ActionLog(**data))
Beispiel #16
0
    def add_balance(self, data, session, curs=None):
        user_id = data['user_id']
        check_user_exist = data.get('check_user_exist', False)
        if check_user_exist:
            self._check_user_exist(session, user_id)
        currs_code_idx = self._get_currs_idx(curs, 'code')
        curr_code = data['currency_code']
        if curr_code not in currs_code_idx:
            raise CurrencyNotFound(currency_code=curr_code)
        curr = currs_code_idx[curr_code]

        try:
            u_curr_f = UsedCurrencyFilter(session, {}, {}, None)
            u_currs = u_curr_f.filter_one_obj(curs)
            u_currs_ids = u_currs.currencies_ids
        except ObjectNotFound:
            u_currs_ids = []

        if curr.id not in u_currs_ids:
            raise UsedCurrencyNotFound(currency_code=curr_code)

        b_data = dict(data)
        b_data.pop('currency_code', None)
        b_data.pop('session_id', None)
        b_data.pop('check_user_exist', None)
        b_data.pop('subject_users_ids', None)

        b_data['environment_id'] = session.environment_id
        b_data['currency_id'] = curr.id
        amount_fields = ['overdraft_limit']
        balance = Balance(
            **decimal_texts_to_cents(b_data, curr, amount_fields))
        try:
            mapping.insert(curs, balance)
        except ObjectCreationError:
            raise BalanceAlreadyExists()
        return response_ok(id=balance.id)
Beispiel #17
0
    def add_balance(self, data, session, curs=None):
        user_id = data['user_id']
        check_user_exist = data.get('check_user_exist', False)
        if check_user_exist:
            self._check_user_exist(session, user_id)
        currs_code_idx = self._get_currs_idx(curs, 'code')
        curr_code = data['currency_code']
        if curr_code not in currs_code_idx:
            raise CurrencyNotFound(currency_code=curr_code)
        curr = currs_code_idx[curr_code]

        try:
            u_curr_f = UsedCurrencyFilter(session, {}, {}, None)
            u_currs = u_curr_f.filter_one_obj(curs)
            u_currs_ids = u_currs.currencies_ids
        except ObjectNotFound:
            u_currs_ids = []

        if curr.id not in u_currs_ids:
            raise UsedCurrencyNotFound(currency_code=curr_code)

        b_data = dict(data)
        b_data.pop('currency_code', None)
        b_data.pop('session_id', None)
        b_data.pop('check_user_exist', None)
        b_data.pop('subject_users_ids', None)

        b_data['environment_id'] = session.environment_id
        b_data['currency_id'] = curr.id
        amount_fields = ['overdraft_limit']
        balance = Balance(**decimal_texts_to_cents(b_data, curr, amount_fields))
        try:
            mapping.insert(curs, balance)
        except ObjectCreationError:
            raise BalanceAlreadyExists()
        return response_ok(id=balance.id)
Beispiel #18
0
    def add_tariff(self, data, session, curs=None):
        # checking parent tariff exist
        pt_id = data['parent_tariff_id']
        currency = data.get('currency', None)
        t_data = {'environment_id': session.environment_id,
            'parent_tariff_id': pt_id, 'name': data['name'],
            'type': data['type'], 'status': data['status']}
        if pt_id is not None:
            if currency is not None:
                raise NonParentTariffWithCurrency
            else:
                t_f = TariffFilter(session, {'id': pt_id}, {}, None)
                t_f.filter_one_obj(curs)
        elif currency is None:
            raise ParentTariffWithoutCurrency
        else:
            c_f = CurrencyFilter({'code': currency}, {}, None)
            c = c_f.filter_one_obj(curs)
            t_data['currency_id'] = c.id

        t = Tariff(**t_data)

        mapping.insert(curs, t)
        return response_ok(id=t.id)
Beispiel #19
0
 def test_insert(self, curs=None):
     obj = self.T(name='boh0', client_ids=[4,6,4])
     mapping.insert(curs, obj)