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客戶報名流程————————
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客戶報名流程學生合同————————
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客戶報名流程學生合同————————
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客戶報名流程學生合同————————#}
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
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實現登錄後頁面才能訪問————————
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————————
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————————
#運行 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建立基本數據————————
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客戶報名流程學生合同————————
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客戶報名流程學生合同————————#}
http://127.0.0.1:8000/DBadd/crm_ContractTemplate/html
http://127.0.0.1:8000/bpm/customer/registration/1/前端