Esempio n. 1
0
class AccountHandler(PermissionHandler, StartXHandler):
    order_by = ['level', 'id']
    model_form_class = AccountModelForm
    list_display = [
        'username', 'email', 'brief',
        get_field_display('学历', 'education'), 'career',
        get_field_display('用户等级', 'level')
    ]
    search_list = ['username__contains']
Esempio n. 2
0
class CourseHandler(PermissionHandler, StartXHandler):
    model_form_class = CourseModelForm

    list_display = ['title', get_field_display('课程状态', 'status'),
                    get_field_display('课程难度', 'difficult'),
                    get_field_display('付费类型', 'course_type'), 'release_date', 'category',
                    'degree_course']

    # 常见问题

    search_list = ['title__contains']
    search_group = [
        Option('category'),
        Option('degree_course'),

    ]
Esempio n. 3
0
class StaffHandler(PermissionHandler, StartXHandler):
    search_list = ['username__contains', 'realname__contains']
    search_group = [
        Option('gender', is_multi=True),
        Option('depart'),
    ]

    def display_reset_pwd(self, model=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=model.pk)
        return mark_safe("<a href='%s'>重置密码</a>" % reset_url)

    list_display = [
        'username', 'realname',
        get_field_display('性别', 'gender'), 'email', 'phone', 'depart', 'roles',
        display_reset_pwd
    ]

    def get_model_form(self, is_add=False, *args, **kwargs):
        if is_add:
            return StaffAddForm
        return StaffChangeModelForm

    def reset_password(self, request, pk):
        """
        重置密码的视图函数
        :param request:
        :param pk:
        :return:
        """
        staffinfo_object = models.Staffinfo.objects.filter(id=pk).first()
        if not staffinfo_object:
            return HttpResponse('用户不存在,无法进行密码重置!')
        if request.method == 'GET':
            form = ResetPasswordForm()
            return render(request, 'startX/change.html', {'form': form})
        form = ResetPasswordForm(data=request.POST)
        if form.is_valid():
            staffinfo_object.password = form.cleaned_data['password']
            staffinfo_object.save()
            return redirect(self.reverse_list_url())
        return render(request, 'startX/change.html', {'form': form})

    def extra_url(self):
        patterns = [
            re_path(r'^reset/password/(?P<pk>\d+)/$',
                    self.wrapper(self.reset_password),
                    name=self.get_url_name('reset_pwd'))
        ]
        return patterns
Esempio n. 4
0
class PrivateCustomerHandler(PermissionHandler, StartXHandler):
    """
    私户设置
    """

    def display_record(self, model=None, is_header=None, *args, **kwargs):
        if is_header:
            return '跟进记录'
        record_url = reverse('startX:generic_consultrecord_list', kwargs={'customer_id': model.pk})
        return mark_safe('<a target="_blank" href="%s">跟进记录</a>' % record_url)

    def display_pay_record(self, model=None, is_header=None, *args, **kwargs):
        if is_header:
            return '缴费'
        record_url = reverse('startX:generic_paymentrecord_list', kwargs={'customer_id': model.pk})
        return mark_safe('<a target="_blank" href="%s">缴费记录</a>' % record_url)

    def get_model_queryset(self, request, *args, **kwargs):
        current_consultant_id = request.session['staffinfo']['staff_id']
        return self.model_class.objects.filter(consultant_id=current_consultant_id)

    def action_multi_remove(self, request, *args, **kwargs):
        """
        批量将私户客户拉取到公户
        :return:
        """
        pk_list = request.POST.getlist('pk')
        current_consultant_id = request.session['staffinfo']['staff_id']

        self.model_class.objects.filter(consultant_id=current_consultant_id, id__in=pk_list).update(consultant=None)

    action_multi_remove.text = "移除到公户"

    def save(self, request, form, is_update, *args, **kwargs):
        """
        添加数据时,重写save方法,直接保存到当前用户的私户里
        :param request:
        :param form:
        :param is_update:
        :param args:
        :param kwargs:
        :return:
        """
        if not is_update:
            current_consultant_id = request.session['staffinfo']['staff_id']
            form.instance.consultant_id = current_consultant_id
        form.save()

    action_list = [action_multi_remove, ]

    model_form_class = PrivateModelForm

    list_display = [StartXHandler.display_checkbox, 'name', 'qq', get_field_display('报名状态', 'status'),
                    get_m2m_display('咨询课程', 'course'), display_record, display_pay_record]
