Exemple #1
0
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
Exemple #2
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])
    ]
Exemple #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"]
Exemple #4
0
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)
    ]  # 配置
Exemple #5
0
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),
    ]
Exemple #6
0
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'),
    ]
Exemple #7
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')
    ]
Exemple #8
0
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
Exemple #9
0
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列表内存连接跳转
    ]
Exemple #10
0
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列表内存连接跳转
    ]
Exemple #11
0
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,
    ]
Exemple #12
0
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),
    ]
Exemple #13
0
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)))
    ]
Exemple #14
0
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])
    ]
Exemple #15
0
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列表内存连接跳转
    ]
Exemple #16
0
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
Exemple #18
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]
Exemple #19
0
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]
Exemple #20
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]
Exemple #21
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]
Exemple #22
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()
Exemple #23
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)
Exemple #24
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 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]
Exemple #26
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)
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]
Exemple #28
0
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'),
    ]
Exemple #30
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]