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. ]

#urls.py

  1. # financial_urls.py
  2.  
  3. from django.conf.urls import url
  4. from bpm.financial import financial_views
  5.  
  6. urlpatterns = [
  7. url(r'^not_payment/$', financial_views.not_payment, name="not_payment"), # 报名流程四 未 缴费 查询
  8. url(r'^already_payment/$', financial_views.already_payment, name="already_payment"), # 报名流程四 已 缴费 查询
  9. url(r'^payment/(\d+)/$', financial_views.payment, name="payment"), # 报名流程四 缴费 #财务
  10. ]
  11. # ————————47PerfectCRM实现CRM客户报名流程————————

# financial_urls.py

  1. # financial_views.py
  2. # ————————53PerfectCRM实现CRM客户报名流程缴费————————
  3. from crm import models #数据库
  4. from django.shortcuts import redirect,render #页面返回
  5. from bpm.bpm_auxiliary import bpm_forms #自定制 forms
  6. from django.contrib.auth.decorators import login_required # 登陆后页面才能访问
  7. # #待缴费
  8. def not_payment(request):
  9. sign=models.Enrollment.objects.all()#所有的报名表
  10. return render(request, 'bpm_financial/not_payment.html', locals())#
  11. # 已缴费
  12. def already_payment(request):
  13. sign=models.Enrollment.objects.all()#所有的报名表
  14. return render(request, 'bpm_financial/already_payment.html', locals())#
  15. #缴费视图
  16. @login_required # 登陆后页面才能访问
  17. def payment(request,enroll_id):
  18. sign=models.Payment.objects.all()#所有的报名表#前端对比用户#缴费记录
  19. enroll_obj=models.Enrollment.objects.get(id=enroll_id)#取对象
  20. errors={} #错误信息
  21. if request.method=="POST":
  22. payment_amount=request.POST.get('amount')#缴费金额
  23. consultant = models.UserProfile.objects.get(id=request.user.id) #财务人员 #当前登陆人
  24. if payment_amount:
  25. payment_amount=int(payment_amount) #转数字类型
  26. if payment_amount<500:
  27. errors['err']='缴费金额不得低于500元!'
  28. else: #生成forms
  29. payment_obj=models.Payment.objects.create(
  30. customer=enroll_obj.customer,##客户表 学员
  31. course=enroll_obj.enrolled_class.course,#所报课程
  32. consultant=consultant,# 财务人员
  33. amount=payment_amount,#缴费金额
  34. )
  35. enroll_obj.Pay_cost=True#已缴费
  36. enroll_obj.save() #保存
  37. enroll_obj.customer.status=0#修改报名状态 为已报名#根据数据库
  38. enroll_obj.customer.save() #保存
  39. return redirect('/bpm/not_payment')#客户表
  40. else:
  41. errors['err']='金额不能为空!'
  42. else:
  43. payment_form= bpm_forms.PaymentForm()#生成表单
  44. return render(request, 'bpm_financial/payment.html', locals())
  45. # ————————53PerfectCRM实现CRM客户报名流程缴费————————