Esempio n. 5
0
class StudentHandler(PermissionHandler, StartXHandler):
    def display_score(self, model=None, is_header=None, *args, **kwargs):
        if is_header:
            return '积分管理'
        record_url = reverse('startX:generic_scorerecord_list',
                             kwargs={'student_id': model.pk})
        return mark_safe('<a target="_blank" href="%s">%s</a>' %
                         (record_url, model.score))

    list_display = [
        'customer', 'qq', 'mobile', 'emergency_contract',
        get_m2m_display('所报班级', 'classes'), display_score,
        get_field_display('学员状态', 'student_status'), 'memo'
    ]

    def get_add_btn(self, request, *args, **kwargs):
        return

    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钩子函数,主要是覆盖掉默认的url,并设置name别名"""

        patterns = [
            re_path(r'^list/$',
                    self.wrapper(self.changelist),
                    name=self.get_list_name),
            re_path(r'^change/(?P<pk>\d+)/$',
                    self.wrapper(self.change_view),
                    name=self.get_change_name),
        ]
        patterns.extend(self.extra_url())
        return patterns

    search_list = [
        'customer__name__contains',
        'qq__contains',
        'mobile__contains',
    ]
    search_group = [
        Option('classes',
               text_func=lambda x: '%s-%s' % (x.school.title, str(x)))
    ]
Esempio n. 6
0
class CourseLessonHandler(PermissionHandler, StartXHandler):
    def get_urls(self):
        """预留的重新自定义url钩子函数,主要是覆盖掉默认的url,并设置name别名"""

        patterns = [
            re_path(r'^list/(?P<course_chapter_id>\d+)/$',
                    self.wrapper(self.changelist),
                    name=self.get_list_name),
            re_path(r'^add/(?P<course_chapter_id>\d+)/$',
                    self.wrapper(self.add_view),
                    name=self.get_add_name),
            re_path(r'^change/(?P<course_chapter_id>\d+)/(?P<pk>\d+)/$',
                    self.wrapper(self.change_view),
                    name=self.get_change_name),
            re_path(r'^del/(?P<course_chapter_id>\d+)/(?P<pk>\d+)/$',
                    self.wrapper(self.delete_view),
                    name=self.get_del_name),
        ]
        patterns.extend(self.extra_url())
        return patterns

    def display_edit_del(self, model=None, is_header=None, *args, **kwargs):
        if is_header:
            return '操作'
        course_chapter_id = kwargs.get('course_chapter_id')
        tpl = '<a href="%s">编辑</a> <a href="%s">删除</a>' % (
            self.reverse_change_url(pk=model.pk,
                                    course_chapter_id=course_chapter_id),
            self.reverse_delete_url(pk=model.pk,
                                    course_chapter_id=course_chapter_id))
        return mark_safe(tpl)

    def get_model_queryset(self, request, *args, **kwargs):
        course_chapter_id = kwargs.get('course_chapter_id')
        return self.model_class.objects.filter(chapter_id=course_chapter_id)

    list_display = [
        'title', 'order',
        get_field_display('课程顺序', 'course_lesson_type'), 'free_trail',
        'lesson_link'
    ]

    search_list = ['title__contains']
Esempio n. 7
0
class OrderDetailHandler(PermissionHandler, StartXHandler):

    def get_add_btn(self, request, *args, **kwargs):
        return

    def get_urls(self):
        """预留的重新自定义url钩子函数,主要是覆盖掉默认的url,并设置name别名"""

        patterns = [
            re_path(r'^list/(?P<order_id>\d+)/$', self.wrapper(self.changelist), name=self.get_list_name),
            re_path(r'^change/(?P<order_id>\d+)/(?P<pk>\d+)/$', self.wrapper(self.change_view),
                    name=self.get_change_name),

        ]
        patterns.extend(self.extra_url())
        return patterns

    def display_edit(self, model=None, is_header=None, *args, **kwargs):
        if is_header:
            return '操作'
        order_id = kwargs.get('order_id')
        tpl = '<a href="%s">编辑</a>' % self.reverse_change_url(pk=model.pk, order_id=order_id)
        return mark_safe(tpl)

    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_model_queryset(self, request, *args, **kwargs):
        order_id = kwargs.get('order_id')
        return self.model_class.objects.filter(order_id=order_id)

    list_display = [
        'order', 'original_price', 'price', 'valid_period', get_field_display('交易类型', 'transaction_type'),
        'transaction_number', 'product']
Esempio n. 8
0
class StudyRecordHandler(PermissionHandler, StartXHandler):
    def get_urls(self):
        """预留的重新自定义url钩子函数,主要是覆盖掉默认的url,并设置name别名"""

        patterns = [
            re_path(r'^list/(?P<student_id>\d+)/$',
                    self.wrapper(self.changelist),
                    name=self.get_list_name),
            re_path(r'^add/(?P<student_id>\d+)/$',
                    self.wrapper(self.add_view),
                    name=self.get_add_name),
            re_path(r'^change/(?P<student_id>\d+)/(?P<pk>\d+)/$',
                    self.wrapper(self.change_view),
                    name=self.get_change_name),
        ]
        patterns.extend(self.extra_url())
        return patterns

    def display_edit(self, model=None, is_header=None, *args, **kwargs):
        if is_header:
            return '操作'
        student_id = kwargs.get('student_id')
        tpl = '<a href="%s">编辑</a> ' % self.reverse_change_url(
            pk=model.pk, student_id=student_id)
        return mark_safe(tpl)

    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

    list_display = [
        get_m2m_display('课时', 'course_lesson'),
        get_m2m_display('学生', 'student'),
        get_field_display('状态', 'status'),
    ]
Esempio n. 9
0
class CoursePriceHandler(PermissionHandler, StartXHandler):
    model_form_class = CoursePriceModelForm

    def get_urls(self):
        """预留的重新自定义url钩子函数,主要是覆盖掉默认的url,并设置name别名"""

        patterns = [
            re_path(r'^list/(?P<course_id>\d+)/$',
                    self.wrapper(self.changelist),
                    name=self.get_list_name),
            re_path(r'^add/(?P<course_id>\d+)/$',
                    self.wrapper(self.add_view),
                    name=self.get_add_name),
            re_path(r'^change/(?P<course_id>\d+)/(?P<pk>\d+)/$',
                    self.wrapper(self.change_view),
                    name=self.get_change_name),
            re_path(r'^del/(?P<course_id>\d+)/(?P<pk>\d+)/$',
                    self.wrapper(self.delete_view),
                    name=self.get_del_name),
        ]
        patterns.extend(self.extra_url())
        return patterns

    def display_edit_del(self, model=None, is_header=None, *args, **kwargs):
        if is_header:
            return '操作'
        course_id = kwargs.get('course_id')
        tpl = '<a href="%s">编辑</a> <a href="%s">删除</a>' % (
            self.reverse_change_url(pk=model.pk, course_id=course_id),
            self.reverse_delete_url(pk=model.pk, course_id=course_id))
        return mark_safe(tpl)

    def get_model_queryset(self, request, *args, **kwargs):
        course_id = kwargs.get('course_id')
        return self.model_class.objects.filter(object_id=course_id)

    list_display = [
        # get_m2m_display('课程','object_id'),
        'content_type',
        get_field_display('有效期', 'valid_period'),
        'price'
    ]
Esempio n. 10
0
class PayMentHandler(PermissionHandler, StartXHandler):
    list_display = ['customer', get_field_display('缴费类型', 'pay_type'), 'paid_fee', 'classes', 'consultant',
                    get_field_display('状态', 'confirm_status')]
    model_form_class = PaymentRecordModelForm

    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钩子函数,主要是覆盖掉默认的url,并设置name别名"""

        patterns = [
            re_path(r'^list/(?P<customer_id>\d+)/$', self.wrapper(self.changelist), name=self.get_list_name),
            re_path(r'^add/(?P<customer_id>\d+)/$', self.wrapper(self.add_view), name=self.get_add_name),

        ]
        patterns.extend(self.extra_url())
        return patterns

    def get_model_queryset(self, request, *args, **kwargs):
        customer_id = kwargs.get('customer_id')
        current_consultant_id = request.session['staffinfo']['staff_id']
        return self.model_class.objects.filter(customer_id=customer_id, customer__consultant_id=current_consultant_id)

    def get_model_form(self, is_add, request, pk, *args, **kwargs):
        customer_id = kwargs.get('customer_id')
        student_object = models.Student.objects.filter(customer_id=customer_id).exists()
        if not student_object:
            return StudentPaymentRecordModelForm
        return PaymentRecordModelForm

    def save(self, request, form, is_update, *args, **kwargs):
        customer_id = kwargs.get('customer_id')
        current_consultant_id = request.session['staffinfo']['staff_id']

        object_exists = models.Customer.objects.filter(id=customer_id,
                                                       consultant_id=current_consultant_id).exists()
        if not object_exists:
            return HttpResponse('非法操作')
        # 缴费记录
        form.instance.customer_id = customer_id
        form.instance.consultant_id = current_consultant_id
        form.save()

        # 创建学员信息
        classes = form.cleaned_data['classes']
        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.classes.add(classes.id)
        else:
            fetch_student_object.classes.add(classes.id)
