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']
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'), ]
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
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]
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))) ]
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']
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']
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'), ]
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' ]
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)
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 ]
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' ]
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 ]
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
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', ]
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]