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 ClassListHandler(PermissionHandler,StarkHandler): def display_course(self, obj=None, is_header=None,*args,**kwargs): if is_header: return '班级' return "%s %s期" % (obj.course.name, obj.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'), 'class_teacher', get_m2m_text('任课老师','tech_teachers'), display_course_record ] model_form_class = ClassListModelForm search_group = [ Option('school'), Option('course') ]
class ClassListHandler(PermissionHandler, StarkHandler): def display_course(self, obj=None, is_header=None, *args, **kwargs): if is_header: return '班级' return '%s (%s)期' % ( obj.course.name, obj.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}) # 带上id 反向生成别名 return mark_safe('<a target="_blank" href="%s">上课记录</a>' % record_url) list_display = [ 'school', display_course, get_datetime_text('开班日期', 'start_date'), 'class_teacher', get_m2m_text('老师', 'tech_teacher'), display_course_record, ] # 自定义显示 model_form_class = ClassListModelForm # 自定义的样式(时间格式) # 加上组合搜索 search_group = [ Option(field='school'), Option(field='course'), ]
class ClassesHandler(PermissionHandler, StarkHandler): def display_classes(self, obj, is_header, *args, **kwargs): if is_header: return '班级' return str(obj) def display_course_record(self, obj, is_header, *args, **kwargs): if is_header: return '上课记录' class_course_record_url = name2url(self.site.namespace, 'academy_courserecord_list', classes_id=obj.pk) return mark_safe("<a target='_blank' href='%s'>上课记录</a>" % (class_course_record_url)) def display_homework(self, obj, is_header, *args, **kwargs): if is_header: return '班级作业' new_url = name2url(self.site.namespace, 'academy_homework_list', classes_id=obj.pk) return mark_safe("<a target='_blank' href='%s'>班级作业</a>" % new_url) def get_queryset(self, request, *args, **kwargs): user_id = request.session['user_info']['id'] id_queryset = UserInfo.objects.filter(id=user_id).first().roles.all().values_list('id') user_role_id_list = [item[0] for item in id_queryset] if 10 in user_role_id_list: #该用户是老师 return UserInfo.objects.filter(id=user_id).first().classes.all() return super().get_queryset(request, *args, **kwargs) model_form_class = ClassesModelForm list_display = ['school', display_classes, get_m2m_text('老师', 'teacher'), 'price', get_datetime_text('开班日期', 'start_date'), display_course_record, display_homework] search_group = [Option('course')]
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 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 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): 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 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 StudentHandler(PermissionHandler, StarkHandler): model_form_class = StudentModelForm def display_score(self, obj=None, is_header=None, *args, **kwargs): if is_header: return '积分管理' record_url = reverse('stark:crm_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): patterns = [ url(r'^list/$', self.wrapper(self.changelist_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_change_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', ] search_group = [ Option('class_list', text_func=lambda x: '%s-%s' % (x.school.title, str(x))) ]
class ClassListHandler(StarkHandler): def display_course(self, obj=None, is_header=None): if is_header: return '班级' return "%s %s期" % (obj.course.name, obj.semester) list_display = [ 'school', display_course, 'price', get_datetime_text('开班日期', 'start_date'), 'class_teacher', get_m2m_text('任课老师', 'tech_teachers') ] model_form_class = ClassListModelForm search_group = [Option('school'), Option('course')]
class PrivateCustomerHandler(PermissionHandler, StarkHandler): # 私户 def display_pay(self, obj=None, is_header=None, *args, **kwargs): if is_header: return "缴费记录" tpl = mark_safe('<a href="%s" target="_blank">查看缴费记录</a>' % reverse( 'stark:web_paymentrecord_list', kwargs={'customer_id': obj.pk})) return tpl def display_record(self, obj=None, is_header=None, *args, **kwargs): if is_header: return "跟进记录" tpl = mark_safe('<a href="%s" target="_blank">查看跟进记录</a>' % reverse( 'stark:web_consultrecord_list', kwargs={'cusotomer_id': obj.pk})) return tpl def action_multi_to_pub(self, request, *args, **kwargs): """ 批量删除(如果想要定制执行成功后的返回值,那么就为action函数设置返回值即可。) :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='') action_list = [action_multi_to_pub] action_multi_to_pub.text = "批量移除到公户" model_form_class = PrivateCustomerModelForm list_display = [ StarkHandler.display_checkbox, 'parent_name', 'wechat', get_m2m_text('咨询的课程', 'course'), get_choice_text('状态', 'status'), display_pay, display_record ] def get_queryset(self, request, *args, **kwargs): current_user_id = request.session['user_info']['id'] return self.model_class.objects.filter(consultant_id=current_user_id) def save(self, request, form, is_update, *args, **kwargs): if not is_update: form.instance.consultant_id = request.session['user_info']['id'] form.save() form.save()
class ClassListHandler(StarkHandler): """ 班级模型视图函数处理类 """ # 页面显示课程信息 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: """ 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) display_list = [ 'school', display_course, 'price', get_datetime_text('开班日期', 'start_date'), 'class_teacher', get_m2m_text('任课老师', 'tech_teachers'), display_course_record, ] model_form_class = ClassListModelForm search_group = [ Option('school'), Option('course'), ]
class PrivateCustomerHandler(PermissionHandler, StarkHandler): def display_record(self, obj=None, is_header=None, *args, **kwargs): if is_header: return '跟进记录' # 直接用 reverse,不用加原搜索条件保留 record_url = reverse('stark:web_consultrecord_list', kwargs={'customer_id': obj.pk}) # 带上id 反向生成别名 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 '缴费记录' # 直接用 reverse,不用加原搜索条件保留 record_url = reverse('stark:web_paymentrecord_list', kwargs={'customer_id': obj.pk}) # 带上id 反向生成别名 return mark_safe('<a target="_blank" href="%s">缴费</a>' % record_url) list_display = [StarkHandler.display_checkbox, 'name', 'qq', get_m2m_text('咨询课程', 'course'), get_choice_text('状态', 'status'), display_record, display_pay_record] # 自定义显示 def get_queryset(self, request, *args, **kwargs): current_user_id = request.session['user_info']['id'] return self.model_class.objects.filter(consultant_id=current_user_id) # 课程顾问为指定id的 def save(self, request, form, is_update, *args, **kwargs): # 重写模块中的方法 """当在销售顾问登录的情况下,可以添加咨询客户,默认就是添加给自己""" # 默认添加学员是给当前id的销售顾问 if not is_update: # 增加 否则是 更新 current_user_id = request.session['user_info']['id'] form.instance.consultant_id = current_user_id form.save() # 保存 # 自定义函数,stark组件里有案例 def action_multi_remove(self, request, *args, **kwargs): """批量移除到公户,自定义函数""" current_user_id = request.session['user_info']['id'] pk_list = request.POST.getlist('pk') # 选中客户id列表 # 校验 id__in=pk_list 过滤 id 是否在 pk_list这个列表中 self.model_class.objects.filter(id__in=pk_list, consultant_id=current_user_id).update(consultant=None) # 自定义函数必须引入action_list action_multi_remove.text = '批量剔除到公户' action_list = [action_multi_remove, ] model_form_class = PrivateCustomerModelForm
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 ClasslistHandler(PermissionHandler, StarkHandler): def display_course(self, obj=None, is_header=None): if is_header: return "班级" return "%s %s 期" % ( obj.course.name, obj.semester, ) # list_display = ['school',display_course,'course','semester'] list_display = [ 'school', display_course, 'price', get_datetime_text('开班日期', 'start_date'), 'class_teacher', get_m2m_text('任课老师', 'tech_teachers') ] model_form_class = ClassListModelForm
class StudentHandler(StarkHandler): model_form_class = StudentModelForm list_display = [ 'customer', 'qq', 'mobile', 'emergency_contract', get_m2m_text('已报班级', 'class_list'), get_choice_text('状态', 'student_status') ] has_add_btn = False def get_list_display(self): """ 获取页面上应该显示的列,预留的自定义扩展,例如:以后根据用户角色的不同展示不同的列 :return: """ 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.changelist_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_change_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'] search_group = [ Option('class_list', text_func=lambda x: '%s-%s' % (x.school.title, str(x))), Option('student_status') ]
class PrivateCustomerHandler(StarkHandler): model_form_class = PrivateCustomerModelForm list_display = [ StarkHandler.display_checkbox, 'name', 'qq', get_choice_text('性别', 'gender'), get_m2m_text('咨询的课程', 'course'), get_choice_text('状态', 'status') ] 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 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 PrivateCustomerHandler(StarkHandler): """ 私人用户相关视图函数处理类 """ # 页面显示跟进记录 def display_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-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): """ 页面显示缴费记录 :param obj: :param is_header: :param args: :param kwargs: :return: """ if is_header: return '缴费记录' record_url = reverse('stark:web-paymentrecord-list', kwargs={'customer_id': obj.pk}) return mark_safe('<a target="_blank" href="%s">查看缴费记录</a>' % \ record_url) def get_queryset(self, request, *args, **kwargs): current_user_id = request.session['user_info']['id'] return self.model_class.objects.filter(consultant_id=current_user_id) def save(self, request, form, is_update, *args, **kwargs): 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: :param args: :param kwargs: :return: """ current_user_id = request.session['user_info']['id'] pk_list = request.POST.getlist('pk') Customer.objects.filter( id__in=pk_list, consultant_id=current_user_id).update(consultant=None) action_multi_remove.text = '移除到公户' display_list = [ StarkHandler.display_checkbox, 'name', 'qq', get_m2m_text('咨询课程', 'course'), get_choice_text('状态', 'status'), display_record, display_pay_record, ] model_form_class = PrivateCustomerModelForm action_list = [ action_multi_remove, ]
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 = [StarkHandler.display_checkbox,'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}) def action_multi_apply(self, request, *args, **kwargs): """ 批量申请到私户 :param request: :return: """ """ # 基本实现-- current_user_id = 6 # 客户ID 列表 pk_list = request.POST.getlist('pk') # 将选中的客户更新到我的私户(consultant=当前用户) models.Customer.objects.filter(id__in=pk_list,status=2,consultant__isnull=True).update(consultant_id=current_user_id) """ current_user_id = 6 pk_list = request.POST.getlist('pk') private_customer_count = models.Customer.objects.filter(consultant_id=current_user_id,status=2).count() # 私户个数的限制 if private_customer_count + len(pk_list) > 150: return HttpResponse('做人不要太贪心,私户中已有%s个客户,最多只能申请 %s'%(private_customer_count,150 - private_customer_count)) # 数据库中加锁 flag = False with transaction.atomic(): # 事务 # 在数据库中加锁 # 防止多个用户同时提交一个相同的客户到自己的私户 origin_queryser = models.Customer.objects.filter(id__in=pk_list,status=2,consultant__isnull=True).select_for_update() if len(origin_queryser) == len(pk_list): models.Customer.objects.filter(id__in=pk_list, status=2, consultant__isnull=True).update(consultant_id=current_user_id) flag = True if not flag: return HttpResponse('手速太慢了,选中的客户已被其他人申请走') action_multi_apply.text = "申请到私户" action_list = [action_multi_apply,]
class StudentHandler(PermissionHandler, StarkHandler): model_form_class = StudentModelForm @property def current_user(self): user_id = self.request.session['user_info']['id'] user_obj = UserInfo.objects.filter(id=user_id).first() return user_obj @property def get_myclasses_url_name(self): return self.get_url_name('myclasses') @property def get_myhomeworkscore_url_name(self): return self.get_url_name('homeworkscore') def display_score(self, obj=None, is_header=None, *args, **kwargs): if is_header: return '积分管理' if self.current_user.depart_id == 4: return f'{obj.score}' record_url = name2url(self.site.namespace, "academy_scorerecord_list", student_id=obj.pk) return mark_safe('<a target="_blank" href="%s">%s</a>' % (record_url, obj.score)) def get_myclasses_view(self, request, *args, **kwargs): student_id = kwargs.get('student_id') classes = Student.objects.filter(id=student_id).first().classes.all() return render(request, 'myclasses.html', {'classes': classes, 'student_id': student_id}) def get_homeworkscore_view(self, request, *args, **kwargs): student_id = kwargs.get('student_id') classes_id = kwargs.get('classes_id') homeworkscore_queryset = HomeworkScore.objects.filter(classes_id=classes_id, student_id=student_id).all() return render(request, 'check_homeworkscore.html', {'score_queryset': homeworkscore_queryset}) def display_myclasses(self, obj, is_header, *args, **kwargs): if is_header: return '我的课程' myclasses_url = name2url(self.site.namespace, self.get_myclasses_url_name, student_id=obj.pk) return mark_safe('<a href="%s">我的课程</a>' % (myclasses_url)) list_display = ['customer', 'qq', 'mobile', 'emergency_contract', get_m2m_text('已报班级', 'classes'), display_score, get_choice_text('状态', 'student_status'),] has_add_btn = False def get_urls(self): 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), url(r'^myclasses/(?P<student_id>\d+)/$', self.wrapper(self.get_myclasses_view), name=self.get_myclasses_url_name), url(r'^myclasses/homeworkscore/(?P<student_id>\d+)/(?P<classes_id>\d+)/$', self.wrapper(self.get_homeworkscore_view), name=self.get_myhomeworkscore_url_name) ] return patterns search_list = ['customer__name', 'qq', 'mobile', ] search_group = [ Option('classes', text_func=lambda x: '%s-%s' % (x.school.title, str(x))) ] def get_queryset(self, request, *args, **kwargs): if self.current_user.depart_id == 4: student_id = Student.objects.filter(user_id=self.current_user.id) return Student.objects.filter(id=student_id) return super().get_queryset(request, *args, **kwargs) def get_search_group(self): if self.current_user.depart_id == 4: return [] return self.search_group def get_search_list(self): if self.current_user.depart_id == 4: return [] return self.search_list def get_list_display(self, request, *args, **kwargs): if self.current_user.depart_id == 4: self.list_display[4]=type(self).display_myclasses return self.list_display
class PubCustomerHandler(PermissionHandler, StarkHandler): def check_record(self, obj, is_header): if is_header: return '跟进记录' record_url = name2url(self.site.namespace, self.get_url_name('record'), pk=obj.pk) return mark_safe("<a href='%s'>跟进记录</a>" % record_url) list_display = [ StarkHandler.display_checkbox, 'name', get_choice_text('性别', 'gender'), 'qq', get_m2m_text('课程', 'course'), get_choice_text('状态', 'status'), check_record ] def get_queryset(self, request, *args, **kwargs): return self.model_class.objects.filter(consultant__isnull=True) def multi_add_to_priv(self, request, *args, **kwargs): consult_id = request.session['user_info']['id'] pk_list = request.POST.getlist('pk') private_customer_count = Customer.objects.filter( consultant_id=consult_id, status=2).count() # 私户个数限制 if (private_customer_count + len(pk_list)) > Customer.MAX_PRIVATE_CUSTOMER_COUNT: return HttpResponse( '做人不要太贪心,私户中已有%s个客户,最多只能申请%s' % (private_customer_count, Customer.MAX_PRIVATE_CUSTOMER_COUNT - private_customer_count)) flag = False with transaction.atomic(): # 事务 # 在数据库中加锁 origin_queryset = Customer.objects.filter( id__in=pk_list, status=2, consultant__isnull=True).select_for_update() if len(origin_queryset) == len(pk_list): Customer.objects.filter( id__in=pk_list, status=2, consultant__isnull=True).update(consultant_id=consult_id) flag = True if not flag: return HttpResponse('手速太慢了,选中的客户已被其他人申请,请重新选择') multi_add_to_priv.text = '批量加入私户' def get_record(self, request, pk): record_list = ConsultRecord.objects.filter(customer_id=pk) return render(request, 'record.html', {'record_list': record_list}) def extra_urls(self): patterns = [ url(r'^record/(?P<pk>\w+)', self.wrapper(self.get_record), name=self.get_url_name('record')) ] return patterns model_form_class = PublicCustomerModelForm action_list = [multi_add_to_priv]
class PublicCustomerHandler(PermissionHandler, StarkHandler): # 增加一个 查看记录按钮 def display_record(self, obj=None, is_header=None, *args, **kwargs): if is_header: return '跟进记录' record_url = self.reverse_commons_url(self.get_url_name('record_view'), pk=obj.pk) # 带上id 反向生成别名 return mark_safe('<a href="%s">查看跟进</a>' % record_url) list_display = [ StarkHandler.display_checkbox, 'name', 'qq', display_record, get_choice_text('状态', 'status'), get_m2m_text('咨询课程', 'course') ] # 自定义显示 # 自定义筛选:过滤只显示未被分配的客户 def get_queryset(self, request, *args, **kwargs): return self.model_class.objects.filter(consultant__isnull=True) model_form_class = PublicCustomerModelForm # 应用上 # 增加一个url(跟进记录)用写好的钩子方法 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=pk) return render(request, 'record_view.html', {'record_list': record_list}) # 自定义函数,stark组件里有案例 def action_multi_apply(self, request, *args, **kwargs): """批量申请到私户,自定义函数""" pk_list = request.POST.getlist('pk') # 选中客户id列表 current_user_id = request.session['user_info']['id'] # 将选中的客户更新到我的私户中()当前登录用户的私户当前登录id中 # 状态验证未成交 且 没有课程顾问的 private_customer_count = models.Customer.objects.filter( consultant_id=current_user_id, status=2).count() # 取当前用户的私户个数 if (private_customer_count + len(pk_list)) > 150: return HttpResponse( '私户中总个数已经有%s 人,还能申请%s 个' % (private_customer_count, models.Customer.MAX_PRIVATE_CUSTOMER - private_customer_count)) # 如果多个人同时提交申请私户可能会有bug所以。。。【数据库加锁,许可证】 from django.db import transaction flag = False with transaction.atomic(): # 事务 # 上锁 select * from customer where id in [11,22] for update; origin_queryset = models.Customer.objects.filter( id__in=pk_list, status=2, consultant__isnull=True).select_for_update() if len(origin_queryset) == len(pk_list): models.Customer.objects.filter( id__in=pk_list, status=2, consultant__isnull=True).update( consultant_id=current_user_id) flag = True if not flag: return HttpResponse('选中的客户已经被其他人申请走了') action_multi_apply.text = '批量申请到私户' action_list = [ action_multi_apply, ]
class PublicCustomerHandler(PermissionHandler, StarkHandler): def display_record(self, obj=None, is_header=None, *args, **kwargs): if is_header: return '跟进记录' record_url = self.reverse_commons_url(self.get_url_name('record_view'), pk=obj.pk) return mark_safe('<a href="%s">查看跟进</a>' % record_url) list_display = [ StarkHandler.display_checkbox, 'name', 'qq', get_m2m_text('咨询课程', 'course'), display_record, get_choice_text('状态', 'status') ] model_form_class = PublicCustomerModelForm def get_queryset(self, request, *args, **kwargs): return self.model_class.objects.filter(consultant__isnull=True) 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}) def action_multi_apply(self, request, *args, **kwargs): """ 批量申请到私户 :return: """ current_user_id = request.session['user_info']['id'] pk_list = request.POST.getlist('pk') private_customer_count = models.Customer.objects.filter( consultant_id=current_user_id, status=2).count() # 私户个数限制 if (private_customer_count + len(pk_list)) > models.Customer.MAX_PRIVATE_CUSTOMER_COUNT: return HttpResponse('做人不要太贪心,私户中已有%s个客户,最多只能申请%s' % (private_customer_count, models.Customer.MAX_PRIVATE_CUSTOMER_COUNT - private_customer_count)) # 数据库中加锁 flag = False with transaction.atomic(): # 事务 # 在数据库中加锁 origin_queryset = models.Customer.objects.filter( id__in=pk_list, status=2, consultant__isnull=True).select_for_update() if len(origin_queryset) == len(pk_list): models.Customer.objects.filter( id__in=pk_list, status=2, consultant__isnull=True).update( consultant_id=current_user_id) flag = True if not flag: return HttpResponse('手速太慢了,选中的客户已被其他人申请,请重新选择') action_multi_apply.text = "申请到我的私户" action_list = [ action_multi_apply, ]
class PublicCustomerHandler(PermissionHandler, StarkHandler): # 公户 model_form_class = PublicCustomerModelForm def action_multi_apply(self, request, *args, **kwargs): """ 批量申请到私户 :return: """ # 客户id pk_list = request.POST.getlist('pk') # 更新到我的私户(consultant=当前自己的id) ######这里还要改 current_user_id = request.session['user_info']['id'] # 限制 如过大于150人 就不可以申请到私户 private_customer_count = models.Customer.objects.filter( consultant__id=current_user_id, status=2).count() if (private_customer_count + len(pk_list)) > models.Customer.MAX_PRIVATE_COUNT: return HttpResponse( "私户中已有%s人,最多只可申请%s人" % (private_customer_count, models.Customer.MAX_PRIVATE_COUNT - private_customer_count)) flag = False with transaction.atomic(): origin_queryset = models.Customer.objects.filter( pk__in=pk_list, status=2, consultant__isnull=True).select_for_update() if not origin_queryset: return HttpResponse("获取用户失败或当前用户已报名,请申请其他用户") if len(origin_queryset) == len(pk_list): origin_queryset.update(consultant_id=current_user_id) flag = True if not flag: return HttpResponse("手速太慢,已有选中客户被其他人申请到私户,请重新申请") action_multi_apply.text = "批量申请到我的私户" action_list = [action_multi_apply] def display_record(self, obj=None, is_header=None, *args, **kwargs): if is_header: return "跟进记录" tpl = '<a href="%s" target="_blank">查看跟进记录</a>' % ( self.reverse_record_view_url(pk=obj.pk)) return mark_safe(tpl) list_display = [ StarkHandler.display_checkbox, 'parent_name', 'wechat', get_choice_text('来源', 'source'), get_m2m_text('咨询课程', 'course'), 'remark', get_datetime_text('咨询日期', 'date'), display_record ] def get_queryset(self, request, *args, **kwargs): """加条件来显示的数据(filter)""" return self.model_class.objects.filter(consultant__isnull=True) def extra_urls(self): patterns = [ url(r'^consultant/record/(?P<pk>\d+)/$', self.wrapper(self.record_view), name=self.get_record_view_url_name) ] return patterns def reverse_record_view_url(self, *args, **kwargs): return self.reverse_commons_url(self.get_record_view_url_name, *args, **kwargs) @property def get_record_view_url_name(self): return self.get_url_name('consultant_record') def record_view(self, request, pk): msg = models.ConsultRecord.objects.filter(customer_id=pk) return render(request, 'consult_record.html', {'body_list': msg})