# financial_views.py

  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. """05客户跟进表"""
  138. class CustomerFollowUp(models.Model):
  139.  
  140. #ForeignKey就是表与表之间的某种约定的关系 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
  141. customer = models.ForeignKey("Customer", on_delete=models.CASCADE)#客户名 #关联到 客户信息表
  142.  
  143. content = models.TextField(verbose_name="跟进内容")#跟进的内容#TextField无限制长度的文本#verbose_nameAdmin中显示的字段名称
  144.  
  145. #ForeignKey就是表与表之间的某种约定的关系 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
  146. consultant =models.ForeignKey("UserProfile", on_delete=models.CASCADE) #关联到 账号表
  147.  
  148. intention_choices =( #报名状态
  149. (0,'2周内报名'),
  150. (1,'1个月内报名'),
  151. (2,'近期无报名计划'),
  152. (3,'已在其它机构报名'),
  153. (4,'已报名'),
  154. (5,'已拉黑'),)
  155. #PositiveSmallIntegerField正小整数 0 ~ 32767(省空间)#choices是Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
  156. intention=models.SmallIntegerField(choices=intention_choices) #报名状态
  157.  
  158. #DateTimeField日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add创建时间(只读)
  159. date = models.DateTimeField(auto_now_add=True)#创建时间(数据库自增)
  160.  
  161. def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
  162. return "<%s:%s>" %(self.customer.qq,self.intention) #返回#格式化字符串#跨表里的QQ号#报名状态
  163. class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
  164. verbose_name_plural = "05客户跟进表"#verbose_name_plural给你的模型类起一个更可读的名字
  165.  
  166. """06学员报名信息表"""
  167. class Enrollment(models.Model):
  168. # ForeignKey就是表与表之间的某种约定的关系#verbose_name是Admin中显示的字段名称 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
  169. customer = models.ForeignKey("Customer",on_delete=models.CASCADE)#学员名字 #关联到 客户信息表
  170. enrolled_class = models.ForeignKey("ClassList",verbose_name="所报班级",on_delete=models.CASCADE)#关联到 班级表
  171. consultant = models.ForeignKey("UserProfile",verbose_name="课程顾问",on_delete=models.CASCADE) #关联到 账号表
  172.  
  173. # ————————52PerfectCRM实现CRM客户报名流程学生合同审核————————
  174. contract_review = models.CharField(max_length=256, blank=True, null=True, verbose_name="合同审核") # 合同审核
  175. # ————————52PerfectCRM实现CRM客户报名流程学生合同审核————————
  176.  
  177. #BooleanField布尔值类型#default=False默认(True)不允许出现空字符#verbose_name是Admin中显示的字段名称
  178. contract_agreed = models.BooleanField(default=False,verbose_name="学员已经同意合同")#学员看合同
  179. contract_approved = models.BooleanField(default=False,verbose_name="合同已经审核") #谁审核
  180.  
  181. # ————————53PerfectCRM实现CRM客户报名流程缴费————————
  182. Pay_cost= models.BooleanField(default=False,verbose_name="缴费") #缴费状态#是不是交定金
  183. # ————————53PerfectCRM实现CRM客户报名流程缴费————————
  184.  
  185. # DateTimeField日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add创建时间(只读)
  186. date = models.DateTimeField(auto_now_add=True)#创建时间(数据库自增)
  187.  
  188. def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
  189. return "%s %s" %(self.customer,self.enrolled_class)#返回#格式化字符串#学员名字#所报班级
  190. class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
  191. unique_together = ("customer","enrolled_class")#联合索引
  192. verbose_name_plural = "06学员报名信息表"#verbose_name_plural给你的模型类起一个更可读的名字
  193.  
  194. """07缴费记录表"""
  195. class Payment(models.Model):
  196. #ForeignKey就是表与表之间的某种约定的关系#verbose_name是Admin中显示的字段名称 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
  197. customer = models.ForeignKey("Customer",on_delete=models.CASCADE)#学员名字 关联到 客户信息表
  198. course = models.ForeignKey("Course",verbose_name="所报课程",on_delete=models.CASCADE)#关联到 课程表
  199.  
  200. #PositiveSmallIntegerField正小整数 0 ~ 32767 #verbose_name是Admin中显示的字段名称#默认值=500
  201. amount = models.PositiveIntegerField(verbose_name="数额",default=500)#缴费数额
  202.  
  203. #ForeignKey就是表与表之间的某种约定的关系#CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
  204. consultant = models.ForeignKey("UserProfile",on_delete=models.CASCADE)#缴费给谁 关联到 账号表 #财务人员
  205.  
  206. #DateTimeField日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add创建时间(只读)
  207. date=models.DateTimeField(auto_now_add=True)#创建时间(数据库自增)
  208.  
  209. def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
  210. return "%s %s" %(self.customer,self.amount)#返回#格式化字符串#学员名字#缴费数额
  211. class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
  212. verbose_name_plural = "07缴费记录表"#verbose_name_plural给你的模型类起一个更可读的名字
  213.  
  214. """08每节课上课纪录表"""
  215. class CourseRecord(models.Model):
  216. # ForeignKey就是表与表之间的某种约定的关系#verbose_name是Admin中显示的字段名称 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
  217. from_class = models.ForeignKey("ClassList",verbose_name="班级",on_delete=models.CASCADE) #那个班级
  218.  
  219. #PositiveSmallIntegerField正小整数 0 ~ 32767 #verbose_name是Admin中显示的字段名称
  220. day_num = models.PositiveSmallIntegerField(verbose_name="第几节(天)") #第几节课
  221.  
  222. # ForeignKey就是表与表之间的某种约定的关系 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
  223. teacher = models.ForeignKey("UserProfile",on_delete=models.CASCADE)#老师是谁 关联到 账号表
  224.  
  225. #BooleanField布尔值类型#default=True默认(True)不允许出现空字符
  226. has_homework = models.BooleanField(default=True) #有没有作业
  227.  
  228. # CharField定长文本#名字最长128#Django可空#数据库可以为空
  229. homework_title = models.CharField(max_length=128,blank=True,null=True) #作业标题
  230.  
  231. #TextField无限制长度的文本#Django可空#数据库可以为空
  232. homework_content = models.TextField(blank=True,null=True) #作业内容
  233.  
  234. #TextField无限制长度的文本#verbose_name是Admin中显示的字段名称
  235. outline =models.TextField(verbose_name="本节课程大纲") #课程主要讲什么
  236.  
  237. # DateTimeField日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add创建时间(只读)
  238. date = models.DateField(auto_now_add=True)#创建时间(数据库自增)
  239.  
  240. def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
  241. return " %s:%s" %(self.from_class,self.day_num)#返回#格式化字符串#班级#第几节(天)
  242. class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
  243. unique_together = ("from_class","day_num") #联合索引
  244. verbose_name_plural = "08每节课上课纪录表" #verbose_name_plural给你的模型类起一个更可读的名字
  245.  
  246. """09学习纪录"""
  247. class StudyRecord(models.Model):
  248. # ForeignKey就是表与表之间的某种约定的关系 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
  249. student = models.ForeignKey("Enrollment",on_delete=models.CASCADE)#学生名字 关联到 学员报名信息表
  250. course_record = models.ForeignKey("CourseRecord",on_delete=models.CASCADE)#开课记录 # 关联到 每节课上课纪录表
  251.  
  252. attendance_choices = (# 本节课上课状态记录
  253. (0,"已签到"),
  254. (1,"迟到"),
  255. (2,"缺勤"),
  256. (3,"早退"),)
  257. #PositiveSmallIntegerField正小整数 0 ~ 32767(省空间)#choices是Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
  258. attendance = models.SmallIntegerField(choices=attendance_choices) # 本节课上课状态记录
  259.  
  260. score_choices = (#学习成绩
  261. (100,"A+"),
  262. (90,"A"),
  263. (85,"B+"),
  264. (80,"B"),
  265. (75,"B-"),
  266. (70,"C+"),
  267. (65,"C"),
  268. (40,"C-"),
  269. (-20,"D"),
  270. (-50,"COPY"),
  271. (0,"N/A"),)
  272. #PositiveSmallIntegerField正小整数 0 ~ 32767(省空间)#choices是Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
  273. score = models.SmallIntegerField(choices=score_choices) #学习成绩
  274.  
  275. memo = models.TextField(blank=True,null=True)#TextField无限制长度的文本#Django可空#数据库可以为空
  276.  
  277. # DateTimeField日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add创建时间(只读)
  278. date = models.DateField(auto_now_add=True)#创建时间(数据库自增)
  279.  
  280. def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
  281. return "%s %s %s" % (self.student, self.course_record, self.score)#返回#格式化字符串#学生名字#开课记录#学习成绩
  282. class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
  283. unique_together = ('student','course_record')#联合索引#学生名字#开课记录
  284. verbose_name_plural = "09学习纪录"#verbose_name_plural给你的模型类起一个更可读的名字
  285.  
  286. # ————————34PerfectCRM实现CRM自定义用户————————
  287. # """10账号表"""
  288. # class UserProfile(models.Model):
  289. # from django.contrib.auth.models import User # 使用django内置的用户表
  290. #
  291. # #OneToOneField一对一 #User是django Admin里的账号表#CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。
  292. # user = models.OneToOneField(User,on_delete=models.CASCADE)# 用户名 #创建外键,关联django用户表
  293. #
  294. # name = models.CharField(max_length=32) #账号名(扩展用户字段)#CharField定长文本
  295. #
  296. # #ManyToManyField多对多和外键工作方式相同,只不过我们处理的是QuerySet而不是模型实例。#Django可空
  297. # roles = models.ManyToManyField("Role",blank=True) #角色(权限) # 双向一对多==多对多
  298. #
  299. # def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
  300. # return self.name #返回 #账号名
  301. # class Meta: #通过一个内嵌类 "class Meta" 给你的 model 定义元数据
  302. # verbose_name_plural = "10账号表"#verbose_name_plural给你的模型类起一个更可读的名字
  303. # ————————34PerfectCRM实现CRM自定义用户————————
  304.  
  305. # ————————34PerfectCRM实现CRM自定义用户————————
  306. #10账号表,创建用户和超级用户
  307. from django.contrib.auth.models import BaseUserManager
  308. class UserProfileManager(BaseUserManager):
  309. def create_user(self, email, name, password=None):
  310. """
  311.   创建并保存一个用户用给定的邮件,日期
  312.   出生和密码。
  313. """
  314. if not email:#没有email 报错
  315. raise ValueError('用户必须有一个电子邮件地址')
  316.  
  317. user = self.model(
  318. email=self.normalize_email(email),#验证邮箱格式
  319. name=name,
  320. )
  321. user.set_password(password)#加密
  322. user.is_active = True
  323. user.save(using=self._db)
  324. return user
  325. def create_superuser(self, email, name, password):
  326. """
  327.   创建并保存一个超级用户具有给定邮件,日期
  328.   出生和密码。
  329. """
  330. user = self.create_user(email,
  331. password=password,
  332. name=name
  333. )
  334. user.is_active = True
  335. user.is_superuser = True
  336. user.save(using=self._db)
  337. return user
  338.  
  339. """10账号表"""
  340. """
  341.  
  342. #删除数据库
  343.  
  344. #调用objects = UserProfileManager()#创建账号 #关联这个函数
  345.  
  346. #运行 Terminal
  347. # 生成 数据表
  348. # python manage.py makemigrations
  349. # 数据表 迁移
  350. # python manage.py migrate
  351. Django Admin里账号密码重置方法
  352. #运行 Terminal
  353. python manage.py createsuperuser
  354.  
  355. Email address: admin@qq.com
  356. 用户名 : admin
  357. Password: admin123456
  358. Password (again): admin123456
  359. """
  360. from django.contrib.auth.models import AbstractBaseUser
  361. # ————————35PerfectCRM实现CRM重写Admin密码修改————————
  362. from django.utils.translation import ugettext_lazy as _ # 语言国际化
  363. from django.utils.safestring import mark_safe
  364. from django.contrib.auth.models import PermissionsMixin
  365. # class UserProfile(AbstractBaseUser):
  366. class UserProfile(AbstractBaseUser,PermissionsMixin):
  367. # ————————35PerfectCRM实现CRM重写Admin密码修改————————
  368. email=models.EmailField(
  369. verbose_name='邮箱账号',
  370. max_length=255,
  371. unique=True#唯一 #登陆账号
  372. )
  373. name=models.CharField(max_length=32,verbose_name='用户名')
  374.  
  375. # ————————35PerfectCRM实现CRM重写Admin密码修改————————
  376. password = models.CharField(_('password'), max_length=128, help_text=mark_safe('''<a href=\"../password/\">修改密码</a>'''))
  377. # ————————35PerfectCRM实现CRM重写Admin密码修改————————
  378.  
  379. is_active = models.BooleanField(default=True,verbose_name='合法账号')#权限#合法账号
  380. is_superuser = models.BooleanField(default=False,verbose_name='超级账号') #超级账号
  381. objects = UserProfileManager()#创建账号 #关联这个函数
  382. USERNAME_FIELD ='email'#指定做为 #登陆账号
  383. REQUIRED_FIELDS = ['name']#必填字段
  384. def get_full_name(self):
  385. return self.email
  386. def get_short_name(self):
  387. #用户确认的电子邮件地址
  388. return self.email
  389. def __str__(self):
  390. return self.name
  391. def has_perm(self,perm,obj=None):
  392. #指明用户是否被认为活跃的。以反选代替删除帐号。
  393. #最简单的可能的答案:是的,总是
  394. return True #有效 账号
  395. def has_module_perms(self, app_label):
  396. #指明用户是否可以登录到这个管理站点。
  397. # 最简单的可能的答案:是的,总是
  398. return True #职员状态
  399. @property
  400. def is_staff(self):
  401. '''“用户的员工吗?”'''
  402. #最简单的可能的答案:所有管理员都是员工
  403. return self.is_superuser#是不是超级用户状态
  404. # AUTH_USER_MODEL = 'crm.UserProfile'#使用自定的admin 表单 #settings.py
  405. # ————————34PerfectCRM实现CRM自定义用户————————
  406.  
  407. """11角色表"""
  408. class Role(models.Model):
  409. name = models.CharField(unique=True,max_length=32)#角色名#CharField定长文本#角色名不可以重复#最长度=32字节
  410. def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
  411. return self.name#返回 #角色名
  412. class Meta: #通过一个内嵌类 "class Meta" 给你的 model 定义元数据
  413. verbose_name_plural = "11角色表" #verbose_name_plural给你的模型类起一个更可读的名字
  414.  
  415. """12标签表"""
  416. class Tag(models.Model):
  417. name = models.CharField(max_length=64,unique=True) #标签名#CharField定长文本#最长度=64字节#不可以重复
  418. def __str__(self): #__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。
  419. return self.name #返回 #标签名
  420. class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据
  421. verbose_name_plural = "12标签表" #verbose_name_plural给你的模型类起一个更可读的名字
  422.  
  423. # ————————01PerfectCRM基本配置ADMIN————————

