示例#1
0
def get_articles(size, page, sort, order, name, article_id):
    query = {} if not name else {'en.title': {'$regex': '.*{}.*'.format(name), '$options': 'i'}}
    query = query if not article_id else {'_id': ObjectId(article_id)}

    total_elements = ApiAccess.get_revenyou_db().bots_store_articles.find(query).count()
    cursor = ApiAccess.get_revenyou_db().bots_store_articles.\
                find(query).\
                skip(page * size).\
                limit(size).\
                collation({'locale': 'en' })

    if order != '':
        cursor = cursor.sort(sort,  -1 if order == 'desc' else 1)

    result = {
        'total_elements': total_elements,
        'total_pages': math.ceil(float(total_elements)/size),
        'current_page': page,
        'content': []}

    for document in cursor:
        result['content'].append(document)
        result['content'][-1]['_id'] = str(result['content'][-1]['_id'])

    return result
示例#2
0
def get_strategies(size, page, sort, order, begin, end, name, strategy_id):
    query = {} if not name else {
        '$or': [{
            'name': {
                '$regex': '.*{}.*'.format(name),
                '$options': 'i'
            }
        }, {
            'team_name': {
                '$regex': '.*{}.*'.format(name),
                '$options': 'i'
            }
        }, {
            'description': {
                '$regex': '.*{}.*'.format(name),
                '$options': 'i'
            }
        }, {
            'key': {
                '$regex': '.*{}.*'.format(name),
                '$options': 'i'
            }
        }]
    }
    query = query if not strategy_id else {'_id': ObjectId(strategy_id)}

    if begin and end:
        query['date_added'] = {'$gte': begin, '$lte': end}
    elif begin:
        query['date_added'] = {'$gte': begin}
    elif end:
        query['date_added'] = {'$lte': end}

    total_elements = ApiAccess.get_revenyou_db().signal_provider.find(
        query).count()
    cursor = ApiAccess.get_revenyou_db().signal_provider.\
                find(query).\
                skip(page * size).\
                limit(size).\
                collation({'locale': 'en' })

    if order != '':
        cursor = cursor.sort(sort, -1 if order == 'desc' else 1)

    result = {
        'total_elements': total_elements,
        'total_pages': math.ceil(float(total_elements) / size),
        'current_page': page,
        'content': []
    }

    for document in cursor:
        result['content'].append(document)
        result['content'][-1]['_id'] = str(result['content'][-1]['_id'])
        result['content'][-1]['date_added'] = utils.utc_ts_to_local_str(
            document.get('date_added', None))
        result['content'][-1]['date_updated'] = utils.utc_ts_to_local_str(
            document.get('date_updated', None))

    return result
示例#3
0
def get_customer_subscribed_snapshot(user_id):
    sub_cursor = ApiAccess.get_revenyou_db().subscribed.find(
        {'user_id': user_id}, {
            '_id': 0,
            'quantity': 1,
            'strategy_id': 1,
            'status': 1,
            'date_added': 1
        })

    result = []
    for document in sub_cursor:
        strategy_name = ApiAccess.get_revenyou_db().signal_provider.find_one({
            '_id':
            ObjectId(document.get('strategy_id', ''))
        }).get('name', '')
        date_time = utils.utc_ts_to_local_str(document.get('date_added',
                                                           None)).split()
        result.append({
            'date':
            date_time[0],
            'time': (date_time[1] if len(date_time) > 1 else ''),
            'operation':
            TimelineSteps.bot_subscription.value['operation'],
            'description':
            '{}: {}/{}'.format(
                TimelineSteps.bot_subscription.value['description'],
                strategy_name, document.get('quantity', '')),
            'status':
            document.get('status', SubscriptionStatus.unknown.value)
        })

    return json.dumps(result)
示例#4
0
def get_new_contact_list():
    maybe_id = get_last_id()
    #Last day or from last saved
    query = {'date_added': {'$gte': int((datetime.now() - timedelta(days=1)).timestamp())}} \
        if maybe_id is None else {'_id': {'$gt': maybe_id}}
    query.update({'email': {'$exists': True, '$ne': ''}})

    contacts = []
    skip_ = 0
    while True:
        partial = list(ApiAccess.get_revenyou_db().sign_up.\
            find(query, {'email': 1, 'first_name': 1, 'last_name': 1, 'nationality': 1}).\
            sort('_id', -1).\
            skip(skip_).\
            limit(_max_limit))
        skip_ += _max_limit
        if len(partial) == 0:
            break
        contacts.extend(partial)

    if len(contacts) == 0:
        return

    ApiAccess.get_skynet_db().cached_contacts.drop()
    ApiAccess.get_skynet_db().cached_contacts.insert_many(contacts)

    for contact in contacts:
        contact['country'] = contact.pop('nationality', '').upper()
        del contact['_id']
    send_contacts(contacts)