Esempio n. 11
0
class StudentHandler(PermissionHandler, StartXHandler):
    order_by = ['id']
    model_form_class = StudentModelForm

    def get_add_btn(self, request, *args, **kwargs):
        return None

    def get_urls(self):
        """预留的重新自定义url钩子函数,主要是覆盖掉默认的url,并设置name别名"""

        patterns = [
            re_path(r'^list/$',
                    self.wrapper(self.changelist),
                    name=self.get_list_name),
            re_path(r'^change/(?P<pk>\d+)/$',
                    self.wrapper(self.change_view),
                    name=self.get_change_name),
        ]
        patterns.extend(self.extra_url())
        return patterns

    def display_study_record(self,
                             model=None,
                             is_header=None,
                             *args,
                             **kwargs):
        if is_header:
            return '学习进度记录'
        record_url = reverse('startX:generic_studyrecord_list',
                             kwargs={'student_id': model.pk})
        return mark_safe('<a target="_blank" href="%s">学习进度记录</a>' %
                         record_url)

    def display_consult_record(self,
                               model=None,
                               is_header=None,
                               *args,
                               **kwargs):
        if is_header:
            return '跟进记录'
        record_url = reverse('startX:generic_consultrecord_list',
                             kwargs={'student_id': model.pk})
        return mark_safe('<a target="_blank" href="%s">跟进记录</a>' % record_url)

    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

    list_display = [
        'account', 'qq', 'mobile', 'emergency_contract', 'score',
        get_field_display('状态', 'student_status'),
        get_m2m_display('已买课程', 'courses'), 'tutor', display_consult_record,
        display_study_record
    ]
