class ClassListHandler(StarkConfig): def display_course(self, row=None, header=None): if header: return '班级' return "%s %s期" % ( row.course.name, row.semester, ) def display_course_record(self, obj=None, is_header=None, *args, **kwargs): if is_header: return '上课记录' record_url = reverse('stark:web_courserecord_list', kwargs={'class_id': obj.pk}) return mark_safe('<a target="_blank" href="%s">上课记录</a>' % record_url) list_display = [ 'school', display_course, 'price', get_datetime_text('开班日期', 'start_date'), 'tutor', get_m2m_text('任课老师', 'teachers'), display_course_record ] list_filter = [ Option('school'), Option('course'), ] model_form_class = ClassListModelForm
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 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 DepartConfig(StarkConfig): # 这里我们把编辑和删除写在了一起 list_display = [ StarkConfig.display_checkbox, 'id', 'name', 'tel', 'user', StarkConfig.display_edit_del ] model_form_class = DepartModelForm # 预留的一个钩子,自己定义下拉初始化内容 def multi_init(self, request): """ 自定义初始化内容 """ pass multi_init.text = "初始化" # multi_delete是后台创建的一个批量删除的函数 action_list = [multi_init, StarkConfig.multi_delete] # 可以查询的字段,关键字搜索 search_list = ['name', 'tel', 'user__title'] list_filter = [ # DistinctNameOption('name',condition={'id__gt':9},value_func=lambda x:x[0],text_func=lambda x:x[0],), Option('level', is_choice=True, text_func=lambda x: x[1]), Option('user', text_func=lambda x: x.title, is_multi=True), # Option('tel',text_func=lambda x:x.tel), Option('proj', is_multi=True) ] # 配置
class ClassListConfig(StarkConfig): def display_title(self, row=None, header=False): if header: return '班级' return "%s-%s期" % (row.course.name, row.semester) def display_start_date(self, row=None, header=False): if header: return '开班日期' return row.start_date.strftime('%Y-%m-%d') list_display = [ 'id', display_title, 'school', display_start_date, StarkConfig.display_edit, StarkConfig.display_del ] list_filter = [ Option(field='school', is_choice=False, is_multi=False, text_func=lambda x: x.title, value_func=lambda x: x.pk), Option(field='course', is_choice=False, is_multi=False, text_func=lambda x: x.name, value_func=lambda x: x.pk), ]
class ClasslistConfig(StarkConfig): def display_semester_title(self, row=None, isHeader=False): """ :param row: :param isHeader: :return: """ if isHeader: return '班级' return '%s-%s期' % (row.course.name, row.semester) def display_start_date(self, row=None, isHeader=False): if isHeader: return '开班日期' return row.start_date.strftime('%Y-%m-%d') list_display = [ 'id', display_semester_title, 'school', display_start_date, StarkConfig.display_del_edit ] filter_list = [ Option(field='school'), Option(field='course'), ]
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 UserInfoHandler(StarkConfig): def display_reset_pwd(self, row=None, header=None): if header: return '重置密码' reset_url = self.reverse_commons_url(self.get_url_name('reset_pwd'), pk=row.pk) return mark_safe("<a href='%s'>重置密码</a>" % reset_url) list_display = [ 'nickname', 'gender', 'phone', 'email', 'depart', display_reset_pwd ] search_list = ['nickname', 'name'] list_filter = [ Option(field='gender', is_choice=True), Option(field='depart'), ] def get_model_form_class(self, is_add, request, pk, *args, **kwargs): if is_add: return UserInfoAddModelForm return UserInfoChangeModelForm 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/change.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.reverse_list_url()) return render(request, 'stark/change.html', {'form': form}) def extra_urls(self): patterns = [ url(r'^reset/password/(?P<pk>\d+)/$', self.wrapper(self.reset_password), name=self.get_url_name('reset_pwd')), ] return patterns
class NIC_list_Config(StarkConfig): # 生成表格信息 list_display = [ "server_obj", 'name', "hwaddr", "netmask", "ipaddrs", "up", ] # 搜索条件 search_list = ["slot", "model", "capacity", "pd_type"] # 组合搜索按钮 # condition 额外的查询条件 # field 表的字段名称 # is_choice True代表是choice选项 # is_multi True代表M2M多对多 -多选 # text_func 按钮文本显示 默认显示ORM中的__str__ 默认x传入的ORM对象数据 # value_func url中GET得参数-默认是表的主键 默认x传入的ORM对象数据 list_filter = [ # text_func=lambda x:x.server_obj,value_func=lambda x:x.server_obj Option(field='server_obj', is_choice=False, is_multi=False, is_show=False), # 不显示-用来Server列表内存连接跳转 ]
class Memory_list_Config(StarkConfig): # def display_memory_record(self, row=None, header=False): # 自定表格头部 # if header: # return "内存信息" # # url = reverse('stark:crm_studyrecord_changelist') # print(row,type(row)) # print(row._meta.get_field("idc").verbose_name) # print(row.idc) # memory_sum = sum([int(i.capacity) for i in row.memory.all()]) # print(memory_sum) # return mark_safe("<a href='/%s?ccid=%s'>%sMB-查看</a>" %("2123/sadasd",row.pk,memory_sum)) # 生成表格信息 list_display = [ 'capacity', 'speed', 'server_obj', ] # 搜索条件 search_list = ["capacity"] # 组合搜索按钮 # condition 额外的查询条件 # field 表的字段名称 # is_choice True代表是choice选项 # is_multi True代表M2M多对多 -多选 # text_func 按钮文本显示 默认显示ORM中的__str__ 默认x传入的ORM对象数据 # value_func url中GET得参数-默认是表的主键 默认x传入的ORM对象数据 list_filter = [ # ,text_func=lambda x:x.server_obj,value_func=lambda x:x.server_obj Option(field='server_obj', is_choice=False, is_multi=False, is_show=False), # 不显示-用来Server列表内存连接跳转 ]
class MaterialCofig(StarkConfig): #复选框 list_display = [ StarkConfig.display_checkbox, 'id', 'name', 'amount', 'update_data', 'storage', 'pos', 'cls' ] list_filter = [ Option('storage', is_multi=True), Option('pos', is_multi=True), Option('cls', is_multi=True), ] search_list = ['name'] #批量删除 action_list = [ StarkConfig.multi_delete, ]
class CityConfig(StarkConfig): order_by = ['city'] search_list = ['city'] action_list = [StarkConfig.multi_delete] list_display = ['city'] list_filter = [ Option(field='prov', is_choice=False, is_multi=True, text_func=lambda x: x.province, value_func=lambda x: x.pk), ]
class StudentHandler(StarkConfig): model_form_class = StudentModelForm def display_score(self, obj=None, is_header=None, *args, **kwargs): if is_header: return '积分管理' 'web_scorerecord_list' record_url = reverse('stark:web_scorerecord_list', kwargs={'student_id': obj.pk}) return mark_safe('<a target="_blank" href="%s">%s</a>' % (record_url, obj.score)) list_display = [ 'customer', 'qq', 'mobile', 'emergency_contract', get_m2m_text('已报班级', 'class_list'), display_score, 'student_status' ] def get_add_btn(self, request, *args, **kwargs): return None def get_list_display(self): value = [] if self.list_display: value.extend(self.list_display) value.append(type(self).display_edit) return value def get_urls(self): patterns = [ url(r'^list/$', self.wrapper(self.change_view), name=self.get_list_url_name), # url(r'^add/$', self.wrapper(self.add_view), name=self.get_add_url_name), url(r'^change/(?P<pk>\d+)/$', self.wrapper(self.change_view), name=self.get_edit_url_name), # url(r'^delete/(?P<pk>\d+)/$', self.wrapper(self.delete_view), name=self.get_delete_url_name), ] patterns.extend(self.extra_urls()) return patterns search_list = [ 'customer__name', 'qq', 'mobile', ] list_filter = [ Option('class_list', text_func=lambda x: '%s-%s' % (x.school.title, str(x))) ]
class CustomerConfig(StarkConfig): # 跟进记录 def display_follow(self, row=None, isHeader=False): """ 跟进记录 :param row: :param isHeader: :return: """ if isHeader: return '跟进记录' url = reverse('stark:crm_consultrecord_changelist') return mark_safe('<a href="%s?cid=%s">跟进记录</a>' % (url, row.pk)) list_display = [ 'name', 'qq', get_chioce_text('状态', 'status'), get_chioce_text('性别', 'gender'), get_chioce_text('客户来源', 'source'), display_follow, ] order_by = ['-id'] # -id 是时间的倒叙 search_list = ['name'] filter_list = [ DistinctNameOption('name', condition={'id__gt': 9}, value_func=lambda x: x[0], text_func=lambda x: x[0]), Option('status', isChoice=True, text_func=lambda x: x[1]), Option('source', isChoice=True, text_func=lambda x: x[1]), Option('gender', isChoice=True, text_func=lambda x: x[1]) ]
class Cpu_list_Config(StarkConfig): # 生成表格信息 list_display = ['health', "model", "cpu_count", "cpu_physical_count", "server_obj"] # 搜索条件 search_list = ["health","model"] # 组合搜索按钮 # condition 额外的查询条件 # field 表的字段名称 # is_choice True代表是choice选项 # is_multi True代表M2M多对多 -多选 # text_func 按钮文本显示 默认显示ORM中的__str__ 默认x传入的ORM对象数据 # value_func url中GET得参数-默认是表的主键 默认x传入的ORM对象数据 list_filter = [ # text_func=lambda x:x.server_obj,value_func=lambda x:x.server_obj Option(field='server_obj', is_choice=False,is_multi=False,is_show=False), # 不显示-用来Server列表内存连接跳转 ]
class ServerConfig(StarkConfig): model_form_class = ServerModelForm def server_detail(self, request, pk): server_disks = models.Disk.objects.filter( server_id=pk).order_by('slot') server_memorys = models.Memory.objects.filter( server_id=pk).order_by('slot') server_nics = models.NIC.objects.filter(server_id=pk) return render( request, 'server/server_detail.html', { 'server_disks': server_disks, 'server_memory': server_memorys, 'server_nics': server_nics }) def server_record(self, request, pk): server_records = models.AssetRecord.objects.filter( server_id=pk).order_by('-create_at') return render(request, 'server/server_record.html', {'server_records': server_records}) def extra_url(self, header=None, row=None): from django.conf.urls import url urlpatterns = [ url(r'^server_detail/(\d+)/', self.server_detail), url(r'^server_record/(\d+)/', self.server_record), ] return urlpatterns def show_detail(self, header=None, row=None): if header: return '查看详情' return mark_safe( '<a href="/stark/api/server/server_detail/{}">查看</a>'.format( row.pk)) # 通过跳转页面展示 def show_records(self, header=None, row=None): if header: return '历史变更记录' return mark_safe( '<a href="/stark/api/server/server_record/{}">查看</a>'.format( row.pk)) # 通过跳转页面展示 def show_status(self, header=None, row=None): if header: return '主机状态' color_dict = {1: 'green', 2: 'blue', 3: 'red', 4: 'yellow'} return mark_safe( '<span style="background-color: {};color:white;padding: 2px">{}</span>' .format(color_dict.get(row.device_status_id), row.get_device_status_id_display())) list_display = [ StarkConfig.display_checkbox, 'id', 'hostname', show_status, 'os_platform', 'os_version', 'idc', show_detail, show_records ] search_list = ['hostname', 'os_version', 'idc__name'] list_filter = [ Option('business_unit', is_multi=True, condition={'pk__in': [1.3]}), Option('device_status_id', is_choice=True, text_func=lambda x: x[1], value_func=lambda x: x[0]) ] action_list = [StarkConfig.multi_delete]
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 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 PubliscCustomerConfig(StarkConfig): # 跟进记录 def display_follow(self, row=None, isHeader=False): """ 跟进记录 :param row: :param isHeader: :return: """ if isHeader: return '跟进记录' url = reverse('stark:crm_consultrecord_pub_changelist') return mark_safe('<a href="%s?cid=%s">跟进记录</a>' % (url, row.pk)) list_display = [ 'name', 'qq', get_chioce_text('状态', 'status'), get_chioce_text('性别', 'gender'), get_chioce_text('客户来源', 'source'), display_follow, ] order_by = ['-id'] # -id 是时间的倒叙 search_list = ['name'] filter_list = [ Option('status', isChoice=True, text_func=lambda x: x[1]), Option('source', isChoice=True, text_func=lambda x: x[1]), Option('gender', isChoice=True, text_func=lambda x: x[1]) ] model_form_class = PubModelForm def get_queryset(self): return self.model_class.objects.filter(consultant__isnull=True) # 获取定义表头的显示 def get_list_display(self): val = [] val.extend(self.list_display) val.append(StarkConfig.display_edit) # 不能用self val.insert(0, StarkConfig.display_checkbox) # val=super().get_list_display() # val.remove(StarkConfig.display_del) return val # 申请客户 def multi_apply(self, request): """ 申请客户 :param request: :return: """ current_user_id = 1 id_list = request.POST.getlist('pk') 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(): # select_for_update上锁 origin = models.Customer.objects.filter( id__in=id_list, consultant__isnull=True).select_for_update() if origin.count() == len(id_list): models.Customer.objects.filter(id__in=id_list).update( consultant=current_user_id) flag = True if not flag: return HttpResponse('已被申请') multi_apply.text = '申请客户' action_list = [multi_apply]
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 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 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 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 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 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 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 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 PrivateCustomerConfig(StarkConfig): # 跟进记录 def display_follow(self, row=None, isHeader=False): """ 跟进记录 :param row: :param isHeader: :return: """ if isHeader: 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_chioce_text('状态', 'status'), get_chioce_text('性别', 'gender'), get_chioce_text('客户来源', 'source'), display_follow, ] order_by = ['-id'] # -id 是时间的倒叙 search_list = ['name'] filter_list = [ Option('status', isChoice=True, text_func=lambda x: x[1]), Option('source', isChoice=True, text_func=lambda x: x[1]), Option('gender', isChoice=True, text_func=lambda x: x[1]) ] model_form_class = PriModelForm def get_queryset(self): current_user_id = 1 return self.model_class.objects.filter(consultant_id=current_user_id) def save(self, form, modify=False): current_user_id = 1 # instance表示自己当前的对象 form.instance.consultant = models.UserInfo.objects.get( id=current_user_id) return form.save() # 获取定义表头的显示 def get_list_display(self): val = [] val.extend(self.list_display) val.append(StarkConfig.display_edit) # 不能用self val.insert(0, StarkConfig.display_checkbox) # val=super().get_list_display() # val.remove(StarkConfig.display_del) return val # 移除客户 def multi_remove(self, request): id_list = request.POST.getlist('pk') current_user_id = 1 models.Customer.objects.filter(id__in=id_list, consultant_id=current_user_id, status=2).update(consultant=None) multi_remove.text = '移除客户' action_list = [multi_remove]
class ClassListHandler(PermissionHandler, StarkHandler): """ stark配置:班级表 """ # 获取自定义ModelForm model_form_class = ClassListModelForm def display_course(self, obj=None, is_header=None): """ 自定义的班级的显示列 :param obj: 当前记录对象 :param is_header: 是否是表头 :return: """ if is_header: return '班级' return "%s(%s期)" % ( obj.course.name, obj.semester, ) def display_course_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_courserecord_list', kwargs={'class_id': obj.pk}) return mark_safe('<a href="%s">查看</a>' % record_url) # 页面显示列:校区|班级|学费|开班日期|班主任|任课老师|上课记录 list_display = [ 'school', display_course, 'price', get_datetime_text('开班日期', 'start_date'), 'class_teacher', get_m2m_text('任课老师', 'tech_teachers'), ] def get_list_display(self, request, *args, **kwargs): """ 预留钩子:增加自定义的上课记录显示列 :return: """ value = [] if self.list_display: value.extend(self.list_display) value.append(type(self).display_course_record) return value # 允许的组合搜索条件:学校|课程 search_group = [ Option('school'), Option('course'), ]
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]