def change_password(user_id, new_password):
    ApiAccess.get_skynet_db().users.update_one({'_id': ObjectId(user_id)}, {
        '$set': {
            'password':
            bcrypt.hashpw(new_password.encode('utf-8'), bcrypt.gensalt())
        }
    })
def modify_user(user_id, permissions, role):
    ApiAccess.get_skynet_db().users.update_one(
        {'_id': ObjectId(user_id)},
        {'$set': {
            'permissions': permissions,
            'role': role
        }})
示例#7
0
def get_feedbacks(size, page, sort, order, name):
    query = {} if not name else {'$or': 
                                [{'message': {'$regex': '.*{}.*'.format(name), '$options': 'i'}}, 
                                {'version': {'$regex': '.*{}.*'.format(name), '$options': 'i'}}]}
        
    total_elements = ApiAccess.get_revenyou_db().feedback.find(query).count()
    cursor = ApiAccess.get_revenyou_db().feedback.\
                find(query).\
                skip(page * size).\
                limit(size).\
                collation({'locale': 'en' })

    if order != '':
        cursor = cursor.sort(sort,  -1 if order == 'desc' else 1)

    result = {
        'total_elements': total_elements,
        'total_pages': math.ceil(float(total_elements)/size),
        'current_page': page,
        'content': []}

    for document in cursor:
        result['content'].append(document)
        result['content'][-1]['_id'] = str(result['content'][-1]['_id'])

    return result
def update_2fa_activation(data):
    if not data['2fa_active']:
        ApiAccess.get_skynet_db().users.update_one(
            {'username': data['username'].upper()},
            {'$set': {
                '2fa_active': True
            }})
示例#9
0
def get_user_subscribed_strategies(user_id, size, page, sort, order, begin,
                                   end):
    query = {'user_id': user_id}

    if begin and end:
        query['date_added'] = {'$gte': begin, '$lte': end}
    elif begin:
        query['date_added'] = {'$gte': begin}
    elif end:
        query['date_added'] = {'$lte': end}

    total_elements = ApiAccess.get_revenyou_db().subscribed.find(query).count()
    cursor = ApiAccess.get_revenyou_db().subscribed.\
                find(query).\
                skip(page * size).\
                limit(size).\
                collation({'locale': 'en' })

    if order != '':
        cursor = cursor.sort(sort, -1 if order == 'desc' else 1)
    cursor = list(cursor)

    result = {
        'total_elements': total_elements,
        'total_pages': math.ceil(float(total_elements) / size),
        'current_page': page,
        'content': []
    }

    signal_providers = ApiAccess.get_revenyou_db().signal_provider.\
        find({'_id': \
            {'$in' : [ObjectId(doc.get('strategy_id', '')) for doc in cursor]}},
            {'name': 1, 'pair': 1, 'icon_url': 1}).\
        limit(size)

    strategy_info = {}
    for item in signal_providers:
        strategy_info[str(item['_id'])] = {
            'strategy_name': item.get('name', ''),
            'strategy_pair': item.get('pair', ''),
            'strategy_icon': item.get('icon_url', '')
        }

    for document in cursor:
        result['content'].append(document)
        result['content'][-1]['_id'] = str(result['content'][-1]['_id'])
        result['content'][-1]['date_added'] = utils.utc_ts_to_local_str(
            document.get('date_added', None))
        result['content'][-1]['date_modified'] = utils.utc_ts_to_local_str(
            document.get('date_modified', None))
        strategy_id = document.get('strategy_id', None)
        if strategy_id is not None and strategy_id in strategy_info:
            result['content'][-1].update(strategy_info[strategy_id])

        pnl = (float(result['content'][-1]['updated_quantity']) - float(result['content'][-1]['quantity'])) / float(result['content'][-1]['quantity']) * 100 \
            if result['content'][-1]['updated_quantity'].isnumeric() else None
        result['content'][-1]['pnl'] = "{:.2f}%".format(pnl) if pnl else ''

    return result