Esempio n. 12
0
class HomeworkDetailHandler(PermissionHandler, StartXHandler):
    model_form_class = HomeworkDetailModelForm

    def get_urls(self):
        """预留的重新自定义url钩子函数,主要是覆盖掉默认的url,并设置name别名"""

        patterns = [
            re_path(r'^list/(?P<homework_id>\d+)/$',
                    self.wrapper(self.changelist),
                    name=self.get_list_name),
            re_path(r'^change/(?P<homework_id>\d+)/(?P<pk>\d+)/$',
                    self.wrapper(self.change_view),
                    name=self.get_change_name),
            re_path(r'^del/(?P<homework_id>\d+)/(?P<pk>\d+)/$',
                    self.wrapper(self.delete_view),
                    name=self.get_del_name),
            re_path(r'^download/(?P<pk>\d+)/$',
                    self.wrapper(self.download),
                    name=self.get_url_name('download')),
        ]
        patterns.extend(self.extra_url())
        return patterns

    def display_edit(self, model=None, is_header=None, *args, **kwargs):
        """

        :param model: model即数据库表对象
        :param is_header: 是否是表头字段
        :return: 显示除了表的字段verbose_name外,自添加字段
        """

        if is_header:
            return "编辑"
        homework_id = kwargs.get('homework_id')
        return mark_safe(
            '<a href="%s">编辑</a>' %
            self.reverse_change_url(pk=model.pk, homework_id=homework_id))

    def display_edit_del(self, model=None, is_header=None, *args, **kwargs):

        if is_header:
            return '操作'
        homework_id = kwargs.get('homework_id')
        tpl = '<a href="%s">编辑</a> <a href="%s">删除</a>' % (
            self.reverse_change_url(pk=model.pk, homework_id=homework_id),
            self.reverse_delete_url(pk=model.pk, homework_id=homework_id))
        return mark_safe(tpl)

    def get_add_btn(self, request, *args, **kwargs):
        return None

    def get_model_queryset(self, request, *args, **kwargs):
        homework_id = kwargs.get('homework_id')
        return self.model_class.objects.filter(homework_id=homework_id)

    def action_multi_check(self, request, *args, **kwargs):
        """
        批量删除钩子,如果想要定制执行成功后的返回值,那么就为action函数设置返回值即可。
        :return:
        """

        pk_list = request.POST.getlist('pk')
        # self.model_class.objects.filter(id__id=pk_list).update(status=4)
        for pk in pk_list:
            home_detail_object = self.model_class.objects.filter(id=pk).first()
            home_detail_object.status = 4
            home_detail_object.save()

    action_multi_check.text = "批量批改"

    def display_download(self, model=None, is_header=None, *args, **kwargs):
        if is_header:
            return '作业文件'
        name = "%s:%s" % (
            self.site.namespace,
            self.get_url_name('download'),
        )
        reverse_url = reverse(name, kwargs={'pk': model.pk})
        return mark_safe('<a target="_blank" href="%s">下载作业</a>' % reverse_url)

    def download(self, request, pk, *args, **kwargs):
        """
        下载学员的作业
        :param request:
        :param pk:
        :param args:
        :param kwargs:
        :return:
        """
        file = str(self.model_class.objects.filter(id=pk).first().file)
        file_link = settings.BASE_FILE + file
        return HttpResponse('<a href="%s" download="%s">点我下载</a>' %
                            (file_link, file))

    action_list = [
        action_multi_check,
    ]
    list_display = [
        StartXHandler.display_checkbox,
        get_m2m_display('学生', 'student'),
        get_field_display('作业状态', 'status'), display_download, 'critic'
    ]
