def api_reset_password(request):
    """
    通过邮箱重置密码
    :param request:
    :return:
    """
    msg, success = '', False
    logger.debug('api_reset_password')
    post_data = json_loads(request.body)
    user_id = post_data.get('user_id', None)
    token = post_data.get('token', None)
    new_password = post_data.get('new_password', None)
    if not (user_id and token and new_password):
        return http_response_json({'success': False, 'msg': '非法请求'})

    user = SiteUser.get_user(user_id)

    if user is None:
        return http_response_json({'success': False, 'msg': '非法请求'})

    token_generator = PasswordResetTokenGenerator()
    check_result = token_generator.check_token(user, token)
    if not check_result:
        return http_response_json({'success': False, 'msg': '非法请求'})

    user.set_password(new_password)
    user.save()
    success = True

    return http_response_json({'success': success, 'msg': msg})
Exemple #2
0
def api_reset_password(request):
    """
    通过邮箱重置密码
    :param request:
    :return:
    """
    msg, success = '', False
    logger.debug('api_reset_password')
    post_data = json_loads(request.body)
    user_id = post_data.get('user_id', None)
    token = post_data.get('token', None)
    new_password = post_data.get('new_password', None)
    if not (user_id and token and new_password):
        return http_response_json({'success': False, 'msg': '非法请求'})

    user = SiteUser.get_user(user_id)

    if user is None:
        return http_response_json({'success': False, 'msg': '非法请求'})

    token_generator = PasswordResetTokenGenerator()
    check_result = token_generator.check_token(user, token)
    if not check_result:
        return http_response_json({'success': False, 'msg': '非法请求'})

    user.set_password(new_password)
    user.save()
    success = True

    return http_response_json({'success': success, 'msg': msg})
Exemple #3
0
def api_update_account(request, user_id):
    """
    更新用户基本信息
    :param request:
    :param user_id:
    :return:
    """
    msg, success = '', False
    logger.debug('api_update_account')
    logger.debug(request.POST)
    post_data = json_loads(request.body)
    user = SiteUser.get_user(user_id)
    if user is None:
        return http_response_json({'success': success, 'msg': '用户不存在'})

    form = UserInfoEditForm(post_data, instance=user)
    if form.is_valid():
        logger.debug('is_valid')
        user.name = form.cleaned_data["name"]
        user.email = form.cleaned_data["email"]
        user.save()
        return http_response_json({'success': True, 'msg': ''})
    else:
        return http_response_json({
            'success': False,
            'msg': ', '.join(form.error_msg)
        })
Exemple #4
0
def get_model_data(request, model_name):
    logger.debug('run api_get_model_data')
    return_data = {'success': False, 'msg': ''}
    get_default_form = request.GET.get('get_default_form', False)
    if model_name == 'client':
        model = Client
        model_form = ClientForm
        data = model.get_all_in_json()
    elif model_name == 'endpoint':
        model = Endpoint
        model_form = EndpointForm
        data = model.get_all_in_json()
    elif model_name == 'client_endpoint':
        model = ClientEndpoint
        model_form = None
        client_id = request.GET.get('client_id')
        data = model.get_all_in_json(client_id)
    else:
        model = None
        model_form = None
        data = []

    if model is None:
        raise error_404(request)

    # 获取一个缺省值用来添加和编辑数据
    if get_default_form:
        t = model_form.get_default_form_json()
        return_data['default_form'] = t

    return_data['data'] = data
    return_data['success'] = True

    return http_response_json(return_data)
def get_endpoint_options(request):
    """
    获取 Endpoint select 选项
    """
    success, msg, data = False, '', []
    post_data = json_loads(request.body)
    clients = post_data.get('clients', [])

    if len(clients) == 0:
        data = Endpoint.objects.all().values('id', 'unique_name', 'name', 'version')
        data = [
            {
                'id': t['id'],
                'unique_name': t['unique_name'],
                'name': t['name'],
                'version': t['version']
            } for t in data
            ]
    else:
        data = ClientEndpoint.objects.filter(
            client_id__in=clients).select_related('endpoint')
        data = [
            {
                'id': t.endpoint.id,
                'unique_name': t.endpoint.unique_name,
                'name': t.endpoint.name,
                'version': t.endpoint.version
            }
            for t in data
            ]

    success = True
    logger.debug(data)
    return http_response_json({'success': success, 'msg': msg, 'data': data})
Exemple #6
0
def update_enable_state_model_data(request, model_name, entry_id=None):
    """
    点击启用按钮,更新启用状态
    :param request:
    :param model_name:
    :param entry_id:
    :return:
    """
    logger.debug('run api_update_enable_state_model_data')
    return_data = {'success': False, 'msg': ''}
    if model_name == 'client':
        model = Client
    elif model_name == 'endpoint':
        model = Endpoint
    elif model_name == 'client_endpoint':
        model = ClientEndpoint
    else:
        model = None

    post_data = json_loads(request.body)
    if model and entry_id:
        try:
            model.objects.filter(id=entry_id).update(enable=post_data['enable'])
            return_data['success'] = True
        except Exception as e:
            logger.error(e.message)
            return_data['msg'] = u'更新启用状态失败'

    return http_response_json(return_data)
