Exemple #1
0
    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)})
Exemple #2
0
    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)})
Exemple #3
0
    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"
            })