Django项目:CRM(客户关系管理系统)--72--62PerfectCRM实现CRM讲师讲课记录

 1 #urls.py
 2 
 3 """PerfectCRM URL Configuration
 4 
 5 The `urlpatterns` list routes URLs to views. For more information please see:
 6     https://docs.djangoproject.com/en/2.0/topics/http/urls/
 7 Examples:
 8 Function views
 9     1. Add an import:  from my_app import views
10     2. Add a URL to urlpatterns:  path('', views.home, name='home')
11 Class-based views
12     1. Add an import:  from other_app.views import Home
13     2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
14 Including another URLconf
15     1. Import the include() function: from django.urls import include, path
16     2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
17 """
18 from django.contrib import admin
19 from django.urls import path
20 
21 # ————————02PerfectCRM创建ADMIN页面————————
22 from django.conf.urls import url  # URL
23 from django.conf.urls import include # 分发URL
24 # ————————02PerfectCRM创建ADMIN页面————————
25 
26 # ————————46PerfectCRM实现登陆后页面才能访问————————
27 from PerfectCRM import main_views
28 # ————————46PerfectCRM实现登陆后页面才能访问————————
29 
30 urlpatterns = [
31     path('admin/', admin.site.urls),
32     
33 # ————————02PerfectCRM创建ADMIN页面————————
34     url(r'^king_admin/', include("king_admin.king_urls")),  # 自定义admin
35 # ————————02PerfectCRM创建ADMIN页面————————
36     
37 # ————————03PerfectCRM创建基本数据————————
38     url(r'^DBadd/', include("DBadd.DBadd_urls")),  # 添加随机数据
39 # ————————03PerfectCRM创建基本数据————————
40     # ————————38PerfectCRM实现全局账号登录注销————————
41     url(r'^gbacc/', include("gbacc.gbacc_urls")),  # 全局账号登录注销
42     # ————————38PerfectCRM实现全局账号登录注销————————
43 
44     # ————————42PerfectCRM实现AJAX全局账号注册————————
45     url(r'^gbacc/', include("gbacc.gbacc_ajax_urls")),  # 全局账号登录注销
46     # ————————42PerfectCRM实现AJAX全局账号注册————————
47 
48     # ————————46PerfectCRM实现登陆后页面才能访问————————
49     url(r'^$', main_views.PortalView.as_view()),
50     # ————————46PerfectCRM实现登陆后页面才能访问————————
51 
52     # ————————47PerfectCRM实现CRM客户报名流程————————
53     url(r'^bpm/', include("bpm.sales.sales_urls")),  # 业务流程 #学生报名
54     # ————————47PerfectCRM实现CRM客户报名流程————————
55 
56     # ————————53PerfectCRM实现CRM客户报名流程缴费————————
57     url(r'^bpm/', include("bpm.financial.financial_urls")),  # 业务流程 #财务缴费
58     # ————————53PerfectCRM实现CRM客户报名流程缴费————————
59 
60     # ————————60PerfectCRM实现CRM学生上课记录————————
61     url( r'^bpm/', include( "bpm.student.student_urls" ) ),  # 业务流程 # 学生上课记录
62     # ————————60PerfectCRM实现CRM学生上课记录————————
63 
64     # ————————62PerfectCRM实现CRM讲师讲课记录————————
65     url( r'^bpm/', include( "bpm.teacher.teacher_urls" ) ),  # 业务流程 # 讲师班级
66     # ————————62PerfectCRM实现CRM讲师讲课记录————————
67 ]
#urls.py

 1 # teacher_urls.py
 2 # ————————62PerfectCRM实现CRM讲师讲课记录————————
 3 from django.conf.urls import url
 4 from bpm.teacher import teacher_views
 5 urlpatterns = [
 6     url(r'^teacher_class/$', teacher_views.teacher_class,name='teacher_class'),#讲师班级
 7     url(r'^teacher_class_detail/(d+)/$', teacher_views.teacher_class_detail, name='teacher_class_detail'),  # 讲师班级课节详情
 8 
 9 ]