示例#10
0
def record_action(caller, username):
    if os.environ['APP_RUN_ENV'] == Mode.development.value:
        print('{} called {}'.format(username, caller))

    ApiAccess.get_skynet_db().audit.insert({
        'time':
        int(datetime.now().timestamp()),
        'username': (username or '-'),
        'caller': (caller or '-')
    })
def successfull_login(data):
    del data['password']
    data['status'] = LoginStates.success.value
    ApiAccess.get_skynet_db().users.update(
        {'username': data['username'].upper()},
        {'$unset': {
            'fail_count': 1,
            'timeout_until': 1
        }})
    return data
def suspend_user(user_id):
    permissions = ApiAccess.get_skynet_db().users.find_one(
        {'_id': ObjectId(user_id)}, {
            '_id': 0,
            'permissions': 1
        })['permissions']
    if 'SUSPENDED' in permissions:
        return

    ApiAccess.get_skynet_db().users.update_one(
        {'_id': ObjectId(user_id)}, {'$push': {
            'permissions': 'SUSPENDED'
        }})
示例#13
0
def unordered_bulk_write(data):
    updates = []
    for item in data:
        updates.append(
            UpdateOne({'_id': item['_id']}, {
                '$setOnInsert': {
                    '_id': item['_id'],
                    'quantity': item['quantity'],
                    'date_added': item['date_added']
                }
            },
                      upsert=True))

    ApiAccess.get_skynet_db().first_deposit.bulk_write(updates)
示例#14
0
def get_deposit_withdrawal_lookup():
    while True:
        pipeline = [{
            '$match': {
                'order_status': OrderStatus.approved.value
            }
        }, {
            '$sort': {
                '_id': 1
            }
        }, {
            '$limit': _default_partition_size
        }, {
            '$lookup': {
                'from':
                'withdrawal',
                'let': {
                    'user_id': '$user_id',
                    'status': '$order_status'
                },
                'pipeline': [{
                    '$match': {
                        '$expr': {
                            '$and': [{
                                '$eq': ['$user_id', '$$user_id']
                            }, {
                                '$eq': ['$withdrawal_status', '$$status']
                            }]
                        }
                    }
                }],
                'as':
                'withdrawals'
            }
        }]
        maybe_id = get_last_id(ApiAccess.get_skynet_db().deposit_withdrawal)
        if maybe_id:
            match_index = next((index for (index, stage) in enumerate(pipeline)
                                if '$match' in stage), None)
            if match_index is None:
                raise KeyError('No $match provided')
            pipeline[match_index]['$match'].update({'_id': {'$gt': maybe_id}})

        data = list(ApiAccess.get_revenyou_db().deposit.aggregate(pipeline))
        if len(data) == 0:
            break
        ApiAccess.get_skynet_db().deposit_withdrawal.insert_many(data)
        time.sleep(_default_cool_off_timeout)
示例#15
0
def get_subscribed_customer_count(begin=None, end=None):
    if begin and end:
        pipeline = [{'$match': {'date_added': {'$gte': begin, '$lte': end}}}]
    elif begin:
        pipeline = [{'$match': {'date_added': {'$gte': begin}}}]
    elif end:
        pipeline = [{'$match': {'date_added': {'$lte': end}}}]
    else:
        pipeline = []

    pipeline.extend([{
        '$match': {
            'status': SubscriptionStatus.active.value
        }
    }, {
        '$group': {
            '_id': '$user_id'
        }
    }, {
        '$count': 'count'
    }])
    cursor = ApiAccess.get_revenyou_db().subscribed.aggregate(pipeline)

    result = [{'_id': 'Subscribed users', 'count': 0}]
    for pair in cursor:
        result[0].update(pair)

    return result
示例#16
0
def get_last_date():
    last_date = list(ApiAccess.get_revenyou_db().deposit.\
        find({}, {'_id': 0, 'date_added': 1}).\
        sort('date_added', -1).\
        limit(1))
    if len(last_date) > 0:
        return last_date[0]['date_added']
示例#17
0
def get_last_saved_date():
    maybe_date = list(ApiAccess.get_skynet_db().first_deposit.\
        find({}, {'_id': 0, 'date_added': 1}).\
        sort('date_added', -1).\
        limit(1))
    if len(maybe_date) > 0:
        return maybe_date[0]['date_added']
