码迷,mamicode.com
首页 > 其他好文 > 详细

django项目一 CRM表结构

时间:2018-10-25 11:12:03      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:network   eth   website   python   orm   drop   office   color   erb   

from django.db import models
from django.contrib import auth
from django.core.exceptions import PermissionDenied
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager, User
from django.utils.translation import ugettext_lazy as _
from multiselectfield import MultiSelectField
from django.utils.safestring import mark_safe

course_choices = ((LinuxL, Linux中高级),
                  (PythonFullStack, Python高级全栈开发),)

class_type_choices = ((fulltime, 脱产班,),
                      (online, 网络班),
                      (weekend, 周末班,),)

source_type = ((qq, "qq群"),
               (referral, "内部转介绍"),
               (website, "官方网站"),
               (baidu_ads, "百度推广"),
               (office_direct, "直接上门"),
               (WoM, "口碑"),
               (public_class, "公开课"),
               (website_luffy, "路飞官网"),
               (others, "其它"),)

enroll_status_choices = ((signed, "已报名"),
                         (unregistered, "未报名"),
                         (studying, 学习中),
                         (paid_in_full, "学费已交齐"))

seek_status_choices = ((A, 近期无报名计划), (B, 1个月内报名), (C, 2周内报名), (D, 1周内报名),
                       (E, 定金), (F, 到班), (G, 全款), (H, 无效),)
pay_type_choices = ((deposit, "订金/报名费"),
                    (tuition, "学费"),
                    (transfer, "转班"),
                    (dropout, "退学"),
                    (refund, "退款"),)

attendance_choices = ((checked, "已签到"),
                      (vacate, "请假"),
                      (late, "迟到"),
                      (absence, "缺勤"),
                      (leave_early, "早退"),)

score_choices = ((100, A+),
                 (90, A),
                 (85, B+),
                 (80, B),
                 (70, B-),
                 (60, C+),
                 (50, C),
                 (40, C-),
                 (0,  D),
                 (-1, N/A),
                 (-100, COPY),
                 (-1000, FAIL),)


class Customer(models.Model):
    """
    客户表
    """
    qq = models.CharField(QQ, max_length=64, unique=True, help_text=QQ号必须唯一)
    qq_name = models.CharField(QQ昵称, max_length=64, blank=True, null=True)
    name = models.CharField(姓名, max_length=32, blank=True, null=True, help_text=学员报名后,请改为真实姓名)
    sex_type = ((male, ), (female, ))
    sex = models.CharField("性别", choices=sex_type, max_length=16, default=male, blank=True, null=True)
    birthday = models.DateField(出生日期, default=None, help_text="格式yyyy-mm-dd", blank=True, null=True)
    phone = models.BigIntegerField(手机号, blank=True, null=True)
    source = models.CharField(客户来源, max_length=64, choices=source_type, default=qq)
    introduce_from = models.ForeignKey(self, verbose_name="转介绍自学员", blank=True, null=True)
    course = MultiSelectField("咨询课程", choices=course_choices)
    class_type = models.CharField("班级类型", max_length=64, choices=class_type_choices, default=fulltime)
    customer_note = models.TextField("客户备注", blank=True, null=True, )
    status = models.CharField("状态", choices=enroll_status_choices, max_length=64, default="unregistered",
                              help_text="选择客户此时的状态")
    network_consult_note = models.TextField(blank=True, null=True, verbose_name=网络咨询师咨询内容)
    date = models.DateTimeField("咨询日期", auto_now_add=True)
    last_consult_date = models.DateField("最后跟进日期", auto_now_add=True)
    next_date = models.DateField("预计再次跟进时间", blank=True, null=True)
    network_consultant = models.ForeignKey(UserProfile, blank=True, null=True, verbose_name=咨询师,
                                           related_name=network_consultant)
    consultant = models.ForeignKey(UserProfile, verbose_name="销售", related_name=customers, blank=True, null=True, )
    class_list = models.ManyToManyField(ClassList, verbose_name="已报班级", blank=True )
    
    def show_status(self):
        color_dict = {
            "signed": green,
            "unregistered": red,
            "studying": pink,
            "paid_in_full": blue,
            
        }
        return mark_safe(<span style="color: white;padding: 4px">{}</span>.format(color_dict[self.status],self.get_status_display()))
    
    def show_classes(self):
        return  | .join([str(i) for i in self.class_list.all()])
    
    class Meta:
        verbose_name = 客户列表
        verbose_name_plural = 客户列表


class Campuses(models.Model):
    """
    校区表
    """
    name = models.CharField(verbose_name=校区, max_length=64)
    address = models.CharField(verbose_name=详细地址, max_length=512, blank=True, null=True)
    
    def __str__(self):
        return self.name


class ContractTemplate(models.Model):
    """
    合同模板表
    """
    name = models.CharField("合同名称", max_length=128, unique=True)
    content = models.TextField("合同内容")
    date = models.DateField(auto_now=True)


