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'^student_course/$', student_views.student_course, name='student_course'),   #学生报名的课程
 8     url(r'^studyrecords/(\d+)/$', student_views.studyrecords, name='studyrecords'),  # #学生上课记录列表StudyRecord
 9 
10 ]
11 # ————————60PerfectCRM实现CRM学生上课记录————————
# student_urls.py

 

 

 1 # student_views.py
 2 # ————————60PerfectCRM实现CRM学生上课记录————————
 3 from django.shortcuts import render #页面返回
 4 from crm import models #数据库
 5 from  django.contrib.auth.decorators import login_required # 登陆后页面才能访问
 6 #学生报名的课程
 7 @login_required # 登陆后页面才能访问
 8 def student_course(request):
 9     if request.user.stu_account:
10         enrollmentlist=request.user.stu_account.enrollment_set.all()#根据账号表关联的ID获取06学员报名信息表
11     return  render(request, 'bpm_student/student_course.html', locals())
12 
13 #学生上课记录列表
14 @login_required # 登陆后页面才能访问
15 def studyrecords(request,enroll_obj_id):
16     enroll_obj=models.Enrollment.objects.get(id=enroll_obj_id)#根据ID获取06学员报名信息表
17     studyrecordlist=enroll_obj.studyrecord_set.all()#根据06学员报名信息表的ID获取09学习纪录
18     return render(request,'bpm_student/studyrecords.html',locals())
19 
20 # ————————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 # ————————60PerfectCRM实现CRM学生上课记录————————
18 
19 # from django import template
20 # register = template.Library()   #模板库
21 from django.db.models import Sum
22 #分数统计#我的成绩
23 @register.simple_tag
24 def get_score(enroll_obj,customer_obj):
25     study_records=enroll_obj.studyrecord_set.filter(course_record__from_class_id=enroll_obj.enrolled_class.id)#根据班级ID 取09学习纪录的信息(包含'score')
26     sum_score= study_records.aggregate(Sum('score'))  #aggregate #总 #返回一个字典,其中包含的计算(聚合) #Sum #合计值
27     return sum_score
28 
29 # ————————60PerfectCRM实现CRM学生上课记录————————
# bpm_tags.py

 

 

 

 1 {#student_course.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             <h4>当前用户: {{ request.user }} | 学员名字:{{ request.user.stu_account.name }} |
 9                 学员QQ:{{ request.user.stu_account }}</h4>
10             <ol class="breadcrumb">
11                 <li><a href="/bpm/student_course/">我的课程</a></li>
12             </ol>
13             <table class="table table-striped table-responsive">
14                 <thead>
15                 <tr>
16                     <th>校区班级</th>
17                     <th>班级类型</th>
18                     <th>课程进度</th>
19                     <th>课程成绩</th>
20                     <th>开课日期</th>
21                     <th>结业日期</th>
22                 </tr>
23                 </thead>
24 
25 
26                 <tbody>
27                 {% for enroll_obj in enrollmentlist %}
28                     <tr>
29                         <td>{{ enroll_obj.enrolled_class }}</td>
30                         {#校区班级#}
31                         <td>{{ enroll_obj.enrolled_class.get_class_type_display }}</td>
32                         {#班级类型#}
33                         <td>
34                             <a href="{% url 'studyrecords' enroll_obj.id %}">已上: {{ enroll_obj.enrolled_class.courserecord_set.all.count }}节</a>
35                         </td>
36                         {#课程进度#}
37                         <td>
38                             {% get_score enroll_obj request.user.stu_account as score_data %}{{ score_data.score__sum }}</td>
39                         {#课程成绩#}
40                         <td>{{ enroll_obj.enrolled_class.start_date }}</td>
41                         {#开课日期#}
42                         <td>{{ enroll_obj.enrolled_class.end_date }}</td>
43                         {#结业日期#}
44                     </tr>
45                 {% endfor %}
46                 </tbody>
47             </table>
48         </div>
49     </div>
50 {% endblock %}
51 {## ————————60PerfectCRM实现CRM学生上课记录————————#}
{#student_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             <h4>当前用户: {{ request.user }} | 学员名字:{{ request.user.stu_account.name }} |
 9                 学员QQ:{{ request.user.stu_account }}</h4>
10             <ol class="breadcrumb">
11                 <li><a href="/bpm/student_course/">我的课程</a></li>
12                 <li><a href="/bpm/studyrecords/{{ enroll_obj.id }}/">{{ enroll_obj.enrolled_class }}</a></li>
13             </ol>
14 
15             <table class="table table-striped table-responsive ">
16                 <thead>
17                 <tr>
18                     <th>课程节次</th>
19                     <th>签到状态</th>
20                     <th>本节作业</th>
21                     <th>本节成绩</th>
22                     <th>本节讲师</th>
23                     <th>上课日期</th>
24                     <th>本节大纲</th>
25                     <th>作业标题</th>
26                     <th>作业要求</th>
27                 </tr>
28                 </thead>
29 
30 
31                 <tbody>
32                 {% for studyrecord in studyrecordlist %}
33                     <tr>
34                         <td>{{ studyrecord.course_record.day_num }}</td>
35                         {#课程节次#}
36                         <td>{{ studyrecord.get_attendance_display }}</td>
37                         {#签到状态#}
38                         <td> {{ studyrecord.course_record.has_homework }}</td>
39                         {#本节作业#}
40                         <td>{{ studyrecord.get_score_display }}</td>
41                         {#本节成绩#}
42                         <td>{{ studyrecord.course_record.teacher }}</td>
43                         {#本节讲师#}
44                         <td>{{ studyrecord.course_record.date }}</td>
45                         {#上课日期#}
46                         <td>
47                             <pre style="width: 240px;height: 60px">{{ studyrecord.course_record.outline }}</pre>
48                             {#本节大纲#}
49                         </td>
50                         <td>
51                             <pre style="width: 240px;height: 60px">{{ studyrecord.course_record.homework_title }}</pre>
52                             {#作业标题#}
53                         </td>
54                         <td>
55                             <pre style="width: 240px;height: 60px">{{ studyrecord.course_record.homework_content }}</pre>
56                             {#作业要求#}
57                         </td>
58                     </tr>
59                 {% endfor %}
60                 </tbody>
61             </table>
62         </div>
63     </div>
64 {% endblock %}
65 {## ————————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:          admin@qq.com
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='admin@qq.com', 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='admin1@qq.com', 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='admin2@qq.com', 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@qq.com', 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='admin4@qq.com', 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='admin5@qq.com', 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='admin6@qq.com', 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='admin7@qq.com', 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='admin8@qq.com', 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='admin9@qq.com', 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值