Esempio n. 13
0
class PaymentRecordHandler(PermissionHandler, StartXHandler):
    def get_add_btn(self, request, *args, **kwargs):
        return None

    order_by = ['-id']
    list_display = [
        StartXHandler.display_checkbox, 'account', 'paid_fee', 'course',
        get_field_display('交易类型', 'pay_type'),
        get_field_display('申请状态', 'confirm_status'),
        get_datetime_format('申请日期', 'apply_date'),
        get_datetime_format('确认日期', 'confirm_date'), 'confirm_user', 'note'
    ]

    def get_urls(self):
        """预留的重新自定义url钩子函数,主要是覆盖掉默认的url,并设置name别名"""

        patterns = [
            re_path(r'^list/(?P<account_id>\d+)/$',
                    self.wrapper(self.changelist),
                    name=self.get_list_name),
            re_path(r'^change/(?P<account_id>\d+)/(?P<pk>\d+)/$',
                    self.wrapper(self.change_view),
                    name=self.get_change_name),
        ]
        patterns.extend(self.extra_url())
        return patterns

    def display_edit(self, model=None, is_header=None, *args, **kwargs):
        if is_header:
            return '操作'
        account_id = kwargs.get('account_id')
        tpl = '<a href="%s">编辑</a>' % self.reverse_change_url(
            pk=model.pk, account_id=account_id)
        return mark_safe(tpl)

    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_model_queryset(self, request, *args, **kwargs):
        account_id = kwargs.get('account_id')
        return self.model_class.objects.filter(account_id=account_id)

    def action_multi_check(self, request, *args, **kwargs):
        """
        批量审批学生状态,审核确认入学
        :return:
        """
        pk_list = request.POST.getlist('pk')
        # 修改状态即可
        for pk in pk_list:
            payment_obj = self.model_class.objects.filter(
                id=pk, confirm_status=1).first()
            if not payment_obj:
                continue
            payment_obj.confirm_status = 2
            payment_obj.confirm_date = now()

            # 审批人

            payment_obj.save()

            payment_obj.account.level = 2
            payment_obj.account.save()

            payment_obj.account.student.student_status = 2
            payment_obj.account.student.save()

    action_multi_check.text = "批量确认入学"

    def action_multi_cancel(self, request, *args, **kwargs):
        """
        批量审批学生状态,审核驳回
        :return:
        """
        pk_list = request.POST.getlist('pk')
        # 修改状态即可
        for pk in pk_list:
            payment_obj = self.model_class.objects.filter(
                id=pk, confirm_status=1).first()
            if not payment_obj:
                continue
            payment_obj.confirm_status = 3
            payment_obj.save()

    action_multi_cancel.text = "批量驳回申请"

    def action_multi_drop_out(self, request, *args, **kwargs):
        """
        批量审批学生状态,审核退学
        :return:
        """
        pk_list = request.POST.getlist('pk')
        # 修改状态即可
        for pk in pk_list:
            payment_obj = self.model_class.objects.filter(
                id=pk, confirm_status=2).first()
            if not payment_obj:
                continue

            payment_obj.account.level = 3
            payment_obj.account.save()

            payment_obj.account.student.student_status = 4
            payment_obj.account.student.save()

    action_multi_drop_out.text = "批量退学"

    def action_multi_graduation(self, request, *args, **kwargs):
        """
        批量审批学生状态,审核确认毕业
        :return:
        """
        pk_list = request.POST.getlist('pk')
        # 修改状态即可
        for pk in pk_list:
            payment_obj = self.model_class.objects.filter(
                id=pk, confirm_status=2).first()
            if not payment_obj:
                continue

            payment_obj.account.student.student_status = 3
            payment_obj.account.student.save()

    action_multi_graduation.text = "批量毕业"

    action_list = [
        action_multi_check, action_multi_cancel, action_multi_drop_out,
        action_multi_graduation
    ]