def get_endpoint_options(request):
    """
    获取 Endpoint select 选项
    """
    success, msg, data = False, '', []
    post_data = json_loads(request.body)
    clients = post_data.get('clients', [])

    if len(clients) == 0:
        data = Endpoint.objects.all().values('id', 'unique_name', 'name',
                                             'version')
        data = [{
            'id': t['id'],
            'unique_name': t['unique_name'],
            'name': t['name'],
            'version': t['version']
        } for t in data]
    else:
        data = ClientEndpoint.objects.filter(
            client_id__in=clients).select_related('endpoint')
        data = [{
            'id': t.endpoint.id,
            'unique_name': t.endpoint.unique_name,
            'name': t.endpoint.name,
            'version': t.endpoint.version
        } for t in data]

    success = True
    logger.debug(data)
    return http_response_json({'success': success, 'msg': msg, 'data': data})
Exemple #8
0
def delete_model_data(request, model_name, entry_id=None):
    """
    删除数据
    :param request:
    :param model_name:
    :param entry_id:
    :return:
    """
    logger.debug('run api_delete_model_data')
    return_data = {'success': False, 'msg': ''}
    if model_name == 'client':
        model = Client
    elif model_name == 'endpoint':
        model = Endpoint
    elif model_name == 'client_endpoint':
        model = ClientEndpoint
    else:
        model = None

    if model and entry_id is not None:
        try:
            entry = model.objects.get(id=entry_id)
            entry.delete()
            return_data['success'] = True
        except models.Model.DoesNotExist:
            return_data['msg'] = u'数据不存在'

    return http_response_json(return_data)
Exemple #9
0
def update_model_data(request, model_name, entry_id):
    """
    创建或更新数据
    :param request:
    :param model_name:
    :param entry_id:
    :return:
    """
    logger.debug('run api_update_model_data')
    return_data = {'success': False, 'msg': ''}

    if model_name == 'client':
        model = Client
        model_form = ClientForm
    elif model_name == 'endpoint':
        model = Endpoint
        model_form = EndpointForm
    elif model_name == 'client_endpoint':
        model = None
        model_form = None
    else:
        model = None
        model_form = None

    post_data = json_loads(request.body)
    logger.debug(post_data)

    if model_name != 'client_endpoint':
        try:
            entry = model.objects.get(id=entry_id)
        except models.Model.DoesNotExist:
            return_data['msg'] = '数据不存在'
            return http_response_json(return_data)

        if model_name == 'client':
            form = model_form(post_data['data'], instance=entry)
        elif model_name == 'endpoint':
            form = model_form(post_data['data'], instance=entry)
        else:
            form = None
    else:
        form = None

    return_data = do_create_or_update_model_data(
        request, model_name, True, post_data, form)
    return http_response_json(return_data)
def get_client_options(request):
    """
    获取 Client select 选项
    """
    success, msg, data = False, '', []
    data = Client.objects.all().values('id', 'name')
    data = [t for t in data]
    success = True
    logger.debug(data)
    return http_response_json({'success': success, 'msg': msg, 'data': data})
Exemple #11
0
def api_get_accounts(request):
    """
    获取所有用户
    :param request:
    :return:
    """
    logger.debug('api_get_accounts')
    data = SiteUser.get_all_in_json()
    response = {'success': True, 'msg': '', 'data': data}
    return http_response_json(response)
def get_client_options(request):
    """
    获取 Client select 选项
    """
    success, msg, data = False, '', []
    data = Client.objects.all().values('id', 'name')
    data = [t for t in data]
    success = True
    logger.debug(data)
    return http_response_json({'success': success, 'msg': msg, 'data': data})
Exemple #13
0
def api_get_accounts(request):
    """
    获取所有用户
    :param request:
    :return:
    """
    logger.debug('api_get_accounts')
    data = SiteUser.get_all_in_json()
    response = {'success': True, 'msg': '', 'data': data}
    return http_response_json(response)
Exemple #14
0
def api_refresh_access_log(request):
    """
    立即从redis中更新访问日志
    :param request:
    :return:
    """
    success, msg, data = False, '', []
    transfer_access_logs.delay()
    parse_access_logs.delay()
    return http_response_json({'success': True, 'msg': msg})
    def decorator(request, *args, **kwargs):
        if request.site_user.is_authenticated() and request.site_user.is_admin:
            return view(request, *args, **kwargs)
        else:
            # 如果是通过API调用的方法,则返回错误信息,而不是跳转到登录页面
            content_type = request.META.get("CONTENT_TYPE", "").lower()
            http_accept = request.META.get("HTTP_ACCEPT", "").lower()
            if content_type.startswith("application/json") or "application/json" in http_accept:
                return http_response_json({"success": False, "msg": "登录会话已超时,请刷新页面重新登录"})

            return error_404(request)
