Django項目:CRM(客戶關係管理系統)--58--48PerfectCRM實現CRM客戶報名流程學生合同

 

 1 # sales_urls.py
 2 # ————————47PerfectCRM實現CRM客戶報名流程————————
 3 from django.conf.urls import url
 4 from bpm.sales import sales_views
 5 
 6 urlpatterns = [
 7     url(r'^customer/(\d+)/enrollment/$', sales_views.enrollment, name="enrollment"),#客戶招生#報名流程一 下一步
 8 
 9     # ————————48PerfectCRM實現CRM客戶報名流程學生合同————————
10     url(r'^customer/registration/(\d+)/$', sales_views.stu_registration, name="stu_registration"),  # 報名流程二 學員籤同合
11     # ————————48PerfectCRM實現CRM客戶報名流程學生合同————————
12 ]
13 # ————————47PerfectCRM實現CRM客戶報名流程————————
# sales_urls.py

 

 

 

 

 1 # sales_views.py
 2 # ————————47PerfectCRM實現CRM客戶報名流程————————
 3 from django.db import IntegrityError  #主動捕捉錯誤信息
 4 from django.shortcuts import render  #頁面返回
 5 from crm import models    #數據庫
 6 from bpm.bpm_auxiliary import bpm_forms   #自定製 forms
 7 from  django.contrib.auth.decorators import login_required# 登錄後頁面才能訪問
 8 
 9 # ————————47PerfectCRM實現CRM客戶報名流程————————
