class BaseMenuTable(tables.Table): check_all = columns.TemplateColumn(""" {% load reverse_tags %} <input class="menu-item" data-id="{{ record|mongo_id }}" type="checkbox" /> """, orderable=False, verbose_name="") value = columns.Column(verbose_name=_("Value")) event_code = columns.Column(verbose_name=_("Project")) menu_type = columns.Column(verbose_name=_("ListType")) menu_status = columns.Column(verbose_name=_("Status")) menu_desc = TruncateColumn(verbose_name=_("Note")) end_time = columns.DateTimeColumn(format="Y-m-d H:i:s", verbose_name=_("EndTime")) create_time = columns.DateTimeColumn(format="Y-m-d H:i:s", verbose_name=_("UpdateTime")) creator = columns.Column(verbose_name=_("Operator")) def __init__(self, *args, **kwargs): super(BaseMenuTable, self).__init__(*args, **kwargs) self.deletable = True @staticmethod def render_menu_type(value): return MENU_TYPE_NAME_MAP.get(value, value) @staticmethod def render_event_code(value): db = get_mongo_client() res = db.menu_event.find_one({'event_code': value}) if not res: return value return res.get('event_name', value)
class BaseMenuTable(tables.Table): check_all = columns.TemplateColumn(""" {% load reverse_tags %} <input class="menu-item" data-id="{{ record|mongo_id }}" type="checkbox" \> """, orderable=False, verbose_name="") value = columns.Column(verbose_name=_(u"值")) event_code = columns.Column(verbose_name=_(u"项目")) menu_type = columns.Column(verbose_name=_(u"名单类型")) menu_status = columns.Column(verbose_name=_(u"状态")) menu_desc = TruncateColumn(verbose_name=_(u"备注")) end_time = columns.DateTimeColumn(format="Y-m-d H:i:s", verbose_name=_(u"结束时间")) create_time = columns.DateTimeColumn(format="Y-m-d H:i:s", verbose_name=_(u"更新时间")) creator = columns.Column(verbose_name=_(u"操作人")) def __init__(self, *args, **kwargs): super(BaseMenuTable, self).__init__(*args, **kwargs) self.deletable = True def render_menu_type(self, value): return MENU_TYPE_NAME_MAP.get(value, value) def render_event_code(self, value): db = get_mongo_client() res = db.menu_event.find_one({'event_code': value}) if not res: return value return res.get('event_name', value)
class RulesTable(tables.Table): id = columns.Column(verbose_name=_(u"规则ID"), orderable=False) title = columns.Column(verbose_name=_(u"规则名称"), orderable=False) status = columns.Column(verbose_name=_(u"状态"), orderable=False) update_time = columns.Column(verbose_name=_(u"更新时间"), orderable=False) user = columns.Column(verbose_name=_(u"更新人"), orderable=False) action = columns.TemplateColumn(""" <span class="action-button"> <a class="rules-on" data-uri="{% url 'rule:change' %}" data-id="{{ record.uuid }}" data-title="{{ record.title }}" data-status="{{ record.status }}">启用</a> </span> <span class="action-button"> <a class="rules-off" data-uri="{% url 'rule:change' %}" data-id="{{ record.uuid }}" data-title="{{ record.title }}" data-status="{{ record.status }}">停用</a> </span> <span class="action-button"> <a class="rules-detail" data-uri="{% url 'rule:detail' %}" data-id="{{ record.uuid }}" >详情</a> </span> <span class="action-button"> <a class="rules-edit" data-uri="{% url 'rule:edit' %}" data-id="{{ record.uuid }}" >编辑</a> </span> """, orderable=False, verbose_name=_(u"操作")) class Meta: attrs = {'class': 'table table-striped table-hover'} def render_update_time(self, value): return datetime.fromtimestamp(int(value)) def render_status(self, value): return u"启用" if value == 'on' else u"停用"
class UserPermissionTable(tables.Table): fullname = columns.Column(verbose_name=_('姓名'), orderable=False) pk = columns.Column(verbose_name=_('email'), orderable=False) is_superuser = columns.BooleanColumn(null=False, verbose_name=_('超级管理员'), orderable=False) entity_id = columns.Column(verbose_name=_('初次登录时间')) remark = columns.Column(verbose_name=_('备注'), orderable=False) @classmethod def render_fullname(cls, record): url = reverse('permissions:user_update') html = '<a href="{}?entity_id={}">{}</a>'.format(url, record.get( 'entity_id', ''), record.get('fullname', record['pk'])) return format_html(html) @classmethod def render_entity_id(cls, value): create_time = ObjectId(value).generation_time # utc to local time create_time += datetime.timedelta(hours=8) return create_time.strftime('%Y-%m-%d %H:%M:%S') class Meta: attrs = {'class': 'table table-striped table-hover'}
class ConfigSourceTable(tables.Table): name_key = columns.Column(verbose_name=_(u"配置名称key"), orderable=False) name_show = columns.Column(verbose_name=_(u"配置名称"), orderable=False) content = columns.Column(verbose_name=_(u"配置内容"), orderable=False) action = columns.TemplateColumn(""" {% load reverse_tags %} <a class="source-destroy" data-uri="{% url 'config:source_destroy' %}" data-name_key="{{ record.name_key }}">删除 </a> """, orderable=False, verbose_name=_(u"操作")) class Meta: attrs = {'class': 'table table-striped table-hover'}
class AbstractJobTable(tables.Table): next_time = columns.Column( orderable=False, verbose_name=_("Next run")) def render_next_time(self, value, record): return utils.get_next_time(record)
class SelectFileTable(FileTable): selection = columns.Column(verbose_name="Selection", empty_values=()) def render_selection(self, value, record): return format_html( '<input type="radio" name="entry_path" value="{0}" required id="id_entry_path">', record['file_table_file'])
class ScheduleTable(tables.Table): course_name = columns.Column(verbose_name="Course") actions = columns.TemplateColumn(template_name="schedules/buttons.html", orderable=False) class Meta: model = Schedule template_name = 'django_tables2/bootstrap.html' fields = ('id', 'course_name', 'location', 'start_date', 'end_date', 'time', 'hours', 'instructor', 'actions')
class EventTable(tables.Table): event_name = columns.Column(verbose_name=_(u"项目名称")) action = columns.TemplateColumn(""" <a class="event-destroy" data-uri="{% url 'menus:event_destroy' %}" data-id="{{ record.event_code }}">删除</a> """, orderable=False, verbose_name=_(u"操作")) class Meta: attrs = {'class': 'table table-striped table-hover'}
class HitLogDetailTable(tables.Table): time = columns.Column(verbose_name=_(u'触碰时间')) rule_id = columns.Column(verbose_name=_(u'规则名称'), orderable=False) group_name = columns.Column(verbose_name=_(u'策略原子组名称'), orderable=False) user_id = columns.Column(verbose_name=_(u'用户ID'), orderable=False) control = columns.Column(verbose_name=_(u'管控原子'), orderable=False) req_body = columns.Column(verbose_name=_(u'请求体'), orderable=False) hit_number = columns.Column(verbose_name=_(u'是否首次命中'), orderable=False) class Meta: attrs = {'class': 'table table-striped table-hover'} def before_render(self, request): self.rules = Rules(load_all=True) def render_time(self, value): return value.strftime('%Y-%m-%d %H:%M:%S') def render_rule_id(self, value): return self.rules.get_rule_name(str(value)) def render_control(self, value): return CONTROL_MAP.get(value, value) def render_hit_number(self, value): return u'-' if value == 0 else u'是' if value == 1 else u'否' def render_passed_users(self, value): return u'-' if value == 0 else value
class DockerImagesTable(dt.Table): id = columns.Column() tags = dt.Column() comment = dt.Column() def render_id(self, value): return format_html( '<input type="radio" name="environment_image" value="{0}" required id="id_environment_image_0">', value)
class UriGroupPermissionTable(tables.Table): desc = columns.Column(verbose_name=_('uri组名称')) pk = columns.Column(verbose_name=_('唯一标识')) uris = columns.Column(verbose_name=_('uri列表')) entity_id = columns.Column(verbose_name=_('创建时间')) action = columns.TemplateColumn(str('x'), orderable=False, verbose_name=_('操作')) @classmethod def render_action(cls, record): url = reverse('permissions:uri_group_update') html = ( ''' <a href="{1}?entity_id={0}" style="margin-right: 10px">变更权限 </a> <a data-entity_id={0} class="perms-uri-group-delete">删除 </a> ''' ).format(record.get('entity_id', ''), url) return format_html(html) @classmethod def render_desc(cls, value, record): url = reverse('permissions:uri_group_update') html = '<a href="{}?entity_id={}">{}</a>'.format( url, record.get('entity_id', ''), value, ) return format_html(html) @classmethod def render_uris(cls, record): html = ( '<pre>{}</pre>'.format('\n'.join(record['uris'])) ) return format_html(html) @classmethod def render_entity_id(cls, value): return UserPermissionTable.render_entity_id(value) class Meta: attrs = {'class': 'table table-hover'}
class MenuStrategyTable(tables.Table): strategy_name = columns.Column(verbose_name=_(u"策略名称"), orderable=False) strategy_desc = columns.Column(verbose_name=_(u"策略描述"), orderable=False) dimension = columns.Column(verbose_name=_(u"维度"), orderable=False) menu_op = columns.Column(verbose_name=_(u"操作码"), orderable=False) event = columns.Column(verbose_name=_(u"项目"), orderable=False) menu_type = columns.Column(verbose_name=_(u"名单类型"), orderable=False) action = columns.TemplateColumn(""" <a class="strategy-destroy" data-uri="{% url 'strategy:menu_strategy_destroy' %}" data-id="{{ record.uuid }}">删除</a> """, orderable=False, verbose_name=_(u"操作")) class Meta: attrs = {'class': 'table table-striped table-hover'} def render_menu_type(self, value): return TYPE_MAP_MENU.get(value, value) def render_menu_op(self, value): return OP_MAP_MENU.get(value, value) def render_dimension(self, value): return DIM_MAP_MENU.get(value, value) def render_event(self, value): db = get_mongo_client() res = db['menu_event'].find_one({'event_code': value}) or {} return res.get('event_name', value)
class FreqStrategyTable(tables.Table): strategy_name = columns.Column(verbose_name=_(u"策略名称"), orderable=False) strategy_desc = columns.Column(verbose_name=_(u"策略描述"), orderable=False) strategy_source = columns.Column(verbose_name=_(u"数据源"), orderable=False) strategy_body = columns.Column(verbose_name=_(u"主体名称"), orderable=False) strategy_time = columns.Column(verbose_name=_(u"时段(单位:秒)"), orderable=False) strategy_limit = columns.Column(verbose_name=_(u"最大值"), orderable=False) action = columns.TemplateColumn(""" <a class="strategy-destroy" data-uri="{% url 'strategy:freq_strategy_destroy' %}" data-id="{{ record.uuid }}">删除</a> """, orderable=False, verbose_name=_(u"操作")) class Meta: attrs = {'class': 'table table-striped table-hover'} def render_strategy_source(self, value): client = get_redis_client() data = client.hget("CONFIG_SOURCE_MAP", value) if data: try: name = json.loads(data).get('name_show', '') except ValueError: return value if name: return u"{0}({1})".format(name, value) return value
class BoolStrategyTable(tables.Table): strategy_name = columns.Column(verbose_name=_(u"策略名称"), orderable=False) strategy_desc = columns.Column(verbose_name=_(u"策略描述"), orderable=False) strategy_var = columns.Column(verbose_name=_(u"内置变量"), orderable=False) strategy_op = columns.Column(verbose_name=_(u"操作码"), orderable=False) strategy_func = columns.Column(verbose_name=_(u"内置函数"), orderable=False) strategy_threshold = columns.Column(verbose_name=_(u"阈值"), orderable=False) action = columns.TemplateColumn(""" <a class="strategy-destroy" data-uri="{% url 'strategy:bool_strategy_destroy' %}" data-id="{{ record.uuid }}">删除</a> """, orderable=False, verbose_name=_(u"操作")) class Meta: attrs = {'class': 'table table-striped table-hover'} def render_strategy_var(self, value): name = VAR_MAP.get(value, "") if name: return u"{0}({1})".format(name, value) return value def render_strategy_op(self, value): name = OP_MAP.get(value, "") if name: return u"{0}({1})".format(name, value) return value def render_strategy_func(self, value): name = FUNC_MAP.get(value, "") if name: return u"{0}({1})".format(name, value) return value
class UserStrategyTable(tables.Table): strategy_name = columns.Column(verbose_name=_("PolicyName"), orderable=False) strategy_desc = columns.Column(verbose_name=_("PolicyDescription"), orderable=False) strategy_source = columns.Column(verbose_name=_("DataSources"), orderable=False) strategy_body = columns.Column(verbose_name=_("BodyName"), orderable=False) strategy_day = columns.Column(verbose_name=_("Nature Day (In Individual)"), orderable=False) strategy_limit = columns.Column(verbose_name=_("Maximum"), orderable=False) action = columns.TemplateColumn(""" <a class="strategy-destroy" data-uri="{% url 'strategy:user_strategy_destroy' %}" data-id="{{ record.uuid }}">delete</a> """, orderable=False, verbose_name=_("Confirm")) class Meta: attrs = {'class': 'table table-striped table-hover'} @staticmethod def render_strategy_source(value): client = get_redis_client() data = client.hget("CONFIG_SOURCE_MAP", value) if data: try: name = json.loads(data).get('name_show', '') except ValueError: return value if name: return "{0}({1})".format(name, value) return value
class GroupPermissionTable(tables.Table): desc = columns.Column(verbose_name=_('Sub_Group_Name')) pk = columns.Column(verbose_name=_('Unique_Identification')) entity_id = columns.Column(verbose_name=_('Creation_Time')) action = columns.TemplateColumn(str('x'), orderable=False, verbose_name=_('Confirm')) @classmethod def render_action(cls, record): url = reverse('permissions:group_update') myca = _("Change Authority") mydel = _("delete") html = ( ''' <a href="{1}?entity_id={0}" style="margin-right: 10px">Change Authority </a> <a data-entity_id={0} class="perms-group-delete">delete </a> ''' ).format(record.get('entity_id', ''), url) return format_html(html) @classmethod def render_desc(cls, value, record): url = reverse('permissions:group_update') html = '<a href="{}?entity_id={}">{}</a>'.format( url, record.get('entity_id', ''), value, ) return format_html(html) @classmethod def render_entity_id(cls, value): return UserPermissionTable.render_entity_id(value) class Meta: attrs = {'class': 'table table-hover'}
class UserTable(django_tables2.Table): """User table to showcase django tables 2.""" export_formats = ('csv', 'json', 'latex', 'ods', 'tsv', 'xls', 'xlsx', 'yml') {%- raw %} username = columns.TemplateColumn( """<a href="{% url 'accounts:user-detail' username=value %}">{{value}}</a>""" ) {% endraw %} first_name_is_long = columns.Column( verbose_name='First name is long', accessor='username', orderable=False, exclude_from_export=True ) class Meta: model = User template_name = 'django_tables2/bootstrap.html' fields = ['username', 'email', 'first_name', 'last_name', 'first_name_is_long'] @staticmethod def render_first_name_is_long(value) -> str: """Checks if the user's name is longer than 10 characters and returns html.""" if len(value) > 10: uri = static('feather/alert-triangle.svg') {% raw %} element = f""" <div> <img src="{uri}" alt="warning"> </div> """ {%- endraw %} else: element = '' return format_html(element)
class HitLogDetailTable(tables.Table): time = columns.Column(verbose_name=_('Hit_time')) rule_id = columns.Column(verbose_name=_('RuleName'), orderable=False) group_name = columns.Column(verbose_name=_('PolicyGroupNameCall'), orderable=False) user_id = columns.Column(verbose_name=_('UserID'), orderable=False) control = columns.Column(verbose_name=_('Projectmanagement'), orderable=False) req_body = columns.Column(verbose_name=_('RequestBody'), orderable=False) hit_number = columns.Column( verbose_name=_('Whether to hit for the first time'), orderable=False) class Meta: attrs = {'class': 'table table-striped table-hover'} def __init__(self, *args, **kwargs): self.rules = Rules(load_all=True) def before_render(self, request): pass @staticmethod def render_time(value): return value.strftime('%Y-%m-%d %H:%M:%S') def render_rule_id(self, value): return self.rules.get_rule_name(str(value)) @staticmethod def render_control(value): return CONTROL_MAP.get(value, value) @staticmethod def render_hit_number(value): return '-' if value == 0 else _('is') if value == 1 else _('Whether') @staticmethod def render_passed_users(value): return '-' if value == 0 else value
class BoolStrategyTable(tables.Table): strategy_name = columns.Column(verbose_name=_("PolicyName"), orderable=False) strategy_desc = columns.Column(verbose_name=_("PolicyDescription"), orderable=False) strategy_var = columns.Column(verbose_name=_("Built_In_Variables"), orderable=False) strategy_op = columns.Column(verbose_name=_("ActionCode"), orderable=False) strategy_func = columns.Column(verbose_name=_("Built_In_Functions"), orderable=False) strategy_threshold = columns.Column(verbose_name=_("Thresholds"), orderable=False) action = columns.TemplateColumn(""" <a class="strategy-destroy" data-uri="{% url 'strategy:bool_strategy_destroy' %}" data-id="{{ record.uuid }}">delete</a> """, orderable=False, verbose_name=_("Confirm")) class Meta: attrs = {'class': 'table table-striped table-hover'} @staticmethod def render_strategy_var(value): name = VAR_MAP.get(value, "") if name: return "{0}({1})".format(name, value) return value @staticmethod def render_strategy_op(value): name = OP_MAP.get(value, "") if name: return "{0}({1})".format(name, value) return value @staticmethod def render_strategy_func(value): name = FUNC_MAP.get(value, "") if name: return "{0}({1})".format(name, value) return value
class MenuStrategyTable(tables.Table): strategy_name = columns.Column(verbose_name=_("PolicyName"), orderable=False) strategy_desc = columns.Column(verbose_name=_("PolicyDescription"), orderable=False) dimension = columns.Column(verbose_name=_("Dimensions"), orderable=False) menu_op = columns.Column(verbose_name=_("ActionCode"), orderable=False) event = columns.Column(verbose_name=_("Project"), orderable=False) menu_type = columns.Column(verbose_name=_("ListType"), orderable=False) action = columns.TemplateColumn(""" <a class="strategy-destroy" data-uri="{% url 'strategy:menu_strategy_destroy' %}" data-id="{{ record.uuid }}">delete</a> """, orderable=False, verbose_name=_("Confirm")) class Meta: attrs = {'class': 'table table-striped table-hover'} @staticmethod def render_menu_type(value): return TYPE_MAP_MENU.get(value, value) @staticmethod def render_menu_op(value): return OP_MAP_MENU.get(value, value) @staticmethod def render_dimension(value): return DIM_MAP_MENU.get(value, value) @staticmethod def render_event(value): db = get_mongo_client() res = db['menu_event'].find_one({'event_code': value}) or {} return res.get('event_name', value)
class AuditLogTable(tables.Table): username = columns.Column(verbose_name=_(u"用户名"), orderable=False) email = columns.Column(verbose_name=_(u"邮箱"), orderable=False) role = columns.Column(verbose_name=_(u"角色"), empty_values=(), orderable=False) path = columns.Column(verbose_name=_(u"请求地址"), orderable=False) operation = columns.Column(verbose_name=_(u"操作类型"), empty_values=(), orderable=False) method = columns.Column(verbose_name=_(u"请求方式"), orderable=False) status = columns.Column(verbose_name=_(u"响应码"), orderable=False) req_body = columns.TemplateColumn(""" <div style="max-width: 600px;"> {% if record.req_body|length > 128 %} <a data-toggle="modal" data-target="#req_body_{{ record.id }}"> 查看 </a> <div class="modal inmodal" id="req_body_{{ record.id }}" tabindex="-1" role="dialog" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content animated fadeIn"> <div class="modal-header"> <h2>请求参数</h2> </div> <div class="modal-body"> {{ record.req_body }} </div> <div class="modal-footer"> <button type="button" class="btn btn-white" data-dismiss="modal">关闭</button> </div> </div> </div> </div> {% else %} {{ record.req_body }} {% endif %} </div> """, orderable=False, verbose_name=_(u"请求参数")) time = columns.DateTimeColumn(verbose_name=_(u"请求时间"), format="Y-m-d H:i:s") class Meta: attrs = {'class': 'table table-striped table-hover'} def before_render(self, request): pk_user_map = {} for d in UserPermission.objects.all_fields(): pk = d.get('pk') if pk: pk_user_map[pk] = d self.pk_user_map = pk_user_map group_name_desc_map = {} for d in GroupPermission.objects.all_fields(): name = d.get('name') if name: group_name_desc_map[name] = d.get('desc', '') self.group_name_desc_map = group_name_desc_map uri_descs_map = defaultdict(list) for d in UriGroupPermission.objects.all_fields(): uris = d.get('uris', []) for uri in uris: desc = d.get('desc', '') uri_descs_map[uri].append(desc) uri_desc_map = {} for uri, descs in uri_descs_map.items(): rw = None r = None for desc in descs: if desc.endswith(u'-读写'): rw = desc if desc.endswith(u'-读'): r = desc if rw and r: uri_desc_map[uri] = r elif rw and not r: uri_desc_map[uri] = rw.rstrip(u'-读写') + u'-写' else: uri_desc_map[uri] = descs[0] self.uri_desc_map = uri_desc_map def render_role(self, value, record): user = self.pk_user_map.get(record.email) if not user: return u'未知' if user.get('is_superuser'): return u'超级管理员' groups = user.get('groups', []) descs = [self.group_name_desc_map.get(name, '') for name in groups] return ', '.join(descs) def render_operation(self, value, record): return self.uri_desc_map.get(record.path, '')
class UseridTable(BaseMenuTable): value = columns.Column(verbose_name=_(u"用户ID")) class Meta: attrs = {'class': 'table table-striped table-hover'}
class PayTable(BaseMenuTable): value = columns.Column(verbose_name=_("Payment account number")) class Meta: attrs = {'class': 'table table-striped table-hover'}
class PhoneTable(BaseMenuTable): value = columns.Column(verbose_name=_(u"手机号")) class Meta: attrs = {'class': 'table table-striped table-hover'}
class IPTable(BaseMenuTable): value = columns.Column(verbose_name=_("IP_Address")) class Meta: attrs = {'class': 'table table-striped table-hover'}