def get_endpoint_ratio(request):
    """
    获取今天 endpoint 访问占比
    :param request:
    :return:
    """
    success, msg, data = False, '', []
    post_data = json_loads(request.body)
    model_cls, filter_dict = parse_ratio_post_data(post_data)

    pipeline = [
        {
            "$group": {
                "_id": "$endpoint_id",
                "count": {"$sum": "$count"}
            },
        },
        {
            "$sort": SON([("count", -1), ("_id", -1)])
        }
    ]

    count_list = model_cls.objects(**filter_dict).aggregate(*pipeline)
    count_list = list(count_list)
    endpoint_id_list = [t['_id'] for t in count_list]
    endpoints = Endpoint.objects.filter(id__in=endpoint_id_list).values('unique_name', 'id')
    endpoint_dict = {}
    for t in endpoints:
        endpoint_dict[t['id']] = t['unique_name']

    legend = []
    y_data = []
    # 因为数据导入导出的原因,有可能导致出现 id 不匹配的问题
    new_count_list = []
    for t in count_list:
        if t['_id'] in endpoint_dict:
            new_count_list.append(t)
    count_list = new_count_list

    # 因为饼图显示的问题,只显示前几项
    count_list = sorted(count_list, key=lambda x: x['count'], reverse=True)
    count_list = count_list[:ECHARTS_PIPE_PLOT_MAX_NUM]
    for t in count_list:
        name = endpoint_dict.get(t['_id'])
        if name:
            legend.append(name)
            y_data.append({'value': t['count'], 'name': name})

    data = {
        'legend': legend,
        'y_data': y_data
    }
    return http_response_json({'success': True, 'msg': msg, 'data': data})
Exemple #17
0
def get_endpoint_ratio(request):
    """
    获取今天 endpoint 访问占比
    :param request:
    :return:
    """
    success, msg, data = False, '', []
    post_data = json_loads(request.body)
    model_cls, filter_dict = parse_ratio_post_data(post_data)

    pipeline = [
        {
            "$group": {
                "_id": "$endpoint_id",
                "count": {"$sum": "$count"}
            },
        },
        {
            "$sort": SON([("count", -1), ("_id", -1)])
        }
    ]

    count_list = model_cls.objects(**filter_dict).aggregate(*pipeline)
    count_list = list(count_list)
    endpoint_id_list = [t['_id'] for t in count_list]
    endpoints = Endpoint.objects.filter(id__in=endpoint_id_list).values('unique_name', 'id')
    endpoint_dict = {}
    for t in endpoints:
        endpoint_dict[t['id']] = t['unique_name']

    legend = []
    y_data = []
    # 因为数据导入导出的原因,有可能导致出现 id 不匹配的问题
    new_count_list = []
    for t in count_list:
        if t['_id'] in endpoint_dict:
            new_count_list.append(t)
    count_list = new_count_list

    # 因为饼图显示的问题,只显示前几项
    count_list = sorted(count_list, key=lambda x: x['count'], reverse=True)
    count_list = count_list[:ECHARTS_PIPE_PLOT_MAX_NUM]
    for t in count_list:
        name = endpoint_dict.get(t['_id'])
        if name:
            legend.append(name)
            y_data.append({'value': t['count'], 'name': name})

    data = {
        'legend': legend,
        'y_data': y_data
    }
    return http_response_json({'success': True, 'msg': msg, 'data': data})
Exemple #18
0
def api_create_account(request):
    """
    创建用户基本信息
    :param request:
    :return:
    """
    msg, success = '', False
    logger.debug('api_create_account')
    post_data = json_loads(request.body)
    logger.debug(post_data)
    form = UserInfoCreateForm(post_data)
    if form.is_valid():
        success, msg, user = form.save()  # 将数据保存到数据库中

        response = {'success': success, 'msg': msg}
        if success:
            response['item'] = user.to_json_dict()
        return http_response_json(response)
    else:
        logger.debug(form.error_msg)
        return http_response_json({'success': success, 'msg': ', '.join(form.error_msg)})
Exemple #19
0
def transfer_to_redis(request):
    """
    将配置数据同步到Redis中
    """
    success, msg = False, ''
    try:
        config_data = get_config_redis_json()
        logger.debug(config_data)
        r = redis.StrictRedis(host=settings.REDIS_HOST,
                              port=settings.REDIS_PORT,
                              db=settings.REDIS_DB,
                              password=settings.REDIS_PASSWORD)

        # 默认transaction=True
        pipe = r.pipeline(transaction=True)
        # 按模式匹配批量删除
        pattern_delete_lua = """
        local keys = redis.call('keys', ARGV[1])
        for i = 1, table.getn(keys) do
            redis.call('del', keys[i])
        end
        """
        pattern_delete = r.register_script(pattern_delete_lua)
        pattern_delete(keys=[''],
                       args=['%s:*' % settings.CLIENT_CONFIG_REDIS_PREFIX],
                       client=pipe)

        for t in config_data:
            logger.debug(t)
            #
            # client = {}
            # for k, v in t.iteritems():
            #     if k != 'endpoints':
            #         client[k] = v
            pipe.set(
                '%s:%s' % (settings.CLIENT_CONFIG_REDIS_PREFIX, t['app_id']),
                json_dumps(t))

            # for s in t['endpoints']:
            #     pipe.set('%s:%s:%s:%s' % (settings.PROXY_CONFIG_REDIS_PREFIX, t['access_key'], s['name'], s['version']),
            #              json_dumps(s))
        # pipe.delete('config:*')

        # the EXECUTE call sends all buffered commands to the server, returning
        # a list of responses, one for each command.
        pipe.execute()
        success = True
    except Exception as e:
        msg = '同步配置数据到 Redis 出现异常'
        logger.error(e.message)
        logger.error(traceback.format_exc())

    return http_response_json({'success': success, 'msg': msg})