#models.py

  1. # forms.py
  2. # ————————47PerfectCRM实现CRM客户报名流程————————
  3. from crm import models #数据库
  4. from django.forms import ModelForm #继承forms自定制
  5. #报名 销售填写
  6. class EnrollmentForm(ModelForm):
  7. def __new__(cls, *args, **kwargs):
  8. for field_name,field_obj in cls.base_fields.items():
  9. field_obj.widget.attrs['class'] = 'form-control'## 前端的样式
  10. return ModelForm.__new__(cls)
  11. class Meta:
  12. model= models.Enrollment
  13. fields= ['enrolled_class']
  14. # ————————47PerfectCRM实现CRM客户报名流程————————
  15.  
  16. # ————————48PerfectCRM实现CRM客户报名流程学生合同————————
  17. #报名学员填 写
  18. class CustomerForm(ModelForm):
  19. def __new__(cls, *args, **kwargs):
  20. for field_name,field_obj in cls.base_fields.items():
  21. field_obj.widget.attrs['class'] = 'form-control'## 前端的样式
  22. if field_name in cls.Meta.readonly_fields:#如果不可修改
  23. field_obj.widget.attrs['disabled'] = True## 前端的样式 灰色
  24. return ModelForm.__new__(cls)
  25.  
  26. # ————————49PerfectCRM实现CRM客户报名流程学生合同表单验证————————
  27. def clean_qq(self):
  28. #print(self.instance.qq,self.cleaned_data['qq'],'9696969696')
  29. if self.instance.qq != self.cleaned_data['qq']: #输入的值和 cleaned_data的值
  30. self.add_error('qq',"大神,请勿非法修改!")
  31. return self.cleaned_data['qq']
  32.  
  33. def clean_consultant(self):
  34. if self.instance.consultant != self.cleaned_data['consultant']:
  35. self.add_error('consultant',"非法修改!不要尝试!")
  36. return self.cleaned_data['consultant']
  37.  
  38. def clean_source(self):
  39. if self.instance.source != self.cleaned_data['source']:
  40. self.add_error('source',"非法修改!不能通过!")
  41. return self.cleaned_data['source']
  42. # ————————49PerfectCRM实现CRM客户报名流程学生合同表单验证————————
  43.  
  44. class Meta:
  45. model=models.Customer#客户表
  46. fields='__all__'
  47. exclude=['tags','content','memo','status','referral_from','consult_courses']#排除,不显示
  48. readonly_fields=['qq','consultant','source']#不可修改
  49. # ————————48PerfectCRM实现CRM客户报名流程学生合同————————
  50.  
  51. # ————————53PerfectCRM实现CRM客户报名流程缴费————————
  52. #缴费记录
  53. class PaymentForm(ModelForm):
  54. def __new__(cls, *args, **kwargs):
  55. for field_name,field_obj in cls.base_fields.items():
  56. field_obj.widget.attrs['class'] = 'form-control'## 前端的样式
  57. return ModelForm.__new__(cls)
  58. class Meta:
  59. model=models.Payment
  60. fields='__all__'
  61.  
  62. # ————————53PerfectCRM实现CRM客户报名流程缴费————————

