Example #1
0
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])
    ]
Example #2
0
class UserConfig(RbacPermission, StarkConfig):
    list_display = [
        "id", "username", "name", "phone",
        get_choice_text("gender", "性别"), "email"
    ]

    order_by = ["-id"]
Example #3
0
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"]
Example #4
0
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,
    ]
Example #5
0
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')
    ]
Example #6
0
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']
Example #7
0
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"]
Example #8
0
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]
Example #9
0
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,
    ]
Example #10
0
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]
Example #11
0
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)
Example #12
0
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)
Example #14
0
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]
Example #15
0
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)
Example #16
0
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)))
    ]
Example #17
0
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]
Example #18
0
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)
Example #19
0
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
Example #20
0
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()
Example #21
0
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]
Example #25
0
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]