Exemple #20
0
def api_user_login(request):
    """
    用户登录
    :param request:
    :return:
    """
    logger.debug('api_user_login')
    msg, success = '', False
    if not SiteUser.has_admin():
        # 如果还没有创建管理员,就先创建管理员
        return http_response_json({'success': False, 'msg': '请先创建管理员'})
    else:
        post_data = json_loads(request.body)
        email = post_data.get('email', '')
        password = post_data.get('password', '')
        remember_me = post_data.get('remember_me', False)
        if remember_me:
            # 不使用datetime的原因是会涉及到时区的问题,太麻烦,未解决
            expiry = 3600 * 24 * settings.LOGIN_EXPIRY_DAY
            # N天后到期
        else:
            expiry = 0  # 关闭浏览器后到期

        user = authenticate(email=email, password=password)
        logger.debug(user)
        if user is not None:
            logger.debug('认证通过')
            # 认证通过
            login(request, user, expiry)
            # 跳转到登陆成功的页面
            logger.debug('跳转到主页')
            return http_response_json({
                'success': True,
                'msg': '',
                'redirect_uri': '/'
            })
        else:
            logger.debug('认证失败')
            response = {'success': False, 'msg': '登录失败,邮箱或密码不正确'}
            return http_response_json(response)
    def decorator(request, *args, **kwargs):
        if request.site_user.is_authenticated():
            return view(request, *args, **kwargs)
        else:
            logger.debug("跳转到登录页")

        # 如果是通过API调用的方法,则返回错误信息,而不是跳转到登录页面
        content_type = request.META.get("CONTENT_TYPE", "").lower()
        http_accept = request.META.get("HTTP_ACCEPT", "").lower()
        if content_type.startswith("application/json") or "application/json" in http_accept:
            return http_response_json({"success": False, "msg": "登录会话已超时,请刷新页面重新登录"})

        return HttpResponseRedirect("/accounts/login/")
Exemple #22
0
def api_update_account(request, user_id):
    """
    更新用户基本信息
    :param request:
    :param user_id:
    :return:
    """
    msg, success = '', False
    logger.debug('api_update_account')
    logger.debug(request.POST)
    post_data = json_loads(request.body)
    user = SiteUser.get_user(user_id)
    if user is None:
        return http_response_json({'success': success, 'msg': '用户不存在'})

    form = UserInfoEditForm(post_data, instance=user)
    if form.is_valid():
        logger.debug('is_valid')
        user.name = form.cleaned_data["name"]
        user.email = form.cleaned_data["email"]
        user.save()
        return http_response_json({'success': True, 'msg': ''})
    else:
        return http_response_json({'success': False, 'msg': ', '.join(form.error_msg)})
Exemple #23
0
def api_user_login(request):
    """
    用户登录
    :param request:
    :return:
    """
    logger.debug('api_user_login')
    msg, success = '', False
    if not SiteUser.has_admin():
        # 如果还没有创建管理员,就先创建管理员
        return http_response_json({'success': False, 'msg': '请先创建管理员'})
    else:
        post_data = json_loads(request.body)
        email = post_data.get('email', '')
        password = post_data.get('password', '')
        remember_me = post_data.get('remember_me', False)
        if remember_me:
            # 不使用datetime的原因是会涉及到时区的问题,太麻烦,未解决
            expiry = 3600 * 24 * settings.LOGIN_EXPIRY_DAY
            # N天后到期
        else:
            expiry = 0  # 关闭浏览器后到期

        user = authenticate(email=email, password=password)
        logger.debug(user)
        if user is not None:
            logger.debug('认证通过')
            # 认证通过
            login(request, user, expiry)
            # 跳转到登陆成功的页面
            logger.debug('跳转到主页')
            return http_response_json({'success': True, 'msg': '', 'redirect_uri': '/'})
        else:
            logger.debug('认证失败')
            response = {'success': False, 'msg': '登录失败,邮箱或密码不正确'}
            return http_response_json(response)
def get_access_detail(request):
    """
    获取访问日志的详情
    :param request:
    :return:
    """
    success, msg, data = False, '', []
    post_data = json_loads(request.body)
    data = AccessLog.get_detail(**post_data)
    if post_data.get('headers_id') is not None:
        return http_response_json({'success': True, 'msg': msg, 'data': data})
    else:
        if data and len(data) > ACCESS_LOG_DETAIL_MAX_BODY_LENGTH:
            data = data[:ACCESS_LOG_DETAIL_MAX_BODY_LENGTH]
        return HttpResponse(data)
Exemple #25
0
def api_create_account(request):
    """
    创建用户基本信息
    :param request:
    :return:
    """
    msg, success = '', False
    logger.debug('api_create_account')
    post_data = json_loads(request.body)
    logger.debug(post_data)
    form = UserInfoCreateForm(post_data)
    if form.is_valid():
        success, msg, user = form.save()  # 将数据保存到数据库中

        response = {'success': success, 'msg': msg}
        if success:
            response['item'] = user.to_json_dict()
        return http_response_json(response)
    else:
        logger.debug(form.error_msg)
        return http_response_json({
            'success': success,
            'msg': ', '.join(form.error_msg)
        })
