Django项目:CRM(客户关系管理系统)--70--60PerfectCRM实现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 ]

#urls.py

 1 # student_urls.py
 2 # ————————60PerfectCRM实现CRM学生上课记录————————
 3 from django.conf.urls import url
 4 from bpm.student import student_views
 5
 6 urlpatterns = [
 7     url(r‘^my_course/$‘, student_views.my_course, name=‘my_course‘),   #学生报名的课程
 8     url(r‘^studyrecords/(\d+)/$‘, student_views.studyrecords, name=‘studyrecords‘),  # #学生上课记录列表
 9 ]
10 # ————————60PerfectCRM实现CRM学生上课记录————————

# student_urls.py

 1 # student_views.py
 2 # ————————60PerfectCRM实现CRM学生上课记录————————
 3 from django.shortcuts import render
 4 from crm import models
 5
 6 #学生报名的课程
 7 def my_course(request):
 8     return  render(request, ‘bpm_student/my_course.html‘, locals())
 9
10 #学生上课记录列表
11 def studyrecords(request,enroll_obj_id):
12     enroll_obj=models.Enrollment.objects.get(id=enroll_obj_id)
13     return render(request,‘bpm_student/studyrecords.html‘,locals())
14
15 # ————————60PerfectCRM实现CRM学生上课记录————————

# student_views.py

 1 # bpm_tags.py
 2
 3 # ————————48PerfectCRM实现CRM客户报名流程学生合同————————
 4 from django import template
 5 register = template.Library()    #模板库
 6
 7 #合同格式
 8 @register.simple_tag
 9 def render_enrolled_contract(enroll_obj):#合同格式
10     if enroll_obj.enrolled_class.contract.template:
11         return enroll_obj.enrolled_class.contract.template.format(course_name=enroll_obj.enrolled_class,stu_name=enroll_obj.customer.name)
12     else:
13         return ‘‘
14
15 # ————————48PerfectCRM实现CRM客户报名流程学生合同————————
16
17
18 # ————————60PerfectCRM实现CRM学生上课记录————————
19
20 # from django import template
21 # register = template.Library()   #模板库
22 from django.db.models import Sum
23 #分数统计
24 @register.simple_tag
25 def get_score(enroll_obj,customer_obj):
26     study_records=enroll_obj.studyrecord_set.filter(course_record__from_class_id=enroll_obj.enrolled_class.id)
27     print(study_records,‘<----study_record‘)
28     return study_records.aggregate(Sum(‘score‘))
29
30 # ————————60PerfectCRM实现CRM学生上课记录————————