class ClassList(models.Model):
    """
    班级表
    """
    course = models.CharField("课程名称", max_length=64, choices=course_choices)
    semester = models.IntegerField("学期")
    campuses = models.ForeignKey(Campuses, verbose_name="校区")
    price = models.IntegerField("学费", default=10000)
    memo = models.CharField(说明, blank=True, null=True, max_length=100)
    start_date = models.DateField("开班日期")
    graduate_date = models.DateField("结业日期", blank=True, null=True)
    contract = models.ForeignKey(ContractTemplate, verbose_name="选择合同模版", blank=True, null=True)
    teachers = models.ManyToManyField(UserProfile, verbose_name="老师")
    class_type = models.CharField(choices=class_type_choices, max_length=64, verbose_name=班额及类型, blank=True,
                                  null=True)
    
    class Meta:
        unique_together = ("course", "semester", campuses)
    
    def __str__(self):
        return "{}{}({})".format(self.get_course_display(), self.semester, self.campuses)


class ConsultRecord(models.Model):
    """
    跟进记录表
    """
    customer = models.ForeignKey(Customer, verbose_name="所咨询客户")
    note = models.TextField(verbose_name="跟进内容...")
    status = models.CharField("跟进状态", max_length=8, choices=seek_status_choices, help_text="选择客户此时的状态")
    consultant = models.ForeignKey("UserProfile", verbose_name="跟进人", related_name=records)
    date = models.DateTimeField("跟进日期", auto_now_add=True)
    delete_status = models.BooleanField(verbose_name=删除状态, default=False)


class Enrollment(models.Model):
    """
    报名表
    """
    
    why_us = models.TextField("为什么报名", max_length=1024, default=None, blank=True, null=True)
    your_expectation = models.TextField("学完想达到的具体期望", max_length=1024, blank=True, null=True)
    contract_agreed = models.BooleanField("我已认真阅读完培训协议并同意全部协议内容", default=False)
    contract_approved = models.BooleanField("审批通过", help_text="在审阅完学员的资料无误后勾选此项,合同即生效", default=False)
    enrolled_date = models.DateTimeField(auto_now_add=True, verbose_name="报名日期")
    memo = models.TextField(备注, blank=True, null=True)
    delete_status = models.BooleanField(verbose_name=删除状态, default=False)
    customer = models.ForeignKey(Customer, verbose_name=客户名称)
    school = models.ForeignKey(Campuses)
    enrolment_class = models.ForeignKey("ClassList", verbose_name="所报班级")
    
    class Meta:
        unique_together = (enrolment_class, customer)


class PaymentRecord(models.Model):
    """
    缴费记录表
    """
    pay_type = models.CharField("费用类型", choices=pay_type_choices, max_length=64, default="deposit")
    paid_fee = models.IntegerField("费用数额", default=0)
    note = models.TextField("备注", blank=True, null=True)
    date = models.DateTimeField("交款日期", auto_now_add=True)
    course = models.CharField("课程名", choices=course_choices, max_length=64, blank=True, null=True, default=N/A)
    class_type = models.CharField("班级类型", choices=class_type_choices, max_length=64, blank=True, null=True,
                                  default=N/A)
    enrolment_class = models.ForeignKey(ClassList, verbose_name=所报班级, blank=True, null=True)
    customer = models.ForeignKey(Customer, verbose_name="客户")
    consultant = models.ForeignKey(UserProfile, verbose_name="销售")
    delete_status = models.BooleanField(verbose_name=删除状态, default=False)
    
    status_choices = (
        (1, 未审核),
        (2, 已审核),
    )
    status = models.IntegerField(verbose_name=审核, default=1, choices=status_choices)
    
    confirm_date = models.DateTimeField(verbose_name="确认日期", null=True, blank=True)
    confirm_user = models.ForeignKey(verbose_name="确认人", to=UserProfile, related_name=confirms, null=True,
                                     blank=True)


class CourseRecord(models.Model):
    """课程记录表"""
    day_num = models.IntegerField("节次", help_text="此处填写第几节课或第几天课程...,必须为数字")
    date = models.DateField(auto_now_add=True, verbose_name="上课日期")
    course_title = models.CharField(本节课程标题, max_length=64, blank=True, null=True)
    course_memo = models.TextField(本节课程内容, max_length=300, blank=True, null=True)
    has_homework = models.BooleanField(default=True, verbose_name="本节有作业")
    homework_title = models.CharField(本节作业标题, max_length=64, blank=True, null=True)
    homework_memo = models.TextField(作业描述, max_length=500, blank=True, null=True)
    scoring_point = models.TextField(得分点, max_length=300, blank=True, null=True)
    re_class = models.ForeignKey(ClassList, verbose_name="班级")
    teacher = models.ForeignKey(UserProfile, verbose_name="讲师")
    
    class Meta:
        unique_together = (re_class, day_num)