Exemple #26
0
def get_access_detail(request):
    """
    获取访问日志的详情
    :param request:
    :return:
    """
    success, msg, data = False, '', []
    post_data = json_loads(request.body)
    data = AccessLog.get_detail(**post_data)
    if post_data.get('headers_id') is not None:
        return http_response_json({'success': True, 'msg': msg, 'data': data})
    else:
        if data and len(data) > ACCESS_LOG_DETAIL_MAX_BODY_LENGTH:
            data = data[:ACCESS_LOG_DETAIL_MAX_BODY_LENGTH]
        return HttpResponse(data)
Exemple #27
0
    def decorator(request, *args, **kwargs):
        if request.site_user.is_authenticated() and request.site_user.is_admin:
            return view(request, *args, **kwargs)
        else:
            # 如果是通过API调用的方法,则返回错误信息,而不是跳转到登录页面
            content_type = request.META.get('CONTENT_TYPE', '').lower()
            http_accept = request.META.get('HTTP_ACCEPT', '').lower()
            if content_type.startswith("application/json") \
                    or 'application/json' in http_accept:
                return http_response_json({
                    'success': False,
                    'msg': '登录会话已超时,请刷新页面重新登录'
                })

            return error_404(request)
Exemple #28
0
def import_config(request):
    """
    上传文件,导入配置
    """
    if request.FILES:
        success, msg, errors = False, '', []
        for _file in request.FILES:
            # 关闭了分块上传,上传上来的就是完整的
            # 只允许选择一份文件,处理完就break
            success, msg, errors = do_import_config(request.FILES[_file])
            break

        return http_response_json({'success': success, 'msg': msg, 'errors': errors})
    else:
        raise error_404(request)
def transfer_to_redis(request):
    """
    将配置数据同步到Redis中
    """
    success, msg = False, ''
    try:
        config_data = get_config_redis_json()
        logger.debug(config_data)
        r = redis.StrictRedis(host=settings.REDIS_HOST, port=settings.REDIS_PORT,
                              db=settings.REDIS_DB, password=settings.REDIS_PASSWORD)

        # 默认transaction=True
        pipe = r.pipeline(transaction=True)
        # 按模式匹配批量删除
        pattern_delete_lua = """
        local keys = redis.call('keys', ARGV[1])
        for i = 1, table.getn(keys) do
            redis.call('del', keys[i])
        end
        """
        pattern_delete = r.register_script(pattern_delete_lua)
        pattern_delete(keys=[''], args=['%s:*' % settings.CLIENT_CONFIG_REDIS_PREFIX], client=pipe)

        for t in config_data:
            logger.debug(t)
            #
            # client = {}
            # for k, v in t.iteritems():
            #     if k != 'endpoints':
            #         client[k] = v
            pipe.set('%s:%s' % (settings.CLIENT_CONFIG_REDIS_PREFIX, t['access_key']), json_dumps(t))

            # for s in t['endpoints']:
            #     pipe.set('%s:%s:%s:%s' % (settings.PROXY_CONFIG_REDIS_PREFIX, t['access_key'], s['name'], s['version']),
            #              json_dumps(s))
        # pipe.delete('config:*')

        # the EXECUTE call sends all buffered commands to the server, returning
        # a list of responses, one for each command.
        pipe.execute()
        success = True
    except Exception as e:
        msg = u'同步配置数据到 Redis 出现异常'
        logger.error(e.message)
        logger.error(traceback.format_exc())

    return http_response_json({'success': success, 'msg': msg})
Exemple #30
0
    def decorator(request, *args, **kwargs):
        if request.site_user.is_authenticated():
            return view(request, *args, **kwargs)
        else:
            logger.debug('跳转到登录页')

        # 如果是通过API调用的方法,则返回错误信息,而不是跳转到登录页面
        content_type = request.META.get('CONTENT_TYPE', '').lower()
        http_accept = request.META.get('HTTP_ACCEPT', '').lower()
        if content_type.startswith("application/json") \
                or 'application/json' in http_accept:
            return http_response_json({
                'success': False,
                'msg': '登录会话已超时,请刷新页面重新登录'
            })

        return HttpResponseRedirect('/accounts/login/')
Exemple #31
0
def reset_password_request(request):
    """
    通过邮箱申请重置密码
    :param request:
    :return:
    """
    msg, success = '', False
    logger.debug('api_reset_password')
    post_data = json_loads(request.body)
    form = PasswordResetForm(post_data)
    if form.is_valid():
        logger.debug('form is valid')
        form.save()
        success = True
    else:
        errors = form.errors.values()
        msg = [t2 for t1 in errors for t2 in t1]
    return http_response_json({'success': success, 'msg': msg})
