• 老广's avatar
    Config (#3502) · 4944ac8e
    老广 authored
    * [Update] 修改config
    
    * [Update] 移动存储设置到到terminal中
    
    * [Update] 修改permission 查看
    
    * [Update] pre merge
    
    * [Update] 录像存储
    
    * [Update] 命令存储
    
    * [Update] 添加存储测试可连接性
    
    * [Update] 修改 meta 值的 key 为大写
    
    * [Update] 修改 Terminal 相关 Storage 配置
    
    * [Update] 删除之前获取录像/命令存储的代码
    
    * [Update] 修改导入失败
    
    * [Update] 迁移文件添加default存储
    
    * [Update] 删除之前代码,添加help_text信息
    
    * [Update] 删除之前代码
    
    * [Update] 删除之前代码
    
    * [Update] 抽象命令/录像存储 APIView
    
    * [Update] 抽象命令/录像存储 APIView 1
    
    * [Update] 抽象命令/录像存储 DictField
    
    * [Update] 抽象命令/录像存储列表页面
    
    * [Update] 修复CustomDictField的bug
    
    * [Update] RemoteApp 页面添加 hidden
    
    * [Update] 用户页面添加用户关联授权
    
    * [Update] 修改存储测试可连接性 target
    
    * [Update] 修改配置
    
    * [Update] 修改存储前端 Form 渲染逻辑
    
    * [Update] 修改存储细节
    
    * [Update] 统一存储类型到 const 文件
    
    * [Update] 修改迁移文件及Model,创建默认存储
    
    * [Update] 修改迁移文件及Model初始化默认数据
    
    * [Update] 修改迁移文件
    
    * [Update] 修改迁移文件
    
    * [Update] 修改迁移文件
    
    * [Update] 修改迁移文件
    
    * [Update] 修改迁移文件
    
    * [Update] 修改迁移文件
    
    * [Update] 修改迁移文件
    
    * [Update] 限制删除默认存储配置,只允许创建扩展的存储类型
    
    * [Update] 修改ip字段长度
    
    * [Update] 修改ip字段长度
    
    * [Update] 修改一些css
    
    * [Update] 修改关联
    
    * [Update] 添加操作日志定时清理
    
    * [Update] 修改记录syslog的instance encoder
    
    * [Update] 忽略登录产生的操作日志
    
    * [Update] 限制更新存储时不覆盖原有AK SK 等字段
    
    * [Update] 修改迁移文件添加comment字段
    
    * [Update] 修改迁移文件
    
    * [Update] 添加 comment 字段
    
    * [Update] 修改默认存储no -> null
    
    * [Update] 修改细节
    
    * [Update] 更新翻译(存储配置
    
    * [Update] 修改定时任务注册,修改系统用户资产、节点关系api
    
    * [Update] 添加监控磁盘任务
    
    * [Update] 修改session
    
    * [Update] 拆分serializer
    
    * [Update] 还原setting原来的manager
    4944ac8e
metadata.py 4.06 KB
# -*- coding: utf-8 -*-
#
from __future__ import unicode_literals

from collections import OrderedDict

from django.core.exceptions import PermissionDenied
from django.http import Http404
from django.utils.encoding import force_text

from rest_framework.metadata import SimpleMetadata
from rest_framework import exceptions, serializers
from rest_framework.request import clone_request


class SimpleMetadataWithFilters(SimpleMetadata):
    """Override SimpleMetadata, adding info about filters"""

    methods = {"PUT", "POST", "GET"}
    attrs = [
        'read_only', 'label', 'help_text',
        'min_length', 'max_length',
        'min_value', 'max_value', "write_only"
    ]

    def determine_actions(self, request, view):
        """
        For generic class based views we return information about
        the fields that are accepted for 'PUT' and 'POST' methods.
        """
        actions = {}
        for method in self.methods & set(view.allowed_methods):
            view.request = clone_request(request, method)
            try:
                # Test global permissions
                if hasattr(view, 'check_permissions'):
                    view.check_permissions(view.request)
                # Test object permissions
                if method == 'PUT' and hasattr(view, 'get_object'):
                    view.get_object()
            except (exceptions.APIException, PermissionDenied, Http404):
                pass
            else:
                # If user has appropriate permissions for the view, include
                # appropriate metadata about the fields that should be supplied.
                serializer = view.get_serializer()
                actions[method] = self.get_serializer_info(serializer)
            finally:
                view.request = request
        return actions

    def get_field_info(self, field):
        """
        Given an instance of a serializer field, return a dictionary
        of metadata about it.
        """
        field_info = OrderedDict()
        field_info['type'] = self.label_lookup[field]
        field_info['required'] = getattr(field, 'required', False)

        for attr in self.attrs:
            value = getattr(field, attr, None)
            if value is not None and value != '':
                field_info[attr] = force_text(value, strings_only=True)

        if getattr(field, 'child', None):
            field_info['child'] = self.get_field_info(field.child)
        elif getattr(field, 'fields', None):
            field_info['children'] = self.get_serializer_info(field)

        if (not field_info.get('read_only') and
            not isinstance(field, (serializers.RelatedField, serializers.ManyRelatedField)) and
                hasattr(field, 'choices')):
            field_info['choices'] = [
                {
                    'value': choice_value,
                    'display_name': force_text(choice_name, strings_only=True)
                }
                for choice_value, choice_name in field.choices.items()
            ]

        return field_info

    def get_filters_fields(self, request, view):
        fields = []
        if hasattr(view, 'get_filter_fields'):
            fields = view.get_filter_fields(request)
        elif hasattr(view, 'filter_fields'):
            fields = view.filter_fields
        return fields

    def get_ordering_fields(self, request, view):
        fields = []
        if hasattr(view, 'get_ordering_fields'):
            fields = view.get_filter_fields(request)
        elif hasattr(view, 'ordering_fields'):
            fields = view.filter_fields
        return fields

    def determine_metadata(self, request, view):
        metadata = super(SimpleMetadataWithFilters, self).determine_metadata(request, view)
        filter_fields = self.get_filters_fields(request, view)
        order_fields = self.get_ordering_fields(request, view)

        meta_get = metadata.get("actions", {}).get("GET", {})
        for k, v in meta_get.items():
            if k in filter_fields:
                v["filter"] = True
            if k in order_fields:
                v["order"] = True
        return metadata