示例#18
0
def get_customer_unsubscribed_snapshot(user_id):
    unsub_cursor = ApiAccess.get_revenyou_db().unsubscribed.find(
        {'user_id': user_id}, {
            '_id': 0,
            'bot_name': 1,
            'date_added': 1
        })

    result = []
    for document in unsub_cursor:
        date_time = utils.utc_ts_to_local_str(document.get('date_added',
                                                           None)).split()
        result.append({
            'date':
            date_time[0],
            'time': (date_time[1] if len(date_time) > 1 else ''),
            'operation':
            TimelineSteps.bot_unsubscription.value['operation'],
            'description':
            '{}: {}'.format(
                TimelineSteps.bot_unsubscription.value['description'],
                document.get('bot_name', '')),
            'status':
            SubscriptionStatus.active.value
        })

    return json.dumps(result)
示例#19
0
def get_top_ids():
    ids = list(ApiAccess.get_skynet_db().gold_members.\
            find({}).\
            sort('asset', -1).\
            limit(_top_max))

    return {'content': ids}
示例#20
0
def get_customer_snapshot(user_id):
    cursor = ApiAccess.get_revenyou_db().sign_up.find({'user_id': user_id}, {
        '_id': 0,
        'youhex_name': 1,
        'status': 1,
        'date_added': 1
    })

    if cursor.count() == 0:
        return {}

    date_time = utils.utc_ts_to_local_str(cursor[0].get('date_added',
                                                        None)).split()
    result = {
        'date':
        date_time[0],
        'time': (date_time[1] if len(date_time) > 1 else ''),
        'operation':
        TimelineSteps.user_creation.value['operation'],
        'description':
        '{}: {}'.format(TimelineSteps.user_creation.value['description'],
                        cursor[0].get('youhex_name', '')),
        'status':
        cursor[0].get('status', UserStatus.unknown.value)
    }
    return result
示例#21
0
def get_swift_id(user_id):
    cursor = ApiAccess.get_revenyou_db().sign_up.find({'user_id': user_id}, {
        'swiftdil_customer_id': 1,
        '_id': 0
    })

    return json.dumps(cursor[0] if cursor.count() > 0 else '')
示例#22
0
def get_csv_exportable(cols):
    global _max_limit
    strategies = []
    skip_ = 0
    while True:
        partial = list(ApiAccess.get_revenyou_db().signal_provider.\
            find({}, {'_id': 0}).\
            skip(skip_).\
            limit(_max_limit))
        skip_ += _max_limit
        if len(partial) == 0:
            break
        strategies.extend(partial)

    result = []
    for strategy in strategies:
        result.append({})
        for col in cols:
            if col == 'date_added':
                result[-1]['date_added'] = utils.utc_ts_to_local_str(
                    strategy.get('date_added', None))
                continue
            if col == 'date_updated':
                result[-1]['date_updated'] = utils.utc_ts_to_local_str(
                    strategy.get('date_updated', None))
                continue

            result[-1][col] = strategy.get(col, '')

    return json.dumps(result)
示例#23
0
def get_full_kyc_customer_count(begin=None, end=None):
    query = {
        '$and': [{
            'swiftdil_customer_id': {
                '$exists': True
            }
        }, {
            'swiftdil_customer_id': {
                '$ne': ''
            }
        }, {
            'swiftdil_customer_id': {
                '$ne': '-'
            }
        }]
    }

    if begin and end:
        query['date_added'] = {'$gte': begin, '$lte': end}
    elif begin:
        query['date_added'] = {'$gte': begin}
    elif end:
        query['date_added'] = {'$lte': end}

    count = ApiAccess.get_revenyou_db().sign_up.find(query).count()

    return [{'_id': 'Full KYC users', 'count': count}]
示例#24
0
def get_unsub_value(user_id):
    pipeline = [{
        '$match': {
            'user_id': user_id
        }
    }, {
        '$group': {
            '_id': '',
            'total': {
                '$sum': {
                    '$toDouble': '$deposit_balance'
                }
            },
            'change': {
                '$sum': {
                    '$toDouble': '$profit'
                }
            },
        }
    }, {
        '$addFields': {
            'value': {
                '$add': ['$total', '$change']
            }
        }
    }, {
        '$project': {
            '_id': 0,
            'value': 1
        }
    }]
    result = list(ApiAccess.get_revenyou_db().unsubscribed.aggregate(pipeline))
    return result[0].get('value', 0) if len(result) > 0 else 0