def get_options(request):
    """
    获取 client, endpoint, client_endpoint select 选项
    """
    success, msg, data = False, '', []
    clients = Client.objects.all().values('id', 'name')
    clients = [t for t in clients]
    endpoints = Endpoint.objects.all().values('id', 'unique_name')
    endpoints = [{
        'id': t['id'],
        'unique_name': t['unique_name'],
    } for t in endpoints]
    client_endpoints = ClientEndpoint.objects.all().values(
        'id', 'client_id', 'endpoint_id')
    client_dict = {}
    for t in clients:
        client_dict[t['id']] = t['name']

    endpoint_dict = {}
    for t in endpoints:
        endpoint_dict[t['id']] = t['unique_name']

    new_client_endpoints = []
    for t in client_endpoints:
        new_client_endpoints.append({
            'id':
            t['id'],
            'name':
            '%s / %s' % (client_dict.get(
                t['client_id'], ''), endpoint_dict.get(t['endpoint_id'], '')),
            'client_id':
            t['client_id'],
            'endpoint_id':
            t['endpoint_id']
        })

    data = {
        'clients': clients,
        'endpoints': endpoints,
        'client_endpoints': new_client_endpoints
    }
    success = True
    logger.debug(data)
    return http_response_json({'success': success, 'msg': msg, 'data': data})
def get_options(request):
    """
    获取 client, endpoint, client_endpoint select 选项
    """
    success, msg, data = False, '', []
    clients = Client.objects.all().values('id', 'name')
    clients = [t for t in clients]
    endpoints = Endpoint.objects.all().values('id', 'unique_name')
    endpoints = [
        {
            'id': t['id'],
            'unique_name': t['unique_name'],
        } for t in endpoints
        ]
    client_endpoints = ClientEndpoint.objects.all().values(
        'id', 'client_id', 'endpoint_id')
    client_dict = {}
    for t in clients:
        client_dict[t['id']] = t['name']

    endpoint_dict = {}
    for t in endpoints:
        endpoint_dict[t['id']] = t['unique_name']

    new_client_endpoints = []
    for t in client_endpoints:
        new_client_endpoints.append({
            'id': t['id'],
            'name': '%s / %s' % (
                client_dict.get(t['client_id'], ''),
                endpoint_dict.get(t['endpoint_id'], '')
            ),
            'client_id': t['client_id'],
            'endpoint_id': t['endpoint_id']
        })

    data = {
        'clients': clients,
        'endpoints': endpoints,
        'client_endpoints': new_client_endpoints
    }
    success = True
    logger.debug(data)
    return http_response_json({'success': success, 'msg': msg, 'data': data})
Exemple #34
0
def api_delete_account(request):
    """
    删除用户
    :param request:
    :return:
    """
    msg, success = '', False
    logger.debug('api_delete_account')
    post_data = json_loads(request.body)
    user_id = post_data.get('user_id', None)
    if user_id:
        try:
            if SiteUser.delete_user(user_id):
                success = True
        except Exception as e:
            logger.debug(e)
            msg = '删除用户出现异常'

    return http_response_json({'success': success, 'msg': msg})
Exemple #35
0
def api_delete_account(request):
    """
    删除用户
    :param request:
    :return:
    """
    msg, success = '', False
    logger.debug('api_delete_account')
    post_data = json_loads(request.body)
    user_id = post_data.get('user_id', None)
    if user_id:
        try:
            if SiteUser.delete_user(user_id):
                success = True
        except Exception as e:
            logger.debug(e)
            msg = '删除用户出现异常'

    return http_response_json({'success': success, 'msg': msg})
Exemple #36
0
def get_access_log(request):
    """
    获取访问日志
    :param request:
    :return:
    """
    success, msg, data = False, '', []
    post_data = json_loads(request.body)
    if post_data['begin_time'] != '' and post_data['begin_time'] is not None:
        post_data['begin_time'] = datetime.strptime(post_data['begin_time'],
                                                    '%Y-%m-%d %H:%M')

    if post_data['end_time'] != '' and post_data['end_time'] is not None:
        post_data['end_time'] = datetime.strptime(post_data['end_time'],
                                                  '%Y-%m-%d %H:%M')

    entries, total_num = AccessLog.query(**post_data)
    data = {'entries': entries, 'total_num': total_num}
    # logger.debug(data)
    return http_response_json({'success': True, 'msg': msg, 'data': data})
Exemple #37
0
def api_update_password(request):
    """
    更新密码
    :param request:
    :return:
    """
    msg, success = '', False
    logger.debug('api_update_password')
    post_data = json_loads(request.body)
    if hasattr(request, 'site_user'):
        user = request.site_user
        form = PasswordChangeForm(user, post_data)
        if form.is_valid():
            form.save()
            success = True
        else:
            msg = ', '.join(form.error_msg)
    else:
        msg = '用户不存在'

    return http_response_json({'success': success, 'msg': msg})
def get_total_count(request):
    """
    获取累计访问统计
    :param request:
    :return:
    """
    success, msg, data = False, '', []
    # post_data = json_loads(request.body)
    today = datetime.today()
    yesterday = datetime.today() - timedelta(days=1)
    yesterday_2 = datetime.today() - timedelta(days=2)
    total_count = AccessTotalDayCounter.objects().aggregate_sum('count')
    today_count = AccessTotalDayCounter.objects(date__lte=today, date__gt=yesterday).aggregate_sum('count')
    yesterday_count = AccessTotalDayCounter.objects(date__lte=yesterday, date__gt=yesterday_2).aggregate_sum('count')

    data = {
        'total_count': total_count,
        'today_count': today_count,
        'yesterday_count': yesterday_count
    }
    return http_response_json({'success': True, 'msg': msg, 'data': data})