# bpm_tags.py

 1 {#my_course.html#}
 2 {## ————————60PerfectCRM实现CRM学生上课记录————————#}
 3 {% extends ‘bpm_master/bpm_sample.html‘ %}
 4 {% load bpm_tags %}
 5 {% block right-container-content %} {#自定义内容开始 右边页面内容#}
 6
 7     <div class="panel-default">
 8         <div class="panel-body">
 9             <h3>当前用户: {{ request.user }} </h3>
10             <table class="table table-striped table-responsive">
11                 <thead>
12                 <tr>
13                     <th>课程名称</th>
14                     <th>班级</th>
15                     <th>开课日期</th>
16                     <th>结业日期</th>
17                     <th>课程进度</th>
18                     <th>我的成绩</th>
19                     <th>作业管理</th>
20                 </tr>
21                 </thead>
22                 <tbody>
23                 {% for enroll_obj in request.user.stu_account.enrollment_set.all %}
24                     <tr>
25                         <td>{{ enroll_obj.enrolled_class.course }}</td>
26                         <td>s{{ enroll_obj.enrolled_class.semester }}</td>
27                         <td>{{ enroll_obj.enrolled_class.start_date }}</td>
28                         <td>{{ enroll_obj.enrolled_class.end_date }}</td>
29                         <td>已上: {{ enroll_obj.enrolled_class.courserecord_set.all.count }} 节</td>
30                         <td>
31                             {% get_score enroll_obj request.user.stu_account as score_data %}{{ score_data.score__sum }}</td>
32                         <td><a href="{% url ‘studyrecords‘ enroll_obj.id %}">作业管理</a></td>
33                     </tr>
34                 {% endfor %}
35                 </tbody>
36             </table>
37         </div>
38     </div>
39 {% endblock %}
40 {## ————————60PerfectCRM实现CRM学生上课记录————————#}

{#my_course.html#}

 1 {#studyrecords.html#}
 2  {## ————————60PerfectCRM实现CRM学生上课记录————————#}
 3 {% extends ‘bpm_master/bpm_sample.html‘ %}
 4 {% load bpm_tags %}
 5 {% block right-container-content %} {#自定义内容开始 右边页面内容#}
 6     <div class="panel-default">
 7         <div class="panel-body">
 8             <h3>当前用户: {{ request.user }}  | <a class="btn btn-info pull" href={% url ‘my_course‘ %}>返回</a></h3>
 9             <table class="table table-striped table-responsive">
10                 <thead>
11                 <tr>
12                     <th>课程名称</th>
13                     <th>课程节次</th>
14                     <th>上课日期</th>
15                     <th>签到状态</th>
16                     <th>我的成绩</th>
17                     <th>是否有作业</th>
18                     <th>作业标题</th>
19                 </tr>
20                 </thead>
21                 <tbody>
22                 {% for studyrecord in enroll_obj.studyrecord_set.all %}
23                     <tr>
24                         <td>{{ studyrecord.course_record }}</td>
25                         <td>{{ studyrecord.course_record.day_num }}</td>
26                         <td>{{ studyrecord.course_record.date }}</td>
27                         <td>{{ studyrecord.get_attendance_display }}</td>
28                         <td>{{ studyrecord.get_score_display }}</td>
29                         <td>{{ studyrecord.course_record.has_homework }}</td>
30                         <td>{{ studyrecord.course_record.homework_title }}</td>
31                     </tr>
32                 {% endfor %}
33                 </tbody>
34             </table>
35         </div>
36     </div>
37 {% endblock %}
38 {## ————————60PerfectCRM实现CRM学生上课记录————————#}

{#studyrecords.html#}

  1 #models.py
  2
  3 # ————————01PerfectCRM基本配置ADMIN————————
  4
  5 from django.db import models
  6 # Create your models here.
  7
  8 """
  9 #运行 Terminal
 10 #    生成 数据表
 11 #    python manage.py makemigrations
 12 #   数据表 迁移
 13 #    python manage.py migrate
 14 """
 15
 16 """01校区表"""
 17 class Branch(models.Model):
 18     name = models.CharField(max_length=128,unique=True) #校区名#CharField作用是保存文本,定长的变量类型
 19     addr = models.CharField(max_length=128) #地址
 20     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
 21         return self.name #返回 #校区名
 22     class Meta: #通过一个内嵌类 "class Meta" 给你的 model 定义元数据
 23         verbose_name_plural =  "01校区表" #verbose_name_plural给你的模型类起一个更可读的名字
 24
 25 """02班级表"""
 26 class ClassList(models.Model):
 27     #ForeignKey就是表与表之间的某种约定的关系  #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
 28     branch = models.ForeignKey("Branch",on_delete=models.CASCADE)#校区    关联到  校区表
 29     course = models.ForeignKey("Course",on_delete=models.CASCADE) #课程   关联到   课程表
 30
 31     # ————————48PerfectCRM实现CRM客户报名流程学生合同————————
 32     contract = models.ForeignKey(‘ContractTemplate‘, blank=True, null=True, default=1,on_delete=models.CASCADE)  # 合同表
 33     # ————————48PerfectCRM实现CRM客户报名流程学生合同————————
 34
 35     class_type_choices = ( #上课形式
 36                           (0,‘面授(脱产)‘),
 37                           (1,‘面授(周末)‘),
 38                           (2,‘网络班‘),)
 39     #PositiveSmallIntegerField正小整数 0 ~ 32767 #choices是Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
 40     class_type = models.SmallIntegerField(choices=class_type_choices)#上课形式
 41
 42     #PositiveSmallIntegerField正小整数 0 ~ 32767
 43     semester = models.PositiveSmallIntegerField(verbose_name="学期") #课程的第几期
 44
 45     #ManyToManyField多对多和外键工作方式相同,只不过我们处理的是QuerySet而不是模型实例。
 46     teachers = models.ManyToManyField("UserProfile") # 老师   关联到    账号表
 47
 48     start_date = models.DateField(verbose_name="开班日期") #DateField 日期格式 YYYY-MM-DD #verbose_name是Admin中显示的字段名称
 49
 50     # DateField 日期格式 YYYY-MM-DD #verbose_name是Admin中显示的字段名称 #Django可空#数据库可以为空
 51     end_date = models.DateField(verbose_name="结业日期",blank=True,null=True)
 52
 53     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
 54         return "%s %s %s" %(self.branch,self.course,self.semester) #返回 #%s格式化输出字符串 #校区#课程# 学期
 55     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
 56         unique_together=(‘branch‘,‘course‘,‘semester‘)  #联合索引
 57         verbose_name_plural = "02班级表" #verbose_name_plural给你的模型类起一个更可读的名字
 58
 59 """03课程表,可以报名那些课程"""
 60 class Course(models.Model):
 61     name = models.CharField(max_length=64,unique=True)#课程名 #CharField作用是保存文本,定长的变量类型
 62     price = models.PositiveSmallIntegerField(verbose_name="学费")#学费#PositiveSmallIntegerField正小整数 0 ~ 32767
 63     period = models.PositiveSmallIntegerField(verbose_name="周期(月)") #PositiveSmallIntegerField正小整数 0 ~ 32767
 64     outline = models.TextField() #课程大纲  #文本类型
 65     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
 66         return self.name #返回 #课程名
 67     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
 68         verbose_name_plural =  "03课程表"#verbose_name_plural给你的模型类起一个更可读的名字
 69
 70 ‘‘‘04客户信息表‘‘‘
 71 class Customer(models.Model):
 72     name = models.CharField(max_length=32,blank=True,null=True)#客户名#CharField定长文本 #名字最长32 # Django可空 #数据库可以为空
 73     qq = models.CharField(max_length=64,unique=True) #QQ号#CharField定长文本 #名字最长64 #唯一,不能重复
 74     qq_name = models.CharField(max_length=64,blank=True,null=True)#QQ名 #CharField定长文本 #名字最长64 # Django可空 #数据库可以为空
 75     phone = models.CharField(max_length=64,blank=True,null=True)#手机号 #CharField定长文本 #名字最长64 # Django可空 #数据库可以为空
 76
 77     # ————————48PerfectCRM实现CRM客户报名流程学生合同————————
 78     id_num=models.CharField(max_length=64,blank=True,null=True,verbose_name=‘身份证号‘)#身份证号
 79     email=models.EmailField(max_length=64,blank=True,null=True,verbose_name=‘邮箱‘)#email
 80     sex_choices=((0,‘保密‘),(1,‘男‘),(2,‘女‘))
 81     sex=models.SmallIntegerField(choices=sex_choices,default=0,verbose_name=‘性别‘)
 82     # ————————48PerfectCRM实现CRM客户报名流程学生合同————————
 83
 84     # ————————53PerfectCRM实现CRM客户报名流程缴费————————
 85     status_choices = ((0, ‘已报名‘), (1, ‘未报名‘), (2, ‘已退学‘))
 86     status = models.SmallIntegerField(choices=status_choices, default=1)  # 学员状态
 87     # ————————53PerfectCRM实现CRM客户报名流程缴费————————
 88
 89     source_choices = ( #客户渠道来源 (内存生成)
 90                       (0,‘转介绍‘),
 91                       (1,‘QQ群‘),
 92                       (2,‘官网‘),
 93                       (3,‘百度推广‘),
 94                       (4,‘51CTO‘),
 95                       (5,‘知乎‘),
 96                       (6,‘市场推广‘),)
 97     #PositiveSmallIntegerField正小整数 0 ~ 32767(省空间)#choices是Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
 98     source = models.SmallIntegerField(choices=source_choices)#客户渠道来源
 99
100     #CharField定长文本#verbose_name是Admin中显示的字段名称#名字最长64 # Django可空 #数据库可以为空
101     referral_from = models.CharField(verbose_name="转介绍人qq",max_length=64,blank=True,null=True) #来自谁介绍的
102
103     #ForeignKey就是表与表之间的某种约定的关系#verbose_name是Admin中显示的字段名称 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
104     consult_courses = models.ForeignKey("Course",verbose_name="咨询课程", on_delete=models.CASCADE) #关联到 课程表
105
106     content= models.TextField(verbose_name="咨询详情") #TextField无限制长度的文本#verbose_name是Admin中显示的字段名称
107
108     #ManyToManyField多对多和外键工作方式相同,只不过我们处理的是QuerySet而不是模型实例。
109     tags = models.ManyToManyField("Tag",blank=True)#多对多关联到 标签表
110
111     #ForeignKey就是表与表之间的某种约定的关系  #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
112     consultant = models.ForeignKey("UserProfile", on_delete=models.CASCADE) #关联到  账号表
113
114     memo = models.TextField(blank=True,null=True)#备注#TextField无限制长度的文本#Django可空#数据库可以为空
115
116     #DateTimeField日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add创建时间(只读)
117     date =  models.DateTimeField(auto_now_add=True)#创建时间(数据库自增)
118
119     def __str__(self): #__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
120         return self.qq  #返回 #QQ号
121
122     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
123         verbose_name_plural =  "04客户表" #verbose_name_plural给你的模型类起一个更可读的名字
124
125 # ————————48PerfectCRM实现CRM客户报名流程学生合同————————
126 #合同模版
127 class ContractTemplate(models.Model):
128     name=models.CharField(‘合同名称‘,max_length=64,unique=True)
129     template=models.TextField()
130
131     def __str__(self):
132         return self.name
133     class Meta:
134         verbose_name_plural=‘合同表‘
135 # ————————48PerfectCRM实现CRM客户报名流程学生合同————————
136
137
138 """05客户跟进表"""
139 class CustomerFollowUp(models.Model):
140
141     #ForeignKey就是表与表之间的某种约定的关系 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
142     customer = models.ForeignKey("Customer", on_delete=models.CASCADE)#客户名 #关联到  客户信息表
143
144     content = models.TextField(verbose_name="跟进内容")#跟进的内容#TextField无限制长度的文本#verbose_name是Admin中显示的字段名称
145
146     #ForeignKey就是表与表之间的某种约定的关系  #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
147     consultant =models.ForeignKey("UserProfile", on_delete=models.CASCADE) #关联到  账号表
148
149     intention_choices =(  #报名状态
150                         (0,‘2周内报名‘),
151                         (1,‘1个月内报名‘),
152                         (2,‘近期无报名计划‘),
153                         (3,‘已在其它机构报名‘),
154                         (4,‘已报名‘),
155                         (5,‘已拉黑‘),)
156     #PositiveSmallIntegerField正小整数 0 ~ 32767(省空间)#choices是Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
157     intention=models.SmallIntegerField(choices=intention_choices) #报名状态
158
159     #DateTimeField日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add创建时间(只读)
160     date =  models.DateTimeField(auto_now_add=True)#创建时间(数据库自增)
161
162     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
163         return "<%s:%s>" %(self.customer.qq,self.intention) #返回#格式化字符串#跨表里的QQ号#报名状态
164     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
165         verbose_name_plural =  "05客户跟进表"#verbose_name_plural给你的模型类起一个更可读的名字
166
167 """06学员报名信息表"""
168 class Enrollment(models.Model):
169     # ForeignKey就是表与表之间的某种约定的关系#verbose_name是Admin中显示的字段名称 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
170     customer = models.ForeignKey("Customer",on_delete=models.CASCADE)#学员名字 #关联到  客户信息表
171     enrolled_class = models.ForeignKey("ClassList",verbose_name="所报班级",on_delete=models.CASCADE)#关联到  班级表
172     consultant = models.ForeignKey("UserProfile",verbose_name="课程顾问",on_delete=models.CASCADE) #关联到  账号表
173
174     # ————————52PerfectCRM实现CRM客户报名流程学生合同审核————————
175     contract_review = models.CharField(max_length=256, blank=True, null=True, verbose_name="合同审核")  # 合同审核
176     # ————————52PerfectCRM实现CRM客户报名流程学生合同审核————————
177
178     #BooleanField布尔值类型#default=False默认(True)不允许出现空字符#verbose_name是Admin中显示的字段名称
179     contract_agreed = models.BooleanField(default=False,verbose_name="学员已经同意合同")#学员看合同
180     contract_approved = models.BooleanField(default=False,verbose_name="合同已经审核") #谁审核
181
182     # ————————53PerfectCRM实现CRM客户报名流程缴费————————
183     Pay_cost= models.BooleanField(default=False,verbose_name="缴费") #缴费状态#是不是交定金
184     # ————————53PerfectCRM实现CRM客户报名流程缴费————————
185
186     # DateTimeField日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add创建时间(只读)
187     date = models.DateTimeField(auto_now_add=True)#创建时间(数据库自增)
188
189     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
190         # ————————57PerfectCRM实现admin批量生成上课记录————————
191         # return "%s %s" %(self.customer,self.enrolled_class)#返回#格式化字符串#学员名字#所报班级
192         return " 学员:%s |QQ: %s |班级:%s" %(self.customer.name,self.customer,self.enrolled_class)#返回#格式化字符串#学员名字#所报班级
193         # ————————57PerfectCRM实现admin批量生成上课记录————————
194     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
195         unique_together =  ("customer","enrolled_class")#联合索引
196         verbose_name_plural =  "06学员报名信息表"#verbose_name_plural给你的模型类起一个更可读的名字
197
198 """07缴费记录表"""
199 class Payment(models.Model):
200     #ForeignKey就是表与表之间的某种约定的关系#verbose_name是Admin中显示的字段名称 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
201     customer = models.ForeignKey("Customer",on_delete=models.CASCADE)#学员名字        关联到  客户信息表
202     course = models.ForeignKey("Course",verbose_name="所报课程",on_delete=models.CASCADE)#关联到  课程表
203
204     #PositiveSmallIntegerField正小整数 0 ~ 32767 #verbose_name是Admin中显示的字段名称#默认值=500
205     amount = models.PositiveIntegerField(verbose_name="数额",default=500)#缴费数额
206
207     #ForeignKey就是表与表之间的某种约定的关系#CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
208     consultant = models.ForeignKey("UserProfile",on_delete=models.CASCADE)#缴费给谁 关联到  账号表 #财务人员
209
210     #DateTimeField日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add创建时间(只读)
211     date=models.DateTimeField(auto_now_add=True)#创建时间(数据库自增)
212
213     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
214         return "%s %s" %(self.customer,self.amount)#返回#格式化字符串#学员名字#缴费数额
215     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
216         verbose_name_plural = "07缴费记录表"#verbose_name_plural给你的模型类起一个更可读的名字
217
218 """08每节课上课纪录表"""
219 class CourseRecord(models.Model):
220     # ForeignKey就是表与表之间的某种约定的关系#verbose_name是Admin中显示的字段名称 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
221     from_class = models.ForeignKey("ClassList",verbose_name="班级",on_delete=models.CASCADE) #那个班级
222
223     #PositiveSmallIntegerField正小整数 0 ~ 32767 #verbose_name是Admin中显示的字段名称
224     day_num = models.PositiveSmallIntegerField(verbose_name="第几节(天)") #第几节课
225
226     # ForeignKey就是表与表之间的某种约定的关系 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
227     teacher = models.ForeignKey("UserProfile",on_delete=models.CASCADE)#老师是谁    关联到    账号表
228
229     #BooleanField布尔值类型#default=True默认(True)不允许出现空字符
230     has_homework = models.BooleanField(default=True) #有没有作业
231
232     # CharField定长文本#名字最长128#Django可空#数据库可以为空
233     homework_title = models.CharField(max_length=128,blank=True,null=True) #作业标题
234
235     #TextField无限制长度的文本#Django可空#数据库可以为空
236     homework_content = models.TextField(blank=True,null=True) #作业内容
237
238     #TextField无限制长度的文本#verbose_name是Admin中显示的字段名称
239     outline =models.TextField(verbose_name="本节课程大纲") #课程主要讲什么
240
241     # DateTimeField日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add创建时间(只读)
242     date = models.DateField(auto_now_add=True)#创建时间(数据库自增)
243
244     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
245         return " %s:%s" %(self.from_class,self.day_num)#返回#格式化字符串#班级#第几节(天)
246     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
247         unique_together = ("from_class","day_num") #联合索引
248         verbose_name_plural = "08每节课上课纪录表" #verbose_name_plural给你的模型类起一个更可读的名字
249
250 """09学习纪录"""
251 class StudyRecord(models.Model):
252     # ForeignKey就是表与表之间的某种约定的关系 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
253     student = models.ForeignKey("Enrollment",on_delete=models.CASCADE)#学生名字   关联到    学员报名信息表
254     course_record = models.ForeignKey("CourseRecord",on_delete=models.CASCADE)#开课记录   # 关联到    每节课上课纪录表
255
256     attendance_choices = (# 本节课上课状态记录
257                             (0,"已签到"),
258                             (1,"迟到"),
259                             (2,"缺勤"),
260                             (3,"早退"),)
261     #PositiveSmallIntegerField正小整数 0 ~ 32767(省空间)#choices是Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
262     attendance = models.SmallIntegerField(choices=attendance_choices) # 本节课上课状态记录
263
264     score_choices = (#学习成绩
265                      (100,"A+"),
266                      (90,"A"),
267                      (85,"B+"),
268                      (80,"B"),
269                      (75,"B-"),
270                      (70,"C+"),
271                      (65,"C"),
272                      (40,"C-"),
273                      (-20,"D"),
274                      (-50,"COPY"),
275                      (0,"N/A"),)
276     #PositiveSmallIntegerField正小整数 0 ~ 32767(省空间)#choices是Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
277     score = models.SmallIntegerField(choices=score_choices) #学习成绩
278
279     memo = models.TextField(blank=True,null=True)#TextField无限制长度的文本#Django可空#数据库可以为空
280
281     # DateTimeField日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add创建时间(只读)
282     date = models.DateField(auto_now_add=True)#创建时间(数据库自增)
283
284     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
285         return "%s %s %s" % (self.student, self.course_record, self.score)#返回#格式化字符串#学生名字#开课记录#学习成绩
286     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
287         unique_together = (‘student‘,‘course_record‘)#联合索引#学生名字#开课记录
288         verbose_name_plural =  "09学习纪录"#verbose_name_plural给你的模型类起一个更可读的名字
289
290 # ————————34PerfectCRM实现CRM自定义用户————————
291 # """10账号表"""
292 # class UserProfile(models.Model):
293 #     from django.contrib.auth.models import User  # 使用django内置的用户表
294 #
295 #     #OneToOneField一对一  #User是django Admin里的账号表#CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
296 #     user = models.OneToOneField(User,on_delete=models.CASCADE)# 用户名 #创建外键,关联django用户表
297 #
298 #     name = models.CharField(max_length=32) #账号名(扩展用户字段)#CharField定长文本
299 #
300 #     #ManyToManyField多对多和外键工作方式相同,只不过我们处理的是QuerySet而不是模型实例。#Django可空
301 #     roles = models.ManyToManyField("Role",blank=True) #角色(权限)   # 双向一对多==多对多
302 #
303 #     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
304 #         return self.name #返回 #账号名
305 #     class Meta: #通过一个内嵌类 "class Meta" 给你的 model 定义元数据
306 #         verbose_name_plural = "10账号表"#verbose_name_plural给你的模型类起一个更可读的名字
307 # ————————34PerfectCRM实现CRM自定义用户————————
308
309 # ————————34PerfectCRM实现CRM自定义用户————————
310 #10账号表,创建用户和超级用户
311 from django.contrib.auth.models import BaseUserManager
312 class UserProfileManager(BaseUserManager):
313     def create_user(self, email, name, password=None):
314         """
315       创建并保存一个用户用给定的邮件,日期
316       出生和密码。
317         """
318         if not email:#没有email 报错
319             raise ValueError(‘用户必须有一个电子邮件地址‘)
320
321         user = self.model(
322             email=self.normalize_email(email),#验证邮箱格式
323             name=name,
324         )
325         user.set_password(password)#加密
326         user.is_active = True
327         user.save(using=self._db)
328         return user
329     def create_superuser(self, email, name, password):
330         """
331       创建并保存一个超级用户具有给定邮件,日期
332       出生和密码。
333         """
334         user = self.create_user(email,
335             password=password,
336             name=name
337         )
338         user.is_active = True
339         user.is_superuser = True
340         user.save(using=self._db)
341         return user
342
343 """10账号表"""
344 """
345
346 #删除数据库
347
348 #调用objects = UserProfileManager()#创建账号 #关联这个函数
349
350 #运行 Terminal
351 #    生成 数据表
352 #    python manage.py makemigrations
353 #   数据表 迁移
354 #    python manage.py migrate
355 Django Admin里账号密码重置方法
356 #运行 Terminal
357 python manage.py createsuperuser
358
359 Email address:          [email protected]
360 用户名 :                 admin
361 Password:               admin123456
362 Password (again):       admin123456
363 """
364 from django.contrib.auth.models import AbstractBaseUser
365 # ————————35PerfectCRM实现CRM重写Admin密码修改————————
366 from django.utils.translation import ugettext_lazy as _  # 语言国际化
367 from django.utils.safestring import mark_safe
368 from django.contrib.auth.models import PermissionsMixin
369 # class UserProfile(AbstractBaseUser):
370 class UserProfile(AbstractBaseUser,PermissionsMixin):
371 # ————————35PerfectCRM实现CRM重写Admin密码修改————————
372     email=models.EmailField(
373         verbose_name=‘邮箱账号‘,
374         max_length=255,
375         unique=True#唯一  #登陆账号
376     )
377     name=models.CharField(max_length=32,verbose_name=‘用户名‘)
378
379     # ————————35PerfectCRM实现CRM重写Admin密码修改————————
380     password = models.CharField(_(‘password‘), max_length=128, help_text=mark_safe(‘‘‘<a href=\"../password/\">修改密码</a>‘‘‘))
381     # ————————35PerfectCRM实现CRM重写Admin密码修改————————
382
383     is_active = models.BooleanField(default=True,verbose_name=‘合法账号‘)#权限#合法账号
384     is_superuser = models.BooleanField(default=False,verbose_name=‘超级账号‘) #超级账号
385     objects = UserProfileManager()#创建账号 #关联这个函数
386     USERNAME_FIELD =‘email‘#指定做为  #登陆账号
387     REQUIRED_FIELDS = [‘name‘]#必填字段
388
389     # ————————60PerfectCRM实现CRM学生上课记录————————
390     stu_account=models.ForeignKey("Customer",verbose_name=‘关联学员帐号‘,blank=True,null=True,on_delete=models.CASCADE,help_text=‘报名成功后创建关联帐户‘)
391     # ————————60PerfectCRM实现CRM学生上课记录————————
392
393     def get_full_name(self):
394         return self.email
395     def get_short_name(self):
396         #用户确认的电子邮件地址
397         return self.email
398     def __str__(self):
399         return self.name
400     def has_perm(self,perm,obj=None):
401         #指明用户是否被认为活跃的。以反选代替删除帐号。
402         #最简单的可能的答案:是的,总是
403         return True   #有效 账号
404     def has_module_perms(self, app_label):
405         #指明用户是否可以登录到这个管理站点。
406         # 最简单的可能的答案:是的,总是
407         return True #职员状态
408     @property
409     def is_staff(self):
410         ‘‘‘“用户的员工吗?”‘‘‘
411         #最简单的可能的答案:所有管理员都是员工
412         return self.is_superuser#是不是超级用户状态
413 # AUTH_USER_MODEL = ‘crm.UserProfile‘#使用自定的admin 表单   #settings.py
414 # ————————34PerfectCRM实现CRM自定义用户————————
415
416 """11角色表"""
417 class Role(models.Model):
418     name = models.CharField(unique=True,max_length=32)#角色名#CharField定长文本#角色名不可以重复#最长度=32字节
419     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
420         return self.name#返回 #角色名
421     class Meta: #通过一个内嵌类 "class Meta" 给你的 model 定义元数据
422         verbose_name_plural = "11角色表" #verbose_name_plural给你的模型类起一个更可读的名字
423
424 """12标签表"""
425 class Tag(models.Model):
426     name =  models.CharField(max_length=64,unique=True) #标签名#CharField定长文本#最长度=64字节#不可以重复
427     def __str__(self): #__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
428         return self.name #返回 #标签名
429     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
430         verbose_name_plural =  "12标签表" #verbose_name_plural给你的模型类起一个更可读的名字
431
432 # ————————01PerfectCRM基本配置ADMIN————————

#models.py

 1 # DBadd_urls.py
 2 # ————————03PerfectCRM创建基本数据————————
 3 from django.conf.urls import url
 4 from DBadd import auth_views
 5 from DBadd import crm_views
 6
 7 urlpatterns = [
 8     url(r‘^auth_user/$‘, auth_views.auth_user), #Django账号表
 9
10     url(r‘^crm_Role/$‘, crm_views.crm_Role), #角色表 等基本信息
11     url(r‘^crm_UserProfile/$‘, crm_views.crm_UserProfile),#账号表 #随机学生
12     url(r‘^crm_userprofile_roles/$‘, crm_views.crm_userprofile_roles),#账号角色关联表 #随机学生
13
14     url(r‘^crm_Customer/$‘, crm_views.crm_Customer),  # 04客户信息表
15
16     # ————————48PerfectCRM实现CRM客户报名流程学生合同————————
17     url(r‘^crm_ContractTemplate/$‘, crm_views.crm_ContractTemplate),  # 角色表 等基本信息
18     # ————————48PerfectCRM实现CRM客户报名流程学生合同————————
19
20     # ————————60PerfectCRM实现CRM学生上课记录————————
21     url(r‘^$‘, crm_views.DBadd),  # Django账号表
22     url(r‘^crm_CourseRecord/$‘, crm_views.crm_CourseRecord),  # 班级节课
23     url(r‘^crm_Enrollment/$‘, crm_views.crm_Enrollment),  # 报名信息
24     # ————————60PerfectCRM实现CRM学生上课记录————————
25
26 ]
27 # ————————03PerfectCRM创建基本数据————————

# DBadd_urls.py

  1 # crm_views.py
  2
  3 # ————————03PerfectCRM创建基本数据————————
  4
  5 from django.shortcuts import render
  6 from django.shortcuts import redirect
  7 from django.shortcuts import HttpResponse
  8
  9 from crm import models
 10 from django.contrib.auth import models as auth_models
 11
 12 # 随机字符串
 13 import random
 14 from random import choice
 15
 16
 17 # 添加"""基本数据"""
 18 def crm_Role(request):
 19     if request.method == "GET":
 20         user_list = models.Role.objects.all()
 21         return render(request, ‘crm_Role.html‘, {‘user_list‘: user_list})
 22     elif request.method == "POST":
 23         try:
 24             models.Role.objects.create(name=‘角色学生‘)
 25             models.Role.objects.create(name=‘角色销售‘)
 26             models.Role.objects.create(name=‘角色老师‘)
 27             models.Role.objects.create(name=‘角色校长‘)
 28             models.Role.objects.create(name=‘角色系统维护‘)
 29
 30             models.Branch.objects.create(name=‘北京校区‘, addr=‘北京天安门‘)
 31             models.Branch.objects.create(name=‘广东校区‘, addr=‘广东东莞市‘)
 32             models.Branch.objects.create(name=‘上海校区‘, addr=‘上海黄浦江‘)
 33             models.Branch.objects.create(name=‘福建校区‘, addr=‘福建仙游县‘)
 34             models.Branch.objects.create(name=‘四川校区‘, addr=‘四川成都市‘)
 35
 36             models.Tag.objects.create(name=‘好,很好‘)
 37             models.Tag.objects.create(name=‘很有兴趣‘)
 38             models.Tag.objects.create(name=‘兴趣不大‘)
 39             models.Tag.objects.create(name=‘交钱很爽快‘)
 40             models.Tag.objects.create(name=‘随便问问的‘)
 41
 42             models.Course.objects.create(name=‘Pyton‘, price=‘6666‘, period=‘40‘,
 43                                          outline=‘Python , 是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库,Python 已经成为继JAVA,C++之后的的第三大语言。 特点:简单易学、免费开源、高层语言、可移植性强、面向对象、可扩展性、可嵌入型、丰富的库、规范的代码等。‘)
 44             models.Course.objects.create(name=‘PHP‘, price=‘8888‘, period=‘50‘,
 45                                          outline=‘PHP语言是目前Web后端开发使用最广泛的语言,几乎绝大多数网站使用。PHP开发快速,开发成本低,周期短,后期维护费用低,开源产品丰富。‘)
 46             models.Course.objects.create(name=‘Java‘, price=‘9999‘, period=‘60‘,
 47                                          outline=‘完成本套餐的学习,学员可以全面掌握后续JavaEE开发所需的Java技术,为后续学习JavaEE开发打下坚实的基础。‘)
 48
 49             # ————————47PerfectCRM实现CRM客户报名流程————————
 50
 51             # models.UserProfile.objects.create(name=‘ADMIN系统维护‘, user_id=1)
 52             # models.UserProfile.objects.create(name=‘李白销售老师‘, user_id=2)
 53             # models.UserProfile.objects.create(name=‘杜甫销售老师‘, user_id=3)
 54             # models.UserProfile.objects.create(name=‘唐伯虎销售老师‘, user_id=4)
 55             # models.UserProfile.objects.create(name=‘颜真卿老师‘, user_id=5)
 56             # models.UserProfile.objects.create(name=‘罗贯中老师‘, user_id=6)
 57             # models.UserProfile.objects.create(name=‘白居易老师‘, user_id=7)
 58             # models.UserProfile.objects.create(name=‘施耐庵老师‘, user_id=8)
 59             # models.UserProfile.objects.create(name=‘曹雪芹校长‘, user_id=9)
 60
 61
 62             models.UserProfile.objects.create(last_login=‘2018-04-18‘, email=‘[email protected]‘, name=‘admin‘, is_active=1,
 63                                               is_superuser=1,
 64                                               password=‘pbkdf2_sha256$100000$cCkwdwzBiea6$VNOFkD7HAKwsjKXsDZMOGO8ct3EpVMaX2JPU+h5PK9E=‘)
 65             models.UserProfile.objects.create(last_login=‘2018-04-18‘, email=‘[email protected]‘, name=‘admin1‘,
 66                                               is_active=1, is_superuser=1,
 67                                               password=‘pbkdf2_sha256$100000$cCkwdwzBiea6$VNOFkD7HAKwsjKXsDZMOGO8ct3EpVMaX2JPU+h5PK9E=‘)
 68             models.UserProfile.objects.create(last_login=‘2018-04-18‘, email=‘[email protected]‘, name=‘admin2‘,
 69                                               is_active=1, is_superuser=1,
 70                                               password=‘pbkdf2_sha256$100000$cCkwdwzBiea6$VNOFkD7HAKwsjKXsDZMOGO8ct3EpVMaX2JPU+h5PK9E=‘)
 71             models.UserProfile.objects.create(last_login=‘2018-04-18‘, email=‘admin3[email protected]‘, name=‘admin3‘,
 72                                               is_active=1, is_superuser=1,
 73                                               password=‘pbkdf2_sha256$100000$cCkwdwzBiea6$VNOFkD7HAKwsjKXsDZMOGO8ct3EpVMaX2JPU+h5PK9E=‘)
 74             models.UserProfile.objects.create(last_login=‘2018-04-18‘, email=‘[email protected]‘, name=‘admin4‘,
 75                                               is_active=1, is_superuser=1,
 76                                               password=‘pbkdf2_sha256$100000$cCkwdwzBiea6$VNOFkD7HAKwsjKXsDZMOGO8ct3EpVMaX2JPU+h5PK9E=‘)
 77             models.UserProfile.objects.create(last_login=‘2018-04-18‘, email=‘[email protected]‘, name=‘admin5‘,
 78                                               is_active=1, is_superuser=1,
 79                                               password=‘pbkdf2_sha256$100000$cCkwdwzBiea6$VNOFkD7HAKwsjKXsDZMOGO8ct3EpVMaX2JPU+h5PK9E=‘)
 80             models.UserProfile.objects.create(last_login=‘2018-04-18‘, email=‘[email protected]‘, name=‘admin6‘,
 81                                               is_active=1, is_superuser=1,
 82                                               password=‘pbkdf2_sha256$100000$cCkwdwzBiea6$VNOFkD7HAKwsjKXsDZMOGO8ct3EpVMaX2JPU+h5PK9E=‘)
 83             models.UserProfile.objects.create(last_login=‘2018-04-18‘, email=‘[email protected]‘, name=‘admin7‘,
 84                                               is_active=1, is_superuser=1,
 85                                               password=‘pbkdf2_sha256$100000$cCkwdwzBiea6$VNOFkD7HAKwsjKXsDZMOGO8ct3EpVMaX2JPU+h5PK9E=‘)
 86             models.UserProfile.objects.create(last_login=‘2018-04-18‘, email=‘[email protected]‘, name=‘admin8‘,
 87                                               is_active=1, is_superuser=1,
 88                                               password=‘pbkdf2_sha256$100000$cCkwdwzBiea6$VNOFkD7HAKwsjKXsDZMOGO8ct3EpVMaX2JPU+h5PK9E=‘)
 89             models.UserProfile.objects.create(last_login=‘2018-04-18‘, email=‘[email protected]‘, name=‘admin9‘,
 90                                               is_active=1, is_superuser=1,
 91                                               password=‘pbkdf2_sha256$100000$cCkwdwzBiea6$VNOFkD7HAKwsjKXsDZMOGO8ct3EpVMaX2JPU+h5PK9E=‘)
 92             # ————————47PerfectCRM实现CRM客户报名流程————————
 93
 94             models.ClassList.objects.create(class_type=1, semester=2, start_date=‘2018-03-20‘, branch_id=1, course_id=1)
 95             models.ClassList.objects.create(class_type=0, semester=5, start_date=‘2018-03-20‘, branch_id=1, course_id=1)
 96             models.ClassList.objects.create(class_type=2, semester=8, start_date=‘2018-03-20‘, branch_id=1, course_id=1)
 97             models.ClassList.objects.create(class_type=0, semester=1, start_date=‘2018-03-20‘, branch_id=1, course_id=1)
 98             models.ClassList.objects.create(class_type=1, semester=3, start_date=‘2018-03-20‘, branch_id=1, course_id=1)
 99             models.ClassList.objects.create(class_type=0, semester=9, start_date=‘2018-03-20‘, branch_id=1, course_id=1)
100             models.ClassList.objects.create(class_type=2, semester=6, start_date=‘2018-03-20‘, branch_id=1, course_id=1)
101             models.ClassList.objects.create(class_type=1, semester=20, start_date=‘2018-03-20‘, branch_id=1,
102                                             course_id=1)
103             models.ClassList.objects.create(class_type=0, semester=32, start_date=‘2018-03-20‘, branch_id=1,
104                                             course_id=1)
105
106
107         except:
108             return HttpResponse(‘基本数据已经添加了。。。‘)
109
110         return redirect(‘/DBadd/crm_Role/‘)
111
112
113 # 添加"""10账号表"""  #随机学生
114 def crm_UserProfile(request):
115     if request.method == "GET":
116         user_list = models.UserProfile.objects.all()
117         return render(request, ‘crm_UserProfile.html‘, {‘user_list‘: user_list})
118     elif request.method == "POST":
119         for i in range(50):
120
121             Rword = ‘‘.join(‘‘.join([chr(random.randint(0x4E00, 0x9FBF)) for i in range(3)]).split())  # 随机中文
122             n = Rword
123
124             a = models.UserProfile.objects.values("user_id").all()
125             e = auth_models.User.objects.values("id").all()
126             print(‘eeeee‘, e, type(e))
127             x = e.difference(a)
128             # for i in x:
129             #     print(‘zzz‘, x, type(x))
130
131             l = []
132             for i in x:
133                 l.append(i[‘id‘])
134             print(‘llll‘, l, type(l))
135
136             if len(l) == 0:
137                 return HttpResponse(‘请添加 admin的用户后,再来添加。。。‘)
138             else:
139                 c = choice(l)
140                 u = c
141                 models.UserProfile.objects.create(name=n, user_id=u)
142         return redirect(‘/DBadd/crm_UserProfile/‘)
143
144
145 # 添加"""10账号表--11角色表""" #随机学生
146 def crm_userprofile_roles(request):
147     if request.method == "GET":
148         user_list = models.UserProfile.objects.all()
149         role_list = models.Role.objects.get(id=1)
150         return render(request, ‘crm_userprofile_roles.html‘, {‘user_list‘: user_list, ‘role_list‘: role_list})
151     elif request.method == "POST":
152         try:
153             for i in range(50):
154                 b1 = models.Role.objects.get(id=1)
155                 a = b1.userprofile_set.values("id").all()
156
157                 e = models.UserProfile.objects.values("id").all()
158                 x = e.difference(a)
159
160                 l = []
161                 for i in x:
162                     l.append(i[‘id‘])
163                 print(‘llll‘, l, type(l))
164
165                 if len(l) == 0:
166                     return HttpResponse(‘请添加 数据 后,再来添加。。。‘)
167                 else:
168                     c = choice(l)
169                     print(‘c‘, c, type(c))
170
171                     g1 = models.UserProfile.objects.get(id=c)
172                     b1 = models.Role.objects.get(id=1)
173                     g1.roles.add(b1)
174             return redirect(‘/DBadd/crm_userprofile_roles/‘)
175         except:
176             return HttpResponse(‘没有数据了。。。‘)
177
178
179 # 添加"""04客户信息表"""
180 def crm_Customer(request):
181     if request.method == "GET":
182         user_list = models.Customer.objects.all()
183         return render(request, ‘crm_Customer.html‘, {‘user_list‘: user_list})
184     elif request.method == "POST":
185         for i in range(50):
186             Rword = ‘‘.join(‘‘.join([chr(random.randint(0x4E00, 0x9FBF)) for i in range(3)]).split())  # 随机中文
187             r = random.randint(5, 18)
188             Num = "".join(random.choice("0123456789") for i in range(r))  # 随机数字 #保证qq的唯一性
189             Cnum = "".join(random.choice("123456789") for i in range(1))  # 随机数字  #id 不能选择0
190             try:
191                 models.Customer.objects.create(name=Rword, qq=Num, qq_name=Rword, phone=Num, source=1,
192                                                referral_from=Rword, consult_courses_id=1, content=Rword,
193                                                consultant_id=Cnum, memo=Rword, date=‘2018-03-20‘)
194             except:
195                 return HttpResponse(‘数据重复了。。。‘)
196
197         return redirect(‘/DBadd/crm_Customer/‘)
198
199
200 # ————————03PerfectCRM创建基本数据————————
201
202 # ————————48PerfectCRM实现CRM客户报名流程学生合同————————
203 def crm_ContractTemplate(request):
204     if request.method == "GET":
205         user_list = models.ContractTemplate.objects.all()
206         return render(request, ‘crm_ContractTemplate.html‘, {‘user_list‘: user_list})
207     elif request.method == "POST":
208         try:
209             t = ‘‘‘
210             委托方:__{stu_name}__
211   法定代表人或负责人:__{stu_name}__
212   服务方:_______
213   法定代表人或负责人:_________
214   根据《中华人民共和国合同法》的有关规定,经双方当事人协商一致,签订本
215 合同。
216   第一条 项目名称__{course_name}__。
217   (注:本参考格式适用于下列技术服务活动:进行设计、工艺、制造、试验以
218 及农作物育种,畜禽的饲养等方面的技术指导、讲解技术资料、解决和解答技术问
219 题;进行示范操作;传授计算机软件的编制技术、先进仪器设备的装配,使用技术
220 等等。)
221   第二条 培训的内容和要求:_______。
222   第三条 培训计划、进度、期限:_______。
223   第四条 培训地点和方式:____________。
224   第五条 服务方(教师)的资历和水平:________。
225   第六条 学员的人数和质量:___________。
226   第七条 教员、学员的食宿、交通、医疗费用的支付和安排____。
227   第八条 报酬及其支付方式:__________。
228   第九条 委托方的违约责任:_________。
229   1.委托方未按合同提供培训条件,影响合同履行的,约定的报酬仍应如数支
230 付;
231   2.擅自将服务方要求保密的技术资料引用、发表和提供给第三方,应支付数
232 额为____的违约金;
233   第十条 服务方的违约责任:
234   1.服务方未按合同制订培训计划,影响培训工作质量的,应当减收___%
235 的报酬;
236   2.服务方提供的师资不符合合同要求,服务方有义务予以重新配备;未按合
237 同规定完成培训工作的,应免收报酬。
238   第十一条 保密条款:________
239   当事人双方应对下列技术资料承担保密义务:______。
240   第十二条 有关技术成果归属条款
241   在履行合同过程中,服务方利用委托方提供的技术资料和工作条件所完成的新
242 的技术成果,属于服务方;委托方利用服务方的工作成果所完成的新技术成果,属
243 于委托方。对新的技术成果享有就该技术成果取得的精神权利(如获得奖金、奖章、
244 荣誉证书的权利)、经济权利(如专利权、非专利技术的转让权,使用权等)和
245 其它利益。
246   第十三条 本合同争议的解决办法:______。
247   本合同自双方当事人签字、盖章后生效。
248 委托方负责人(或授权代表)      服务方负责人(或授权代表)
249   签字:__{stu_name}__(盖章)     签名:____(盖章)
250   签字时间:_________     签字时间:_________
251   签字地点:_________     签字地点:_________
252   开户银行:_________     开户银行:_________
253   帐号:___________     帐号:___________
254   委托方担保人(名称):___     服务方担保人(名称):___
255   地址:___________     地址:___________
256   负责人(或授权代表)         负责人(或授权代表)
257   签字:________(盖章)    签字:________(盖章)
258   签字时间:_________     签字时间:_________
259   签字地点:_________     签字地点:_________
260   开户银行:_________     开户银行:_________
261   帐号:___________     帐号:___________‘‘‘
262
263             models.ContractTemplate.objects.create(name=‘技术合同:专业技术培训协议‘, template=t)
264         except:
265             return HttpResponse(‘数据错误!重复了吧。。。‘)
266
267         return redirect(‘/DBadd/crm_ContractTemplate/‘)
268
269
270 # ————————48PerfectCRM实现CRM客户报名流程学生合同————————
271
272 # ————————60PerfectCRM实现CRM学生上课记录————————
273 def DBadd(request):
274     return  render(request,‘DBadd.html‘,locals())
275 def crm_CourseRecord(request):
276     if request.method == "GET":
277         user_list = models.CourseRecord.objects.all()
278         return render(request, ‘crm_CourseRecord.html‘, {‘user_list‘: user_list})
279     elif request.method == "POST":
280         a=1
281         for i in range(2):
282             try:
283                 # 创建班级  节课
284                 models.CourseRecord.objects.create(from_class_id=1, day_num=a, teacher_id=1, has_homework=1, outline=1,date=‘2018-05-05‘)
285                 models.CourseRecord.objects.create(from_class_id=2, day_num=a, teacher_id=1, has_homework=1, outline=1,date=‘2018-05-05‘)
286                 models.CourseRecord.objects.create(from_class_id=3, day_num=a, teacher_id=1, has_homework=1, outline=1,date=‘2018-05-05‘)
287                 a+=1
288                 # 创建班级  节课
289             except:
290                 return HttpResponse(‘数据错误!重复了吧。。。‘)
291         return redirect(‘/DBadd/crm_CourseRecord/‘)
292 def crm_Enrollment(request):
293     if request.method == "GET":
294         user_list = models.Enrollment.objects.all()
295         return render(request, ‘crm_Enrollment.html‘, {‘user_list‘: user_list})
296     elif request.method == "POST":
297         a=1
298         for i in range(6):
299             try:
300                 # 创建报名信息
301                 models.Enrollment.objects.create(customer_id=a, enrolled_class_id=1, consultant_id=1, contract_review=1,contract_agreed=1,contract_approved=1,Pay_cost=1,date=‘2018-05-05 14:45:19.537109‘)
302                 models.Enrollment.objects.create(customer_id=a, enrolled_class_id=2, consultant_id=1, contract_review=1,contract_agreed=1,contract_approved=1,Pay_cost=1,date=‘2018-05-05 14:45:19.537109‘)
303                 models.Enrollment.objects.create(customer_id=a, enrolled_class_id=3, consultant_id=1, contract_review=1,contract_agreed=1,contract_approved=1,Pay_cost=1,date=‘2018-05-05 14:45:19.537109‘)
304                 a+=1
305                 # 创建报名信息
306             except:
307                 return HttpResponse(‘数据错误!重复了吧。。。‘)
308         return redirect(‘/DBadd/crm_Enrollment/‘)
309 # ————————60PerfectCRM实现CRM学生上课记录————————

# crm_views.py

 1 {#DBadd.html#}
 2 {## ————————60PerfectCRM实现CRM学生上课记录————————#}
 3 <!DOCTYPE html>
 4 <html lang="en">
 5 <head>
 6     <meta charset="UTF-8">
 7     <title>Title</title>
 8 </head>
 9 <body>
10 <div style="margin:0 auto;width:50%">
11     <h1><a target="_blank" href="crm_ContractTemplate/"> 添加合同</a></h1>
12     <h1><a target="_blank" href="crm_Role/"> 添加基本信息</a></h1>
13     <h1><a target="_blank" href="crm_Customer/"> 添加学生</a></h1>
14     <h1><a target="_blank" href="crm_CourseRecord/"> 添加班级节次</a></h1>
15     <h1><a target="_blank" href="crm_Enrollment/"> 添加报名信息</a></h1>
16 </div>
17
18 </body>
19 </html>
20 {## ————————60PerfectCRM实现CRM学生上课记录————————#}

{#DBadd.html#}

 1 {#crm_CourseRecord.html#}
 2 {## ————————60PerfectCRM实现CRM学生上课记录————————#}
 3 <!DOCTYPE html>
 4 <html lang="en">
 5 <head>
 6     <meta charset="UTF-8">
 7     <title>Title</title>
 8 </head>
 9 <body>
10             <h3>添加班级</h3>
11             <form method="POST" action="/DBadd/crm_CourseRecord/">
12                  {% csrf_token %}
13                 <input type="submit"value="添加"/>
14             </form>
15             <h3>班级详细</h3>
16             <ul>
17                 {% for row in user_list %}
18                     <li>
19                         <a>{{row.id}}-{{row.from_class}}</a>
20                     </li>
21                 {% endfor %}
22             </ul>
23 </body>
24 </html>
25 {## ————————60PerfectCRM实现CRM学生上课记录————————#}

{#crm_CourseRecord.html#}

 1 {#crm_Enrollment.html#}
 2 {## ————————60PerfectCRM实现CRM学生上课记录————————#}
 3 <!DOCTYPE html>
 4 <html lang="en">
 5 <head>
 6     <meta charset="UTF-8">
 7     <title>Title</title>
 8 </head>
 9 <body>
10             <h3>添加报名信息</h3>
11             <form method="POST" action="/DBadd/crm_Enrollment/">
12                  {% csrf_token %}
13                 <input type="submit"value="添加"/>
14             </form>
15             <h3>详细</h3>
16             <ul>
17                 {% for row in user_list %}
18                     <li>
19                         <a>{{row.id}}-{{row.customer}}</a>
20                     </li>
21                 {% endfor %}
22             </ul>
23 </body>
24 </html>
25
26 {## ————————60PerfectCRM实现CRM学生上课记录————————#}

{#crm_Enrollment.html#}

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

时间: 2024-07-29 22:44:08

Django项目:CRM(客户关系管理系统)--70--60PerfectCRM实现CRM学生上课记录的相关文章

Django项目:CRM(客户关系管理系统)--69--59PerfectCRM实现king_admin批量生成上课记录

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

CRM客户关系管理系统如何分析客户的动态需求

由于激烈的市场竞争,对于怎样掌握客户的动态需求,怎样保持客户市场的稳定增长,对于企业来说已经成为普遍的关注点.CRM客户关系管理系统经过了10年的发展历程,怎样管理客户.了解客户成就了CRM客户关系管理系统的大市场. CRM供货商一般侧重于宣扬软件的特性及功用,而对其全体价值则没有做出了解的表述. 用户高档处理层一般从基础设施安顿而非运营和战略视点对待CRM客户关系管理系统施行. 由于无法从运营和战略视点安顿CRM客户关系管理系统,用户对CRM的价值认知只停留在技术功率层面上. 只需跨过技术和流

Django CRM客户关系管理系统

CRM需求分析 随着信息化时代带来的科技创新,CRM客户关系管理系统带来的效益在已经成为很多企业提高竞争优势的一分部,CRM客户关系管理系统将企业管理和客户关系管理集成到统一的平台,其系统功能主要体现在企业与客户之间的业务和企业内部之前部门之间的业务.因此CRM客户关系管理系统不但可以记录企业自内部信息,对于客户信息存储也是可以做到的,其中还涉及市场竞争对手的情报资料,还包括了企业进行营销.销售及支持服务所需的各种数据. 功能实现 (1)建议统一的信息编码系统; (2)设计能够良好反映事物特性的

CRM客户关系管理系统商业项目

本课程共33讲,购买课程后,可以下载项目需求分析文档,数据库设计文档,完整的项目源代码,数据库文件等资料,系统采用jsp,servlet,js,ajax,jquery,easyui,mysql数据库等相关技术实现,所有代码均为原生态,无第三方插件,系统稳定,高效,快捷,本系统是专门针对各种中小型企业量身定做的CRM客户关系管理系统,为企业管客户,管商机,管销售,从而推动业务进展,提高工作效率,管理大数据. 项目主要功能有客户管理,合同管理,合同附件管理,合同预览(放大缩小),订单管理,商务洽谈,

CRM客户关系管理系统商业项目视频课程

本课程共33讲,购买课程后,可以下载项目需求分析文档,数据库设计文档,完整的项目源代码,数据库文件等资料,系统采用jsp,servlet,js,ajax,jquery,easyui,mysql数据库等相关技术实现,所有代码均为原生态,无第三方插件,系统稳定,高效,快捷,本系统是专门针对各种中小型企业量身定做的CRM客户关系管理系统,为企业管客户,管商机,管销售,从而推动业务进展,提高工作效率,管理大数据. 项目主要功能有客户管理,合同管理,合同附件管理,合同预览(放大缩小),订单管理,商务洽谈,

CRM客户关系管理系统需求分析文档

系统简介 本软件采用现在流行的WEB架构开发,主要针对中小型公司.管销售,管客户,管商机:可以在任何能上网的地方登录使用,使用简单,功能强大,方便快捷,丰富完善的报表功能,极大的提高公司的运营效率,不会因为人员的变动而导致数据的丢失,对公司的日常业务,问题追责等提供详细数据,对于公司领导可以做到"一表知天下",具体功能如下:1.客户管理:1.1.有非常完善的客户资料信息,对不同的客户进行分类管理,如普通客户,VIP客户,成交客户和潜在客户等1.2.对客户的每次来电,拜访情况可以做详细的

crm客户关系管理系统大约多少钱?

随着CRM在企业中的应用普遍化,不少人相信对CRM系统并不陌生,但是更多人关注的还是CRM客户关系管理系统价格如何. 其实CRM价格并不是固定的,毕竟市面上CRM系统种类众多,种类不同,价格不一样,功能不同,价格也不一样,所以CRM客户关系管理系统价格是由多方面因素影响的. 其实不同的CRM都有不同的价格,况且现在很多CRM都分模块或分版本销售,所以会出现不同的需求不同的价格.当然了选择CRM不仅仅要看价格,而且要看这套CRM是否符合自己公司的具体需求.可以尝试多去试用,多去对比,找出适合自己企

最好用的CRM客户关系管理系统

佳网CRM客户关系管理系统我们致力于解决企业客户管理,提高企业的办事效率,为企业提供一站式服务化繁为简: 统一管理,不再分散 解决客户资料分散于业务员个人的问题,现在每个人一个帐号,客户资料统一管理 权限设置细化明确 不同部门设置不同的菜单权限,不同的员工级别设置不同的操作权限 精准定位,多条件查找 根据级别.合同状态.所属业务员.跟单状态等不同条件快速查找客户资料 客户资料随身而行 移动端全功能支持,随时随地看客户.跟单.订单.合同资料 实时消息提醒 第一时间通知与您相关的新消息,即刻加入企业

CRM客户关系管理系统如何推动企业走向成功

随着我国互联网信息技术水平的不断提高,crm客户关系管理系统发展迅速.许多的企业对crm系统进行了引进,帮助企业赢得收益与未来,那crm系统如何帮助企业走向成功的呢?下面我们一起来看看. 一.集中保存客户信息客户无疑是企业发展的根本,crm系统拥有强大的客户信息管理的能力,可以详细记录客户信息,对客户的信息进行集中管理和共享,防止出现因业务调整或人员的流动而产生客户资源或数据的流失:同时,crm系统能够保证客户信息的完整,积累企业的宝贵财富.让企业从现有客户中获取更多市场份额,让客户生命周期发挥