10 from django.core.mail import send_mail
11 # send_mail的參數分別是  郵件標題,郵件內容,發件箱(settings.py中設置過的那個),收件箱列表(能夠發送給多我的),失敗靜默(若發送失敗,報錯提示咱們)
12 import random
13 import datetime  # 獲取時間#登錄過時
14 #發送郵件的功能 #驗證碼#密碼
15 class stmp() :
16     def __init__(self):
17         self.emaillist=[]  #發送給誰
18         self.code=None    #驗證碼#密碼
19     def stmps(self,request,email,msg_mail): #傳參數#頁面,session #郵箱,發送給誰 #內容
20         self.emaillist.append(email) #將郵箱地址添加到調用Django發送郵件功能
21         # ——————生成驗證碼——————
22         _letter_cases = "abcdefghjkmnpqrstuvwxy"  # 小寫字母,去除可能干擾的i,l,o,z
23         _upper_cases = _letter_cases.upper()  # 大寫字母
24         _numbers = ''.join(map(str, range(3, 10)))  # 數字
25         chars = ''.join((_letter_cases, _upper_cases, _numbers))  # 變成一條字符串
26         list = random.sample(chars, 4)  # 從一條字符串隨機選4個字符變成列表
27         self.code = ''.join(list)  # 列表變字符串
28         # ——————生成驗證碼——————
29         # ——————調用Django發送郵件——————
30         title= 'PerfectCRM項目自動郵件:%s'%self.code   # 郵件標題#防止同樣的內容被郵箱屏蔽
31         send_mail(title,  # 郵件標題
32                   msg_mail,  # 驗證碼內容
33                   'perfectcrm@sina.cn',  # 發送的郵箱  #根據狀況從新配置
34                   self.emaillist,  # 接受的郵箱
35                   fail_silently=False,  # 靜默,拋出異常
36                   )
37         print('發送郵件成功!沒收到要換標題!檢查發送郵箱的配置!')
38         # ——————調用Django發送郵件——————
39 
40 # ————————47PerfectCRM實現CRM客戶報名流程————————
41 # ————————47PerfectCRM實現CRM客戶報名流程————————
42 
43 #報名填寫 銷售
44 @login_required # 登錄後頁面才能訪問
45 def enrollment(request,customer_id):
46     msgs={} #錯誤信息
47     customer_obj=models.Customer.objects.get(id=customer_id)#取到客戶信息記錄 #返回到頁面#報名人
48     consultant_obj=models.UserProfile.objects.get(id=request.user.id)#報名課程顧問
49 
50     stmp_mail = {}  #郵件發送成功
51     stmpemail = stmp() #實例化發送郵件的功能
52     email = request.POST.get('email')  # 讓頁面POST提交的值,在頁面GET後仍然存在顯示
53     if request.method=="POST":
54         enroll_form= bpm_forms.EnrollmentForm(request.POST)#獲取數據
55         if enroll_form.is_valid():#表單驗證
56             msg = "http://127.0.0.1:8000/bpm/customer/registration/{enroll_obj_id}/"
57             try:
58                 enroll_form.cleaned_data['customer']=customer_obj#添加學員對象 記錄 #報名人
59                 enroll_form.cleaned_data['consultant'] = consultant_obj#報名課程顧問
60                 enroll_obj=models.Enrollment.objects.create(**enroll_form.cleaned_data)#建立記錄
61                 msgs['msg']=msg.format(enroll_obj_id=enroll_obj.id)#報名記錄對應的id
62             except IntegrityError as e:
63                 #取到這條記錄
64                 enroll_obj=models.Enrollment.objects.get(customer_id=customer_obj.id,
65                                                          enrolled_class_id=enroll_form.cleaned_data['enrolled_class'].id)
66                 enroll_form.add_error('__all__','記錄已經存在,不能重複建立!')
67                 msgs['msg']=msg.format(enroll_obj_id=enroll_obj.id)#報名記錄對應的id
68             if email:
69                 msg_mail = "http://127.0.0.1:8000/bpm/customer/registration/%s/"%enroll_obj.id
70                 stmpemail.stmps(request, email,msg_mail)  # 發送郵件
71                 stmp_mail['ok'] = "郵件已發送成功!"
72 
73     else:
74         enroll_form= bpm_forms.EnrollmentForm()#modelform表單
75     return render(request, 'bpm_sales/enrollment.html', locals())
76 # ————————47PerfectCRM實現CRM客戶報名流程————————
77 
78 
79 # ————————48PerfectCRM實現CRM客戶報名流程學生合同————————
80 #學員合同簽訂
81 def stu_registration(request,enroll_id):
82     enroll_obj=models.Enrollment.objects.get(id=enroll_id)#獲取報名記錄
83     customer_form= bpm_forms.CustomerForm(instance=enroll_obj.customer)#生成表單
84     return render(request,'bpm_sales/stu_registration.html',locals())
85 # ————————48PerfectCRM實現CRM客戶報名流程學生合同————————
# sales_views.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 
17 # ————————48PerfectCRM實現CRM客戶報名流程學生合同————————
18 #報名學員填 寫
19 class CustomerForm(ModelForm):
20     def __new__(cls, *args, **kwargs):
21         for field_name,field_obj in cls.base_fields.items():
22             field_obj.widget.attrs['class'] = 'form-control'## 前端的樣式
23             if field_name in cls.Meta.readonly_fields:#若是不可修改
24                 field_obj.widget.attrs['disabled'] = True## 前端的樣式 灰色
25         return ModelForm.__new__(cls)
26 
27     class Meta:
28         model=models.Customer#客戶表
29         fields='__all__'
30         exclude=['tags','content','memo','status','referral_from','consult_courses']#排除,不顯示
31         readonly_fields=['qq','consultant','source']#不可修改
32 # ————————48PerfectCRM實現CRM客戶報名流程學生合同————————
# forms.py

 

 

 

 

 1 {#stu_registration.html#}
 2 {## ————————48PerfectCRM實現CRM客戶報名流程學生合同————————#}
 3 {% extends 'bpm_master/bpm_sample.html' %}
 4 {% load bpm_tags %}
 5 {% block right-container-content %} {#自定義內容開始 右邊頁面內容#}
 6     <div class="container col-lg-7 col-md-offset-2">
 7         <div class="panel panel-warning">
 8             <div class=" panel-heading">
 9                 <h3 class="panel-title container">報名入學|信息填寫</h3>
10             </div>
11             <div class="panel-body ">                           <!--返回提交函數-->
12                 <form method="post" class="form-horizontal" role="form">{% csrf_token %}
13                     {% for foo in customer_form %}
14                         <div class="form-group">
15                             <label for="inputEmail3" class="col-sm-2 control-label">{{ foo.label }}</label>
16                             <div class="col-sm-8">
17                                 {{ foo }}
18                             </div>
19                         </div>
20                     {% endfor %}
21                     <hr>
22                     {#返回06學員報名信息表的數據#}
23                     <div class="form-group">
24                         <label for="inputEmail3" class="col-sm-2 control-label">所報班級</label>
25                         <div class="col-sm-8">
26                             {{ enroll_obj.enrolled_class }}
27                         </div>
28                     </div>
29                     <div class="form-group">
30                         <label for="inputEmail3" class="col-sm-2 control-label">課程費用</label>
31                         <div class="col-sm-8">
32                             {{ enroll_obj.enrolled_class.course.price }}
33                         </div>
34                     </div>
35                     <div class="form-group">
36                         <label for="inputEmail3" class="col-sm-2 control-label">開課日期</label>
37                         <div class="col-sm-8">
38                             {{ enroll_obj.enrolled_class.start_date }}
39                         </div>
40                     </div>
41 
42                     <div class="form-group">
43                         <label for="inputEmail3" class="col-sm-2 control-label">合同</label>
44                         <div class="col-sm-10">
45                             <div style="width: 550px">
46                                 <pre style="height: 300px">{% render_enrolled_contract enroll_obj %}  </pre> <!--tgs-->
47                             </div>
48 
49                         </div>
50                     </div>
51                     <div class="form-group">
52                         <div class="col-sm-12">
53                             <input type="checkbox" value="{{ enroll_obj.contract_agreed }}" name="contract_agreed"
54                                    checked>
55                             我已經認真閱讀完協議並接受全部條款
56                         </div>
57                     </div>
58                     <div class="text-center">
59                         <input type="submit" class="btn btn-info" value="提交">
60                     </div>
61                 </form>
62             </div>
63             <div class="panel-footer">
64                 <input type="button" class="btn btn-danger right" value="關閉" onclick="CloseWebPage()">
65             </div>
66         </div>
67     </div>
68 {% endblock %}
69 
70 {% block js %}
71     <script>
72         function CloseWebPage() {
73             if (confirm("您肯定要關閉本頁嗎?")) {
74                 window.opener = null;
75                 window.open('', '_self');
76                 window.close();
77             }
78             else {
79             }
80         }
81     </script>
82 {% endblock %}
83 {## ————————48PerfectCRM實現CRM客戶報名流程學生合同————————#}
{#stu_registration.html#}

 

 

 

 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 # bpm_tags.py
# bpm_tags.py

 

 

  1 # settings.py
  2 
  3 """
  4 Django settings for PerfectCRM project.
  5 
  6 Generated by 'django-admin startproject' using Django 2.0.3.
  7 
  8 For more information on this file, see
  9 https://docs.djangoproject.com/en/2.0/topics/settings/
 10 
 11 For the full list of settings and their values, see
 12 https://docs.djangoproject.com/en/2.0/ref/settings/
 13 """
 14 
 15 import os
 16 
 17 # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
 18 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 19 
 20 
 21 # Quick-start development settings - unsuitable for production
 22 # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/
 23 
 24 # SECURITY WARNING: keep the secret key used in production secret!
 25 SECRET_KEY = 'atkhzsd7emv4_okn@ynhji)p)qbpuvhq+a7@yx5=chaa0$l_br'
 26 
 27 # SECURITY WARNING: don't run with debug turned on in production!
 28 DEBUG = True
 29 
 30 ALLOWED_HOSTS = []
 31 
 32 
 33 # Application definition
 34 
 35 INSTALLED_APPS = [
 36     'django.contrib.admin',
 37     'django.contrib.auth',
 38     'django.contrib.contenttypes',
 39     'django.contrib.sessions',
 40     'django.contrib.messages',
 41     'django.contrib.staticfiles',
 42     
 43 # ————————04PerfectCRM實現King_admin註冊功能————————
 44     # 'crm.apps.CrmConfig',
 45     'crm',
 46 # ————————04PerfectCRM實現King_admin註冊功能————————
 47 
 48 # ————————02PerfectCRM建立ADMIN頁面————————
 49     'king_admin',
 50 # ————————02PerfectCRM建立ADMIN頁面————————
 51     # ————————38PerfectCRM實現全局帳號登陸註銷————————
 52     'gbacc',
 53     # ————————38PerfectCRM實現全局帳號登陸註銷————————
 54 
 55     # ————————48PerfectCRM實現CRM客戶報名流程學生合同————————
 56     'bpm',
 57     # ————————48PerfectCRM實現CRM客戶報名流程學生合同————————
 58 ]
 59 
 60 MIDDLEWARE = [
 61     'django.middleware.security.SecurityMiddleware',
 62     'django.contrib.sessions.middleware.SessionMiddleware',
 63     'django.middleware.common.CommonMiddleware',
 64     'django.middleware.csrf.CsrfViewMiddleware',
 65     'django.contrib.auth.middleware.AuthenticationMiddleware',
 66     'django.contrib.messages.middleware.MessageMiddleware',
 67     'django.middleware.clickjacking.XFrameOptionsMiddleware',
 68 ]
 69 
 70 ROOT_URLCONF = 'PerfectCRM.urls'
 71 
 72 TEMPLATES = [
 73     {
 74         'BACKEND': 'django.template.backends.django.DjangoTemplates',
 75 # ————————02PerfectCRM建立ADMIN頁面————————
 76         'DIRS': [os.path.join(BASE_DIR, 'templates'),
 77                   os.path.join(BASE_DIR, 'king_admin/king_templates'),
 78 
 79 # ————————03PerfectCRM建立基本數據————————
 80                   os.path.join(BASE_DIR, 'DBadd/DBadd_templates'),
 81 # ————————03PerfectCRM建立基本數據————————
 82                 # ————————38PerfectCRM實現全局帳號登陸註銷————————
 83                   os.path.join(BASE_DIR, 'gbacc/gbacc_templates'),
 84                 # ————————38PerfectCRM實現全局帳號登陸註銷————————
 85 
 86                 # ————————47PerfectCRM實現CRM客戶報名流程————————
 87                 os.path.join(BASE_DIR, 'bpm/bpm_templates'), ]
 88                 # ————————47PerfectCRM實現CRM客戶報名流程————————
 89 
 90 ,
 91 # ————————02PerfectCRM建立ADMIN頁面————————
 92         'APP_DIRS': True,
 93         'OPTIONS': {
 94             'context_processors': [
 95                 'django.template.context_processors.debug',
 96                 'django.template.context_processors.request',
 97                 'django.contrib.auth.context_processors.auth',
 98                 'django.contrib.messages.context_processors.messages',
 99             ],
100         },
101     },
102 ]
103 
104 WSGI_APPLICATION = 'PerfectCRM.wsgi.application'
105 
106 
107 # Database
108 # https://docs.djangoproject.com/en/2.0/ref/settings/#databases
109 
110 DATABASES = {
111     'default': {
112         'ENGINE': 'django.db.backends.sqlite3',
113         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
114     }
115 }
116 
117 
118 # Password validation
119 # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
120 
121 AUTH_PASSWORD_VALIDATORS = [
122     {
123         'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
124     },
125     {
126         'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
127     },
128     {
129         'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
130     },
131     {
132         'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
133     },
134 ]
135 
136 
137 # Internationalization
138 # https://docs.djangoproject.com/en/2.0/topics/i18n/
139 
140 # ————————01PerfectCRM基本配置ADMIN————————
141 #LANGUAGE_CODE = 'en-us'
142 
143 #英文轉中文方法
144 LANGUAGE_CODE = 'zh-Hans'
145 # ————————01PerfectCRM基本配置ADMIN————————
146 
147 TIME_ZONE = 'UTC'
148 
149 USE_I18N = True
150 
151 USE_L10N = True
152 
153 USE_TZ = True
154 
155 
156 # Static files (CSS, JavaScript, Images)
157 # https://docs.djangoproject.com/en/2.0/howto/static-files/
158 
159 STATIC_URL = '/static/'
160 
161 # ————————01PerfectCRM基本配置ADMIN————————
162 STATICFILES_DIRS = [os.path.join(BASE_DIR,'king_admin/static'),
163 # ————————01PerfectCRM基本配置ADMIN————————
164                     # ————————38PerfectCRM實現全局帳號登陸註銷————————
165                     os.path.join(BASE_DIR, 'gbacc/static'),
166                     # ————————38PerfectCRM實現全局帳號登陸註銷————————
167                     
168                     # ————————47PerfectCRM實現CRM客戶報名流程————————
169                     os.path.join(BASE_DIR, 'bpm/static'),]
170                     # ————————47PerfectCRM實現CRM客戶報名流程————————
171 
172 
173 # ————————34PerfectCRM實現CRM自定義用戶————————
174 AUTH_USER_MODEL = 'crm.UserProfile'#使用自定的admin 表單
175 # ————————34PerfectCRM實現CRM自定義用戶————————
176 
177 
178 
179 # ————————44PerfectCRM實現帳號快速註冊登錄————————
180 # send e-mail
181 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'  #email後端
182 EMAIL_USE_TLS = False   #是否使用TLS安全傳輸協議
183 EMAIL_USE_SSL = True    #是否使用SSL加密,qq企業郵箱要求使用
184 EMAIL_HOST = 'smtp.sina.cn'   #發送郵件的郵箱 的 SMTP服務器       #根據狀況從新配置
185 EMAIL_PORT = 465                 #發件箱的SMTP服務器端口 #通常不須要修改465
186 EMAIL_HOST_USER = 'perfectcrm@sina.cn'    #發送郵件的郵箱帳號     #根據狀況從新配置  #perfectcrm@sina.cn   pydjango@sina.cn
187 EMAIL_HOST_PASSWORD = 'admin123456'         #發送郵件的郵箱密碼    #根據狀況從新配置
188 
189 # ————————44PerfectCRM實現帳號快速註冊登錄————————
190 
191 
192 # ————————46PerfectCRM實現登錄後頁面才能訪問————————
193 LOGIN_URL = '/gbacc/gbacc_login/'# login_url 配置      #默認 /accounts/login/  #注意: / (絕對路徑)
194 # ————————46PerfectCRM實現登錄後頁面才能訪問————————
# settings.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 
 85     source_choices = ( #客戶渠道來源 (內存生成)
 86                       (0,'轉介紹'),
 87                       (1,'QQ羣'),
 88                       (2,'官網'),
 89                       (3,'百度推廣'),
 90                       (4,'51CTO'),
 91                       (5,'知乎'),
 92                       (6,'市場推廣'),)
 93     #PositiveSmallIntegerField正小整數 0 ~ 32767(省空間)#choices是Admin中顯示選擇框的內容,用不變更的數據放在內存中從而避免跨表操做
 94     source = models.SmallIntegerField(choices=source_choices)#客戶渠道來源
 95 
 96     #CharField定長文本#verbose_name是Admin中顯示的字段名稱#名字最長64 # Django可空 #數據庫能夠爲空
 97     referral_from = models.CharField(verbose_name="轉介紹人qq",max_length=64,blank=True,null=True) #來自誰介紹的
 98 
 99     #ForeignKey就是表與表之間的某種約定的關係#verbose_name是Admin中顯示的字段名稱 #CASCADE從父表刪除或更新且自動刪除或更新子表中匹配的行。
100     consult_courses = models.ForeignKey("Course",verbose_name="諮詢課程", on_delete=models.CASCADE) #關聯到 課程表
101 
102     content= models.TextField(verbose_name="諮詢詳情") #TextField無限制長度的文本#verbose_name是Admin中顯示的字段名稱
103 
104     #ManyToManyField多對多和外鍵工做方式相同,只不過咱們處理的是QuerySet而不是模型實例。
105     tags = models.ManyToManyField("Tag",blank=True)#多對多關聯到 標籤表
106 
107     #ForeignKey就是表與表之間的某種約定的關係  #CASCADE從父表刪除或更新且自動刪除或更新子表中匹配的行。
108     consultant = models.ForeignKey("UserProfile", on_delete=models.CASCADE) #關聯到  帳號表
109 
110     memo = models.TextField(blank=True,null=True)#備註#TextField無限制長度的文本#Django可空#數據庫能夠爲空
111 
112     #DateTimeField日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add建立時間(只讀)
113     date =  models.DateTimeField(auto_now_add=True)#建立時間(數據庫自增)
114 
115     def __str__(self): #__str__()是Python的一個「魔幻」方法,這個方法定義了當object調用str()時應該返回的值。
116         return self.qq  #返回 #QQ號
117 
118     class Meta:#經過一個內嵌類 "class Meta" 給你的 model 定義元數據
119         verbose_name_plural =  "04客戶表" #verbose_name_plural給你的模型類起一個更可讀的名字
120 
121 # ————————48PerfectCRM實現CRM客戶報名流程學生合同————————
122 #合同模版
123 class ContractTemplate(models.Model):
124     name=models.CharField('合同名稱',max_length=64,unique=True)
125     template=models.TextField()
126 
127     def __str__(self):
128         return self.name
129     class Meta:
130         verbose_name_plural='合同表'
131 # ————————48PerfectCRM實現CRM客戶報名流程學生合同————————
132 
133 
134 """05客戶跟進表"""
135 class CustomerFollowUp(models.Model):
136 
137     #ForeignKey就是表與表之間的某種約定的關係 #CASCADE從父表刪除或更新且自動刪除或更新子表中匹配的行。
138     customer = models.ForeignKey("Customer", on_delete=models.CASCADE)#客戶名 #關聯到  客戶信息表
139 
140     content = models.TextField(verbose_name="跟進內容")#跟進的內容#TextField無限制長度的文本#verbose_name是Admin中顯示的字段名稱
141 
142     #ForeignKey就是表與表之間的某種約定的關係  #CASCADE從父表刪除或更新且自動刪除或更新子表中匹配的行。
143     consultant =models.ForeignKey("UserProfile", on_delete=models.CASCADE) #關聯到  帳號表
144 
145     intention_choices =(  #報名狀態
146                         (0,'2周內報名'),
147                         (1,'1個月內報名'),
148                         (2,'近期無報名計劃'),
149                         (3,'已在其它機構報名'),
150                         (4,'已報名'),
151                         (5,'已拉黑'),)
152     #PositiveSmallIntegerField正小整數 0 ~ 32767(省空間)#choices是Admin中顯示選擇框的內容,用不變更的數據放在內存中從而避免跨表操做
153     intention=models.SmallIntegerField(choices=intention_choices) #報名狀態
154 
155     #DateTimeField日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add建立時間(只讀)
156     date =  models.DateTimeField(auto_now_add=True)#建立時間(數據庫自增)
157 
158     def __str__(self):#__str__()是Python的一個「魔幻」方法,這個方法定義了當object調用str()時應該返回的值。
159         return "<%s:%s>" %(self.customer.qq,self.intention) #返回#格式化字符串#跨表裏的QQ號#報名狀態
160     class Meta:#經過一個內嵌類 "class Meta" 給你的 model 定義元數據
161         verbose_name_plural =  "05客戶跟進表"#verbose_name_plural給你的模型類起一個更可讀的名字
162 
163 """06學員報名信息表"""
164 class Enrollment(models.Model):
165     # ForeignKey就是表與表之間的某種約定的關係#verbose_name是Admin中顯示的字段名稱 #CASCADE從父表刪除或更新且自動刪除或更新子表中匹配的行。
166     customer = models.ForeignKey("Customer",on_delete=models.CASCADE)#學員名字 #關聯到  客戶信息表
167     enrolled_class = models.ForeignKey("ClassList",verbose_name="所報班級",on_delete=models.CASCADE)#關聯到  班級表
168     consultant = models.ForeignKey("UserProfile",verbose_name="課程顧問",on_delete=models.CASCADE) #關聯到  帳號表
169 
170     #BooleanField布爾值類型#default=False默認(True)不容許出現空字符#verbose_name是Admin中顯示的字段名稱
171     contract_agreed = models.BooleanField(default=False,verbose_name="學員已經贊成合同")#學員看合同
172     contract_approved = models.BooleanField(default=False,verbose_name="合同已經審覈") #誰審覈
173 
174     # DateTimeField日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add建立時間(只讀)
175     date = models.DateTimeField(auto_now_add=True)#建立時間(數據庫自增)
176 
177     def __str__(self):#__str__()是Python的一個「魔幻」方法,這個方法定義了當object調用str()時應該返回的值。
178         return "%s %s" %(self.customer,self.enrolled_class)#返回#格式化字符串#學員名字#所報班級
179     class Meta:#經過一個內嵌類 "class Meta" 給你的 model 定義元數據
180         unique_together =  ("customer","enrolled_class")#聯合索引
181         verbose_name_plural =  "06學員報名信息表"#verbose_name_plural給你的模型類起一個更可讀的名字
182 
183 """07繳費記錄表"""
184 class Payment(models.Model):
185     #ForeignKey就是表與表之間的某種約定的關係#verbose_name是Admin中顯示的字段名稱 #CASCADE從父表刪除或更新且自動刪除或更新子表中匹配的行。
186     customer = models.ForeignKey("Customer",on_delete=models.CASCADE)#學員名字        關聯到  客戶信息表
187     course = models.ForeignKey("Course",verbose_name="所報課程",on_delete=models.CASCADE)#關聯到  課程表
188 
189     #PositiveSmallIntegerField正小整數 0 ~ 32767 #verbose_name是Admin中顯示的字段名稱#默認值=500
190     amount = models.PositiveIntegerField(verbose_name="數額",default=500)#繳費數額
191 
192     #ForeignKey就是表與表之間的某種約定的關係#CASCADE從父表刪除或更新且自動刪除或更新子表中匹配的行。
193     consultant = models.ForeignKey("UserProfile",on_delete=models.CASCADE)#繳費給誰 關聯到  帳號表
194 
195     #DateTimeField日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add建立時間(只讀)
196     date=models.DateTimeField(auto_now_add=True)#建立時間(數據庫自增)
197 
198     def __str__(self):#__str__()是Python的一個「魔幻」方法,這個方法定義了當object調用str()時應該返回的值。
199         return "%s %s" %(self.customer,self.amount)#返回#格式化字符串#學員名字#繳費數額
200     class Meta:#經過一個內嵌類 "class Meta" 給你的 model 定義元數據
201         verbose_name_plural = "07繳費記錄表"#verbose_name_plural給你的模型類起一個更可讀的名字
202 
203 """08每節課上課紀錄表"""
204 class CourseRecord(models.Model):
205     # ForeignKey就是表與表之間的某種約定的關係#verbose_name是Admin中顯示的字段名稱 #CASCADE從父表刪除或更新且自動刪除或更新子表中匹配的行。
206     from_class = models.ForeignKey("ClassList",verbose_name="班級",on_delete=models.CASCADE) #那個班級
207 
208     #PositiveSmallIntegerField正小整數 0 ~ 32767 #verbose_name是Admin中顯示的字段名稱
209     day_num = models.PositiveSmallIntegerField(verbose_name="第幾節(天)") #第幾節課
210 
211     # ForeignKey就是表與表之間的某種約定的關係 #CASCADE從父表刪除或更新且自動刪除或更新子表中匹配的行。
212     teacher = models.ForeignKey("UserProfile",on_delete=models.CASCADE)#老師是誰    關聯到    帳號表
213 
214     #BooleanField布爾值類型#default=True默認(True)不容許出現空字符
215     has_homework = models.BooleanField(default=True) #有沒有做業
216 
217     # CharField定長文本#名字最長128#Django可空#數據庫能夠爲空
218     homework_title = models.CharField(max_length=128,blank=True,null=True) #做業標題
219 
220     #TextField無限制長度的文本#Django可空#數據庫能夠爲空
221     homework_content = models.TextField(blank=True,null=True) #做業內容
222 
223     #TextField無限制長度的文本#verbose_name是Admin中顯示的字段名稱
224     outline =models.TextField(verbose_name="本節課程大綱") #課程主要講什麼
225 
226     # DateTimeField日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add建立時間(只讀)
227     date = models.DateField(auto_now_add=True)#建立時間(數據庫自增)
228 
229     def __str__(self):#__str__()是Python的一個「魔幻」方法,這個方法定義了當object調用str()時應該返回的值。
230         return " %s:%s" %(self.from_class,self.day_num)#返回#格式化字符串#班級#第幾節(天)
231     class Meta:#經過一個內嵌類 "class Meta" 給你的 model 定義元數據
232         unique_together = ("from_class","day_num") #聯合索引
233         verbose_name_plural = "08每節課上課紀錄表" #verbose_name_plural給你的模型類起一個更可讀的名字
234 
235 """09學習紀錄"""
236 class StudyRecord(models.Model):
237     # ForeignKey就是表與表之間的某種約定的關係 #CASCADE從父表刪除或更新且自動刪除或更新子表中匹配的行。
238     student = models.ForeignKey("Enrollment",on_delete=models.CASCADE)#學生名字   關聯到    學員報名信息表
239     course_record = models.ForeignKey("CourseRecord",on_delete=models.CASCADE)#開課記錄   # 關聯到    每節課上課紀錄表
240 
241     attendance_choices = (# 本節課上課狀態記錄
242                             (0,"已簽到"),
243                             (1,"遲到"),
244                             (2,"缺勤"),
245                             (3,"早退"),)
246     #PositiveSmallIntegerField正小整數 0 ~ 32767(省空間)#choices是Admin中顯示選擇框的內容,用不變更的數據放在內存中從而避免跨表操做
247     attendance = models.SmallIntegerField(choices=attendance_choices) # 本節課上課狀態記錄
248 
249     score_choices = (#學習成績
250                      (100,"A+"),
251                      (90,"A"),
252                      (85,"B+"),
253                      (80,"B"),
254                      (75,"B-"),
255                      (70,"C+"),
256                      (65,"C"),
257                      (40,"C-"),
258                      (-20,"D"),
259                      (-50,"COPY"),
260                      (0,"N/A"),)
261     #PositiveSmallIntegerField正小整數 0 ~ 32767(省空間)#choices是Admin中顯示選擇框的內容,用不變更的數據放在內存中從而避免跨表操做
262     score = models.SmallIntegerField(choices=score_choices) #學習成績
263 
264     memo = models.TextField(blank=True,null=True)#TextField無限制長度的文本#Django可空#數據庫能夠爲空
265 
266     # DateTimeField日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add建立時間(只讀)
267     date = models.DateField(auto_now_add=True)#建立時間(數據庫自增)
268 
269     def __str__(self):#__str__()是Python的一個「魔幻」方法,這個方法定義了當object調用str()時應該返回的值。
270         return "%s %s %s" % (self.student, self.course_record, self.score)#返回#格式化字符串#學生名字#開課記錄#學習成績
271     class Meta:#經過一個內嵌類 "class Meta" 給你的 model 定義元數據
272         unique_together = ('student','course_record')#聯合索引#學生名字#開課記錄
273         verbose_name_plural =  "09學習紀錄"#verbose_name_plural給你的模型類起一個更可讀的名字
274 
275 # ————————34PerfectCRM實現CRM自定義用戶————————
276 # """10帳號表"""
277 # class UserProfile(models.Model):
278 #     from django.contrib.auth.models import User  # 使用django內置的用戶表
279 #
280 #     #OneToOneField一對一  #User是django Admin裏的帳號表#CASCADE從父表刪除或更新且自動刪除或更新子表中匹配的行。
281 #     user = models.OneToOneField(User,on_delete=models.CASCADE)# 用戶名 #建立外鍵,關聯django用戶表
282 #
283 #     name = models.CharField(max_length=32) #帳號名(擴展用戶字段)#CharField定長文本
284 #
285 #     #ManyToManyField多對多和外鍵工做方式相同,只不過咱們處理的是QuerySet而不是模型實例。#Django可空
286 #     roles = models.ManyToManyField("Role",blank=True) #角色(權限)   # 雙向一對多==多對多
287 #
288 #     def __str__(self):#__str__()是Python的一個「魔幻」方法,這個方法定義了當object調用str()時應該返回的值。
289 #         return self.name #返回 #帳號名
290 #     class Meta: #經過一個內嵌類 "class Meta" 給你的 model 定義元數據
291 #         verbose_name_plural = "10帳號表"#verbose_name_plural給你的模型類起一個更可讀的名字
292 # ————————34PerfectCRM實現CRM自定義用戶————————
293 
294 # ————————34PerfectCRM實現CRM自定義用戶————————
295 #10帳號表,建立用戶和超級用戶
296 from django.contrib.auth.models import BaseUserManager
297 class UserProfileManager(BaseUserManager):
298     def create_user(self, email, name, password=None):
299         """
300       建立並保存一個用戶用給定的郵件,日期
301       出生和密碼。
302         """
303         if not email:#沒有email 報錯
304             raise ValueError('用戶必須有一個電子郵件地址')
305 
306         user = self.model(
307             email=self.normalize_email(email),#驗證郵箱格式
308             name=name,
309         )
310         user.set_password(password)#加密
311         user.is_active = True
312         user.save(using=self._db)
313         return user
314     def create_superuser(self, email, name, password):
315         """
316       建立並保存一個超級用戶具備給定郵件,日期
317       出生和密碼。
318         """
319         user = self.create_user(email,
320             password=password,
321             name=name
322         )
323         user.is_active = True
324         user.is_superuser = True
325         user.save(using=self._db)
326         return user
327 
328 """10帳號表"""
329 """
330 
331 #刪除數據庫
332 
333 #調用objects = UserProfileManager()#建立帳號 #關聯這個函數
334 
335 #運行 Terminal
336 #    生成 數據表
337 #    python manage.py makemigrations
338 #   數據表 遷移
339 #    python manage.py migrate
340 Django Admin裏帳號密碼重置方法
341 #運行 Terminal  
342 python manage.py createsuperuser
343 
344 Email address:          admin@qq.com
345 用戶名 :                 admin
346 Password:               admin123456
347 Password (again):       admin123456
348 """
349 from django.contrib.auth.models import AbstractBaseUser
350 # ————————35PerfectCRM實現CRM重寫Admin密碼修改————————
351 from django.utils.translation import ugettext_lazy as _  # 語言國際化
352 from django.utils.safestring import mark_safe
353 from django.contrib.auth.models import PermissionsMixin
354 # class UserProfile(AbstractBaseUser):
355 class UserProfile(AbstractBaseUser,PermissionsMixin):
356 # ————————35PerfectCRM實現CRM重寫Admin密碼修改————————
357     email=models.EmailField(
358         verbose_name='郵箱帳號',
359         max_length=255,
360         unique=True#惟一  #登錄帳號
361     )
362     name=models.CharField(max_length=32,verbose_name='用戶名')
363 
364     # ————————35PerfectCRM實現CRM重寫Admin密碼修改————————
365     password = models.CharField(_('password'), max_length=128, help_text=mark_safe('''<a href=\"../password/\">修改密碼</a>'''))
366     # ————————35PerfectCRM實現CRM重寫Admin密碼修改————————
367 
368     is_active = models.BooleanField(default=True,verbose_name='合法帳號')#權限#合法帳號
369     is_superuser = models.BooleanField(default=False,verbose_name='超級帳號') #超級帳號
370     objects = UserProfileManager()#建立帳號 #關聯這個函數
371     USERNAME_FIELD ='email'#指定作爲  #登錄帳號
372     REQUIRED_FIELDS = ['name']#必填字段
373     def get_full_name(self):
374         return self.email
375     def get_short_name(self):
376         #用戶確認的電子郵件地址
377         return self.email
378     def __str__(self):
379         return self.name
380     def has_perm(self,perm,obj=None):
381         #指明用戶是否被認爲活躍的。以反選代替刪除賬號。
382         #最簡單的可能的答案:是的,老是
383         return True   #有效 帳號
384     def has_module_perms(self, app_label):
385         #指明用戶是否能夠登陸到這個管理站點。
386         # 最簡單的可能的答案:是的,老是
387         return True #職員狀態
388     @property
389     def is_staff(self):
390         '''「用戶的員工嗎?」'''
391         #最簡單的可能的答案:全部管理員都是員工
392         return self.is_superuser#是否是超級用戶狀態
393 # AUTH_USER_MODEL = 'crm.UserProfile'#使用自定的admin 表單   #settings.py
394 # ————————34PerfectCRM實現CRM自定義用戶————————
395 
396 """11角色表"""
397 class Role(models.Model):
398     name = models.CharField(unique=True,max_length=32)#角色名#CharField定長文本#角色名不能夠重複#最長度=32字節
399     def __str__(self):#__str__()是Python的一個「魔幻」方法,這個方法定義了當object調用str()時應該返回的值。
400         return self.name#返回 #角色名
401     class Meta: #經過一個內嵌類 "class Meta" 給你的 model 定義元數據
402         verbose_name_plural = "11角色表" #verbose_name_plural給你的模型類起一個更可讀的名字
403 
404 """12標籤表"""
405 class Tag(models.Model):
406     name =  models.CharField(max_length=64,unique=True) #標籤名#CharField定長文本#最長度=64字節#不能夠重複
407     def __str__(self): #__str__()是Python的一個「魔幻」方法,這個方法定義了當object調用str()時應該返回的值。
408         return self.name #返回 #標籤名
409     class Meta:#經過一個內嵌類 "class Meta" 給你的 model 定義元數據
410         verbose_name_plural =  "12標籤表" #verbose_name_plural給你的模型類起一個更可讀的名字
411 
412 # ————————01PerfectCRM基本配置ADMIN————————
#models.py

 

 

 

 

 

 

  1 #admin.py
  2 # ————————01PerfectCRM基本配置ADMIN————————
  3 from django.contrib import admin
  4 # Register your models here.
  5 from crm import models #從crm導入models
  6 
  7 # ————————24PerfectCRM實現King_admin自定義操做數據————————
  8 from django.shortcuts import render
  9 # ————————24PerfectCRM實現King_admin自定義操做數據————————
 10 
 11 # ————————35PerfectCRM實現CRM重寫Admin密碼修改————————
 12 from django import forms
 13 from django.contrib.auth.admin import UserAdmin
 14 from django.contrib.auth.forms import ReadOnlyPasswordHashField
 15 from crm.models import UserProfile
 16 #重寫admin
 17 class UserCreationForm(forms.ModelForm):
 18     """  一個表單來建立新用戶。包括全部必需的
 19   字段,加上重複密碼。"""
 20     password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
 21     password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)
 22     class Meta:
 23         model = UserProfile
 24         fields = ('email', 'name')
 25     def clean_password2(self):
 26         # 檢查兩個密碼條目匹配
 27         password1 = self.cleaned_data.get("password1")
 28         password2 = self.cleaned_data.get("password2")
 29         if password1 and password2 and password1 != password2:
 30             raise forms.ValidationError("密碼不匹配")
 31         return password2
 32     def save(self, commit=True):
 33         #保存密碼散列的格式提供
 34         user = super(UserCreationForm, self).save(commit=False)
 35         user.set_password(self.cleaned_data["password1"])
 36         if commit:
 37             user.save()
 38         return user
 39 #重寫admin
 40 class UserChangeForm(forms.ModelForm):
 41     """更新用戶的一種形式。包括全部字段
 42   用戶,但取代了管理員的密碼字段
 43   密碼散列顯示領域。
 44     """
 45     password = ReadOnlyPasswordHashField(label="Password",
 46         help_text=("原始密碼不存儲,因此沒有辦法看到"
 47                     "這個用戶的密碼,可是你能夠改變密碼 "
 48                     "使用 <a href=\"../password/\">修改密碼</a>."))#哈值
 49     class Meta:
 50         model = UserProfile
 51         fields = ('email', 'password', 'name', 'is_active', 'is_superuser')
 52     def clean_password(self):
 53         # 無論用戶提供什麼,返回初始值。
 54         # 這是在這裏,而不是在球場上,由於
 55         # 字段沒有對初始值的訪問
 56         return self.initial["password"]
 57 #重寫admin
 58 class UserProfileAdmin(UserAdmin):#用戶類,繼承上一個類 UserAdmin
 59     # 單添加和更改用戶實例
 60     form = UserChangeForm
 61     add_form = UserCreationForm
 62 
 63     # 字段用於顯示用戶模型。
 64     # 這些覆蓋定義UserAdmin固定在底座上
 65     # auth.User引用特定字段。
 66     list_display = ('email', 'name','is_active', 'is_superuser', ) #顯示字段表頭
 67     list_filter = ('is_superuser',) # 過濾器(能夠包含ManyToManyField) (注意加 逗號 , )
 68     fieldsets = (                 #自定義顯示字段
 69         (None, {'fields': ('email','name', 'password')}),
 70         ('我的信息', {'fields': ( 'email','name')}),
 71         ('用戶權限', {'fields': ('is_active','is_superuser','groups','user_permissions')}),#後臺顯示配置
 72     )
 73     #添加自定義字段
 74     # 覆蓋get_fieldsets時使用這個屬性建立一個用戶。
 75     add_fieldsets = (
 76         (None, {
 77             'classes': ('wide',),
 78             'fields': ('email', 'name', 'password1', 'password2')}
 79         ),
 80     )
 81     search_fields = ('email',) #搜索(不能包含CharField)(注意加 逗號 , )
 82     ordering = ('email',) #自定義排序,默認'-id'
 83     filter_horizontal = ('groups','user_permissions', ) #複選框
 84 
 85 # 如今註冊這個新UserAdmin ,由於咱們不在使用Django的內置權限
 86 admin.site.register(UserProfile, UserProfileAdmin)
 87 #註銷 原來的  # admin.site.register(models.UserProfile)   #10帳號表
 88 # ————————35PerfectCRM實現CRM重寫Admin密碼修改————————
 89 
 90 # ————————04PerfectCRM實現King_admin註冊功能————————
 91 class CustomerAdmin(admin.ModelAdmin):#定製Djanago admin
 92     list_display = ('id','qq','source','consultant','content','date')#顯示字段表頭
 93     # ————————11PerfectCRM實現King_admin分頁顯示條數————————
 94     list_per_page = 2  #分頁條數
 95     # ————————11PerfectCRM實現King_admin分頁顯示條數————————
 96     # ————————16PerfectCRM實現King_admin日期過濾————————
 97     # ————————15PerfectCRM實現King_admin多條件過濾————————
 98     # 過濾器(能夠包含ManyToManyField) (注意加 逗號 , )
 99     # list_filter = ('source','consultant','consult_courses',)
100     list_filter = ('date','source','consultant','consult_courses',)
101     # ————————15PerfectCRM實現King_admin多條件過濾————————
102     # ————————16PerfectCRM實現King_admin日期過濾————————
103     # ————————18PerfectCRM實現King_admin搜索關鍵字————————
104     #搜索(不能包含CharField)(注意加 逗號 , )
105     search_fields = ('name','qq',)
106     # ————————18PerfectCRM實現King_admin搜索關鍵字————————
107 
108     # ————————26PerfectCRM實現King_admin自定義排序————————
109     ordering = ['-qq'] #自定義排序,默認'-id'
110     # ————————26PerfectCRM實現King_admin自定義排序————————
111 
112     # ————————27PerfectCRM實現King_admin編輯複選框————————
113     filter_horizontal = ('tags',) #複選框
114     # ————————27PerfectCRM實現King_admin編輯複選框————————
115 
116     # ————————28PerfectCRM實現King_admin編輯限制————————
117     readonly_fields = ('qq','consultant',) # 不可修改
118     # ————————28PerfectCRM實現King_admin編輯限制————————
119 
120 
121 
122     # ————————24PerfectCRM實現King_admin自定義操做數據————————
123     # from django.shortcuts import render
124     actions = ['test_actions',]#定製功能    #測試返回到一個新頁面
125     def test_actions(self,request,arg2):#對應的函數 #request類本身的請求  #arg2類的內容
126         return render(request,"king_admin/table_index.html")
127     test_actions.short_description = "測試顯示中文"
128     # ————————24PerfectCRM實現King_admin自定義操做數據————————
129 # ————————04PerfectCRM實現King_admin註冊功能————————
130 
131 #註冊到 Django Admin裏
132 admin.site.register(models.Branch)                  #01校區表
133 admin.site.register(models.ClassList)               #02班級表
134 admin.site.register(models.Course)                  #03課程表,能夠報名那些課程
135 
136 # ————————04PerfectCRM實現King_admin註冊功能————————
137 # admin.site.register(models.Customer)                #04客戶信息表
138 admin.site.register(models.Customer,CustomerAdmin)                #04客戶信息表
139 # ————————04PerfectCRM實現King_admin註冊功能————————
140 
141 # ————————48PerfectCRM實現CRM客戶報名流程學生合同————————
142 admin.site.register(models.ContractTemplate)            #合同模版
143 # ————————48PerfectCRM實現CRM客戶報名流程學生合同————————
144 
145 
146 
147 admin.site.register(models.CustomerFollowUp)        #05客戶跟進表
148 admin.site.register(models.Enrollment)              #06學員報名信息表
149 admin.site.register(models.Payment)                 #07繳費記錄表
150 admin.site.register(models.CourseRecord)            #08每節課上課紀錄表
151 admin.site.register(models.StudyRecord)             #09學習紀錄
152 
153 # ————————35PerfectCRM實現CRM重寫Admin密碼修改————————
154 # admin.site.register(models.UserProfile)             #10帳號表
155 # ————————35PerfectCRM實現CRM重寫Admin密碼修改————————
156 
157 admin.site.register(models.Role)                    #11角色表
158 admin.site.register(models.Tag)                     #12標籤表
159 
160 '''
161 Django Admin裏帳號密碼重置方法
162 #運行 Terminal  
163 
164 python manage.py createsuperuser
165 
166 Username :              admin
167 Email address:          admin@qq.com
168 Password:               admin123456
169 Password (again):       admin123456
170 
171 
172 英文轉中文方法
173 到settings.py裏修改
174 # LANGUAGE_CODE = 'en-us'
175 LANGUAGE_CODE = 'zh-Hans'
176 '''
177 
178 # ————————01PerfectCRM基本配置ADMIN————————
#admin.py

 

 

 

#運行 Terminal
# 生成 數據表
# python manage.py makemigrations
# 數據表 遷移
# python manage.py migrate

 

 

 

 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 # ————————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 
 10 from crm import models
 11 from django.contrib.auth import models as auth_models
 12 
 13 #隨機字符串
 14 import random
 15 from random import choice
 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',outline='Python , 是一種面向對象的解釋型計算機程序設計語言,具備豐富和強大的庫,Python 已經成爲繼JAVA,C++以後的的第三大語言。 特色:簡單易學、免費開源、高層語言、可移植性強、面向對象、可擴展性、可嵌入型、豐富的庫、規範的代碼等。')
 43             models.Course.objects.create(name='PHP',price='8888',period='50',outline='PHP語言是目前Web後端開發使用最普遍的語言,幾乎絕大多數網站使用。PHP開發快速,開發成本低,週期短,後期維護費用低,開源產品豐富。')
 44             models.Course.objects.create(name='Java',price='9999',period='60',outline='完成本套餐的學習,學員能夠全面掌握後續JavaEE開發所需的Java技術,爲後續學習JavaEE開發打下堅實的基礎。')
 45 
 46             # ————————47PerfectCRM實現CRM客戶報名流程————————
 47 
 48             # models.UserProfile.objects.create(name='ADMIN系統維護', user_id=1)
 49             # models.UserProfile.objects.create(name='李白銷售老師', user_id=2)
 50             # models.UserProfile.objects.create(name='杜甫銷售老師', user_id=3)
 51             # models.UserProfile.objects.create(name='唐伯虎銷售老師', user_id=4)
 52             # models.UserProfile.objects.create(name='顏真卿老師', user_id=5)
 53             # models.UserProfile.objects.create(name='羅貫中老師', user_id=6)
 54             # models.UserProfile.objects.create(name='白居易老師', user_id=7)
 55             # models.UserProfile.objects.create(name='施耐庵老師', user_id=8)
 56             # models.UserProfile.objects.create(name='曹雪芹校長', user_id=9)
 57 
 58 
 59             models.UserProfile.objects.create(last_login='2018-04-18', email='admin@qq.com',name='admin',is_active=1,is_superuser=1,password='pbkdf2_sha256$100000$cCkwdwzBiea6$VNOFkD7HAKwsjKXsDZMOGO8ct3EpVMaX2JPU+h5PK9E=')
 60             models.UserProfile.objects.create(last_login='2018-04-18', email='admin1@qq.com',name='admin1',is_active=1,is_superuser=1,password='pbkdf2_sha256$100000$cCkwdwzBiea6$VNOFkD7HAKwsjKXsDZMOGO8ct3EpVMaX2JPU+h5PK9E=')
 61             models.UserProfile.objects.create(last_login='2018-04-18', email='admin2@qq.com',name='admin2',is_active=1,is_superuser=1,password='pbkdf2_sha256$100000$cCkwdwzBiea6$VNOFkD7HAKwsjKXsDZMOGO8ct3EpVMaX2JPU+h5PK9E=')
 62             models.UserProfile.objects.create(last_login='2018-04-18', email='admin3@qq.com',name='admin3',is_active=1,is_superuser=1,password='pbkdf2_sha256$100000$cCkwdwzBiea6$VNOFkD7HAKwsjKXsDZMOGO8ct3EpVMaX2JPU+h5PK9E=')
 63             models.UserProfile.objects.create(last_login='2018-04-18', email='admin4@qq.com',name='admin4',is_active=1,is_superuser=1,password='pbkdf2_sha256$100000$cCkwdwzBiea6$VNOFkD7HAKwsjKXsDZMOGO8ct3EpVMaX2JPU+h5PK9E=')
 64             models.UserProfile.objects.create(last_login='2018-04-18', email='admin5@qq.com',name='admin5',is_active=1,is_superuser=1,password='pbkdf2_sha256$100000$cCkwdwzBiea6$VNOFkD7HAKwsjKXsDZMOGO8ct3EpVMaX2JPU+h5PK9E=')
 65             models.UserProfile.objects.create(last_login='2018-04-18', email='admin6@qq.com',name='admin6',is_active=1,is_superuser=1,password='pbkdf2_sha256$100000$cCkwdwzBiea6$VNOFkD7HAKwsjKXsDZMOGO8ct3EpVMaX2JPU+h5PK9E=')
 66             models.UserProfile.objects.create(last_login='2018-04-18', email='admin7@qq.com',name='admin7',is_active=1,is_superuser=1,password='pbkdf2_sha256$100000$cCkwdwzBiea6$VNOFkD7HAKwsjKXsDZMOGO8ct3EpVMaX2JPU+h5PK9E=')
 67             models.UserProfile.objects.create(last_login='2018-04-18', email='admin8@qq.com',name='admin8',is_active=1,is_superuser=1,password='pbkdf2_sha256$100000$cCkwdwzBiea6$VNOFkD7HAKwsjKXsDZMOGO8ct3EpVMaX2JPU+h5PK9E=')
 68             models.UserProfile.objects.create(last_login='2018-04-18', email='admin9@qq.com',name='admin9',is_active=1,is_superuser=1,password='pbkdf2_sha256$100000$cCkwdwzBiea6$VNOFkD7HAKwsjKXsDZMOGO8ct3EpVMaX2JPU+h5PK9E=')
 69             # ————————47PerfectCRM實現CRM客戶報名流程————————
 70 
 71             models.ClassList.objects.create(class_type=1,semester=2,start_date='2018-03-20',branch_id=1,course_id=1)
 72             models.ClassList.objects.create(class_type=0,semester=5,start_date='2018-03-20',branch_id=1,course_id=1)
 73             models.ClassList.objects.create(class_type=2,semester=8,start_date='2018-03-20',branch_id=1,course_id=1)
 74             models.ClassList.objects.create(class_type=0,semester=1,start_date='2018-03-20',branch_id=1,course_id=1)
 75             models.ClassList.objects.create(class_type=1,semester=3,start_date='2018-03-20',branch_id=1,course_id=1)
 76             models.ClassList.objects.create(class_type=0,semester=9,start_date='2018-03-20',branch_id=1,course_id=1)
 77             models.ClassList.objects.create(class_type=2,semester=6,start_date='2018-03-20',branch_id=1,course_id=1)
 78             models.ClassList.objects.create(class_type=1,semester=20,start_date='2018-03-20',branch_id=1,course_id=1)
 79             models.ClassList.objects.create(class_type=0,semester=32,start_date='2018-03-20',branch_id=1,course_id=1)
 80 
 81 
 82         except:
 83             return HttpResponse('基本數據已經添加了。。。')
 84 
 85         return  redirect('/DBadd/crm_Role/')
 86 
 87 
 88 
 89 #添加"""10帳號表"""  #隨機學生
 90 def crm_UserProfile(request):
 91     if request.method == "GET":
 92         user_list = models.UserProfile.objects.all()
 93         return render(request, 'crm_UserProfile.html', {'user_list':user_list})
 94     elif request.method == "POST":
 95         for i in range(50):
 96 
 97             Rword = ''.join(''.join([chr(random.randint(0x4E00, 0x9FBF)) for i in range(3)]).split())# 隨機中文
 98             n=Rword
 99 
100             
101             a = models.UserProfile.objects.values("user_id").all()
102             e = auth_models.User.objects.values("id").all()
103             print('eeeee', e, type(e))
104             x=e.difference(a)
105             # for i in x:
106             #     print('zzz', x, type(x))
107 
108             l=[]
109             for i in x:
110                 l.append(i['id'])
111             print('llll', l, type(l))
112 
113             if len(l)==0:
114                 return HttpResponse('請添加 admin的用戶後,再來添加。。。')
115             else:
116                 c = choice(l)
117                 u = c
118                 models.UserProfile.objects.create(name=n, user_id=u)
119         return redirect('/DBadd/crm_UserProfile/')
120 
121 #添加"""10帳號表--11角色表""" #隨機學生
122 def crm_userprofile_roles(request):
123     if request.method == "GET":
124         user_list = models.UserProfile.objects.all()
125         role_list = models.Role.objects.get(id=1)
126         return render(request, 'crm_userprofile_roles.html', {'user_list':user_list,'role_list':role_list})
127     elif request.method == "POST":
128         try:
129             for i in range(50):
130                 b1 = models.Role.objects.get(id=1)
131                 a=b1.userprofile_set.values("id").all()
132 
133                 e = models.UserProfile.objects.values("id").all()
134                 x = e.difference(a)
135 
136                 l = []
137                 for i in x:
138                     l.append(i['id'])
139                 print('llll', l, type(l))
140 
141                 if len(l) == 0:
142                     return HttpResponse('請添加 數據 後,再來添加。。。')
143                 else:
144                     c = choice(l)
145                     print('c', c, type(c))
146 
147                     g1 = models.UserProfile.objects.get(id=c)
148                     b1 = models.Role.objects.get(id=1)
149                     g1.roles.add(b1)
150             return redirect('/DBadd/crm_userprofile_roles/')
151         except:
152             return HttpResponse('沒有數據了。。。')
153 
154 
155 
156 
157 # 添加"""04客戶信息表"""
158 def crm_Customer(request):
159     if request.method == "GET":
160         user_list = models.Customer.objects.all()
161         return render(request, 'crm_Customer.html', {'user_list': user_list})
162     elif request.method == "POST":
163         for i in range(50):
164             Rword = ''.join(''.join([chr(random.randint(0x4E00, 0x9FBF)) for i in range(3)]).split())  # 隨機中文
165             r=random.randint(5,18)
166             Num = "".join(random.choice("0123456789") for i in range(r))  # 隨機數字 #保證qq的惟一性
167             Cnum = "".join(random.choice("123456789") for i in range(1))  # 隨機數字  #id 不能選擇0
168             try:
169                 models.Customer.objects.create(name=Rword, qq=Num, qq_name=Rword, phone=Num, source=1,
170                                                referral_from=Rword, consult_courses_id=1, content=Rword,
171                                                consultant_id=Cnum, memo=Rword, date='2018-03-20')
172             except:
173                 return HttpResponse('數據重複了。。。')
174 
175         return redirect('/DBadd/crm_Customer/')
176 
177 
178 # ————————03PerfectCRM建立基本數據————————
179 
180 
181 # ————————48PerfectCRM實現CRM客戶報名流程學生合同————————
182 def crm_ContractTemplate(request):
183     if request.method == "GET":
184         user_list = models.ContractTemplate.objects.all()
185         return render(request, 'crm_ContractTemplate.html', {'user_list':user_list})
186     elif request.method == "POST":
187         try:
188             t= '''
189             委託方:__{stu_name}__ 
190   法定表明人或負責人:__{stu_name}__ 
191   服務方:_______ 
192   法定表明人或負責人:_________ 
193   根據《中華人民共和國合同法》的有關規定,經雙方當事人協商一致,簽定本 
194 合同。 
195   第一條 項目名稱__{course_name}__。 
196   (注:本參考格式適用於下列技術服務活動:進行設計、工藝、製造、試驗以 
197 及農做物育種,畜禽的飼養等方面的技術指導、講解技術資料、解決和解答技術問 
198 題;進行示範操做;傳授計算機軟件的編制技術、先進儀器設備的裝配,使用技術 
199 等等。) 
200   第二條 培訓的內容和要求:_______。 
201   第三條 培訓計劃、進度、期限:_______。 
202   第四條 培訓地點和方式:____________。 
203   第五條 服務方(教師)的資歷和水平:________。 
204   第六條 學員的人數和質量:___________。 
205   第七條 教員、學員的食宿、交通、醫療費用的支付和安排____。 
206   第八條 報酬及其支付方式:__________。 
207   第九條 委託方的違約責任:_________。 
208   1.委託方未按合同提供培訓條件,影響合同履行的,約定的報酬仍應如數支 
209 付; 
210   2.擅自將服務方要求保密的技術資料引用、發表和提供給第三方,應支付數 
211 額爲____的違約金; 
212   第十條 服務方的違約責任: 
213   1.服務方未按合同制訂培訓計劃,影響培訓工做質量的,應當減收___% 
214 的報酬; 
215   2.服務方提供的師資不符合合同要求,服務方有義務予以從新配備;未按合 
216 同規定完成培訓工做的,應免收報酬。 
217   第十一條 保密條款:________ 
218   當事人雙方應對下列技術資料承擔保密義務:______。 
219   第十二條 有關技術成果歸屬條款 
220   在履行合同過程當中,服務方利用委託方提供的技術資料和工做條件所完成的新 
221 的技術成果,屬於服務方;委託方利用服務方的工做成果所完成的新技術成果,屬 
222 於委託方。對新的技術成果享有就該技術成果取得的精神權利(如得到獎金、獎章、 
223 榮譽證書的權利)、經濟權利(如專利權、非專利技術的轉讓權,使用權等)和 
224 其它利益。 
225   第十三條 本合同爭議的解決辦法:______。 
226   本合同自雙方當事人簽字、蓋章後生效。
227 委託方負責人(或受權表明)      服務方負責人(或受權表明) 
228   簽字:__{stu_name}__(蓋章)     簽名:____(蓋章) 
229   簽字時間:_________     簽字時間:_________ 
230   簽字地點:_________     簽字地點:_________ 
231   開戶銀行:_________     開戶銀行:_________ 
232   賬號:___________     賬號:___________ 
233   委託方擔保人(名稱):___     服務方擔保人(名稱):___ 
234   地址:___________     地址:___________ 
235   負責人(或受權表明)         負責人(或受權表明) 
236   簽字:________(蓋章)    簽字:________(蓋章) 
237   簽字時間:_________     簽字時間:_________ 
238   簽字地點:_________     簽字地點:_________ 
239   開戶銀行:_________     開戶銀行:_________ 
240   賬號:___________     賬號:___________'''
241 
242             models.ContractTemplate.objects.create(name='技術合同:專業技術培訓協議',template=t)
243         except:
244             return HttpResponse('數據錯誤!重複了吧。。。')
245 
246         return  redirect('/DBadd/crm_ContractTemplate/')
247 
248 # ————————48PerfectCRM實現CRM客戶報名流程學生合同————————
# crm_views.py

 

 

 

 1 {#crm_ContractTemplate.html#}
 2 {## ————————48PerfectCRM實現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 
12             <form method="POST" action="/DBadd/crm_ContractTemplate/">
13                  {% csrf_token %}
14                 <input type="submit"value="添加"/>
15             </form>
16 
17             <h3>合同詳細</h3>
18             <ul>
19                 {% for row in user_list %}
20                     <li>
21 
22                         <a>{{row.id}}-{{row.name}}</a>
23                         <hr>
24                         <pre>{{row.template}}</pre>
25                     </li>
26                 {% endfor %}
27             </ul>
28 
29 
30 </body>
31 </html>
32 
33 {## ————————48PerfectCRM實現CRM客戶報名流程學生合同————————#}
{#crm_ContractTemplate.html#}

 

 

http://127.0.0.1:8000/DBadd/crm_ContractTemplate/html

 

http://127.0.0.1:8000/bpm/customer/registration/1/前端

相關文章
相關標籤/搜索