Esempio n. 14
0
class PublicCustomerHandler(PermissionHandler, StartXHandler):
    """公户设置"""
    def get_model_queryset(self, reqeust, *args, **kwargs):
        return self.model_class.objects.filter(consultant__isnull=True)

    def display_record(self, model=None, is_header=None, *args, **kwargs):
        if is_header:
            return '跟进记录'
        record_url = self.reverse_commons_url(self.get_url_name('record'),
                                              pk=model.pk)
        return mark_safe('<a href="%s">查看跟进记录</a>' % record_url)

    def record_view(self, request, pk):
        records = self.model_class.objects.filter(
            id=pk).first().consultrecord_set.all()

        return render(request, 'record.html', {'records': records})

    def extra_url(self):
        patterns = [
            re_path(r'^record/(?P<pk>\d+)/$',
                    self.wrapper(self.record_view),
                    name=self.get_url_name('record'))
        ]
        return patterns

    def action_multi_pull(self, request, *args, **kwargs):
        """
        批量将公户客户申请拉取到私户
        :return:
        """
        pk_list = request.POST.getlist('pk')
        current_consultant_id = request.session['staffinfo']['staff_id']

        # 做验证
        current_consultant_customers = models.Customer.objects.filter(
            consultant_id=current_consultant_id, status=2).count()
        if len(pk_list) + current_consultant_customers > 150:
            return HttpResponse('超出最大值,您已有 %s 个客户,最多还能添加 %s 个客户' %
                                (current_consultant_customers,
                                 150 - current_consultant_customers))

        # 数据库中加锁
        flag = False
        with transaction.atomic():  # 事务
            queryset = models.Customer.objects.filter(id__in=pk_list,
                                                      status=2,
                                                      consultant__isnull=True)
            origin_queryset = queryset.select_for_update()  # 加数据库锁
            if len(origin_queryset) == len(pk_list):
                queryset.update(consultant_id=current_consultant_id)
                flag = True

        if not flag:
            return HttpResponse('手速太慢了,选中的客户已被其他人申请,请重新选择')

    action_multi_pull.text = "加入我的私户"

    action_list = [
        action_multi_pull,
    ]

    list_display = [
        StartXHandler.display_checkbox, 'name', 'qq',
        get_field_display('报名状态', 'status'),
        get_m2m_display('咨询课程', 'course'), display_record
    ]
    model_form_class = PublicModelForm
