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
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
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)
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 }})
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 }})
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
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' }})
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)
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)
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
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']
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']
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)
def get_top_ids(): ids = list(ApiAccess.get_skynet_db().gold_members.\ find({}).\ sort('asset', -1).\ limit(_top_max)) return {'content': ids}
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
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 '')
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)
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}]
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)
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)
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
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()
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