class StudyRecord(models.Model):
    """
    学习记录
    """
    
    attendance = models.CharField("考勤", choices=attendance_choices, default="checked", max_length=64)
    score = models.IntegerField("本节成绩", choices=score_choices, default=-1)
    homework_note = models.CharField(max_length=255, verbose_name=作业批语, blank=True, null=True)
    date = models.DateTimeField(auto_now_add=True)
    note = models.CharField("备注", max_length=255, blank=True, null=True)
    homework = models.FileField(verbose_name=作业文件, blank=True, null=True, default=None)
    course_record = models.ForeignKey(CourseRecord, verbose_name="某节课程")
    student = models.ForeignKey(Customer, verbose_name="学员")
    
    class Meta:
        unique_together = (course_record, student)


class UserManager(BaseUserManager):
    use_in_migrations = True
    
    def _create_user(self, username, password, **extra_fields):
        """
        Creates and saves a User with the given username, email and password.
        """
        if not username:
            raise ValueError(The given username must be set)
        username = self.normalize_email(username)
        username = self.model.normalize_username(username)
        user = self.model(username=username, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user
    
    def create_user(self, username, password=None, **extra_fields):
        extra_fields.setdefault(is_staff, False)
        extra_fields.setdefault(is_superuser, False)
        return self._create_user(username, password, **extra_fields)
    
    def create_superuser(self, username, password, **extra_fields):
        extra_fields.setdefault(is_staff, True)
        extra_fields.setdefault(is_superuser, True)
        
        if extra_fields.get(is_staff) is not True:
            raise ValueError(Superuser must have is_staff=True.)
        if extra_fields.get(is_superuser) is not True:
            raise ValueError(Superuser must have is_superuser=True.)
        
        return self._create_user(username, password, **extra_fields)


# A few helper functions for common logic between User and AnonymousUser.
def _user_get_all_permissions(user, obj):
    permissions = set()
    for backend in auth.get_backends():
        if hasattr(backend, "get_all_permissions"):
            permissions.update(backend.get_all_permissions(user, obj))
    return permissions


def _user_has_perm(user, perm, obj):
    """
    A backend can raise `PermissionDenied` to short-circuit permission checking.
    """
    for backend in auth.get_backends():
        if not hasattr(backend, has_perm):
            continue
        try:
            if backend.has_perm(user, perm, obj):
                return True
        except PermissionDenied:
            return False
    return False


def _user_has_module_perms(user, app_label):
    """
    A backend can raise `PermissionDenied` to short-circuit permission checking.
    """
    for backend in auth.get_backends():
        if not hasattr(backend, has_module_perms):
            continue
        try:
            if backend.has_module_perms(user, app_label):
                return True
        except PermissionDenied:
            return False
    return False


class Department(models.Model):
    name = models.CharField(max_length=32, verbose_name="部门名称")
    count = models.IntegerField(verbose_name="人数", default=0)
    
    def __str__(self):
        return self.name


class UserProfile(AbstractBaseUser, PermissionsMixin):
    username = models.EmailField(
        max_length=255,
        unique=True,
    )
    is_staff = models.BooleanField(
        _(staff status),
        default=False,
        help_text=_(Designates whether the user can log into this admin site.),
    )
    is_admin = models.BooleanField(default=False)
    name = models.CharField(名字, max_length=32)
    department = models.ForeignKey(Department, default=None, blank=True, null=True)
    mobile = models.CharField(手机, max_length=32, default=None, blank=True, null=True)
    
    memo = models.TextField(备注, blank=True, null=True, default=None)
    date_joined = models.DateTimeField(auto_now_add=True)
    
    USERNAME_FIELD = username
    REQUIRED_FIELDS = [name]
    
    class Meta:
        verbose_name = 账户信息
        verbose_name_plural = "账户信息"
    
    def get_full_name(self):
        # The user is identified by their email address
        return self.name
    
    def get_short_name(self):
        # The user is identified by their email address
        return self.username
    
    def __str__(self):  # __unicode__ on Python 2
        return self.username
    
    def has_perm(self, perm, obj=None):
        #     "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        
        if self.is_active and self.is_superuser:
            return True
        return _user_has_perm(self, perm, obj)
    
    def has_perms(self, perm_list, obj=None):
        #     "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        for perm in perm_list:
            if not self.has_perm(perm, obj):
                return False
        return True
    
    def has_module_perms(self, app_label):
        #     "Does the user have permissions to view the app `app_label`?"
        #     Simplest possible answer: Yes, always
        if self.is_active and self.is_superuser:
            return True
        
        return _user_has_module_perms(self, app_label)
    
    objects = UserManager()

 

django项目一 CRM表结构

标签:network   eth   website   python   orm   drop   office   color   erb   

原文地址:https://www.cnblogs.com/niuli1987/p/9847691.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!