Esempio n. 15
0
class OrderHandler(PermissionHandler, StartXHandler):
    order_by = ['-id']

    def get_add_btn(self, request, *args, **kwargs):
        return None

    def display_orderdetail(self, model=None, is_header=None, *args, **kwargs):
        if is_header:
            return '订单详情'
        record_url = reverse('startX:generic_orderdetail_list',
                             kwargs={'order_id': model.pk})
        return mark_safe('<a target="_blank" href="%s">订单详情</a>' % record_url)

    def display_paymentrecord(self,
                              model=None,
                              is_header=None,
                              *args,
                              **kwargs):
        if is_header:
            return '缴费申请'
        record_url = reverse('startX:generic_paymentrecord_list',
                             kwargs={'account_id': model.account_id})
        return mark_safe('<a target="_blank" href="%s">缴费申请</a>' % record_url)

    def get_urls(self):
        """预留的重新自定义url钩子函数,主要是覆盖掉默认的url,并设置name别名"""

        patterns = [
            re_path(r'^list/$',
                    self.wrapper(self.changelist),
                    name=self.get_list_name),
            re_path(r'^change/(?P<pk>\d+)/$',
                    self.wrapper(self.change_view),
                    name=self.get_change_name),
        ]
        patterns.extend(self.extra_url())
        return patterns

    list_display = [
        'account', 'payment_amount',
        get_field_display('交易类型', 'payment_type'),
        get_field_display('订单状态', 'status'),
        get_datetime_format('生成时间', 'date'),
        get_datetime_format('付款时间', 'pay_time'), 'payment_number',
        'order_nubmer', display_orderdetail, display_paymentrecord
    ]

    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

    search_list = [
        'account__contains',
    ]
Esempio n. 16
0
class CheckPayMentHandler(PermissionHandler, StartXHandler):
    order_by = ['-id', 'confirm_status']
    list_display = [StartXHandler.display_checkbox, 'customer', get_field_display('费用类型', 'pay_type'), 'paid_fee',
                    'classes', get_datetime_format('支付日期', 'apply_date'),
                    get_field_display('确认状态', 'confirm_status'), 'consultant']

    def get_urls(self):
        """只有查看和审批功能"""

        patterns = [
            re_path(r'^list/$', self.wrapper(self.changelist), name=self.get_list_name),

        ]
        patterns.extend(self.extra_url())
        return patterns

    def get_list_display(self, request, *args, **kwargs):
        """
        取消默认的编辑和删除
        :return: 为不同权限的用户设置预留的扩展,自定义显示列
        """
        value = []
        if self.list_display:
            value.extend(self.list_display)
        return value

    def get_add_btn(self, request, *args, **kwargs):
        """没有添加的功能"""
        return None

    def action_multi_check(self, request, *args, **kwargs):
        """
        批量审批确认
        :return:
        """
        pk_list = request.POST.getlist('pk')

        for pk in pk_list:
            payment_object = self.model_class.objects.filter(id=pk, confirm_status=1).first()
            if not payment_object:
                continue
            # 缴费记录
            payment_object.confirm_status = 2
            payment_object.save()

            # 客户表
            payment_object.customer.status = 1
            payment_object.customer.save()

            # 学生表
            payment_object.customer.student.student_status = 2
            payment_object.customer.student.save()

    action_multi_check.text = "批量确认"

    def action_multi_cancel(self, request, *args, **kwargs):
        """
        批量审批驳回
        :return:
        """
        pk_list = request.POST.getlist('pk')
        self.model_class.objects.filter(id__in=pk_list, confirm_status=1).update(confirm_status=3)

    action_multi_cancel.text = "批量驳回"

    def action_multi_drop_out(self, request, *args, **kwargs):
        """
        批量审批退学
        :return:
        """
        pk_list = request.POST.getlist('pk')
        for pk in pk_list:
            payment_object = self.model_class.objects.filter(id=pk, confirm_status=2).first()
            if not payment_object:
                continue
            # 客户表
            payment_object.pay_type = 3
            payment_object.save()

            # 学生表
            payment_object.customer.student.student_status = 4
            payment_object.customer.student.save()

    action_multi_drop_out.text = "批量退学"

    action_list = [action_multi_check, action_multi_cancel, action_multi_drop_out]