10 
11 # ————————62PerfectCRM实现CRM讲师讲课记录————————
# teacher_urls.py

 1 # teacher_views.py
 2 # ————————62PerfectCRM实现CRM讲师讲课记录————————
 3 from django.contrib.auth.decorators import login_required  # 登陆后页面才能访问
 4 from django.shortcuts import render
 5 
 6 #讲师班级
 7 @login_required  # 登陆后页面才能访问
 8 def teacher_class(request):
 9     # user_id=request.user.id #当前登陆的ID
10     # classlist=models.UserProfile.objects.get(id=user_id).classlist_set.all()#讲师所教班级
11     classes_obj=request.user.classlist_set.all() #根据 登陆的ID 获取02班级表
12     return render(request,'bpm_teacher/teacher_class.html',locals())
13 
14 # 讲师班级课节详情
15 @login_required  # 登陆后页面才能访问
16 def teacher_class_detail(request,class_id):
17     # user_id=request.user.id #当前登陆的ID
18     # classes_obj=models.UserProfile.objects.get(id=user_id).classlist_set.get(id=class_id)#所选的班级
19     classes_obj=request.user.classlist_set.get(id=class_id) #根据 登陆的ID 获取02班级表
20     courserecordlist=classes_obj.courserecord_set.all()#根据 02班级表的ID 获取09学习纪录
21     return render(request, 'bpm_teacher/teacher_classes_detail.html', locals())
22 
23 # ————————62PerfectCRM实现CRM讲师讲课记录————————
# teacher_views.py

  1 # kingadmin.py
  2 # ————————04PerfectCRM实现King_admin注册功能————————
  3 from crm import models
  4 #print("kingadmin crm",models.Customer)
  5 
  6 # ————————05PerfectCRM实现King_admin注册功能获取内存————————
  7 # from king_admin.base_admin import register,BaseAdmin
  8 from king_admin.base_admin import site,BaseAdmin
  9 # ————————05PerfectCRM实现King_admin注册功能获取内存————————
 10 
 11 # ————————24PerfectCRM实现King_admin自定义操作数据————————
 12 from django.shortcuts import render
 13 # ————————24PerfectCRM实现King_admin自定义操作数据————————
 14 
 15 # ————————28PerfectCRM实现King_admin编辑限制————————
 16 from django.forms import ValidationError
 17 from django.shortcuts import render,redirect
 18 # ————————28PerfectCRM实现King_admin编辑限制————————
 19 
 20 
 21 
 22 
 23 # ————————62PerfectCRM实现CRM讲师讲课记录————————
 24 # 02班级表
 25 class ClassListAdmin(BaseAdmin):
 26     list_display = ['id', 'branch', 'course', 'class_type', 'semester', 'start_date', 'end_date']  # 显示字段表头
 27     list_filter = ['branch', 'course', 'class_type']  # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
 28     filter_horizontal = ['teachers']  #复选框
 29 site.register(models.ClassList,ClassListAdmin)               #02班级表
 30 
 31 # ————————62PerfectCRM实现CRM讲师讲课记录————————
 32 
 33 
 34 
 35 
 36 #04客户信息表
 37 class CustomerAdmin(BaseAdmin):#定制Djanago admin
 38     # ————————54PerfectCRM实现CRM客户报名链接————————
 39     # list_display = ('id', 'qq', 'source', 'consultant', 'content', 'date')  # 显示字段表头
 40     list_display = ('id', 'qq', 'source', 'consultant', 'content', 'date','status','enroll')  # 显示字段表头
 41     # ————————54PerfectCRM实现CRM客户报名链接————————
 42     # ————————11PerfectCRM实现King_admin分页显示条数————————
 43     list_per_page = 2  #分页条数  # 默认分页条数10
 44     # ————————11PerfectCRM实现King_admin分页显示条数————————
 45     # ————————16PerfectCRM实现King_admin日期过滤————————
 46     # ————————15PerfectCRM实现King_admin多条件过滤————————
 47     # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
 48     # list_filter = ('source','consultant','consult_courses',)
 49     list_filter = ('date','source','consultant','consult_courses',)
 50     # ————————15PerfectCRM实现King_admin多条件过滤————————
 51     # ————————16PerfectCRM实现King_admin日期过滤————————
 52     # ————————18PerfectCRM实现King_admin搜索关键字————————
 53     #搜索(不能包含CharField)(注意加 逗号 , )
 54     search_fields = ('name','qq',)
 55     # ————————18PerfectCRM实现King_admin搜索关键字————————
 56     # ————————26PerfectCRM实现King_admin自定义排序————————
 57     ordering = '-qq'  #自定义排序,默认'-id'
 58     # ————————26PerfectCRM实现King_admin自定义排序————————
 59     # ————————27PerfectCRM实现King_admin编辑复选框————————
 60     filter_horizontal = ('tags',) #复选框
 61     # ————————27PerfectCRM实现King_admin编辑复选框————————
 62     # ————————33PerfectCRM实现King_admin编辑整张表限制————————
 63     readonly_table=True#默认表单不锁定
 64     # ————————33PerfectCRM实现King_admin编辑整张表限制————————
 65 
 66     # ————————55PerfectCRM实现CRM客户报名状态颜色变化————————
 67     colored_fields = {
 68         'status':{'已报名':"rgba(145, 255, 0, 0.78)",
 69                   '未报名':"#ddd"},}
 70     # ————————55PerfectCRM实现CRM客户报名状态颜色变化————————
 71 
 72     # ————————54PerfectCRM实现CRM客户报名链接————————
 73     def enroll(self):
 74         '''报名'''
 75         print("customize field enroll",self)
 76         link_name = "报名"
 77         if self.instance.status == 0:
 78             link_name = "报名新课程"
 79         return '''<a target="_blank" class="btn-link" href="/bpm/customer/%s/enrollment/">点击%s</a> ''' % (self.instance.id,link_name)
 80                 # url(r'^customer/(d+)/enrollment/$', sales_views.enrollment, name="enrollment"),  # 客户招生#报名流程一 下一步
 81                 # target属性用于表示所链接文件打开到的位置 #记住,“”内的文字只是表示一个对象的名子。
 82     enroll.display_name = "报名链接"
 83     # ————————54PerfectCRM实现CRM客户报名链接————————
 84 
 85 
 86 
 87     # ————————24PerfectCRM实现King_admin自定义操作数据————————
 88     # from django.shortcuts import render
 89     actions = ['test_actions',]#定制功能    #测试返回到一个新页面
 90     def test_actions(self,request,arg2):#对应的函数 #request类自己的请求  #arg2类的内容
 91         return render(request,"king_admin/table_index.html")
 92     test_actions.short_description = "测试显示中文"
 93     # ————————24PerfectCRM实现King_admin自定义操作数据————————
 94 
 95     # ————————28PerfectCRM实现King_admin编辑限制————————
 96     # ————————31PerfectCRM实现King_admin编辑多对多限制————————
 97     # readonly_fields = ('qq', 'consultant',)  # 不可修改
 98     readonly_fields = ('qq', 'consultant','tags',)  # 不可修改
 99     # ————————31PerfectCRM实现King_admin编辑多对多限制————————
