class CustomerConfig(StarkConfig): def display_follow(self, row=None, header=False): if header: return '跟进记录' url = reverse("stark:crm_consultrecord_changelist") return mark_safe("<a href='%s?cid=%s'>跟进记录</a>" % ( url, row.pk, )) list_display = [ 'name', 'qq', get_choice_text('status', '状态'), get_choice_text('gender', '性别'), get_choice_text('source', '来源'), display_follow ] order_by = [ '-id', ] search_list = ['name', 'qq'] list_filter = [ Option('status', is_choice=True, text_func=lambda x: x[1]), Option('gender', is_choice=True, text_func=lambda x: x[1]), Option('source', is_choice=True, text_func=lambda x: x[1]) ]
class UserConfig(RbacPermission, StarkConfig): list_display = [ "id", "username", "name", "phone", get_choice_text("gender", "性别"), "email" ] order_by = ["-id"]
class ArticleConfig(RbacPermission, StarkConfig): def display_user(self, row=None, header=False): if header: return "发布者" return row.user.username list_display = [ 'nid', 'title', 'desc', 'comm_count', 'up_count', get_choice_text("type", "文章类型"), display_user, 'category', 'status', ] search_list = [ 'title', 'desc', 'comm_count', 'up_count', 'type', 'user', 'category', 'status' ] list_filter = [ Option(field='type', is_choice=True, is_multi=True, text_func=lambda x: x[1]), Option(field='category', is_choice=False, is_multi=True, text_func=lambda x: x.title, value_func=lambda x: x.pk) ] order_by = ["-nid"]
class ServerConfig(StarkConfig): def display_detail(self, row=None, header=False): """ 查看详细 :param row: :param header: :return: """ if header: return "查看详细" return mark_safe("<a href='/stark/api/server/%s/detail/'>查看详细</a>" % row.id) list_display = [ StarkConfig.display_checkbox, "hostname", display_detail, get_choice_text('device_status_id', '状态'), ] search_list = ["hostname", "business_unit__name"] def multi_delete(self, request): pks = request.POST.getlist("pk") models.Server.objects.filter(id__in=pks).delete() multi_delete.text = "批量删除" action_list = [ multi_delete, ]
class ServerConfig(StarkConfig): model_form_class = ServerForm # # def show_satus(self, header=None, row=None): # if header: # return '设备状态' # # # return mark_safe('<span style="color:red">{}</span>'.format(row.get_device_status_id_display())) def show_hostname(self, header=None, row=None): if header: return '主机名' return mark_safe( '<a href="{}"> {} </a>'.format('/stark/repository/server/server_detail/{}'.format(row.pk), row.hostname)) def show_record(self, header=None, row=None): if header: return '变更记录' return mark_safe( '<a href="{}"> 查看 </a>'.format('/stark/repository/server/server_record/{}'.format(row.pk), )) # 展示的字段 可以使用内置或者自定义方法 内置get_choice_text 自定义show_hostname list_display = ['id', show_hostname, 'idc', 'cabinet_num', 'cabinet_order', get_choice_text('device_status_id', '状态', ), show_record, 'latest_date'] # 排序 order_by = ['-id'] # 搜索 search_list = ['id', 'hostname', ] def server_detail(self, request, pk): obj = models.Server.objects.filter(pk=pk).first() disks = obj.disk_list.order_by('slot') return render(request, 'server_detail.html', {'obj': obj, 'disks': disks}) def server_record(self, request, pk): obj = models.Server.objects.filter(pk=pk).first() return render(request, 'server_record.html', {'obj': obj}) #额外补充整合详情页及变更记录 def extra_url(self): urlpatterns = [ url(r'^server_detail/(\d+)/$', self.server_detail, name='server_detail'), url(r'^server_record/(\d+)/$', self.server_record, name='server_record'), ] return urlpatterns # 组合搜索 组合筛选 list_filter = [ # Option('idc', is_multi=True, condition={'pk__in': [1, ]}), # condition 只显示部分筛选条件 Option('idc', is_multi=True, ), # Option('business_unit'), Option('device_status_id', is_choice=True, text_func=lambda x: x[1]) #choice字段额外加is_choice 无text_func则结果为元组(1,'xx') ]
class UserInfoConfig(StarkConfig): def display_detail(self, row=None, header=False): if header: return '查看详细' return mark_safe('<a href="%s">%s</a>' % ( reverse('stark:crm_userinfo_detail', kwargs={'pk': row.id}), row.name, )) list_display = [ display_detail, get_choice_text('gender', '性别'), # display_gender函数:self, row=None, header=False 'phone', 'email', 'depart', StarkConfig.display_edit, StarkConfig.display_del ] def extra_url(self): info = self.model_class._meta.app_label, self.model_class._meta.model_name urlpatterns = [ url(r'^(?P<pk>\d+)/detail/$', self.wrapper(self.detail_view), name='%s_%s_detail' % info), ] return urlpatterns def detail_view(self, request, pk): """ 查看详细页面 :param request: :param pk: :return: """ return HttpResponse('详细页面...') search_list = ['name', 'depart__title']
class UserInfoConfig(RbacPermission, StarkConfig): def display_title(self, row=None, header=False): if header: return "姓名" return row.username def display_telephone(self, row=None, header=False): if header: return "电话" return row.telephone list_display = [ 'nid', display_title, get_choice_text("sex", "性别"), "email", display_telephone, "asset", "status" ] search_list = ["username"] order_by = ["-nid"]
class Server_list_Config(StarkConfig): def display_memory_record(self, row=None, header=False): # 自定表格头部 if header: return "内存信息" url = reverse('stark:repository_memory_changelist') memory_sum = sum([int(i.capacity) for i in row.memory.all()]) return mark_safe("<a href='%s?server_obj=%s'>%sMB|查看</a>" % (url, row.pk, memory_sum)) def display_disk_record(self, row=None, header=False): # 自定表格头部 if header: return "硬盘信息" url = reverse('stark:repository_disk_changelist') disk_sum = sum([int(i.capacity) for i in row.disk.all()]) return mark_safe("<a href='%s?server_obj=%s'>%sGB|查看</a>" % (url, row.pk, disk_sum)) def display_nic_record(self, row=None, header=False): # 自定表格头部 if header: return "网卡信息" url = reverse('stark:repository_nic_changelist') name_show = [i.name for i in row.nic.all()][0] return mark_safe("<a href='%s?server_obj=%s'>%s|查看</a>" % (url, row.pk, name_show)) def display_create_at_date(self, row=None, header=False): if header: return '创建时间' return row.create_at.strftime('%Y-%m-%d') def display_latest_date_date(self, row=None, header=False): if header: return '修改时间' return row.latest_date.strftime('%Y-%m-%d') def get_add_btn(self): name = "%s:%s" % ( self.site.namespace, self.get_add_url_name, ) permission_dict = self.request.session.get( settings.PERMISSION_SESSION_KEY) if name in permission_dict: return super().get_add_btn() def get_list_display(self): ''' 自动判断是否有编辑删除权限的显示 :return: ''' val = super().get_list_display() permission_dict = self.request.session.get( settings.PERMISSION_SESSION_KEY) edit_name = "%s:%s" % ( self.site.namespace, self.get_change_url_name, ) del_name = "%s:%s" % ( self.site.namespace, self.get_del_url_name, ) if edit_name not in permission_dict: val.remove(StarkConfig.display_edit) val.remove(StarkConfig.display_checkbox) if del_name not in permission_dict: val.remove(StarkConfig.display_del) if edit_name in permission_dict and del_name in permission_dict: val.remove(StarkConfig.display_edit) val.remove(StarkConfig.display_del) val.insert(len(self.list_display), StarkConfig.display_edit_del) return val def get_action_list(self): ''' 根据权限是否隐藏批量执行按钮 ''' val = super().get_action_list() print(val) permission_dict = self.request.session.get( settings.PERMISSION_SESSION_KEY) del_name = "%s:%s" % ( self.site.namespace, self.get_del_url_name, ) if del_name not in permission_dict: val.remove(StarkConfig.multi_delete) return val # def get_list_display(self): # permission_dict = self.request.session.get(settings.PERMISSION_SESSION_KEY) # # val = super().get_list_display() # if not permission_dict.get("stark:repository_server_del"): # val.remove(StarkConfig.display_del) # # if not permission_dict.get("stark:repository_server_del"): # val.remove(StarkConfig.display_edit) # # val.insert(0, StarkConfig.display_checkbox) # return val # 生成表格信息 list_display = [ 'idc', 'cabinet_num', "cabinet_order", "business_unit", "tags", "server_status_id", "hostname", "sn", "manufacturer", "model", "manage_ip", "os_platform", "os_version", "cpu_count", "cpu_physical_count", "cpu_model", display_create_at_date, # 创建时间 display_latest_date_date, # 修改时间 display_memory_record, # 内存 display_disk_record, # 磁盘 display_nic_record, # 网卡 get_choice_text('server_status_id', '状态') ] # 搜索条件 search_list = ["cpu_count", "manage_ip", 'cabinet_num'] # 组合搜索按钮 # condition 额外的查询条件 # field 表的字段名称 # is_choice True代表是choice选项 # is_multi True代表M2M多对多 # text_func 按钮文本显示 默认显示ORM中的__str__ 默认x传入的ORM对象数据 # value_func url中GET得参数-默认是表的主键 默认x传入的ORM对象数据 list_filter = [ Option(field='os_platform', is_choice=False, is_multi=False, text_func=lambda x: x.os_platform, value_func=lambda x: x.os_platform), Option(field='os_version', is_choice=False, is_multi=False, value_func=lambda x: x.os_version, text_func=lambda x: x.os_version), Option(field='server_status_id', is_choice=True, is_multi=False, text_func=lambda x: x[1]), ] action_list = [StarkConfig.multi_delete]
class ServerConfig(StarkConfig): # def display_status(self, row=None, header=False): # if header: # return '状态' # from django.utils.safestring import mark_safe # data = row.get_device_status_id_display() # tpl = "<span style='color:green'>%s</span>" % data # return mark_safe(tpl) def host_dep(self, row=None, header=False): if header: return "host_dep" s = [] for r in row.roles.all(): print(r) s.append( "<a href='/stark/app01/host/%s/role' style='padding:3px 6px'>%s</a>" % (row.pk, r.title)) return mark_safe(" ".join(s)) def host_role(self, request, nid): # role_list=models.Role.objects.filter(pk=id)[0] role_name = models.Host.objects.filter( pk=nid).values_list("roles__title")[0] role_group = models.Host.objects.filter( pk=nid).values_list("roles__permissions__p_group__name") print(role_name, role_group) return render(request, 'host_group.html', locals()) # return HttpResponse("ok") def host_sw(self, row=None, header=False): if header: return "host_sw" s = [] for r in row.sw.all(): print(r) # s.append("<a href='stark/app01/switch_port/?id=%s' style='padding:3px 6px'>%s.%s</a>"%(r.pk,r.switch_name,r.sw_port_num)) s.append("<span style='padding:3px 6px'>%s.%s</apan>" % (r.switch_name, r.sw_port_num)) return mark_safe(" ".join(s)) # def host_switch(self,request,id): # customer_distrbute_list = models.Switch_Port.objects.filter(pk=id)[0] # print(customer_distrbute_list) # return render(request, "my_customers.html", locals()) def host_st(self, row=None, header=False): if header: return "host_st" s = [] for r in row.st.all(): print(r) s.append( "<a href='/stark/app01/host/%s/host_storage' style='padding:3px 6px'>%s.%s</a>" % (row.pk, r.storage_name, r.st_port_wwid)) # s.append("<a href='/stark/app01/host/%s/host_storage' style='padding:3px 6px'>%s</a>"%(row.pk,r.storage_name)) return mark_safe(" ".join(s)) def host_storage(self, request, nid): st_name = models.Host.objects.filter( pk=nid).values_list("st__storage_name__name")[0] sw_name = models.Host.objects.filter( pk=nid).values_list("sw__switch_name__switch_name")[0] st_port = models.Host.objects.filter( pk=nid).values_list("st__st_port_wwid")[0] sw_port = models.Host.objects.filter( pk=nid).values_list("sw__sw_port_num")[0] sw_port_protocol = models.Host.objects.filter( pk=nid).values_list("sw__sw_port_protocol__protocol_name")[0] # for n in storage_port: # print(n) context = { "st_name": st_name, "sw_name": sw_name, "st_port": st_port, "sw_port": sw_port, "sw_port_protocol": sw_port_protocol } print(context) return render(request, 'host_storage.html', locals()) # return render(request, "my_customers.html", locals()) def extra_url(self): # temp=[] # # temp.append(url("host_storage/(\d+)",self.host_storage)) # temp.append(url("user_role/(?P<id>\d+)",self.user_role)) # temp.append(url("host_switch/(?P<id>\d+)",self.host_switch)) # temp.append(url("^(?P<nid>\d+)/host_storage/$", self.host_storage)) # # temp.append(url(r'^(?P<nid>\d+)$', self.detail_view)), # print("temp",temp) # return temp patterns = [ url(r'^(?P<nid>\d+)/host_storage/$', self.host_storage), url(r'^(?P<nid>\d+)/role/$', self.host_role), url(r'^(?P<nid>\d+)/detail/$', self.display_detail), url(r'^(?P<nid>\d+)/scan/$', self.display_scan), ] return patterns def scan(self, row=None, header=False): if header: return 'Scan' s = [] # s.append("<a href='/stark/app01/host/%s/scan' style='padding:3px 6px'>%s</a>" % ( s.append( "<a href='/stark/app01/host/%s/scan' style='padding:3px 6px'><input id=id_scan type='button' value=%s></a>" % (row.pk, "scan")) return mark_safe(" ".join(s)) def display_scan(self, request, nid): host_obj = models.Host.objects.filter(pk=nid).values()[0] if os.path.exists("%s/%s.html" % (settings.SERVER_HTML[0], host_obj["nickname"])): print("retrun the before one ") return render(request, "%s.html" % host_obj["nickname"], locals()) error = "the server %s can not connect with ansible " % host_obj[ "hostname"] CNA_info = host_obj["CNAs"] regex = re.compile(r'(((([a-z])?([0-9])?)+:)){1,}') print(">>>", CNA_info) if not ansible_check.scan_ping(host_obj["hostname"]): return HttpResponse(error) print("finish ping ") if CNA_info: print("get into wwpn") if not regex.search(CNA_info): CNA_info += " ,".join([ wwpn for wwpn in ssh_cmd.get_fc_host_wwpn(host_obj["hostname"]) ]) models.Host.objects.filter(pk=nid).update(CNAs=CNA_info) print(host_obj, settings.SERVER_HTML[0]) # wwpn_list=ssh_cmd.get_fc_host_wwpn(host_obj["hostname"]) result_html = ansible_check.format_html(host_obj["hostname"], settings.SERVER_HTML[0], host_obj["nickname"]) print(result_html) if not result_html: return HttpResponse(error) return render(request, result_html, locals()) def nick_name(self, row=None, header=False): if header: return 'nick_name' s = [] s.append( "<a href='/stark/app01/host/%s/detail' style='padding:3px 6px'>%s</a>" % (row.pk, row.nickname)) return mark_safe(" ".join(s)) # return mark_safe("<a href='/stark/app01/user/%s/detail/'>%s</a>" % (row.id,)) def display_detail(self, request, nid): """ 详细页面的视图函数 :param request: :param nid: :return: """ host_info = models.Host.objects.filter(pk=nid).values() st = models.Host.objects.filter( pk=nid).values("st__storage_name__name") sw = models.Host.objects.filter( pk=nid).values("sw__switch_name__switch_name") print("host_name", host_info, st, sw) return render(request, 'server_detail.html', locals()) list_display = [ StarkConfig.display_checkbox, # display_status, nick_name, host_dep, "disks", "CNAs", "boot_to", host_sw, host_st, get_choice_text('device_status_id', 'status'), scan ] search_list = [ 'nickname', 'CNAs', 'host_sw', ] list_display_links = [ "nickname", ] # list_filter = [ # # Option('business_unit',condition={'id__gt':0},is_choice=False,text_func=lambda x:x.name,value_func=lambda x:x.id,is_multi=True), # Option('business_unit', condition={'id__gt': 0}, is_choice=False, text_func=lambda x: x.name, # value_func=lambda x: x.id), # Option('device_status_id', is_choice=True, text_func=lambda x: x[1], value_func=lambda x: x[0]), # ] # 自定义ModelForm model_form_class = ServerModelForm # def extra_url(self): # """ # 扩展URL # :return: # """ # from django.conf.urls import url # patterns = [ # url(r'^(?P<nid>\d+)/detail/$', self.detail_view), # ] # return patterns # def detail_view(self, request, nid): # """ # 详细页面的视图函数 # :param request: # :param nid: # :return: # """ # nic_list = models.NIC.objects.filter(server_id=nid) # memory_list = models.Memory.objects.filter(server_id=nid) # disk_list = models.Disk.objects.filter(server_id=nid) # # context = { # 'nic_list':nic_list, # 'memory_list':memory_list, # 'disk_list':disk_list, # } # return render(request, 'server_detail.html',context) def multi_delete(self, request): pk_list = request.POST.getlist('pk') models.Role.objects.filter(id__in=pk_list).delete() # 无返回值,返回当前页面 from django.shortcuts import redirect # 有返回值 # return HttpResponse("ok") multi_delete.text = 'multi_delete' action_list = [ multi_delete, ]
class Server_list_Config(StarkConfig): script_state_add = True # 添加post请求时,是否触发脚本 script_state_delete = False # 删除delete请求时,是否触发脚本 script_state_change = True # 修改put请求时,是否触发脚本 # 删除数据 判断字段状态 是否可以删除 deletefieldcheckjudge = { "server_status_id": "4" } # ,"hostname":"testcommon002" def hookscript_add(self, *args, **kwargs): hostname = self.request.POST.get('hostname') hostcreate.delay(hostname=hostname) # 打印debug日志 logger.debug('hostname:%s 创建zabbix' % (hostname, )) def hookscript_change(self, *args, **kwargs): pk = kwargs.get('pk') # 获取服务器状态 server_status_id = self.request.POST.get('server_status_id') if str(server_status_id) == "4": # 发布执行动作 hostdelete.delay(pk=pk) # post请求进来数据,传给异步脚本 # 打印debug日志 logger.debug('删除zabbix监控主机配置 pk:%s server_status_id:%s' % (pk, server_status_id)) # url = reverse('stark:repository_k8sresourcecontroller_changelist') # return '%s?configmaprelation=%s' % (url, pk) def display_memory_record(self, row=None, header=False): # 自定表格头部 if header: return "内存信息" url = reverse('stark:repository_memory_changelist') memory_sum = sum([int(i.capacity) for i in row.memory.all()]) return mark_safe("<a href='%s?server_obj=%s'>%sMB|查看</a>" % (url, row.pk, memory_sum)) # def display_disk_record(self, row=None, header=False): # 自定表格头部 # if header: # return "硬盘信息" # url = reverse('stark:repository_disk_changelist') # disk_sum = sum([int(i.capacity) for i in row.disk.all()]) # return mark_safe("<a href='%s?server_obj=%s'>%sGB|查看</a>" %(url,row.pk,disk_sum)) # def display_network_record(self, row=None, header=False): # 自定表格头部 # if header: # return "网卡信息" # url = reverse('stark:repository_nic_changelist') # name_show = [i.name for i in row.nic.all()][0] # return mark_safe("<a href='%s?server_obj=%s'>%s|查看</a>" %(url,row.pk,name_show)) def display_create_at_date(self, row=None, header=False): if header: return '创建时间' return row.create_at.strftime('%Y-%m-%d') def display_latest_date_date(self, row=None, header=False): if header: return '修改时间' return row.latest_date.strftime('%Y-%m-%d') def get_add_btn(self): name = "%s:%s" % ( self.site.namespace, self.get_add_url_name, ) permission_dict = self.request.session.get( settings.PERMISSION_SESSION_KEY) if name in permission_dict: return super().get_add_btn() def get_list_display(self): ''' 自动判断是否有编辑删除权限的显示 :return: ''' val = super().get_list_display() permission_dict = self.request.session.get( settings.PERMISSION_SESSION_KEY) edit_name = "%s:%s" % ( self.site.namespace, self.get_change_url_name, ) del_name = "%s:%s" % ( self.site.namespace, self.get_del_url_name, ) if edit_name not in permission_dict: val.remove(StarkConfig.display_edit) val.remove(StarkConfig.display_checkbox) if del_name not in permission_dict: val.remove(StarkConfig.display_del) if edit_name in permission_dict and del_name in permission_dict: val.remove(StarkConfig.display_edit) val.remove(StarkConfig.display_del) val.append(StarkConfig.display_edit_del) return val def get_action_list(self): ''' 根据权限是否隐藏批量执行按钮 ''' val = super().get_action_list() permission_dict = self.request.session.get( settings.PERMISSION_SESSION_KEY) del_name = "%s:%s" % ( self.site.namespace, self.get_del_url_name, ) if del_name not in permission_dict: val.remove(StarkConfig.multi_delete) return val # 生成表格信息 list_display = [ "hostname", "os_platform", display_create_at_date, # 创建时间 display_latest_date_date, # 修改时间 display_memory_record, # 内存 # display_disk_record, # 磁盘 # display_network_record, # 网卡 get_choice_text('server_status_id', '状态') ] # 搜索条件 search_list = ["cpu_count", "manage_ip", 'cabinet_num'] # 组合搜索按钮 # condition 额外的查询条件 # field 表的字段名称 # is_choice True代表是choice选项 # is_multi True代表M2M多对多 # text_func 按钮文本显示 默认显示ORM中的__str__ 默认x传入的ORM对象数据 # value_func url中GET得参数-默认是表的主键 默认x传入的ORM对象数据 list_filter = [ Option(field='os_platform', is_choice=False, is_multi=False, text_func=lambda x: x.os_platform, value_func=lambda x: x.os_platform), Option(field='server_status_id', is_choice=True, is_multi=False, text_func=lambda x: x[1]), ] action_list = [StarkConfig.multi_delete]
class ServerConfig(StarkConfig): # 第一种写法 # def display_status(self, row=None, header=False): # if header: # return '状态' # from django.utils.safestring import mark_safe # data = row.get_device_status_id_display() # 如果想显示chionse类型的字段,需要get_字段名_display() # tpl = "<span style='color:green'>%s</span>" % data # return mark_safe(tpl) # 主机页面展示服务器的详细页面 def display_detail(self, row=None, header=False): """ 查看详细 :param row: :param header: :return: """ if header: return '查看详细' return mark_safe("<a href='/stark/api/server/%s/detail/'>查看详细</a>" % row.id) def display_record(self, row=None, header=False): """ 查看详细 :param row: :param header: :return: """ if header: return '变更记录' return mark_safe("<a href='/stark/api/server/%s/record/'>变更记录</a>" % row.id) # 第二种写法 list_display = [ 'hostname', 'os_platform', 'os_version', # display_status, 'business_unit', 'latest_date', get_choice_text('device_status_id', '状态'), # device_status_id 这个是数据库的字段,状态是web页面上定义的标题 display_detail, # 注意自定义的字段不用加引号 display_record, ] # 按字段快速搜索 search_list = ['hostname', 'os_platform', 'business_unit__name'] # 分类列表 Option需要导入 list_filter = [ # Option('business_unit',condition={'id__gt':0},is_choice=False,text_func=lambda x:x.name,value_func=lambda x:x.id,is_multi=True), Option('business_unit', condition={'id__gt': 0}, is_choice=False, text_func=lambda x: x.name, value_func=lambda x: x.id), Option('device_status_id', is_choice=True, text_func=lambda x: x[1], value_func=lambda x: x[0]), ] # 自定义ModelForm model_form_class = ServerModelForm # 用来显示时间样式的 def extra_url(self): """ 自定义扩展URL,必须用这个名字 :return: """ from django.conf.urls import url patterns = [ url(r'^(?P<nid>\d+)/detail/$', self.detail_view), # 主机详情url url(r'^(?P<nid>\d+)/record/$', self.record_view), # 变更详情url # url(r'^login/$',self.login), ] return patterns # def login(self): def detail_view(self, request, nid): """ 主机详细页面的视图函数 :param request: :param nid: :return: """ base_list = models.Server.objects.filter(id=nid) nic_list = models.NIC.objects.filter(server_id=nid) memory_list = models.Memory.objects.filter(server_id=nid) disk_list = models.Disk.objects.filter(server_id=nid) context = { 'base_list': base_list, 'nic_list': nic_list, 'memory_list': memory_list, 'disk_list': disk_list, } return render(request, 'server_detail.html', context) def record_view(self, request, nid): """ 变更记录页面 :param request: :param nid: :return: """ record_list = models.AssetRecord.objects.filter(server_id=nid) context = { 'record_list': record_list, } return render(request, 'server_record.html', context)
class Configcenter_list_Config(StarkConfig): script_state_add = False # 添加post请求时,是否触发脚本 script_state_delete = False # 删除delete请求时,是否触发脚本 script_state_change = True # 修改put请求时,是否触发脚本 def hookscript_change(self, *args, **kwargs): pk = kwargs.get('pk') postcontent = self.request.POST.get('content') publish_id = self.request.POST.get('publish_id') print('publish_id', publish_id) if str(publish_id) == "1": # 发布执行动作 # 执行异步脚本 ,configcontentormobj=connobj kubernetes_configmaps.delay(postcontent=postcontent, pk=pk) # post请求进来数据,传给异步脚本 settings.log_record.debug( 'pk:%s publish_id:%s content:execute,async,kubernetes_configmaps' % (pk, publish_id)) settings.log_record.debug( 'pk:%s publish_id:%s content:unexecuted,async' % (pk, publish_id)) # if str(publish_id) == "2": # 不发布执行动作 # # postcontent:提交配置内容 # kubernetes_configmaps.delay(postcontent=postcontent,pk=pk) # post请求进来数据,传给异步脚本 url = reverse('stark:repository_resourcecontroller_changelist') return '%s?configmaprelation=%s' % (url, pk) def get_list_display(self): ''' 自动判断是否有编辑删除权限的显示 :return: ''' val = super().get_list_display() permission_dict = self.request.session.get( settings.PERMISSION_SESSION_KEY) edit_name = "%s:%s" % ( self.site.namespace, self.get_change_url_name, ) del_name = "%s:%s" % ( self.site.namespace, self.get_del_url_name, ) if edit_name not in permission_dict: val.remove(StarkConfig.display_edit) val.remove(StarkConfig.display_checkbox) if del_name not in permission_dict: val.remove(StarkConfig.display_del) if edit_name in permission_dict and del_name in permission_dict: val.remove(StarkConfig.display_edit) val.remove(StarkConfig.display_del) val.insert(len(self.list_display), StarkConfig.display_edit_del) return val def get_action_list(self): ''' 根据权限是否隐藏批量执行按钮 ''' val = super().get_action_list() # print(val) permission_dict = self.request.session.get( settings.PERMISSION_SESSION_KEY) del_name = "%s:%s" % ( self.site.namespace, self.get_del_url_name, ) if del_name not in permission_dict: val.remove(StarkConfig.multi_delete) return val def get_add_btn(self): name = "%s:%s" % ( self.site.namespace, self.get_add_url_name, ) permission_dict = self.request.session.get( settings.PERMISSION_SESSION_KEY) if name in permission_dict: return super().get_add_btn() def display_create_at_date(self, row=None, header=False): if header: return '创建时间' return row.create_at.strftime('%Y-%m-%d') def display_latest_date_date(self, row=None, header=False): if header: return '修改时间' return row.latest_date.strftime('%Y-%m-%d') def display_configrelation(self, row=None, header=False): if header: return "更新设置" configrelation = row.configrelation.all() class_name_list = ["%s" % (row.title) for row in configrelation] return ','.join(class_name_list) # 生成表格信息 list_display = [ get_choice_text('publish_id', '发布'), get_choice_text('conftype_id', '配置类型'), 'title', 'content', "notes", 'change_user', # 修改用户 display_configrelation, # 关系 display_create_at_date, # 创建时间 display_latest_date_date, # 修改时间 get_choice_text('publish_status_id', '发布状态'), get_choice_text('environment_id', '正式/测试'), ] # 搜索条件 search_list = [ "title", ] # 组合搜索按钮 # condition 额外的查询条件 # field 表的字段名称 # is_choice True代表是choice选项 # is_multi True代表M2M多对多 # text_func 按钮文本显示 默认显示ORM中的__str__ 默认x传入的ORM对象数据 # value_func url中GET得参数-默认是表的主键 默认x传入的ORM对象数据 list_filter = [ # Option(field='os_platform', is_choice=False,is_multi=False,text_func=lambda x:x.os_platform,value_func=lambda x:x.os_platform), # Option(field='os_version' ,is_choice=False,is_multi=False,value_func=lambda x:x.os_version ,text_func=lambda x:x.os_version), Option(field='publish_status_id', is_choice=True, is_multi=False, text_func=lambda x: x[1] + "发布"), Option(field='environment_id', is_choice=True, is_multi=False, text_func=lambda x: x[1] + "环境"), ] action_list = [StarkConfig.multi_delete]
class PaymentRecordHandler(PermissionHandler, StarkHandler): """ stark配置:缴费申请表 """ def get_model_form_class(self, is_add, request, pk, *args, **kwargs): """ 获取自定义ModelForm:老学员使用PaymentRecordModelForm,新学员使用StudentPaymentRecordModelForm :param is_add: :param request: :param pk: :return: """ customer_id = kwargs.get('customer_id') student_exists = models.Student.objects.filter( customer_id=customer_id).exists() if student_exists: return PaymentRecordModelForm return StudentPaymentRecordModelForm # 页面显示列:缴费类型|金额|申请班级|课程顾问|状态 list_display = [ get_choice_text('缴费类型', 'pay_type'), 'paid_fee', 'class_list', 'consultant', get_choice_text('状态', 'confirm_status') ] def get_list_display(self, request, *args, **kwargs): """ 钩子方法:取消默认的编辑删除列 :return: """ value = [] if self.list_display: value.extend(self.list_display) return value def get_urls(self): """ 预留钩子:重写URL :return: """ patterns = [ re_path(r'^list/(?P<customer_id>\d+)/$', self.wrapper(self.list_view), name=self.get_list_url_name), re_path(r'^add/(?P<customer_id>\d+)/$', self.wrapper(self.add_view), name=self.get_add_url_name), ] patterns.extend(self.extra_urls()) return patterns def get_queryset(self, request, *args, **kwargs): """ 预留钩子:获取当前用户指定私有客户的缴费申请 :param request: :param args: :param kwargs: :return: """ customer_id = kwargs.get('customer_id') current_user_id = request.session['user_info']['id'] return self.model_class.objects.filter( customer_id=customer_id, customer__consultant_id=current_user_id) def save(self, request, form, is_update, *args, **kwargs): """ 钩子方法:保存前增加业务处理 :param request: :param form: :param is_update: :return: """ customer_id = kwargs.get('customer_id') current_user_id = request.session['user_info']['id'] # 判断学员是否是当前课程顾问的私有客户 object_exists = models.Customer.objects.filter( id=customer_id, consultant_id=current_user_id).exists() if not object_exists: return HttpResponse('非法操作') form.instance.customer_id = customer_id form.instance.consultant_id = current_user_id # 创建缴费记录信息 form.save() # 创建学员信息 class_list = form.cleaned_data['class_list'] fetch_student_object = models.Student.objects.filter( customer_id=customer_id).first() # 新学员 if not fetch_student_object: qq = form.cleaned_data['qq'] mobile = form.cleaned_data['mobile'] emergency_contract = form.cleaned_data['emergency_contract'] student_object = models.Student.objects.create( customer_id=customer_id, qq=qq, mobile=mobile, emergency_contract=emergency_contract) student_object.class_list.add(class_list.id) # 老学员 else: fetch_student_object.class_list.add(class_list.id)
class Host_list_Config(StarkConfig): script_state_add = False # 添加post请求时,是否触发脚本 script_state_delete = False # 删除delete请求时,是否触发脚本 script_state_change = True # 修改put请求时,是否触发脚本 def hookscript_change(self, *args, **kwargs): pk = kwargs.get('pk') status = self.request.POST.get('status') print('publish_id', status) if str(status) == "1": # 发布执行动作---为想好怎么操作控制器,所以不执行脚本 # 执行异步脚本 ,configcontentormobj=connobj # kubernetes_configmaps.delay(postcontent=postcontent,pk=pk) # post请求进来数据,传给异步脚本 print('存活', status, pk) settings.log_record.debug( 'pk:%s publish_id:%s content:execute,async,kubernetes_configmaps' % (pk, status)) settings.log_record.debug( 'pk:%s publish_id:%s content:unexecuted,async' % (pk, status)) # if str(publish_id) == "2": # 不发布执行动作 # # postcontent:提交配置内容 # kubernetes_configmaps.delay(postcontent=postcontent,pk=pk) # post请求进来数据,传给异步脚本 def get_list_display(self): ''' 自动判断是否有编辑删除权限的显示 :return: ''' val = super().get_list_display() permission_dict = self.request.session.get( settings.PERMISSION_SESSION_KEY) edit_name = "%s:%s" % ( self.site.namespace, self.get_change_url_name, ) del_name = "%s:%s" % ( self.site.namespace, self.get_del_url_name, ) if edit_name not in permission_dict: val.remove(StarkConfig.display_edit) val.remove(StarkConfig.display_checkbox) if del_name not in permission_dict: val.remove(StarkConfig.display_del) if edit_name in permission_dict and del_name in permission_dict: val.remove(StarkConfig.display_edit) val.remove(StarkConfig.display_del) val.insert(len(self.list_display), StarkConfig.display_edit_del) return val def get_action_list(self): ''' 根据权限是否隐藏批量执行按钮 ''' val = super().get_action_list() # print(val) permission_dict = self.request.session.get( settings.PERMISSION_SESSION_KEY) del_name = "%s:%s" % ( self.site.namespace, self.get_del_url_name, ) if del_name not in permission_dict: val.remove(StarkConfig.multi_delete) return val def get_add_btn(self): ''' 添加按钮 :return: ''' name = "%s:%s" % ( self.site.namespace, self.get_add_url_name, ) permission_dict = self.request.session.get( settings.PERMISSION_SESSION_KEY) if name in permission_dict: return super().get_add_btn() def display_create_time_date(self, row=None, header=False): if header: return '创建时间' return row.create_time.strftime('%Y-%m-%d') def display_modify_time_date(self, row=None, header=False): if header: return '修改时间' return row.modify_time.strftime('%Y-%m-%d') # 生成表格信息 list_display = [ get_choice_text('status', '状态'), 'hostname', 'i_ip', "o_ip", 'cpu_info', 'mem_info', 'disk_info', 'remarks', 'instanceid', display_create_time_date, # 创建时间 display_modify_time_date, # 修改时间 ] # 搜索条件 search_list = [ "hostname", ] # 组合搜索按钮 # condition 额外的查询条件 # field 表的字段名称 # is_choice True代表是choice选项 # is_multi True代表M2M多对多 # text_func 按钮文本显示 默认显示ORM中的__str__ 默认x传入的ORM对象数据 # value_func url中GET得参数-默认是表的主键 默认x传入的ORM对象数据 list_filter = [ # Option(field='os_platform', is_choice=False,is_multi=False,text_func=lambda x:x.os_platform,value_func=lambda x:x.os_platform), # Option(field='os_version' ,is_choice=False,is_multi=False,value_func=lambda x:x.os_version ,text_func=lambda x:x.os_version), Option(field='status', is_choice=True, is_multi=False, text_func=lambda x: x[1]), # Option(field='environment_id', is_choice=True, is_multi=False, text_func=lambda x: x[1] + "环境"), # Option(field='configmaprelation', is_choice=False, is_multi=True, is_show=False), # 不显示-用来 configcenter 配置文件管理的 关联 控制器 ] # 自定义批量执行 def multi_restart(self, request): """ 批量执行重启控制器 :param request: :return: """ id_list = request.POST.getlist('pk') # [1,2] for i in id_list: rowobj = self.model_class.objects.filter(pk=i).first() print(rowobj.content) multi_restart.text = "zabbix监控删除" # 批量执行动作按钮添加 action_list = [StarkConfig.multi_delete, multi_restart]
class PublicCustomerConfig(StarkConfig): list_display = [ 'name', 'qq', get_choice_text('status', '状态'), get_choice_text('gender', '性别'), get_choice_text('source', '来源') ] order_by = [ '-id', ] search_list = ['name', 'qq'] list_filter = [ Option('gender', is_choice=True, text_func=lambda x: x[1]), Option('source', is_choice=True, text_func=lambda x: x[1]) ] model_form_class = PubModelForm def multi_apply(self, request): """ 申请客户 :param request: :return: """ id_list = request.POST.getlist('pk') # [1,2] current_user_id = 1 # 以后要改成去session中获取当前登陆用户ID my_customer_count = models.Customer.objects.filter( consultant_id=current_user_id, status=2).count() if (my_customer_count + len(id_list)) > settings.MAX_PRIVATE_CUSTOMER: return HttpResponse('做人别太贪心') flag = False with transaction.atomic(): origin = models.Customer.objects.filter( id__in=id_list, consultant__isnull=True).select_for_update() if len(origin) == len(id_list): models.Customer.objects.filter(id__in=id_list).update( consultant_id=current_user_id) flag = True if not flag: return HttpResponse('已被其他顾问申请(手速太慢)') multi_apply.text = "申请客户" action_list = [ multi_apply, ] def get_list_display(self): val = super().get_list_display() val.remove(StarkConfig.display_del) val.insert(0, StarkConfig.display_checkbox) return val def get_queryset(self): return self.model_class.objects.filter(consultant__isnull=True)
class StudentHandler(PermissionHandler, StarkHandler): """ 学生表:stark配置 """ # 获取自定义ModelForm model_form_class = StudentModelForm def display_score(self, obj=None, is_header=None, *args, **kwargs): """ 自定义的学生积分显示列 :param obj: :param is_header: :return: """ if is_header: return '积分管理' record_url = reverse('stark:web_scorerecord_list', kwargs={'student_id': obj.pk}) return mark_safe('<a href="%s">%s</a>' % (record_url, obj.score)) # 页面展示列:客户信息|QQ号|手机号|紧急联系人电话|已报班级|状态|积分管理|编辑 list_display = [ 'customer', 'qq', 'mobile', 'emergency_contract', get_m2m_text('已报班级', 'class_list'), get_choice_text('状态', 'student_status'), display_score, ] def get_list_display(self, request, *args, **kwargs): """ 预留钩子:进展示编辑列 :return: """ value = [] if self.list_display: value.extend(self.list_display) value.append(type(self).display_edit) return value def get_urls(self): """ 预留钩子:重写URL(学生信息不允许被增删) :return: """ patterns = [ re_path(r'^list/$', self.wrapper(self.list_view), name=self.get_list_url_name), re_path(r'^edit/(?P<pk>\d+)/$', self.wrapper(self.edit_view), name=self.get_edit_url_name), ] patterns.extend(self.extra_urls()) return patterns # 添加按钮配置:取消 has_add_btn = False # 允许的条件搜索范围:姓名|qq|电话 search_list = [ 'customer__name', 'qq', 'mobile', ] # 允许的组合搜索条件:班级 search_group = [ Option('class_list', text_func=lambda x: '%s-%s' % (x.school.title, str(x))) ]
class Resourcecontroller_list_Config(StarkConfig): script_state_add = False # 添加post请求时,是否触发脚本 script_state_delete = False # 删除delete请求时,是否触发脚本 script_state_change = True # 修改put请求时,是否触发脚本 def hookscript_change(self, *args, **kwargs): pk = kwargs.get('pk') postcontent = self.request.POST.get('content') publish_id = self.request.POST.get('publish_id') configrelation = self.request.POST.getlist('configrelation') print('publish_id',publish_id) if str(publish_id) =="不执行": # 发布执行动作---为想好怎么操作控制器,所以不执行脚本 # 执行异步脚本 ,configcontentormobj=connobj kubernetes_configmaps.delay(postcontent=postcontent,pk=pk) # post请求进来数据,传给异步脚本 settings.log_record.debug('pk:%s publish_id:%s content:execute,async,kubernetes_configmaps' % (pk, publish_id )) settings.log_record.debug('pk:%s publish_id:%s content:unexecuted,async' % (pk, publish_id)) # if str(publish_id) == "2": # 不发布执行动作 # # postcontent:提交配置内容 # kubernetes_configmaps.delay(postcontent=postcontent,pk=pk) # post请求进来数据,传给异步脚本 def get_list_display(self): ''' 自动判断是否有编辑删除权限的显示 :return: ''' val = super().get_list_display() permission_dict = self.request.session.get(settings.PERMISSION_SESSION_KEY) edit_name = "%s:%s" % (self.site.namespace, self.get_change_url_name,) del_name = "%s:%s" % (self.site.namespace, self.get_del_url_name,) if edit_name not in permission_dict: val.remove(StarkConfig.display_edit) val.remove(StarkConfig.display_checkbox) if del_name not in permission_dict: val.remove(StarkConfig.display_del) if edit_name in permission_dict and del_name in permission_dict: val.remove(StarkConfig.display_edit) val.remove(StarkConfig.display_del) val.insert(len(self.list_display), StarkConfig.display_edit_del) return val def get_action_list(self): ''' 根据权限是否隐藏批量执行按钮 ''' val = super().get_action_list() # print(val) permission_dict = self.request.session.get(settings.PERMISSION_SESSION_KEY) del_name = "%s:%s" % (self.site.namespace, self.get_del_url_name,) if del_name not in permission_dict: val.remove(StarkConfig.multi_delete) return val def get_add_btn(self): name = "%s:%s" % (self.site.namespace, self.get_add_url_name,) permission_dict = self.request.session.get(settings.PERMISSION_SESSION_KEY) if name in permission_dict: return super().get_add_btn() def display_create_at_date(self, row=None, header=False): if header: return '创建时间' return row.create_at.strftime('%Y-%m-%d') def display_latest_date_date(self, row=None, header=False): if header: return '修改时间' return row.latest_date.strftime('%Y-%m-%d') def display_configrelation(self, row=None, header=False): if header: return "更新设置" configrelation = row.configrelation.all() class_name_list = [ "%s" %(row.title) for row in configrelation] return ','.join(class_name_list) def display_configmaprelation(self, row=None, header=False): if header: return "关联configmap" configmaprelation = row.configmaprelation.all() class_name_list = [ "%s" %(row.title) for row in configmaprelation] return ','.join(class_name_list) # 生成表格信息 list_display = [ get_choice_text('publish_id', '发布'), get_choice_text('conftype_id', '配置类型'), 'title', 'content', "notes", 'change_user', # 修改用户 display_configrelation, # 关联自用配置文件,相当于在什么环境执行该脚本 display_configmaprelation, # 关联的configmap display_create_at_date, # 创建时间 display_latest_date_date, # 修改时间 get_choice_text('publish_status_id', '发布状态'), get_choice_text('environment_id', '正式/测试'), ] # 搜索条件 search_list = ["title",] # 组合搜索按钮 # condition 额外的查询条件 # field 表的字段名称 # is_choice True代表是choice选项 # is_multi True代表M2M多对多 # text_func 按钮文本显示 默认显示ORM中的__str__ 默认x传入的ORM对象数据 # value_func url中GET得参数-默认是表的主键 默认x传入的ORM对象数据 list_filter = [ # Option(field='os_platform', is_choice=False,is_multi=False,text_func=lambda x:x.os_platform,value_func=lambda x:x.os_platform), # Option(field='os_version' ,is_choice=False,is_multi=False,value_func=lambda x:x.os_version ,text_func=lambda x:x.os_version), Option(field='publish_status_id', is_choice=True, is_multi=False, text_func=lambda x: x[1] + "发布"), Option(field='environment_id', is_choice=True, is_multi=False, text_func=lambda x: x[1] + "环境"), Option(field='configmaprelation', is_choice=False, is_multi=True, is_show=False), # 不显示-用来 configcenter 配置文件管理的 关联 控制器 ] # 自定义批量执行 def multi_restart(self, request): """ 批量执行重启控制器 :param request: :return: """ id_list = request.POST.getlist('pk') # [1,2] for i in id_list: rowobj = self.model_class.objects.filter(pk=i).first() print(rowobj.content) # cc = self.model_class.objects.filter(pk=i).values("configmaprelation__pk") # print("cc",[i for i in cc]) # print("id_list:::::::::::::::",id_list) # current_user_id = 1 # 以后要改成去session中获取当前登陆用户ID # models.Customer.objects.filter(id__in=id_list, status=2, consultant_id=current_user_id).update(consultant=None) multi_restart.text = "重启控制器Pod" # 批量执行动作按钮添加 action_list = [StarkConfig.multi_delete,multi_restart]
class ServerConfig(StarkConfig): # def display_status(self, row=None, header=False): # if header: # return "状态" # from django.utils.safestring import mark_safe # data = row.get_device_status_id_display() # tpl = "<span style='color:green'>%s</span>"%data # return mark_safe(tpl) def display_detail(self, row=None, header=False): if header: return "查看详细" return mark_safe("<a href='/stark/api/server/%s/detail/'>查看详细</a>" % row.id) def display_record(self, row=None, header=False): if header: return "变更记录" return mark_safe("<a href='/stark/api/server/%s/record/'>变更记录</a>" % row.id) list_display = [ # StarkConfig.display_checkbox, 'hostname', 'os_platform', 'os_version', #display_status, 'business_unit', get_choice_text('device_status_id', '状态'), display_detail, display_record, ] search_list = [ 'hostname', 'os_platform', 'business_unit__name', ] list_filter = [ # Option('business_unit',condition={'id__gt':3},is_choice=False,text_func=lambda x:x.name,value_func=lambda x:x.id), Option('device_status_id', is_choice=True, text_func=lambda x: x[1], value_func=lambda x: x[0], is_multi=True), ] # 自定义modelForm model_form_class = ServerModelForm action_list = [ # StarkConfig.multi_delete ] def extra_url(self): """ 扩展URL :return: """ from django.conf.urls import url patterns = [ url(r'^(?P<nid>\d+)/detail/$', self.detail_view), url(r'^(?P<nid>\d+)/record/$', self.record_view), ] return patterns def detail_view(self, request, nid): """ 详细页面的视图函数 :param request: :param nid: :return: """ nic_list = models.NIC.objects.filter(server_id=nid) memory_list = models.Memory.objects.filter(server_id=nid) disk_list = models.Disk.objects.filter(server_id=nid) context = { 'nic_list': nic_list, 'memory_list': memory_list, 'disk_list': disk_list, } return render(request, 'server_detail.html', context) def record_view(self, request, nid): record_list = models.AssetRecord.objects.filter(server_id=nid) context = {'record_list': record_list} return render(request, 'server_record.html', context)
class UserInfoHandler(PermissionHandler, StarkHandler): """ stark配置:员工表(用户表) """ def get_model_form_class(self, is_add, request, pk, *args, **kwargs): """ 获取自定义ModelForm :param is_add: :param request: :param pk: :return: """ if is_add: return UserInfoAddModelForm return UserInfoChangeModelForm def display_reset_pwd(self, obj=None, is_header=None, *args, **kwargs): """ 自定义的重置密码显示列 :param obj: 要重置密码的记录对象 :param is_header: 是否是表头 :return: """ if is_header: return '密码' reset_url = self.reverse_commons_url(self.get_url_name('reset_pwd'), pk=obj.pk) return mark_safe("<a href='%s'>重置</a>" % reset_url) # 页面显示列:复选框|姓名|员工昵称|性别|手机号|邮箱|部门|重置密码|默认编辑删除操作 list_display = [ StarkHandler.display_checkbox, 'name', 'nickname', get_choice_text('性别', 'gender'), 'phone', 'email', 'depart', display_reset_pwd, ] # 允许的条件搜索范围:昵称|姓名|邮箱|手机 search_list = ['nickname__contains', 'name__contains', 'email__contains', 'phone__contains'] # 允许的组合搜索条件:性别|部门 search_group = [ Option('gender', ), Option('depart', is_multi=True, db_condition={'id__gt': 0}) ] # 允许的批量操作:删除 action_list = [StarkHandler.action_multi_delete, ] def reset_password(self, request, pk): """ 视图函数:重置密码 :param request: :param pk: :return: """ userinfo_object = models.UserInfo.objects.filter(id=pk).first() if not userinfo_object: return HttpResponse('用户不存在,无法进行密码重置!') if request.method == 'GET': form = ResetPasswordForm() return render(request, 'stark/edit.html', {'form': form}) form = ResetPasswordForm(data=request.POST) if form.is_valid(): userinfo_object.password = form.cleaned_data['password'] userinfo_object.save() return redirect(self.memory_reverse()) return render(request, 'stark/edit.html', {'form': form}) def extra_urls(self): """ 预留钩子:新增URL :return: """ patterns = [ re_path(r'^reset/password/(?P<pk>\d+)/$', self.wrapper(self.reset_password), name=self.get_url_name('reset_pwd')), ] return patterns
class PrivateCustomerConfig(StarkConfig): def display_follow(self, row=None, header=False): if header: return '跟进记录' url = reverse("stark:crm_consultrecord_pri_changelist") return mark_safe("<a href='%s?cid=%s'>跟进记录</a>" % ( url, row.pk, )) list_display = [ 'name', 'qq', get_choice_text('status', '状态'), get_choice_text('gender', '性别'), get_choice_text('source', '来源'), display_follow ] order_by = [ '-id', ] search_list = ['name', 'qq'] list_filter = [ Option('status', is_choice=True, text_func=lambda x: x[1]), Option('gender', is_choice=True, text_func=lambda x: x[1]), ] model_form_class = PriModelForm def multi_remove(self, request): """ 申请客户 :param request: :return: """ id_list = request.POST.getlist('pk') # [1,2] current_user_id = 1 # 以后要改成去session中获取当前登陆用户ID models.Customer.objects.filter( id__in=id_list, status=2, consultant_id=current_user_id).update(consultant=None) multi_remove.text = "移除客户" action_list = [ multi_remove, ] def get_list_display(self): val = super().get_list_display() val.remove(StarkConfig.display_del) val.insert(0, StarkConfig.display_checkbox) return val def get_queryset(self): current_user_id = 1 # 以后要改成去session中获取当前登陆用户ID return self.model_class.objects.filter(consultant_id=current_user_id) def save(self, form, modify=False): current_user_id = 1 # 以后要改成去session中获取当前登陆用户ID form.instance.consultant = models.UserInfo.objects.get( id=current_user_id) return form.save()
class K8sIngress_list_Config_Admin(StarkConfig): model_form_class = K8sIngressesForm script_state_add = False # 添加post请求时,是否触发脚本 script_state_delete = False # 删除delete请求时,是否触发脚本 script_state_change = True # 修改put请求时,是否触发脚本 # 删除数据 判断字段状态 是否可以删除 deletefieldcheckjudge = { "publish_status_id": "2" } # ,"hostname":"testcommon002" def hookscript_change(self, *args, **kwargs): pk = kwargs.get('pk') # k8singresses_obj = self.model_class.objects.filter(pk=pk).first() # postcontent = self.request.POST.get('content') publish_id = self.request.POST.get('publish_id') # 获取数据中 旧的url,用于 celery 脚本 中,新旧url判断 # old_db_urlpath = str(k8singresses_obj.urlpath).replace(" ","") # print('conftype_id',conftype_id) if str(publish_id) == "1": # 发布执行动作 # 执行异步脚本 ,configcontentormobj=connobj kubernetes_ingresses.delay(pk=pk, ) print('kubernetes_ingresses.delay(pk=pk)') logger.debug( 'pk:%s publish_id:%s content:execute,async,kubernetes_ingresses' % ( pk, publish_id, )) logger.debug('pk:%s publish_id:%s content:unexecuted,async' % (pk, publish_id)) # if str(publish_id) == "2": # 不发布执行动作 # # postcontent:提交配置内容 # kubernetes_configmaps.delay(postcontent=postcontent,pk=pk) # post请求进来数据,传给异步脚本 # url = reverse('stark:repository_k8sresourcecontroller_changelist') # return '%s?configmaprelation=%s' %(url,pk) def get_list_display(self): ''' 自动判断是否有编辑删除权限的显示 :return: ''' val = super().get_list_display() permission_dict = self.request.session.get( settings.PERMISSION_SESSION_KEY) edit_name = "%s:%s" % ( self.site.namespace, self.get_change_url_name, ) del_name = "%s:%s" % ( self.site.namespace, self.get_del_url_name, ) if edit_name not in permission_dict: val.remove(StarkConfig.display_edit) val.remove(StarkConfig.display_checkbox) if del_name not in permission_dict: val.remove(StarkConfig.display_del) if edit_name in permission_dict and del_name in permission_dict: val.remove(StarkConfig.display_edit) val.remove(StarkConfig.display_del) val.append(StarkConfig.display_edit_del) return val def get_action_list(self): ''' 根据权限是否隐藏批量执行按钮 ''' val = super().get_action_list() # print(val) permission_dict = self.request.session.get( settings.PERMISSION_SESSION_KEY) del_name = "%s:%s" % ( self.site.namespace, self.get_del_url_name, ) if del_name not in permission_dict: val.remove(StarkConfig.multi_delete) return val def get_add_btn(self): name = "%s:%s" % ( self.site.namespace, self.get_add_url_name, ) permission_dict = self.request.session.get( settings.PERMISSION_SESSION_KEY) if name in permission_dict: return super().get_add_btn() def display_create_at_date(self, row=None, header=False): if header: return '创建时间' return row.create_at.strftime('%Y-%m-%d') def display_latest_date_date(self, row=None, header=False): if header: return '修改时间' return row.latest_date.strftime('%Y-%m-%d') # 生成表格信息 list_display = [ get_choice_text('publish_id', '发布'), get_choice_text('ingress_id', 'serviceName'), 'title', 'content', "notes", # 备注 'change_user', # 修改用户 display_create_at_date, # 创建时间 display_latest_date_date, # 修改时间 get_choice_text('publish_status_id', '发布状态'), 'task_status', ] # 搜索条件 search_list = [ "title", ] # 组合搜索按钮 # condition 额外的查询条件 # field 表的字段名称 # is_choice True代表是choice选项 # is_multi True代表M2M多对多 # text_func 按钮文本显示 默认显示ORM中的__str__ 默认x传入的ORM对象数据 # value_func url中GET得参数-默认是表的主键 默认x传入的ORM对象数据 list_filter = [ # Option(field='os_platform', is_choice=False,is_multi=False,text_func=lambda x:x.os_platform,value_func=lambda x:x.os_platform), # Option(field='os_version' ,is_choice=False,is_multi=False,value_func=lambda x:x.os_version ,text_func=lambda x:x.os_version), Option(field='publish_status_id', is_choice=True, is_multi=False, text_func=lambda x: x[1]), # Option(field='environment_id', is_choice=True, is_multi=False, text_func=lambda x: x[1] + "环境"), ] action_list = [StarkConfig.multi_delete]
class PublicCustomerHandler(PermissionHandler, StarkHandler): """ stark配置:客户表(公有) """ # 获取自定义ModelForm model_form_class = PublicCustomerModelForm def display_record(self, obj=None, is_header=None, *args, **kwargs): """ 自定义跟进记录显示列 :param obj: 选则的客户对象 :param is_header: :return: """ if is_header: return '跟进记录' record_url = self.reverse_commons_url(self.get_url_name('record_view'), pk=obj.pk) return mark_safe('<a class="text-info" href="%s">查看</a>' % record_url) # 页面显示列:复选框|姓名|联系方式|咨询课程|状态|跟进记录 list_display = [ StarkHandler.display_checkbox, 'name', 'qq', get_m2m_text('咨询课程', 'course'), get_choice_text('状态', 'status'), display_record, ] def extra_urls(self): """ 预留钩子:新增URL :return: """ patterns = [ re_path(r'^record/(?P<pk>\d+)/$', self.wrapper(self.record_view), name=self.get_url_name('record_view')), ] return patterns def get_queryset(self, request, *args, **kwargs): """ 预留钩子:获取没有课程顾问的客户(公有客户) :param request: :param args: :param kwargs: :return: """ return self.model_class.objects.filter(consultant__isnull=True) def record_view(self, request, pk): """ 视图函数:查看跟进记录 :param request: :param pk: 要查看的客户的id :return: """ record_list = models.ConsultRecord.objects.filter(customer_id=pk) return render(request, 'record_view.html', {'record_list': record_list}) def action_multi_apply(self, request, *args, **kwargs): """ 批量操作:公户到私户 :param request: :param args: :param kwargs: :return: """ current_user_id = request.session['user_info']['id'] pk_list = request.POST.getlist('pk') # 私户个数限制 private_customer_count = models.Customer.objects.filter(consultant_id=current_user_id, status=2).count() if (private_customer_count + len(pk_list)) > models.Customer.MAX_PRIVATE_CUSTOMER_COUNT: return HttpResponse('做人不要太贪心,私户中已有%s个客户,最多还能申请%s' % ( private_customer_count, models.Customer.MAX_PRIVATE_CUSTOMER_COUNT - private_customer_count)) # 数据库中加锁 flag = False with transaction.atomic(): # 事务 # 在数据库中加锁,销售选定的客户中有已报名的、或被其他销售抢先的,则不允许添加 origin_queryset = models.Customer.objects.filter(id__in=pk_list, status=2, consultant__isnull=True).select_for_update() if len(origin_queryset) == len(pk_list): models.Customer.objects.filter(id__in=pk_list, status=2, consultant__isnull=True).update(consultant_id=current_user_id) flag = True if flag: # 添加成功刷新页面 return redirect(self.memory_reverse()) else: return HttpResponse('手速太慢了,选中的客户已被其他人申请,请重新选择') action_multi_apply.text = "添加到私户" # 批量操作:删除|公户到私户 action_list = [StarkHandler.action_multi_delete, action_multi_apply, ]
class K8sConfigmap_list_Config_Admin(StarkConfig): model_form_class = K8sConfigmapForm script_state_add = False # 添加post请求时,是否触发脚本 script_state_delete = False # 删除delete请求时,是否触发脚本 script_state_change = True # 修改put请求时,是否触发脚本 # 删除数据 判断字段状态 是否可以删除 deletefieldcheckjudge = { "publish_status_id": "2" } # ,"hostname":"testcommon002" def hookscript_change(self, *args, **kwargs): pk = kwargs.get('pk') # postcontent = self.request.POST.get('content') publish_id = self.request.POST.get('publish_id') conftype_id = self.request.POST.get("conftype_id") print('conftype_id', conftype_id) if str(publish_id) == "1": # 发布执行动作 kubernetes_configmaps.delay(pk=pk) # post请求进来数据,传给异步脚本 logger.debug( 'pk:%s publish_id:%s content:execute,async,kubernetes_configmaps' % (pk, publish_id)) logger.debug('pk:%s publish_id:%s content:unexecuted,async' % (pk, publish_id)) if str(publish_id) == "2": # 不发布执行动作 return None # 返回空 stark 组件不会执行 跳转任务 url = reverse('stark:repository_k8sresourcecontroller_changelist') return '%s?configmaprelation=%s' % (url, pk) def get_list_display(self): ''' 自动判断是否有编辑删除权限的显示 :return: ''' val = super().get_list_display() permission_dict = self.request.session.get( settings.PERMISSION_SESSION_KEY) edit_name = "%s:%s" % ( self.site.namespace, self.get_change_url_name, ) del_name = "%s:%s" % ( self.site.namespace, self.get_del_url_name, ) if edit_name not in permission_dict: val.remove(StarkConfig.display_edit) val.remove(StarkConfig.display_checkbox) if del_name not in permission_dict: val.remove(StarkConfig.display_del) if edit_name in permission_dict and del_name in permission_dict: val.remove(StarkConfig.display_edit) val.remove(StarkConfig.display_del) val.append(StarkConfig.display_edit_del) return val def get_action_list(self): ''' 根据权限是否隐藏批量执行按钮 ''' val = super().get_action_list() # print(val) permission_dict = self.request.session.get( settings.PERMISSION_SESSION_KEY) del_name = "%s:%s" % ( self.site.namespace, self.get_del_url_name, ) if del_name not in permission_dict: val.remove(StarkConfig.multi_delete) return val def get_add_btn(self): name = "%s:%s" % ( self.site.namespace, self.get_add_url_name, ) permission_dict = self.request.session.get( settings.PERMISSION_SESSION_KEY) if name in permission_dict: return super().get_add_btn() def display_create_at_date(self, row=None, header=False): if header: return '创建时间' return row.create_at.strftime('%Y-%m-%d') def display_latest_date_date(self, row=None, header=False): if header: return '修改时间' return row.latest_date.strftime('%Y-%m-%d') # 多对多 # def display_configrelation(self, row=None, header=False): # if header: # return "更新设置" # configrelation = row.configrelation.all() # class_name_list = [ "%s" %(row.title) for row in configrelation] # return ','.join(class_name_list) # 生成表格信息 list_display = [ get_choice_text('publish_id', '发布'), 'title', 'content', "notes", 'change_user', # 修改用户 display_create_at_date, # 创建时间 display_latest_date_date, # 修改时间 get_choice_text('publish_status_id', '发布状态'), 'task_status', ] # 搜索条件 search_list = [ "title", ] # 组合搜索按钮 # condition 额外的查询条件 # field 表的字段名称 # is_choice True代表是choice选项 # is_multi True代表M2M多对多 # text_func 按钮文本显示 默认显示ORM中的__str__ 默认x传入的ORM对象数据 # value_func url中GET得参数-默认是表的主键 默认x传入的ORM对象数据 list_filter = [ # Option(field='os_platform', is_choice=False,is_multi=False,text_func=lambda x:x.os_platform,value_func=lambda x:x.os_platform), # Option(field='os_version' ,is_choice=False,is_multi=False,value_func=lambda x:x.os_version ,text_func=lambda x:x.os_version), Option(field='publish_status_id', is_choice=True, is_multi=False, text_func=lambda x: x[1]), ] action_list = [StarkConfig.multi_delete]
class K8sResourcecontroller_list_Config(StarkConfig): model_form_class = K8sResourcecontrollerForm script_state_add = False # 添加post请求时,是否触发脚本 script_state_delete = False # 删除delete请求时,是否触发脚本 script_state_change = True # 修改put请求时,是否触发脚本 # 删除数据 判断字段状态 是否可以删除 deletefieldcheckjudge = {"publish_status_id":"2"} # ,"hostname":"testcommon002" def hookscript_change(self, *args, **kwargs): pk = kwargs.get('pk') # postcontent = self.request.POST.get('content') publish_id = self.request.POST.get('publish_id') # configrelation = self.request.POST.getlist('configrelation') print('publish_id', publish_id) if str(publish_id) == "不执行": # 发布执行动作---为想好怎么操作控制器,所以不执行脚本 # 执行异步脚本 ,configcontentormobj=connobj # kubernetes_configmaps.delay(pk=pk) # post请求进来数据,传给异步脚本 logger.debug( 'pk:%s publish_id:%s content:execute,async,kubernetes_configmaps' % (pk, publish_id)) logger.debug('pk:%s publish_id:%s content:unexecuted,async' % (pk, publish_id)) def get_list_display(self): ''' 自动判断是否有编辑删除权限的显示 :return: ''' val = super().get_list_display() permission_dict = self.request.session.get(settings.PERMISSION_SESSION_KEY) edit_name = "%s:%s" % (self.site.namespace, self.get_change_url_name,) del_name = "%s:%s" % (self.site.namespace, self.get_del_url_name,) if edit_name not in permission_dict: val.remove(StarkConfig.display_edit) val.remove(StarkConfig.display_checkbox) if del_name not in permission_dict: val.remove(StarkConfig.display_del) if edit_name in permission_dict and del_name in permission_dict: val.remove(StarkConfig.display_edit) val.remove(StarkConfig.display_del) val.append(StarkConfig.display_edit_del) return val def get_action_list(self): ''' 根据权限是否隐藏批量执行按钮 ''' val = super().get_action_list() # print(val) permission_dict = self.request.session.get(settings.PERMISSION_SESSION_KEY) del_name = "%s:%s" % (self.site.namespace, self.get_del_url_name,) if del_name not in permission_dict: val.remove(StarkConfig.multi_delete) return val def get_add_btn(self): name = "%s:%s" % (self.site.namespace, self.get_add_url_name,) permission_dict = self.request.session.get(settings.PERMISSION_SESSION_KEY) if name in permission_dict: return super().get_add_btn() def display_create_at_date(self, row=None, header=False): if header: return '创建时间' return row.create_at.strftime('%Y-%m-%d') def display_latest_date_date(self, row=None, header=False): if header: return '修改时间' return row.latest_date.strftime('%Y-%m-%d') def display_configmaprelation(self, row=None, header=False): ''' 多对多关系表展示 ''' if header: return "关联configmap" configmaprelation = row.configmaprelation.all() class_name_list = ["%s" % (row.title) for row in configmaprelation] return ','.join(class_name_list) # 生成表格信息 list_display = [ get_choice_text('publish_id', '发布'), get_choice_text('conftype_id', '配置类型'), 'title', 'content', "notes", 'change_user', # 修改用户 display_configmaprelation, # 关联的configmap display_create_at_date, # 创建时间 display_latest_date_date, # 修改时间 get_choice_text('publish_status_id', '发布状态'), ] # 搜索条件 search_list = ["title", ] # 组合搜索按钮 # condition 额外的查询条件 # field 表的字段名称 # is_choice True代表是choice选项 # is_multi True代表M2M多对多 # text_func 按钮文本显示 默认显示ORM中的__str__ 默认x传入的ORM对象数据 # value_func url中GET得参数-默认是表的主键 默认x传入的ORM对象数据 list_filter = [ # Option(field='os_platform', is_choice=False,is_multi=False,text_func=lambda x:x.os_platform,value_func=lambda x:x.os_platform), # Option(field='os_version' ,is_choice=False,is_multi=False,value_func=lambda x:x.os_version ,text_func=lambda x:x.os_version), Option(field='publish_status_id', is_choice=True, is_multi=False, text_func=lambda x: x[1]), Option(field='configmaprelation', is_choice=False, is_multi=True, is_show=False), # 不显示-用来 configcenter 配置文件管理的 关联 控制器 ] # 自定义批量执行 def multi_restart(self, request): """ 批量执行重启控制器 :param request: :return: """ id_list = request.POST.getlist('pk') # [1,2] kubernetes_restart_resource_controller.delay(pk_list=id_list) multi_restart.text = "重启控制器Pod" # 批量执行动作按钮添加 action_list = [StarkConfig.multi_delete, multi_restart]
class PrivateCustomerHandler(PermissionHandler, StarkHandler): """ stark配置:客户表(私有) """ # 获取自定义ModelForm model_form_class = PrivateCustomerModelForm def display_record(self, obj=None, is_header=None, *args, **kwargs): """ 自定义跟进记录显示列 :param obj: 选择的客户对象 :param is_header: :return: """ if is_header: return '跟进记录' record_url = reverse('stark:web_consultrecord_list', kwargs={'customer_id': obj.pk}) return mark_safe('<a href="%s">管理</a>' % record_url) def display_pay_record(self, obj=None, is_header=None, *args, **kwargs): """ 自定义缴费显示列 :param obj: :param is_header: :param args: :param kwargs: :return: """ if is_header: return '缴费' record_url = reverse('stark:web_paymentrecord_list', kwargs={'customer_id': obj.pk}) return mark_safe('<a href="%s">管理</a>' % record_url) # 页面显示列:复选框|姓名|联系方式|咨询课程|状态|跟进记录|缴费 list_display = [ StarkHandler.display_checkbox, 'name', 'qq', get_m2m_text('咨询课程', 'course'), get_choice_text('状态', 'status'), display_record, display_pay_record, ] def get_queryset(self, request, *args, **kwargs): """ 预留钩子:获取当前用户的私有客户 :param request: :param args: :param kwargs: :return: """ current_user_id = request.session['user_info']['id'] return self.model_class.objects.filter(consultant_id=current_user_id) def save(self, request, form, is_update, *args, **kwargs): """ 钩子方法:保存前设置默认课程顾问为当前登录用户 :param request: :param form: :param is_update: :param args: :param kwargs: :return: """ if not is_update: current_user_id = request.session['user_info']['id'] form.instance.consultant_id = current_user_id form.save() def action_multi_remove(self, request, *args, **kwargs): """ 批量操作:私户到公户 :return: """ current_user_id = request.session['user_info']['id'] pk_list = request.POST.getlist('pk') self.model_class.objects.filter( id__in=pk_list, consultant_id=current_user_id).update(consultant=None) return redirect(self.memory_reverse(*args, **kwargs)) action_multi_remove.text = "移除到公户" # 批量操作:删除|私户到公户 action_list = [StarkHandler.action_multi_delete, action_multi_remove]