def get_access_log(request):
    """
    获取访问日志
    :param request:
    :return:
    """
    success, msg, data = False, '', []
    post_data = json_loads(request.body)
    if post_data['begin_time'] != '' and post_data['begin_time'] is not None:
        post_data['begin_time'] = datetime.strptime(post_data['begin_time'], '%Y-%m-%d %H:%M')

    if post_data['end_time'] != '' and post_data['end_time'] is not None:
        post_data['end_time'] = datetime.strptime(post_data['end_time'], '%Y-%m-%d %H:%M')

    entries, total_num = AccessLog.query(**post_data)
    data = {
        'entries': entries,
        'total_num': total_num
    }
    # logger.debug(data)
    return http_response_json({'success': True, 'msg': msg, 'data': data})
Exemple #40
0
def api_update_password(request):
    """
    更新密码
    :param request:
    :return:
    """
    msg, success = '', False
    logger.debug('api_update_password')
    post_data = json_loads(request.body)
    if hasattr(request, 'site_user'):
        user = request.site_user
        form = PasswordChangeForm(user, post_data)
        if form.is_valid():
            form.save()
            success = True
        else:
            msg = ', '.join(form.error_msg)
    else:
        msg = '用户不存在'

    return http_response_json({'success': success, 'msg': msg})
Exemple #41
0
def api_create_admin(request):
    """
    网站刚开始运行时,没有管理员,需要创建一个
    :param request:
    :return:
    """
    logger.debug('api_create_admin')
    msg, success, data = '', False, []
    if SiteUser.has_admin():
        return error_404(request)
    else:
        logger.debug(request.body)
        post_data = json_loads(request.body)
        form = UserCreationForm(post_data)
        if form.is_valid():
            form.save(is_admin=True)  # 将数据保存到数据库中
            success = True

        response = {'success': success, 'msg': msg, 'data': data}
        logger.debug(data)
        return http_response_json(response)
Exemple #42
0
def api_create_admin(request):
    """
    网站刚开始运行时,没有管理员,需要创建一个
    :param request:
    :return:
    """
    logger.debug('api_create_admin')
    msg, success, data = '', False, []
    if SiteUser.has_admin():
        return error_404(request)
    else:
        logger.debug(request.body)
        post_data = json_loads(request.body)
        form = UserCreationForm(post_data)
        if form.is_valid():
            form.save(is_admin=True)  # 将数据保存到数据库中
            success = True

        response = {'success': success, 'msg': msg, 'data': data}
        logger.debug(data)
        return http_response_json(response)
Exemple #43
0
def create_model_data(request, model_name):
    """
    创建或更新数据
    :param request:
    :param model_name:
    :return:
    """
    logger.debug('run api_create_model_data')

    post_data = json_loads(request.body)
    logger.debug(post_data)
    if model_name == 'client':
        form = ClientForm(post_data['data'])
    elif model_name == 'endpoint':
        form = EndpointForm(post_data['data'])
    elif model_name == 'client_endpoint':
        form = None
    else:
        form = None

    return_data = do_create_or_update_model_data(
        request, model_name, False, post_data, form)
    return http_response_json(return_data)
def get_count_by_query(request):
    """
    获取访问统计
    :param request:
    :return:
    """
    success, msg, data = False, '', []
    now = datetime.now()
    post_data = json_loads(request.body)
    logger.debug(post_data)
    if post_data['begin_time'] != '' and post_data['begin_time'] is not None:
        post_data['begin_time'] = datetime.strptime(post_data['begin_time'], '%Y-%m-%d %H:%M')
    else:
        post_data['begin_time'] = None

    if post_data['end_time'] != '' and post_data['end_time'] is not None:
        post_data['end_time'] = datetime.strptime(post_data['end_time'], '%Y-%m-%d %H:%M')
    else:
        post_data['end_time'] = None

    by_search = post_data.get('by_search', False)
    time_frame = post_data.get('time_frame', None)
    if not by_search:
        post_data['require_total'] = True

    if post_data['begin_time'] is None:
        if post_data['end_time'] is None:
            base_time = datetime.now()
        else:
            base_time = post_data['end_time']
    else:
        base_time = None

    if base_time is not None and time_frame is not None:
        if time_frame == '24h':
            post_data['begin_time'] = datetime(base_time.year, base_time.month, base_time.day, base_time.hour) \
                                      - timedelta(hours=23)
            post_data['x_data_use_hour'] = True
        elif time_frame == '7d':
            post_data['begin_time'] = datetime(base_time.year, base_time.month, base_time.day) \
                                      - timedelta(days=6)
        elif time_frame == '30d':
            post_data['begin_time'] = datetime(base_time.year, base_time.month, base_time.day) \
                                      - timedelta(days=29)
        elif time_frame == '1d':
            post_data['begin_time'] = datetime(base_time.year, base_time.month, base_time.day)
            post_data['end_time'] = post_data['begin_time'] + timedelta(days=1) - timedelta(seconds=1)
            post_data['x_data_use_hour'] = True
        elif time_frame == '1m':
            post_data['begin_time'] = datetime(base_time.year, base_time.month, 1)
            post_data['end_time'] = post_data['begin_time'] + relativedelta(months=1) - timedelta(seconds=1)

    if post_data['begin_time'] is None:
        post_data['begin_time'] = datetime(now.year, now.month, now.day, now.hour) \
                                  - timedelta(hours=24)

    if post_data['end_time'] is None:
        end_time = datetime.now()
    else:
        end_time = post_data['end_time']

    if post_data['begin_time'] + timedelta(hours=36) > end_time:
        post_data['time_unit'] = 'hour'
    else:
        post_data['time_unit'] = 'day'

    x_data, y_data = query_access_count(**post_data)
    data = {
        'x_data': x_data,
        'y_data': y_data
    }

    return http_response_json({'success': True, 'msg': msg, 'data': data})
