class UserInfoHandler(StarkHandler): # per_page_num = 3 # 定制页面的列 list_display = [ 'name', get_choice_text('性别', 'gender'), get_choice_text('班级', 'classes'), # 'gender','classes', 'age', 'email', 'depart', StarkHandler.display_edit, StarkHandler.display_del ] has_add_btn = True # 在stark/service/v1 下面定义了一个model_form_class的None,就是为了可以自定义自己的ModelForm model_form_class = UserInfoModelForm # order_list = ['name'] # 姓名中含有关键字或邮箱中含有关键字 如果没有 __contains 就算精确查找 search_list = ['name__contains', 'email__contains'] # 当页面减少了部门字段以后,数据库保存不了,因此,就要使用form_database_save的这个钩子函数,去自定义部门字段的值 def form_database_save(self, form, is_update=False): form.instance.depart_id = 1 form.save()
class UserInfoHandler(StarkHandler): """ 用户相关视图函数处理类 """ # 自定义页面显示列 display_list = [ StarkHandler.display_checkbox, 'name', get_choice_text('性别', 'gender'), get_choice_text('班级', 'classes'), 'age', 'email', 'depart', StarkHandler.display_edit, StarkHandler.display_del, ] # 自定义每页显示条目数量 per_page_count = 10 # 自定义页面是否显示添加按钮 has_add_btn = True # 自定义页面表单模型 # model_form_class = UserInfoModelForm # 自定义排序关键字列表 order_list = ['id'] # 自定义搜索关键词列表 search_list = ['name__contains', 'email__contains'] # 自定义页面可批量操作功能列表 action_list = [StarkHandler.action_multi_delete,] # 自定义页面组合搜索可选项组合 search_group = [ Option('gender', is_multi=True), # MyOption('depart', {'id__gt': 2}), Option('depart', db_condition={'id__gt': 0}), # Option('gender', text_func=lambda field_obj: field_obj[1] + '666'), ]
class TeaStudentHandler(PermissionHandler, StarkHandler): # 老师 查看自己的学生 search_list = ['stu_name__contains'] def display_course_record(self, obj=None, is_header=None, *args, **kwargs): if is_header: return "课堂反馈" return mark_safe( '<a href="%s" target="_blank">查看课堂反馈</a>' % reverse('stark:web_courserecord_list', kwargs={'student_id': obj.pk})) list_display = ['stu_name', get_choice_text('性别', 'stu_gender'), 'school', get_choice_text('年级', 'education'), display_course_record] has_add_btn = False def get_list_display(self, request, *args, **kwargs): return self.list_display def get_urls(self): patterns = [ re_path(r'^list/$', self.wrapper(self.changelist_view), name=self.get_list_url_name), ] return patterns def get_queryset(self, request, *args, **kwargs): current_user_id = request.session['user_id'] teach_obj = models.Teacher.objects.filter(id=current_user_id).first() return self.model_class.objects.filter(teacher=teach_obj, teacher__isnull=False)
class UserInfoHandler(StarkHandler): # def display_gender(self, obj=None, is_header=None): # if is_header: # return "性别" # return obj.get_gender_display # # def display_classes(self, obj=None, is_header=None): # if is_header: # return "班级" # # return obj.get_classes_display # 定制页面显示的列,我这里定义几个,则页面显示几个列 list_display = [StarkHandler.display_checkbox, 'name', 'age', 'email', get_choice_text('性别', 'gender'), get_choice_text('班级', 'classes'), StarkHandler.display_edit, StarkHandler.display_del] # def get_list_display(self): # return ['name', 'age', 'email', 'depart'] has_add_btn = True order_list = ['id'] search_list = ['name__contains'] action_list = [StarkHandler.action_multi_delete, ] search_group = [ Option('gender', is_multi=True), Option('depart', db_condition={'id__gt': 0}), ]
class UserInfoHandler(StarkHandler): # 定制页面显示的列 list_display = [ StarkHandler.display_checkbox, 'id', 'name', get_choice_text('性别', 'gender'), get_choice_text('班级', 'classes'), 'age', 'email', 'depart', StarkHandler.display_edit, StarkHandler.display_del ] per_page_count = 10 # 每页显示数据个数 has_add_btn = True # 是否显示添加按钮 order_list = ['id'] # 数据排序方式 # 姓名中或邮箱中含有关键字 不加__contains就是精确查找 search_list = ['name__contains', 'email__contains'] action_list = [StarkHandler.action_multi_delete] # 批量删除 # model_form_class = UserInfoModelForm # 自定制 添加/编辑 页面显示的字段 # def save(self, form, is_update=False): # form.instance.depart_id = 1 # form.save() search_group = [ Option('gender', is_multi=True), MyOption('depart', db_condition={'id__gt': 2}), # db_condition:ORM的筛选条件 # Option('gender', text_func=lambda field_object: '666' ) ]
class PaymentRecordHandler(StarkHandler): list_display = [get_choice_text('缴费类型', 'pay_type'), 'paid_fee', 'class_list', 'consultant', get_choice_text('状态', 'confirm_status')] def get_list_display(self, request, *args, **kwargs): """ 获取页面上应该显示的列,预留的自定义扩展,例如:以后根据用户的不同显示不同的列 :return: """ value = [] if self.list_display: value.extend(self.list_display) return value def get_urls(self): patterns = [ url(r'^list/(?P<customer_id>\d+)/$', self.wrapper(self.changelist_view), name=self.get_list_url_name), url(r'^add/(?P<customer_id>\d+)/$', self.wrapper(self.add_view), name=self.get_add_url_name), ] patterns.extend(self.extra_urls()) return patterns def get_queryset(self, request, *args, **kwargs): customer_id = kwargs.get('customer_id') current_user_id = request.session['user_info']['id'] return self.model_class.objects.filter(customer_id=customer_id, customer__consultant_id=current_user_id) def get_model_form_class(self, is_add, request, pk, *args, **kwargs): # 如果当前客户有学生信息,则使用PaymentRecordModelForm;否则StudentPaymentRecordModelForm customer_id = kwargs.get('customer_id') student_exists = models.Student.objects.filter(customer_id=customer_id).exists() if student_exists: return PaymentRecordModelForm return StudentPaymentRecordModelForm def save(self, request, form, is_update, *args, **kwargs): customer_id = kwargs.get('customer_id') current_user_id = request.session['user_info']['id'] object_exists = models.Customer.objects.filter(id=customer_id, consultant_id=current_user_id).exists() if not object_exists: return HttpResponse('非法操作') form.instance.customer_id = customer_id form.instance.consultant_id = current_user_id # 创建缴费记录信息 form.save() # 创建学员信息 class_list = form.cleaned_data['class_list'] fetch_student_object = models.Student.objects.filter(customer_id=customer_id).first() if not fetch_student_object: qq = form.cleaned_data['qq'] mobile = form.cleaned_data['mobile'] emergency_contract = form.cleaned_data['emergency_contract'] student_object = models.Student.objects.create(customer_id=customer_id, qq=qq, mobile=mobile, emergency_contract=emergency_contract) student_object.class_list.add(class_list.id) else: fetch_student_object.class_list.add(class_list.id)
class StudentHandler(PermissionHandler, ResetPasswordHandler, StarkHandler): search_group = [ Option(field='education'), Option(field='course'), ] search_list = ['stu_name__contains', 'teacher__nickname__contains'] list_display = ['stu_name', get_choice_text('性别', 'stu_gender'), 'school', get_choice_text('年级', 'education'), get_m2m_text('报名科目', 'course'), get_m2m_text('任课老师', 'teacher'), ResetPasswordHandler.display_reset_pwd ] def get_model_form_class(self, is_add, request, *args, **kwargs): if is_add: return StudentAddModelForm return StudentUpdateModelForm def save(self, request, form, is_update, *args, **kwargs): # 给学生分配教师的角色 if not is_update: form.save() role_obj = Role.objects.filter(title='学生').first() student_obj = form.instance student_obj.roles.add(role_obj) student_obj.save() form.save()
class PriCustomerHandler(PermissionHandler, StarkHandler): def contact(self, obj, is_header): if is_header: return '跟进' contact_url = name2url(self.site.namespace, "academy_consultrecord_list", customer_id=obj.pk) return mark_safe("<a target='_blank' href='%s'>跟进</a>" % contact_url) def pay_record(self, obj=None, is_header=None, *args, **kwargs): if is_header: return '缴费' record_url = name2url(self.site.namespace,'academy_paymentrecord_list', customer_id=obj.pk) return mark_safe('<a target="_blank" href="%s">缴费</a>' % record_url) def multi_remove_to_pub(self, request, *args, **kwargs): consult_id = request.session['user_info']['id'] customer_id_list = request.POST.getlist('pk') Customer.objects.filter(id__in=customer_id_list, consultant_id=consult_id).update(consultant_id=None) multi_remove_to_pub.text = "移除到公户" list_display = [StarkHandler.display_checkbox, 'name',get_choice_text('性别', 'gender'), 'qq', get_m2m_text('咨询课程', 'course'), get_choice_text('状态', 'status'), contact, pay_record] def get_queryset(self, request, *args, **kwargs): consult_id = request.session['user_info']['id'] return Customer.objects.filter(consultant_id=consult_id) action_list = [multi_remove_to_pub]
class UserInfoHandler(StarkHandler): # 定制页面显示的列 list_display = [ StarkHandler.display_checkbox, 'name', get_choice_text('性别', 'gender'), get_choice_text('班级', 'classes'), 'age', 'email', 'depart', StarkHandler.display_edit, StarkHandler.display_del ] per_page_count = 10 has_add_btn = True # model_form_class = UserInfoModelForm order_list = ['id'] search_list = ['name__contains', 'email__contains'] action_list = [ StarkHandler.action_multi_delete, ] # def save(self, form, is_update=False): # form.instance.depart_id = 1 # form.save() search_group = [ Option('gender', is_multi=True), Option('depart', db_condition={'id__gt': 0}) # MyOption('depart', {'id__gt': 2}), # Option('gender', text_func=lambda field_object: field_object[1] + '666'), ]
class PublicCustomerHandler(StarkHandler): list_display = ['name','qq',get_choice_text('状态','status'),get_choice_text('性别','gender'), get_m2m_text('咨询的课程','course')] def get_queryset(self, request, *args, **kwargs): return self.model_class.objects.filter(consultant__isnull=True) model_form_class = PublicCustomerModelForm
class PaymentHandler(PermissionHandler, StarkHandler): list_display = [get_choice_text('缴费类型', 'pay_type'), 'paid_fee', 'classes', 'consultant', get_choice_text('状态', 'confirm_status')] def get_urls(self): patterns = [ url(r'^list/(?P<customer_id>\d+)/$', self.wrapper(self.changelist_view), name=self.get_list_url_name), url(r'^add/(?P<customer_id>\d+)/$', self.wrapper(self.add_view), name=self.get_add_url_name), ] patterns.extend(self.extra_urls()) return patterns def get_queryset(self, request, *args, **kwargs): customer_id = kwargs.get('customer_id') consult_id = request.session['user_info']['id'] return self.model_class.objects.filter(customer_id=customer_id, customer__consultant_id=consult_id) def get_model_form_class(self, is_add, request, *args, **kwargs): # 如果当前客户有学生信息,则使用PaymentRecordModelForm;否则StudentPaymentRecordModelForm customer_id = kwargs.get('customer_id') student_exists = Student.objects.filter(customer_id=customer_id).exists() if student_exists: return PaymentRecordModelForm return StudentPaymentRecordModelForm def save(self, form, is_update, request, *args, **kwargs): customer_id = kwargs.get('customer_id') consult_id = request.session['user_info']['id'] object_exists = Customer.objects.filter(id=customer_id, consultant_id=consult_id).exists() if not object_exists: return HttpResponse('非法操作') form.instance.customer_id = customer_id form.instance.consultant_id = consult_id # 创建缴费记录信息 form.save() # 创建学员信息 classes = form.cleaned_data['classes'] fetch_student_object = Student.objects.filter(customer_id=customer_id).first() if not fetch_student_object: #先创建用户信息 new_user_obj = Customer.objects.filter(id=customer_id).first() name, gender, phone = new_user_obj.name, new_user_obj.gender, request.POST.get('mobile') default_student_pwd = to_md('123') user_obj = UserInfo(name=name, password=default_student_pwd, gender=gender, phone=phone, depart_id=4) user_obj.save() user_obj.roles.add(12) #具体指数据库中角色id,一般不会改变 qq = form.cleaned_data['qq'] mobile = form.cleaned_data['mobile'] emergency_contract = form.cleaned_data['emergency_contract'] student_object = Student.objects.create(user_id=user_obj.id, 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 UserInfoHandler(StarkHandler): # per_page_num = 1 # 定制页面的列 list_display = [ 'name', get_choice_text('性别', 'gender'), get_choice_text('班级', 'classes'), 'age', 'email', 'depart', StarkHandler.display_edit, StarkHandler.display_del ]
class CheckPaymentRecordHandler(PermissionHandler, StarkHandler): order_list = ['-id', 'confirm_status'] list_display = [ StarkHandler.display_checkbox, 'customer', get_choice_text('缴费类型', 'pay_type'), 'paid_fee', 'classes', get_datetime_text('申请日期', 'apply_date'), get_choice_text('状态', 'confirm_status'), 'consultant' ] has_add_btn = False def get_urls(self): patterns = [ url(r'^list/$', self.wrapper(self.changelist_view), name=self.get_list_url_name), ] patterns.extend(self.extra_urls()) return patterns def action_multi_confirm(self, request, *args, **kwargs): """ 批量确认 :param request: :param args: :param 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_confirm.text = '批量确认' def action_multi_cancel(self, request, *args, **kwargs): 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 = '批量驳回' action_list = [action_multi_confirm, action_multi_cancel]
class PaymentApprovalHandler(PermissionHandle, StarkHandler): def multi_change(self, request): 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.save() payment_obj.customer.status = 1 payment_obj.customer.save() payment_obj.customer.student.student_status = 2 payment_obj.customer.student.save() multi_change.text = '批量确认' def multi_reject(self, request): pk_list = request.POST.getlist('pk') self.model_class.objects.filter( id__in=pk_list, confirm_status=1).update(confirm_status=3) multi_reject.text = '批量驳回' def get_urls(self): patterns = [ url(r'^list/$', self.wrapper(self.list), name=self.get_list_url_name), ] patterns.extend(self.extra_urls()) return patterns def get_label_name(self, request, *args, **kwargs): ''' 为以后的扩展预留,根据不同的情况显示不同的内容(列) :return: ''' value = [] if self.label_name: value.extend(self.label_name) return value action_list = [multi_change, multi_reject] has_add_btn = False order_list = ['confirm_status'] label_name = [ StarkHandler.display_checkbox, 'customer', get_choice_text('费用类型', 'pay_type'), 'paid_fee', 'class_list', get_date_text('申请日期', 'apply_date'), get_choice_text('确认状态', 'confirm_status'), 'consultant' ]
class PrivateCustomerHandler(StarkHandler): def display_record(self, obj=None, is_header=None, *args, **kwargs): if is_header: return '跟进' record_url = reverse('stark:web_consultrecord_list', kwargs={'customer_id': obj.pk}) return mark_safe('<a target="_blank" href="%s">跟进</a>' % record_url) def display_pay_record(self, obj=None, is_header=None, *args, **kwargs): if is_header: return '缴费' record_url = reverse('stark:web_paymentrecord_list', kwargs={'customer_id': obj.pk}) return mark_safe('<a target="_blank" href="%s">缴费</a>' % record_url) model_form_class = PrivateCustomerModelForm list_display = [ StarkHandler.display_checkbox, 'name', 'qq', get_choice_text('性别', 'gender'), get_m2m_text('咨询的课程', 'course'), get_choice_text('状态', 'status'), display_record, display_pay_record ] def get_queryset(self, request, *args, **kwargs): current_user_id = request.session['user_info']['id'] print(current_user_id) # 拿到当前用户申请到的客户 return self.model_class.objects.filter(consultant_id=current_user_id) def form_database_save(self, request, form, is_update, *args, **kwargs): if not is_update: current_user_id = request.session['user_info']['id'] form.instance.consultant_id = current_user_id form.save() def action_multi_remove(self, request, *args, **kwargs): """ 把私户批量移除到公户 :param request: :return: """ current_user_id = request.session['user_info']['id'] pk_list = request.POST.getlist('pk') self.model_class.objects.filter( id__in=pk_list, consultant_id=current_user_id).update(consultant_id=None) action_multi_remove.text = "批量移动到公户" action_list = [ action_multi_remove, ]
class CheckPaymentRecordHandler(PermissionHandler, StarkHandler): search_group = [Option('confirm_status'), Option('consultant')] order_list = ['confirm_status'] list_display = [ StarkHandler.display_checkbox, 'consultant', 'customer', 'paid_fee', get_choice_text('类型', 'pay_type'), get_choice_text('状态', 'confirm_status'), 'apply_date' ] def get_list_display(self, request, *args, **kwargs): return self.list_display has_add_btn = False def get_urls(self): patterns = [ re_path(r'^list/$', self.wrapper(self.changelist_view), name=self.get_list_url_name), ] return patterns def action_multi_check(self, request, *args, **kwargs): pk_list = request.POST.getlist('pk') for pk in pk_list: payrecord_obj = self.model_class.objects.filter( id=pk, confirm_status=1).first() if not payrecord_obj: continue payrecord_obj.confirm_status = 2 payrecord_obj.customer.status = 1 payrecord_obj.save() payrecord_obj.customer.save() action_multi_check.text = "批量通过审核" def action_multi_cancle(self, request, *args, **kwargs): pk_list = request.POST.getlist('pk') for pk in pk_list: payrecord_obj = self.model_class.objects.filter( id=pk, confirm_status=1).first() if not payrecord_obj: continue payrecord_obj.confirm_status = 3 payrecord_obj.save() action_multi_cancle.text = "批量驳回" action_list = [action_multi_check, action_multi_cancle]
class UserInfoHandler(StarkHandler): def display_reset_pwd(self, obj=None, is_header=None, *args, **kwargs): if is_header: return "重置密码" reset_url = self.reverse_commons_url(self.get_url_name('reset_pwd'), pk=obj.pk) return mark_safe( '<a class="btn btn-small btn-info" href="%s">重置密码</a>' % reset_url) list_display = [ 'name', 'nickname', 'email', 'depart', get_choice_text('状态', 'status'), display_reset_pwd ] def get_model_form_class(self, is_add, request, pk, *args, **kwargs): """ 定制添加和编辑页面 :param is_add: :param request: :param pk: :param args: :param kwargs: :return: """ if is_add: return UserInfoAddModelForm return UserInfoChangeModelForm def reset_password(self, request, pk): """ 重置密码 :param request: :param pk: 重置密码的 用户ID :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 search_list = ['name__contains', 'nickname__contains', 'email_contains'] search_group = [Option(field='depart')]
class TeacherHandler(PermissionHandler,ResetPasswordHandler, StarkHandler): list_display = ['nickname', get_choice_text('性别', 'gender'), 'phone', 'wechat', get_m2m_text('教授科目', 'course'), 'free_time', ResetPasswordHandler.display_reset_pwd] search_list = ['nickname__contains', 'free_time__contains'] search_group = [ Option(field='gender'), Option(field='course'), ] def get_model_form_class(self, is_add, request, *args, **kwargs): if is_add: return TeacherAddModelForm return TeacherUpdateModelForm def save(self, request, form, is_update, *args, **kwargs): # 给老师分配教师的角色 if not is_update: form.save() role_obj = Role.objects.filter(title='教师').first() teacher_obj = form.instance teacher_obj.roles.add(role_obj) form.save()
class ContactHandler(StarkHandler): list_display = [ 'id', 'name', 'company', get_choice_text('类别', 'position'), 'tel', 'phone', 'email', 'wechat_name', 'meno' ] search_list = ['name__contains', 'company__contains']
class UserInfoHandler(StarkHandler): def display_reset_pwd(self, obj=None, is_header=None): if is_header: return "重置密码" parse_url = ParseUrl(request=self.request, namespace=self.site.namespace, name=self.get_url_name('reset_pwd'), pk=obj.pk) url = parse_url.memory_url() return mark_safe('<a href="%s">重置密码</a>' % url) list_display = ['nickname', 'name', get_choice_text('性别', 'gender'), 'phone', 'email', 'depart', display_reset_pwd] def get_model_form_class(self, is_add=False): """ 定制添加和编辑页面 :param is_add: :return: """ 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() parse_url = ParseUrl(request=self.request, namespace=self.site.namespace, name=self.get_list_url_name) url = parse_url.memory_url() return redirect(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 # 模糊搜索 search_list = ['nickname__contains', 'name__contains'] # 组合搜索 search_group = [ Option(field='gender'), Option(field='depart', is_multi=True), ]
class UserInfoHandler(PermissionHandler, StarkHandler): def display_reset_pwd(self, obj=None, is_header=None, *args, **kwargs): # 自定义额外字段,然后加到list_display中即可 if is_header: return '重置密码' reset_url = self.reverse_commons_url(self.get_url_name('rest_pwd'), pk=obj.pk) # 带上id 反向生成别名 return mark_safe('<a href="%s">重置密码</a>' % reset_url) list_display = [ 'nickname', get_choice_text('性别', 'gender'), 'phone', 'email', 'depart', display_reset_pwd ] # 加上模糊搜索 search_list = ['nickname__contains', 'name__contains'] # 加上组合搜索 search_group = [ Option(field='gender'), Option(field='depart'), ] def get_model_form_class(self, is_add, request, pk, *args, **kwargs): if is_add: return UserInfoAddModelForm return UserInfoEditModelForm # 扩展功能==================单独一个url处理重置密码功能================== # 自定义的视图函数,给下面调用 def reset_password(self, request, pk): """重置密码的视图函数""" user_object = models.UserInfo.objects.filter(id=pk).first() if not user_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(): # 密码更新到数据库 user_object.password = form.cleaned_data['password'] user_object.save() return redirect(self.reverse_list_url()) # 直接使用封装好的方法,会跳页面 return render(request, 'stark/change.html', {'form': form}) # 自定义增加url(重置密码)用写好的钩子方法 def extra_urls(self): patterns = [ url(r'^reset/password/(?P<pk>\d+)$', self.wrapper(self.reset_password), name=self.get_url_name('rest_pwd')) ] return patterns
class StudentHandler(StarkHandler): """ 学员相关视图函数处理类 """ # 页面显示积分记录 def display_score_record(self, obj=None, is_header=None, *args, **kwargs): """ 页面显示积分记录 :param obj: :param is_header: :parma args: :param kwargs: :return: """ if is_header: return '积分管理' score_url = reverse('stark:web-scorerecord-list', kwargs={'student_id': obj.pk}) return mark_safe('<a target="_blank" href="%s">%s</a>' % (score_url, obj.score)) def get_add_btn(self, request, *args, **kwargs): return None def get_display_list(self): value = [] if self.display_list: value.extend(self.display_list) value.append(type(self).display_edit) return value def get_urls(self): patterns = [ url(r'^list/$', self.wrapper(self.list_view), name=self.get_list_url_name), # url(r'^add/$', self.wrapper(self.add_view), # name=self.get_add_url_name), url(r'^edit/(?P<pk>\d+)/$', self.wrapper(self.edit_view), name=self.get_edit_url_name), # url(r'^del/(?P<pk>\d+)/$', self.wrapper(self.del_view), # name=self.get_del_url_name), ] patterns.extend(self.extra_urls()) return patterns display_list = [ 'customer', 'qq', 'mobile', 'emergency_contract', get_m2m_text('已报班级', 'class_list'), display_score_record, get_choice_text('状态', 'student_status') ] model_form_class = StudentModelForm search_list = ['customer__name', 'qq', 'mobile'] search_group = [ Option('class_list', text_func=lambda x: '%s-%s' % (x.school.title, str(x))) ]
class UserInfolHandler(PermissionHandler, StarkHandler): order_list = [ 'depart_id', ] search_list = ['name__contains'] search_group = [ Option(field='gender', is_multi=True), Option(field='depart'), ] def reset_user_pwd(title): from stark.utils.convert import name2url def inner(self, obj=None, is_header=None, *args, **kwargs): if is_header: return title return mark_safe("<a href='%s'>%s</a>" % (name2url( self.site.namespace, self.get_url_name('reset_pwd'), pk=obj.pk), title)) return inner list_display = [ 'name', get_choice_text('性别', 'gender'), 'phone', 'depart', reset_user_pwd('重置密码'), ] def get_model_form_class(self, is_add, request, *args, **kwargs): if is_add: return UserInfoAddModelForm else: return UserInfoEditModelForm def reset_pwd(self, request, pk, *args, **kwargs): user_obj = UserInfo.objects.filter(id=pk).first() if not user_obj: return HttpResponse('user does not exist!') form = ResetPwdModelForm() if request.method == 'GET': return render(request, 'stark/change.html', {'form': form}) form = ResetPwdModelForm(data=request.POST) if form.is_valid(): pwd = form.cleaned_data['password'] user_obj.password = pwd user_obj.save() # 在数据库保存成功后,跳转回列表页面(携带原来的参数)。 return redirect(self.reverse_list_url()) return render(request, 'stark/change.html', {'form': form}) def extra_urls(self): patterns = [ url(r'^resetpwd/(?P<pk>\w+)/$', self.wrapper(self.reset_pwd), name=self.get_url_name('reset_pwd')), ] return patterns
class PublishCustomerHandler(PermissionHandle, StarkHandler): MAX_CUSTOMER = 150 def display_record(self, obj=None, is_header=None): if is_header: return '跟进详情' reverse_record = self.reverse_common_url(self.get_url_name('record'), id=obj.pk) return mark_safe("<a href='%s'>跟进记录</a>" % reverse_record) def record(self, request, id, *args, **kwargs): form = models.Record.objects.filter(customer_id=id) return render(request, 'record_list.html', locals()) def extra_urls(self): patterns = [ url(r'record/(?P<id>\d+)/$', self.wrapper(self.record), name=self.get_url_name('record')), ] return patterns def queryset_obj(self, request, *args, **kwargs): return self.model_class.objects.filter(consultant__isnull=True) label_name = [ StarkHandler.display_checkbox, 'name', 'qq', get_mtom_text('咨询课程', 'course'), get_choice_text('状态', 'status'), display_record ] def multi_public(self, request): current_user_id = request.session['user']['id'] pk_list = request.POST.getlist('pk') has_customer_count = self.model_class.objects.filter( consultant_id=current_user_id, status=2).count() # 私户个数限制 if (len(pk_list) + has_customer_count) > self.MAX_CUSTOMER: return HttpResponse('你的私户中已有%s个客户,最多只能申请%s个客户' % (has_customer_count, (self.MAX_CUSTOMER - has_customer_count))) flag = False with transaction.atomic(): origin_queryset = self.model_class.objects.filter( id__in=pk_list, consultant__isnull=True, status=2).select_for_update() if len(origin_queryset) == len(pk_list): self.model_class.objects.filter( id__in=pk_list, consultant__isnull=True, status=2).update(consultant_id=current_user_id) flag = True if not flag: return HttpResponse('选中的客户已被其他人申请,请重新选择') multi_public.text = '添加到私户' action_list = [multi_public] model_form_class = PublishCustomerModelForm
class PaymentRecordHandler(PermissionHandler, StarkHandler): list_display = [ 'consultant', get_choice_text('缴费类型', 'pay_type'), 'paid_fee', 'apply_date', get_choice_text('状态', 'confirm_status') ] def get_model_form_class(self, is_add, request, *args, **kwargs): customer_id = kwargs['customer_id'] if models.Student.objects.filter(customer_id=customer_id): return self.model_form_class return StudentAddModelForm model_form_class = PaymentRecordModelForm def get_list_display(self, request, *args, **kwargs): return self.list_display def get_queryset(self, request, *args, **kwargs): current_user_id = request.session['user_id'] return self.model_class.objects.filter( customer_id=kwargs['customer_id'], customer__consultant_id=current_user_id) def get_urls(self): patterns = [ re_path(r'^list/(?P<customer_id>\d+)/$', self.wrapper(self.changelist_view), name=self.get_list_url_name), re_path(r'^add/(?P<customer_id>\d+)/$', self.wrapper(self.add_view), name=self.get_add_url_name), ] return patterns def save(self, request, form, is_update, *args, **kwargs): customer_id = kwargs.get('customer_id') current_user_id = request.session['user_info']['id'] obj_exists = models.Customer.objects.filter( id=customer_id, consultant_id=current_user_id).exists() if not obj_exists: return HttpResponse('呵呵!非法操作!') form.instance.customer_id = customer_id form.instance.consultant_id = current_user_id form.save()
class DeployHandler(StarkHandler): list_display = [ StarkHandler.display_checkbox, 'title', get_choice_text('状态', 'status'), StarkHandler.display_edit, StarkHandler.display_del ] # has_add_btn = False action_list = [StarkHandler.action_multi_delete]
class Quotation_infoHandler(StarkHandler): list_display = [ 'qid', 'customer', 'contact', get_choice_text('交货时间', 'delivery_time') ] search_list = [ 'name__contains', ]
class StudentHandler(PermissionHandler, StarkHandler): model_form_class = StudentModelForm def display_score(self, obj=None, is_header=None, *args, **kwargs): """新加一列""" if is_header: return '积分管理' # 反向取url 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, get_choice_text('状态', 'student_status') ] # 自定义显示 def get_add_btn(self, request, *args, **kwargs): """重构隐藏, 添加按钮""" return None def get_list_display(self, request, *args, **kwargs): """重构:只需要修改按钮""" value = [] if self.list_display: value.extend(self.list_display) value.append(type(self).display_edit) return value def get_urls(self): """重构url ,值需要列表功能""" patterns = [ url(r'^list/$', self.wrapper(self.changelist_view), name=self.get_list_url_name), url(r'^change/(?P<pk>\d+)/$', self.wrapper(self.change_view), name=self.get_change_url_name), ] patterns.extend(self.extra_urls()) return patterns # 模糊搜索 search_list = [ 'customer__name', 'qq', 'mobile', ] # 组合搜索 search_group = [ Option('class_list', text_func=lambda x: '%s-%s' % (x.school.title, str(x))) # 利用text_func添加一个lambda函数处理显示字符串 ]
class PublicCustomerHandler(StarkHandler): def display_record(self, obj=None, is_header=None): if is_header: return '跟进记录' record_url = ParseUrl(request=self.request, namespace=self.site.namespace, name=self.get_url_name('record_view'), pk=obj.pk) url = record_url.memory_url() return mark_safe('<a href="%s">查看跟进</a>' % url) list_display = [ 'name', 'qq', get_choice_text('状态', 'status'), get_choice_text('性别', 'gender'), get_m2m_text('咨询的课程', 'course'), display_record ] def get_queryset(self, request, *args, **kwargs): return self.model_class.objects.filter(consultant__isnull=True) model_form_class = PublicCustomerModelForm def extra_urls(self): patterns = [ url(r'^record/(?P<pk>\d+)/$', self.wrapper(self.record_view), name=self.get_url_name('record_view')) ] return patterns def record_view(self, request, pk): """ 查看跟进记录视图 :param request: :param pk: :return: """ record_list = models.ConsultRecord.objects.filter(customer_id=pk) return render(request, 'record_view.html', {'record_list': record_list})
class CourseRecordHandler(PermissionHandler, StarkHandler): # 老师查看或添加自己某个学生所有的课堂反馈 search_group = [Option('status')] model_form_class = CourseRecordModelForm list_display = [ 'student', 'course', 'record_num', get_datetime_text('上课时间', 'date'), get_choice_text('状态', 'status') ] def display_edit(self, obj=None, is_header=None, *args, **kwargs): """ 自定义页面显示的列(表头和内容) :param obj: :param is_header: :return: """ if is_header: return "编辑" return mark_safe('<a href="%s">编辑</a>' % self.reverse_change_url( pk=obj.pk, student_id=kwargs['student_id'])) def get_urls(self): patterns = [ re_path(r'^list/(?P<student_id>\d+)$', self.wrapper(self.changelist_view), name=self.get_list_url_name), re_path(r'^add/(?P<student_id>\d+)$', self.wrapper(self.add_view), name=self.get_add_url_name), re_path(r'^change/(?P<student_id>\d+)/(?P<pk>\d+)/$', self.wrapper(self.change_view), name=self.get_change_url_name), ] return patterns def display_edit_del(self, obj=None, is_header=None, *args, **kwargs): if is_header: return '操作' tpl = '<a href="%s">反馈详细信息</a>' % (self.reverse_change_url( pk=obj.pk, student_id=kwargs['student_id'])) return mark_safe(tpl) def get_queryset(self, request, *args, **kwargs): return self.model_class.objects.filter(student_id=kwargs['student_id']) def save(self, request, form, is_update, *args, **kwargs): if form.instance.status == settings.RECORD_CHECKED: return HttpResponse("已审核过的课堂反馈不可以被修改!") if is_update: form.instance.status = settings.RECORD_UNCHECKED form.instance.student_id = kwargs['student_id'] form.instance.teacher_id = request.session['user_id'] form.save()