100 
101     # ————————29PerfectCRM实现King_admin编辑自定义限制————————
102     def default_form_validation(self,obj):
103         print('validation:制定的',obj.cleaned_data)
104         consult_course=obj.cleaned_data.get('content','')#自制验证字段
105         if len(consult_course)<10:
106             return ValidationError(#添加错误信息 返回
107                                 ("该字段%(field)s 咨询内容记录不能少于10个字符"),
108                                 code='invalid',
109                                 params={'field':'content',},
110                             )
111     # ————————29PerfectCRM实现King_admin编辑自定义限制————————
112 
113     # ————————28PerfectCRM实现King_admin编辑限制————————
114 
115     # ————————30PerfectCRM实现King_admin编辑自定义字段验证————————
116     def clean_name(self,obj,*args,**kwargs):#名称验证 单个
117         name=obj.cleaned_data['name']
118         if not name:
119             obj.add_error('name','不能为空!')
120             return ValidationError(#添加错误信息 返回
121                                 ("%(field)s:该字段 不能为空"),
122                                 code='invalid',
123                                 params={'field':'name',},
124                             )
125         elif len(name)<5:
126             obj.add_error('name','不能小于5个字符!')
127             #return ValidationError('',)
128             return ValidationError(#添加错误信息 返回
129                                 ("%(field)s:该字段 不能小于5个字符!"),
130                                 code='invalid',
131                                 params={'field':'name',},
132                             )
133     # ————————30PerfectCRM实现King_admin编辑自定义字段验证————————
134 
135 # ————————34PerfectCRM实现CRM自定义用户————————
136 #10账号表
137 class UserProfileAdmin(BaseAdmin):#定制Djanago admin
138     list_display = ('id', 'email', 'name')  # 显示字段表头
139 
140     # ————————36PerfectCRM实现King_admin密码修改————————
141     readonly_fields = ('password',)   # 不可修改,限制
142     filter_horizontal = ('user_permissions','groups') #复选框
143     modelform_exclude_fields=['last_login']#排除#不显示 #自增日期 #base_admin.py #forms.py
144     # ————————36PerfectCRM实现King_admin密码修改————————
145 
146 site.register(models.UserProfile, UserProfileAdmin)
147 # ————————34PerfectCRM实现CRM自定义用户————————
148 
149 # ————————05PerfectCRM实现King_admin注册功能获取内存————————
150 # register(models.Customer,CustomerAdmin)
151 # register(models.CourseRecord)
152 site.register(models.Customer,CustomerAdmin)
153 # ————————58PerfectCRM实现king_admin批量生成上课记录————————
154 # site.register(models.CourseRecord)
155 # ————————58PerfectCRM实现king_admin批量生成上课记录————————
156 # ————————05PerfectCRM实现King_admin注册功能获取内存————————
157 
158 # ————————04PerfectCRM实现King_admin注册功能————————
159 
160 
161 # ————————56PerfectCRM实现CRM客户报名缴费链接————————
162 # 06学员报名信息表
163 class EnrollmentAdmin(BaseAdmin):  # 定制Djanago admin
164     list_display = ('id', 'customer', 'enrolled_class', 'consultant', 'Pay_cost', 'date', 'payment')  # 显示字段表头
165 
166     # ————————58PerfectCRM实现king_admin批量生成上课记录————————
167     list_filter = ('enrolled_class','consultant', 'Pay_cost',) # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
168     # ————————58PerfectCRM实现king_admin批量生成上课记录————————
169 
170     colored_fields = {
171         'Pay_cost': {True: "rgba(145, 255, 0, 0.78)",
172                      False: "#ddd"}, }
173     def payment(self):
174         link_name = "增加缴费"
175         if self.instance.Pay_cost == False:
176             link_name = "缴费"
177         return '''<a target="_blank" class="btn-link"  href="/bpm/payment/%s/" >点击%s</a> ''' % (self.instance.id, link_name)
178         # url(r'^payment/(d+)/$', financial_views.payment, name="payment"),  # 报名流程四    缴费   #财务
179         # target属性用于表示所链接文件打开到的位置 #记住,“”内的文字只是表示一个对象的名子。
180     payment.display_name = "缴费链接"
181 site.register(models.Enrollment, EnrollmentAdmin)  # 06学员报名信息表
182 # ————————56PerfectCRM实现CRM客户报名缴费链接————————
183 
184 # ————————58PerfectCRM实现king_admin批量生成上课记录————————
185 # 07缴费记录表
186 class PaymentAdmin(BaseAdmin):
187     list_display = ['id', 'customer', 'course', 'amount', 'consultant','date']  # 显示字段表头
188     list_filter = ('customer', 'course', 'consultant',)  # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
189 
190 from django.shortcuts import render, HttpResponse, redirect
191 # 08每节课上课纪录表
192 class CourseRecordAdmin(BaseAdmin):
193     list_display = ['id', 'from_class', 'day_num', 'teacher', 'has_homework', 'homework_title', 'homework_content','outline', 'date']  # 显示字段表头
194     list_filter = ('from_class', 'teacher', 'date')  # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
195     def initialize_studyrecords(self, request, queryset):  # 制定功能
196         print('initialize_studyrecords', self, request, queryset)
197         if len(queryset) > 1:
198             return HttpResponse("同时只能选择一个班级!")
199         print('获取对应的学员', queryset[0].from_class.enrollment_set.all())  # _set反向查询
200         new_obj_list = []  # 用于批量创建事务  #防止数据库事物回滚
201         for enrll_obj in queryset[0].from_class.enrollment_set.all():  # 创建学习记录
202             #     models.StudyRecord.objects.get_or_create(       #get_or_ #防止报错
203             #         student=enrll_obj,#对应学员
204             #         course_record=queryset[0],
205             #         attendance=0,#签到状态,默认签到,
206             #         score=0,#成绩
207             #     )
208 
209             # 防止数据库事物回滚    #"""09学习纪录"""
210             new_obj_list.append(models.StudyRecord(
211                 student=enrll_obj,  # 对应学员
212                 course_record=queryset[0],  # 班级#节课
213                 attendance=0,  # 签到状态,默认签到,
214                 score=0,  # 成绩
215             ))
216         try:
217             models.StudyRecord.objects.bulk_create(new_obj_list)  # bulk_create批量创建数据库事物 #统一最后保存
218         except Exception as e:
219             return HttpResponse('批量创建失败,本节课可能有相应的上课记录')
220 
221         return redirect("/king_admin/crm/studyrecord/?course_record=%s" % queryset[0].id)  # 学习记录 #加上过滤
222 
223     actions = ['initialize_studyrecords', ]
224     initialize_studyrecords.short_description = "创建班级本节上课记录"  # 显示别名
225 # 09学习纪录
226 class StudyRecordAdmin(BaseAdmin):
227     list_display = ['id', 'student', 'course_record', 'attendance', 'score', 'date']  # 显示字段表头
228 
229     list_filter = ['course_record', 'attendance', 'score', 'student']  # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
230 
231     list_editable = ['score', 'attendance']  # 可编辑   #用于上课点名 批改成绩
232 
233 site.register(models.Payment, PaymentAdmin)  # 07缴费记录表
234 site.register(models.CourseRecord, CourseRecordAdmin)  # 08每节课上课纪录表
235 site.register(models.StudyRecord, StudyRecordAdmin)  # 09学习纪录
236 # ————————58PerfectCRM实现king_admin批量生成上课记录————————
# kingadmin.py

 1 {#teacher_class.html#}
 2 {## ————————62PerfectCRM实现CRM讲师讲课记录————————#}
 3 {% extends 'bpm_master/bpm_sample.html' %}
 4 {% block right-container-content %} {#自定义内容开始 右边页面内容#}
 5     <div class="panel-default">
 6         <div class="panel-body">
 7             <h4>当前用户: {{ request.user }} | 讲师名字:{{ request.user.stu_account.name }} |
 8                 讲师QQ:{{ request.user.stu_account }}</h4>
 9             <ol class="breadcrumb">
10                 <li><a href="/bpm/teacher_class/">我的班级</a></li>
11             </ol>
12             <table class="table table-striped table-responsive">
13                 <thead>
14                 <tr>
15                     <th><a target="_blank" href="/king_admin/crm/classlist/add/">校区班级</a></th>
16                     <th>班级类型</th>
17                     <th><a target="_blank" href="/king_admin/crm/courserecord/add/">课程进度</a></th>
18                     <th><a target="_blank" href="/king_admin/crm/customer/">学员数量</a></th>
19                     <th>开课日期</th>
20                     <th>结业日期</th>
21                 </tr>
22                 </thead>
23                 <tbody>
24                 {% for class in classes_obj %}
25                     <tr>
26                         <td>{{ class }}</td>
27                         <td>{{ class.get_class_type_display }}</td>
28                         <td>
29                             <a href="{% url 'teacher_class_detail' class.id %}">
30                                 已上: {{ class.courserecord_set.all.count }}节
31                             </a>
32                         </td>
33                         <td>{{ class.enrollment_set.select_related.count }}</td>
34                         <td>{{ class.start_date }}</td>
35                         <td>{{ class.end_date }}</td>
36                     </tr>
37                 {% endfor %}
38                 </tbody>
39             </table>
40         </div>
41     </div>
42 {% endblock %}
43 {## ————————62PerfectCRM实现CRM讲师讲课记录————————#}
{#teacher_class.html#}

 1 {#teacher_classes_detail.html#}
 2 {## ————————62PerfectCRM实现CRM讲师讲课记录————————#}
 3 {% extends 'bpm_master/bpm_sample.html' %}
 4 {% block right-container-content %} {#自定义内容开始 右边页面内容#}
 5     <div class="panel-default">
 6         <div class="panel-default">
 7             <div class="panel-body">
 8                 <h4>当前用户: {{ request.user }} | 讲师名字:{{ request.user.stu_account.name }} |
 9                     讲师QQ:{{ request.user.stu_account }} </h4>
10                 <ol class="breadcrumb">
11                     <li><a href="/bpm/teacher_class/">我的班级</a></li>
12                     <li><a href="{% url 'teacher_class_detail' classes_obj.id %}">{{ classes_obj }}</a></li>
13                 </ol>
14                 <table class="table table-striped table-responsive ">
15                     <thead>
16                     <tr>
17                         <th><a target="_blank" href="/king_admin/crm/courserecord/add/">课程节次</a></th>
18                         <th>签到状态</th>
19                         <th>本节作业</th>
20                         <th>上课日期</th>
21                         <th>本节大纲</th>
22                         <th>作业标题</th>
23                         <th>作业要求</th>
24                     </tr>
25                     </thead>
26 
27 
28                     <tbody>
29                     {% for courserecord in courserecordlist %}
30                         <tr>
31                             <td><a target="_blank"
32                                    href="/king_admin/crm/courserecord/{{ courserecord.id }}/change/">第 {{ courserecord.day_num }}节</a>
33                             </td>
34                             {#课程节次#}
35                             <td>
36                                 <a target="_blank"
37                                    href="/king_admin/crm/studyrecord/?course_record={{ courserecord.id }} ">点名/成绩</a>
38                             </td>
39                             {#签到状态#}
40                             <td>{{ courserecord.has_homework }}</td>
41                             {#本节作业#}
42                             <td> {{ courserecord.date }}</td>
43                             {#上课日期#}
44                             <td>
45                                 <pre style=" 240px;height: 60px">{{ courserecord.outline }} </pre>
46                             </td>
47                             {#本节大纲#}
48                             <td>
49                                 <pre style=" 240px;height: 60px">{{ courserecord.homework_title }}</pre>
50                             </td>
51                             {#作业标题#}
52                             <td>
53                                 <pre style=" 240px;height: 60px">{{ courserecord.homework_content }} </pre>
54                             </td>
55                             {#作业要求#}
56                         </tr>
57                     {% endfor %}
58                     </tbody>
59                 </table>
60             </div>
61         </div>
62     </div>
63 {% endblock %}
64 {## ————————62PerfectCRM实现CRM讲师讲课记录————————#}
{#teacher_classes_detail.html#}

原文地址:https://www.cnblogs.com/ujq3/p/9032870.html