Exemple #45
0
    """
    success, msg, data = False, '', []
    # post_data = json_loads(request.body)
    today = datetime.today()
    yesterday = datetime.today() - timedelta(days=1)
    yesterday_2 = datetime.today() - timedelta(days=2)
    total_count = AccessTotalDayCounter.objects().sum('count')
    today_count = AccessTotalDayCounter.objects(date__lte=today, date__gt=yesterday).sum('count')
    yesterday_count = AccessTotalDayCounter.objects(date__lte=yesterday, date__gt=yesterday_2).sum('count')
``
    data = {
        'total_count': total_count,
        'today_count': today_count,
        'yesterday_count': yesterday_count
    }
    return http_response_json({'success': True, 'msg': msg, 'data': data})


def parse_ratio_post_data(post_data):
    now = datetime.now()
    logger.debug(post_data)
    if post_data['begin_time'] != '' and post_data['begin_time'] is not None:
        post_data['begin_time'] = datetime.strptime(post_data['begin_time'], '%Y-%m-%d')
    else:
        post_data['begin_time'] = None

    if post_data['end_time'] != '' and post_data['end_time'] is not None:
        post_data['end_time'] = datetime.strptime(post_data['end_time'], '%Y-%m-%d')
    else:
        post_data['end_time'] = None
Exemple #46
0
def get_count_by_query(request):
    """
    获取访问统计
    :param request:
    :return:
    """
    success, msg, data = False, '', []
    now = datetime.now()
    post_data = json_loads(request.body)
    logger.debug(post_data)
    if post_data['begin_time'] != '' and post_data['begin_time'] is not None:
        post_data['begin_time'] = datetime.strptime(post_data['begin_time'],
                                                    '%Y-%m-%d %H:%M')
    else:
        post_data['begin_time'] = None

    if post_data['end_time'] != '' and post_data['end_time'] is not None:
        post_data['end_time'] = datetime.strptime(post_data['end_time'],
                                                  '%Y-%m-%d %H:%M')
    else:
        post_data['end_time'] = None

    by_search = post_data.get('by_search', False)
    time_frame = post_data.get('time_frame', None)
    if not by_search:
        post_data['require_total'] = True

    if post_data['begin_time'] is None:
        if post_data['end_time'] is None:
            base_time = datetime.now()
        else:
            base_time = post_data['end_time']
    else:
        base_time = None

    if base_time is not None and time_frame is not None:
        if time_frame == '24h':
            post_data['begin_time'] = datetime(base_time.year, base_time.month, base_time.day, base_time.hour) \
                                      - timedelta(hours=23)
            post_data['x_data_use_hour'] = True
        elif time_frame == '7d':
            post_data['begin_time'] = datetime(base_time.year, base_time.month, base_time.day) \
                                      - timedelta(days=6)
        elif time_frame == '30d':
            post_data['begin_time'] = datetime(base_time.year, base_time.month, base_time.day) \
                                      - timedelta(days=29)
        elif time_frame == '1d':
            post_data['begin_time'] = datetime(base_time.year, base_time.month,
                                               base_time.day)
            post_data['end_time'] = post_data['begin_time'] + timedelta(
                days=1) - timedelta(seconds=1)
            post_data['x_data_use_hour'] = True
        elif time_frame == '1m':
            post_data['begin_time'] = datetime(base_time.year, base_time.month,
                                               1)
            post_data['end_time'] = post_data['begin_time'] + relativedelta(
                months=1) - timedelta(seconds=1)

    if post_data['begin_time'] is None:
        post_data['begin_time'] = datetime(now.year, now.month, now.day, now.hour) \
                                  - timedelta(hours=24)

    if post_data['end_time'] is None:
        end_time = datetime.now()
    else:
        end_time = post_data['end_time']

    if post_data['begin_time'] + timedelta(hours=36) > end_time:
        post_data['time_unit'] = 'hour'
    else:
        post_data['time_unit'] = 'day'

    x_data, y_data = query_access_count(**post_data)
    data = {'x_data': x_data, 'y_data': y_data}

    return http_response_json({'success': True, 'msg': msg, 'data': data})