# forms.py

  1. {#not_audit.html#}
  2. {## # ————————53PerfectCRM实现CRM客户报名流程缴费————————#}
  3. {% extends 'bpm_master/bpm_sample.html' %}
  4. {% block right-container-content %} {#自定义内容开始 右边页面内容#}
  5. <div class="panel-default">
  6. <div class="panel-body">
  7. <h3>待缴费 | <a class="btn btn-info pull" href={% url 'already_payment' %}>已缴费</a></h3>
  8. <table class="table table-striped table-responsive">
  9. <thead>
  10. <tr>
  11. <th>客户名字</th>
  12. <th>客户QQ</th>
  13. <th>手机号码</th>
  14. <th>咨询顾问</th>
  15.  
  16. <th>所报班级</th>
  17. <th>报名课程顾问</th>
  18. <th>合同审核</th>
  19. <th>合同状态</th>
  20. <th>日期时间</th>
  21. </tr>
  22. </thead>
  23. <tbody>
  24. {% for foo in sign %}
  25. {# {% if foo.contract_agreed and foo.contract_approved == false %}#}
  26. {% if foo.contract_approved and not foo.Pay_cost %}
  27. <tr>
  28. <td><a href="{% url 'payment' foo.id %}">{{ foo.customer.name }}</a></td>
  29. <td>{{ foo.customer }}</td>
  30. <td>{{ foo.customer.phone }}</td>
  31. <td>{{ foo.customer.consultant }}</td>
  32.  
  33. <td>{{ foo.enrolled_class }}</td>
  34. <td>{{ foo.consultant }}</td>
  35. <td>{{ foo.contract_review }}</td>
  36. <td>{{ foo.contract_approved }}</td>
  37. <td>{{ foo.date }}</td>
  38. </tr>
  39. {% endif %}
  40. {% endfor %}
  41. </tbody>
  42. </table>
  43. </div>
  44. </div>
  45. {% endblock %}
  46.  
  47. {## # ————————53PerfectCRM实现CRM客户报名流程缴费————————#}

{#not_audit.html#}

  1. {#already_payment.html#}
  2. {## # ————————53PerfectCRM实现CRM客户报名流程缴费————————#}
  3. {% extends 'bpm_master/bpm_sample.html' %}
  4. {% block right-container-content %} {#自定义内容开始 右边页面内容#}
  5. <div class="panel-default">
  6. <div class="panel-body">
  7. <h3>已缴费 | <a class="btn btn-success pull" href={% url 'not_payment' %}>待缴费</a></h3>
  8. <table class="table table-striped table-responsive">
  9. <thead>
  10. <tr>
  11. <th>客户名字</th>
  12. <th>客户QQ</th>
  13. <th>手机号码</th>
  14. <th>咨询顾问</th>
  15.  
  16. <th>所报班级</th>
  17. <th>报名课程顾问</th>
  18. <th>合同审核</th>
  19. <th>合同状态</th>
  20. <th>日期时间</th>
  21. </tr>
  22. </thead>
  23. <tbody>
  24. {% for foo in sign %}
  25. {# {% if foo.contract_agreed and foo.contract_approved == false %}#}
  26. {% if foo.contract_approved and foo.Pay_cost %}
  27. <tr>
  28. <td><a href="{% url 'payment' foo.id %}">{{ foo.customer.name }}</a></td>
  29. <td>{{ foo.customer }}</td>
  30. <td>{{ foo.customer.phone }}</td>
  31. <td>{{ foo.customer.consultant }}</td>
  32.  
  33. <td>{{ foo.enrolled_class }}</td>
  34. <td>{{ foo.consultant }}</td>
  35. <td>{{ foo.contract_review }}</td>
  36. <td>{{ foo.contract_approved }}</td>
  37. <td>{{ foo.date }}</td>
  38. </tr>
  39. {% endif %}
  40. {% endfor %}
  41. </tbody>
  42. </table>
  43. </div>
  44. </div>
  45. {% endblock %}
  46.  
  47. {## # ————————53PerfectCRM实现CRM客户报名流程缴费————————#}

{#already_payment.html#}

  1. {#payment.html#}
  2. {## # ————————53PerfectCRM实现CRM客户报名流程缴费————————#}
  3. {% extends 'bpm_master/bpm_sample.html' %}
  4. {% block right-container-content %} {#自定义内容开始 右边页面内容#}
  5. <div class="panel panel-info">
  6. <h4> 学员缴费:</h4>
  7. </div>
  8. <div id="content">
  9. <form action="" class="form-horizontal col-lg-5" role="form" method="post">{% csrf_token %}
  10. <table>
  11. <div class="form-group">
  12. <label for="inputeEmail4" class="col-sm-3"> 客户名字: </label>
  13. <div class="col-sm-3"> {{ enroll_obj.customer.name }}</div>
  14. </div>
  15. <div class="form-group">
  16. <label for="inputeEmail4" class="col-sm-3"> 客户QQ </label>
  17. <div class="col-sm-3"> {{ enroll_obj.customer }}</div>
  18. </div>
  19. <div class="form-group">
  20. <label for="inputeEmail4" class="col-sm-3"> 手机号码: </label>
  21. <div class="col-sm-3"> {{ enroll_obj.customer.phone }}</div>
  22. </div>
  23. <div class="form-group">
  24. <label for="inputeEmail4" class="col-sm-3">咨询顾问 </label>
  25. <div class="col-sm-3"> {{ enroll_obj.customer.consultant }} </div>
  26. </div>
  27. <div class="form-group">
  28. <label for="inputeEmail4" class="col-sm-3"> 所报课程 </label>
  29. <div class="col-sm-3"> {{ enroll_obj.enrolled_class }} </div>
  30. </div>
  31. <div class="form-group">
  32. <label for="inputeEmail4" class="col-sm-3">报名课程顾问 </label>
  33. <div class="col-sm-3"> {{ enroll_obj.consultant }} </div>
  34. </div>
  35. <div class="form-group">
  36. <label for="inputeEmail4" class="col-sm-3">合同审核 </label>
  37. <div class="col-sm-3"> {{ enroll_obj.contract_review }} </div>
  38. </div>
  39. <div class="form-group">
  40. <label for="inputeEmail9" class="col-sm-3">缴费金额 :</label>
  41. <div><input type="text" name="amount" placeholder="至少不低于500">
  42. <span style="color: #c7254e">{{ errors.err }}</span>
  43. </div>
  44. </div>
  45. <div class="form-group">
  46. <label for="inputeEmail9" class="col-sm-3">财务人员 :</label>
  47. <div class="col-sm-3"> {{ request.user.name }} </div>
  48. </div>
  49. </table>
  50. <div class="form-group col-sm-6">
  51. <a class="btn btn-danger pull " href={% url 'not_payment' %}>返回</a>
  52. <input type="submit" class="btn btn-success pull-right " value="缴费">
  53. </div>
  54. </form>
  55.  
  56. <hr>
  57. <table class="table table-striped table-responsive">
  58. <thead>
  59. <tr>
  60. <th>客户名字</th>
  61. <th>客户QQ</th>
  62. <th>手机号码</th>
  63. <th>咨询顾问</th>
  64. <th>所报课程</th>
  65.  
  66. <th>报名课程顾问</th>
  67. <th>合同审核</th>
  68.  
  69. <th>缴费金额</th>
  70. <th>财务人员</th>
  71. <th>日期时间</th>
  72. </tr>
  73. </thead>
  74. <tbody>
  75. {% for foo in sign %}
  76. {% if foo.customer == enroll_obj.customer %}
  77. <tr>
  78. <td>{{ foo.customer.name }}</td>
  79. <td>{{ foo.customer }}</td>
  80. <td>{{ foo.customer.phone }}</td>
  81. <td>{{ foo.customer.consultant }}</td>
  82. <td>{{ foo.course }}</td>
  83.  
  84. <td>{{ enroll_obj.consultant }}</td>
  85. <td>{{ enroll_obj.contract_review }}</td>
  86.  
  87. <td>{{ foo.amount }}</td>
  88. <td>{{ foo.consultant }}</td>
  89. <td>{{ foo.date }}</td>
  90. </tr>
  91. {% endif %}
  92. {% endfor %}
  93. </tbody>
  94. </table>
  95. </div>
  96. {% endblock %}
  97. {## # ————————53PerfectCRM实现CRM客户报名流程缴费————————#}

{#payment.html#}

Django项目:CRM(客户关系管理系统)--63--53PerfectCRM实现CRM客户报名流程缴费的更多相关文章

  1. 文献综述二十:基于UML技术的客户关系管理系统实现

    一.基本信息 标题:基于UML技术的客户关系管理系统实现 时间:2015 出版源:电子设计工程 文件分类:uml技术的研究 二.研究背景 设计出可应用与银行和储户之间沟通的客户关系管理系统,从而实现对 ...

  2. Django项目:CRM(客户关系管理系统)--84--74PerfectCRM实现CRM权限和权限组限制访问URL

    #models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...

  3. Django项目:CRM(客户关系管理系统)--85--75PerfectCRM实现CRM扩展权限

    # sales_urls.py # ————————47PerfectCRM实现CRM客户报名流程———————— from django.conf.urls import url from bpm. ...

  4. Django项目:CRM(客户关系管理系统)--82--72PerfectCRM实现CRM动态菜单和角色

    #models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...

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

    #urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...

  6. Django项目:CRM(客户关系管理系统)--78--68PerfectCRM实现CRM业务流程(bpm)报名缴费分页

    # pagination.py # ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页———————— from django.utils.safestring impo ...

  7. Django项目:CRM(客户关系管理系统)--73--63PerfectCRM实现CRM讲师下载作业

    # teacher_urls.py # ————————62PerfectCRM实现CRM讲师讲课记录———————— from django.conf.urls import url from bp ...

  8. Django项目:CRM(客户关系管理系统)--71--61PerfectCRM实现CRM学生上传作业

    # student_urls.py # ————————60PerfectCRM实现CRM学生上课记录———————— from django.conf.urls import url from bp ...

  9. Django项目:CRM(客户关系管理系统)--67--57PerfectCRM实现admin批量生成上课记录

    #admin.py # ————————01PerfectCRM基本配置ADMIN———————— from django.contrib import admin # Register your m ...

随机推荐

  1. echarts折线区域图

    一.使用场景 当舒张压和收缩压超过或低于他们对应的范围时,折线应该给与不同颜色.两个指标对应的范围也要填充不同的颜色. 二.实现方案 主要使用了echarts中的visualMap,series.ma ...

  2. https://stackoverflow.com/与程序相关的IT技术问答网站

    https://stackoverflow.com/ Stack Overflow是一个与程序相关的IT技术问答网站.用户可以在网站免费提交问题,浏览问题,索引相关内容,在创建主页的时候使用简单的HT ...

  3. HTML引入CSS的方法

    1.嵌入式 通过<style>标记,来引入CSS样式. 语法格式:<style type = “text/css”></style> 提示:<style> ...

  4. Acess link

  5. Spring事物管理机制简单学习

    首先spring并不直接管理事物,而是提供了多种事物管理器,他们将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现. Spring管理事物的接口是org.s ...

  6. 王者归来,Java 程序设计葵花宝典!

    致谢  感谢所有关注本号的小伙伴们,这一年来本号的茁壮成长离不开大家的支持. 2018年,继续坚持分享以及为大家谋求福利!!! Java技术栈往期赠书 赠书一:新春第一次送书,价值78元 X 3本 赠 ...

  7. spring boot发简单文本邮件

    首先要去邮箱打开POP3/SMTP权限: 然后会提供个授权码,用来发送邮件.忘记了,可以点生成授权码再次生成. 1.引入spring boot自带的mail依赖,这里版本用的:<spring-b ...

  8. 关于ueditor 文本框

    遇到一个问题,需要将从ueditor中的获得的带格式的文本,从数据库中取出,在放回到 ueditor中去,但是 文本中\n总是截断字符串,出现 这种情况,后面的字符就不能算到里面去了,程序就报错了. ...

  9. 多重背包 /// 单调队列DP oj1943

    题目大意: em.... 就是多重背包 挑战340页的东西 ...自己的笔记总结总是比较乱的 重点:原始的状态转移方程中 更新第 i 种物品时 重量%w[i] 的值不同 则它们之间是相互独立的: 1- ...

  10. jQuery实现contains方法不区分大小写的方法教程

    jQuery.expr[':'].Contains = function(a, i, m){ return jQuery(a).text().toUpperCase() .indexOf(m[3].t ...