def login(username, password, token):
    login_user = ApiAccess.get_skynet_db().users.find_one(
        {'username': username.upper()})

    if login_user is None:
        return None

    result_retry_fail = check_fail_retry(login_user)
    if result_retry_fail is not None:
        return result_retry_fail

    login_user['_id'] = str(login_user['_id'])
    if bcrypt.hashpw(password.encode('utf-8'),
                     login_user['password']) != login_user['password']:
        return update_fail_retry(login_user)

    if os.environ['APP_RUN_ENV'] == Mode.development.value:  #skip 2FA on dev
        return successfull_login(login_user)

    result_2fa = check_2fa(login_user, token)
    if result_2fa is not None:
        return result_2fa

    update_2fa_activation(login_user)

    return successfull_login(login_user)
示例#26
0
def get_csv_exportable(max, cols, begin, end):
    query = {}
    if begin and end:
        query['date_added'] = {'$gte': begin, '$lte': end}
    elif begin:
        query['date_added'] = {'$gte': begin}
    elif end:
        query['date_added'] = {'$lte': end}

    cursor = list(ApiAccess.get_revenyou_db().sign_up.\
                find(query, {'_id': 0}).\
                limit(max).\
                collation({'locale': 'en'}))

    if 'phone_number' in cols:
        carriers = ApiAccess.get_revenyou_db().carrier.\
        find({'_id': \
            {'$in' : [ObjectId(doc.get('carrier_id', '')) for doc in cursor]}},
            {'non_formated_phone_number': 1}).\
        limit(max)

        phone_numbers = {}
        for item in carriers:
            phone_numbers[str(item['_id'])] = item.get(
                'non_formated_phone_number', '')

    result = []
    for document in cursor:
        result.append({})
        for col in cols:
            if col == 'phone_number':
                result[-1]['phone_number'] = phone_numbers.get(
                    document.get('carrier_id', ''), '')
                continue
            if col == 'full_name':
                result[-1]['full_name'] = '{} {}'.format(
                    document.get('first_name', ''),
                    document.get('last_name', ''))
                continue
            if col == 'date_added':
                result[-1]['date_added'] = utils.utc_ts_to_local_str(
                    document.get('date_added', None))
                continue

            result[-1][col] = document.get(col, '')

    return json.dumps(result)
示例#27
0
def get_reports():
    headers = {
        'Authorization': 'Bearer {}'.format(ApiAccess.get_swift_access_token())
    }

    response = requests.get('{}/reports'.format(ApiAccess._swift_api_base),
                            headers=headers)
    response.raise_for_status()
    return response.json()
def create_user(username, password, role, permissions):
    existing_user = ApiAccess.get_skynet_db().users.find_one(
        {'username': username.upper()})

    if existing_user is None:
        ApiAccess.get_skynet_db().users.insert_one({
            'username':
            username.upper(),
            'password':
            bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()),
            'role':
            role,
            'permissions':
            permissions
        })
        return username.upper()

    return None
示例#29
0
def get_customer_screenings(customer_id):
    response = requests.get(
        '{}/customers/{}/screenings'.format(ApiAccess._swift_api_base,
                                            customer_id),
        headers={
            'Authorization':
            'Bearer {}'.format(ApiAccess.get_swift_access_token())
        })
    return response.json()
示例#30
0
def get_user_unsubscribed_strategies(user_id, size, page, sort, order, begin,
                                     end):
    query = {'user_id': user_id}

    if begin and end:
        query['date_added'] = {'$gte': begin, '$lte': end}
    elif begin:
        query['date_added'] = {'$gte': begin}
    elif end:
        query['date_added'] = {'$lte': end}

    total_elements = ApiAccess.get_revenyou_db().unsubscribed.find(
        query).count()
    cursor = ApiAccess.get_revenyou_db().unsubscribed.\
                find(query).\
                skip(page * size).\
                limit(size).\
                collation({'locale': 'en' })

    if order != '':
        cursor = cursor.sort(sort, -1 if order == 'desc' else 1)

    result = {
        'total_elements': total_elements,
        'total_pages': math.ceil(float(total_elements) / size),
        'current_page': page,
        'content': []
    }

    for document in cursor:
        result['content'].append(document)
        result['content'][-1]['_id'] = str(result['content'][-1]['_id'])
        result['content'][-1]['date_added'] = utils.utc_ts_to_local_str(
            document.get('date_added', None))
        result['content'][-1]['date_modified'] = utils.utc_ts_to_local_str(
            document.get('date_modified', None))
        result['content'][-1]['date_subscribed'] = utils.utc_ts_to_local_str(
            document.get('date_subscribed', None))
        balance = float(result['content'][-1]['deposit_balance'])
        result['content'][-1]['pnl'] = '{:.2f}%'.format(
            (float(result['content'][-1]['profit']) + balance - balance) /
            balance * 100)

    return result