async def get_one(self, request): """ Получить один конкретный пользователь :param request: :return: """ if request.auth.get('group') != 1: return web.HTTPUnauthorized( ) # только админ может видеть пользователей своих db = request.app['db'] # обновить список тегов клиента администратора client = await one(db, Client.get_by_id(request.auth.get('client'))) client_token = client.get('token') dp = DataProvider(client_token) all_ava_tags = await dp.get_tags() # список тегов клиента import json as _json for uid, _ws_list in request.app['websockets'].items(): if int(request.auth.get('id')) == int(uid): # просим всех клиентов пользователя обновить у себя настройки профиля # если у них там что-то не обновится, потребуется перезайти for _ws in _ws_list: try: if all_ava_tags: await _ws.send_str( _json.dumps( { 'type': 'update_client_tags', 'payload': all_ava_tags }, cls=DateTimeAwareEncoder)) except Exception as e: request.app['_log'].error(str(e)) user_id = request.match_info.get('id') or request.get('id') or 0 if int(user_id) > 0: await self._fix_deleted_tags(user_id, request.app) user = await one( db, User.get_full_by_id(user_id, request.auth.get('client'))) user = group_from_labels(user) # статистика stat = { 'user_id': str(request.auth.get('id')), 'code': '15', 'msg': 'Users fetched [' + str(user_id) + ']' } await insert(db, Statistic.add(stat)) return web.json_response( user, dumps=self.__encode_helper, headers={'X-Total-Count': str(0) if len(user) == 0 else str(1)})
async def get_list(self, request): """ Получить список звонков :param request: :return: """ auth = request.auth if request.auth.get('group') not in [1, 2]: return web.HTTPUnauthorized() # собираем все штуки для сортировки и пагинации limit = request.query.get('_end', '15') offset = request.query.get('_start', '0') sort = request.query.get('_sort', 'start_time') order = request.query.get('_order', 'DESC') date_from = str( request.query.get('_date_from', (datetime.now() - relativedelta(days=7)).replace( hour=0, minute=0, second=0, microsecond=0, tzinfo=None))) date_till = str( request.query.get( '_date_till', datetime.now().replace(hour=23, minute=59, second=59, microsecond=0, tzinfo=None))) db = request.app['db'] user = await one( db, User.get_full_by_id(auth.get('id'), auth.get('client'))) # обновляем список тегов if int(auth.get('id')) > 0 and user.get( 'params_enable_deleted_tags_check') is True: u = Users() await u._fix_deleted_tags(auth.get('id'), request.app) # получаем данные текущего пользователя token = user['clients_token'] # TODO: добавить фильтры из настроек юзера # у нас нельзя сортировать по id результат отчета, говорит prohibited dt = DataProvider(token) if sort == 'id': sort = 'start_time' try: dt.set_period(date_from, date_till) except Exception as e: raise web.HTTPNotAcceptable( reason='Period error. Please try again', body=str(e)) dt.set_fields(user['params_fields']) if user['params_filters'] is not None and user[ 'params_filters'] != 'null' and len( user['params_filters']) > 0: _flt = user['params_filters'][0].get('filters') for f in _flt: if str(f.get('value')).isdigit(): f['value'] = int(f['value']) dt.filters = user['params_filters'][0] dt.set_sort([{'field': sort, 'order': str(order).lower()}]) if int(limit) - int(offset) > 0: limit = int(limit) - int(offset) limit = str(limit) try: calls = Report.__extract_data(await dt.get_part(limit, offset)) except TypeError as e: return web.json_response([], headers={ 'X-Total-Count': '0', 'X-Problem': str(e) }) except Exception as ee: raise web.HTTPNotAcceptable(reason=str(ee), body=str(ee)) # calls uniq # calls = list({v['id']:v for v in calls}.values()) # для снимания тега с обращения допишем в теги обращения, ибо в реакте не понятно как это сделать # статистика прослушанности static = await many( db, """ SELECT msg FROM statistics WHERE code=30 and statistics.user_id = %s order by id ASC """ % auth.get('id')) static = [int(x.get('msg')) for x in static.get('data')] for call in calls: if int(call.get('id')) in static: call['listened'] = True else: call['listened'] = False if call.get('tags'): for x in call['tags']: x['comm_id'] = call.get('id') if request.auth.get('group') == 2: # если пользователь, то он может видеть только теги из своего списка user_tags = user['params_tags'] for call in calls: if call.get('tags'): call['tags'][:] = [ x for x in call['tags'] if x.get('tag_id') in user_tags ] rowcount = dt.get_total() # статистика stat = { 'user_id': request.auth.get('id'), 'code': '20', 'msg': 'Report fetched from:[' + str(date_from) + '] to:[' + str(date_till) + '] total:[' + str(rowcount) + ']' } await insert(db, Statistic.add(stat)) return web.json_response(calls, dumps=Report.__encode_helper, headers={'X-Total-Count': str(rowcount)})
async def xls(self, request): """ Подгружаем XLS и отдаем клиету :param request: :return: """ from helpers.xls_maker import make_report auth = request.auth if request.auth.get('group') not in [1, 2]: return web.HTTPUnauthorized() date_from = str( request.query.get('_date_from', (datetime.now() - relativedelta(days=7)).replace( hour=0, minute=0, second=0, tzinfo=None))) date_till = str( request.query.get( '_date_till', datetime.now().replace(hour=23, minute=59, second=59, tzinfo=None))) filters = None if 'filter' in request.query: import json try: filters = json.loads(request.query.get('filter')) except Exception as e: pass if filters: if '_date_from' in filters: date_from = str( filters.get('_date_from', (datetime.now() - relativedelta(days=7)).replace(hour=0, minute=0, second=0, tzinfo=None))) if '_date_till' in filters: date_till = str( filters.get( '_date_till', datetime.now().replace(hour=23, minute=59, second=59, tzinfo=None))) sort = request.query.get('_sort', 'start_time') order = request.query.get('_order', 'DESC') db = request.app['db'] user = await one( db, User.get_full_by_id(auth.get('id'), auth.get('client'))) token = user['clients_token'] # TODO: добавить фильтры из настроек юзера # у нас нельзя сортировать по id результат отчета, говорит prohibited dt = DataProvider(token) if sort == 'id': sort = 'start_time' dt.set_period(date_from, date_till) # различная мета инфа для отчета в XLS _meta = { 'from': date_from, 'till': date_till, 'client': user['clients_name'], 'user': user['users_name'], } dt.set_fields(user['params_fields']) if user['params_filters'] is not None and user[ 'params_filters'] != 'null' and len( user['params_filters']) > 0: _flt = user['params_filters'][0].get('filters') for f in _flt: if str(f.get('value')).isdigit(): f['value'] = int(f['value']) print(user['params_filters'][0]) dt.filters = user['params_filters'][0] dt.set_sort([{'field': sort, 'order': str(order).lower()}]) report = await dt.get() # статистика прослушанности static = await many( db, """ SELECT msg FROM statistics WHERE code=30 and statistics.user_id = %s order by id ASC """ % auth.get('id')) static = [int(x.get('msg')) for x in static.get('data')] for call in report.get('result').get('data'): if int(call.get('id')) in static: call['listened'] = 'Да' else: call['listened'] = 'Нет' if call.get('tags'): for x in call['tags']: x['comm_id'] = call.get('id') if request.auth.get('group') == 2: # если пользователь, то он может видеть только теги из своего списка user_tags = user['params_tags'] for call in report.get('result').get('data'): if call.get('tags'): call['tags'][:] = [ x for x in call['tags'] if x.get('tag_id') in user_tags ] xls_filec = make_report( report, fields_preparator(config.get('app').get('fields_avaliable')), user['params_fields'], _meta, { 'hide_sys_id': user['params_hide_sys_id'], 'hide_sys_aon': user['params_hide_sys_aon'], 'hide_sys_player': user['params_hide_sys_player'], 'hide_sys_static': user['params_hide_sys_static'], }) return web.Response( body=xls_filec, headers={ "Сontent-disposition": "attachment; filename=report.xls", "Content-type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; base64", # "Content-Length" : str(len(xls_filec)), "Content-Transfer-Encoding": "binary", "Cache-Control": "must-revalidate", "Pragma": "public" })