项目实战CRM开发(三) 零基础老男孩Python学习

    /    2019-04-19

8. 用户表,存储销售、讲师账户信息

这里我们用django自带的认证系统,并对其进行自定制

class UserProfile(auth.AbstractBaseUser, auth.PermissionsMixin):
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,

    )
    password = models.CharField(_('password'), max_length=128,
                                help_text=mark_safe('''<a class='btn-link' href='password'>重置密码</a>'''))

    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    is_staff = models.BooleanField(
        verbose_name='staff status',
        default=True,
        help_text='Designates whether the user can log into this admin site.',
    )
    name = models.CharField(max_length=32)
    #role = models.ForeignKey("Role",verbose_name="权限角色")
    branch = models.ForeignKey("Branch",verbose_name="所属校区",blank=True,null=True)
    roles = models.ManyToManyField('Role',blank=True)
    memo = models.TextField('备注', blank=True, null=True, default=None)
    date_joined = models.DateTimeField(blank=True, null=True, auto_now_add=True)

    USERNAME_FIELD = 'email'
    # REQUIRED_FIELDS = ['name','token','department','tel','mobile','memo']
    REQUIRED_FIELDS = ['name']

    def get_full_name(self):
        # The user is identified by their email address
        return self.email

    def get_short_name(self):
        # The user is identified by their email address
        return self.email

    def __str__(self):  # __str__ on Python 2
        return self.email

    # def has_perm(self, perm, obj=None):
    #     "Does the user have a specific permission?"
    #     # Simplest possible answer: Yes, always
    #     return True
    def has_perms(self, perm, obj=None):
        "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        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
        return True


    @property
    def is_superuser(self):
        "Is the user a member of staff?"
        # Simplest possible answer: All admins are staff
        return self.is_admin

    class Meta:
        verbose_name = '用户信息'
        verbose_name_plural = u"用户信息"


    objects = auth.UserManager()

    class Meta:
        verbose_name = 'CRM账户'
        verbose_name_plural = 'CRM账户'

UserProfile

9. 角色表,用于角色划分,用于权限管理,权限功能我们后面会实现,这里只在表里先存个简单的角色名

class Role(models.Model):
    '''角色信息'''
    name = models.CharField(max_length=32,unique=True)
    menus = models.ManyToManyField('FirstLayerMenu',blank=True)

    def __str__(self):
        return self.name

Role

10. 校区表,存储不同校区

class Branch(models.Model):
    '''存储所有校区'''
    name = models.CharField(max_length=64,unique=True)
    def __str__(self):
        return self.name

11. 菜单表,不同的角色看到的菜单不同, 我们支持动态菜单 ,所以需要把菜单 以及 和角色的关联存下

class FirstLayerMenu(models.Model):
    '''第一层侧边栏菜单'''
    name = models.CharField('菜单名',max_length=64)
    url_type_choices = ((0,'related_name'),(1,'absolute_url'))
    url_type = models.SmallIntegerField(choices=url_type_choices,default=0)
    url_name = models.CharField(max_length=64,unique=True)
    order = models.SmallIntegerField(default=0,verbose_name='菜单排序')
    sub_menus = models.ManyToManyField('SubMenu',blank=True)

    def __str__(self):
        return self.name

FirstLayerMenu

12. 二级菜单表, 还可以支持2级子菜单

class SubMenu(models.Model):
    '''第二层侧边栏菜单'''

    name = models.CharField('二层菜单名', max_length=64)
    url_type_choices = ((0,'related_name'),(1,'absolute_url'))
    url_type = models.SmallIntegerField(choices=url_type_choices,default=0)
    url_name = models.CharField(max_length=64, unique=True)
    order = models.SmallIntegerField(default=0, verbose_name='菜单排序')

    def __str__(self):
        return self.name

SubMenu

13. 缴费记录

class PaymentRecord(models.Model):
    enrollment = models.ForeignKey("Enrollment")
    pay_type_choices = (('deposit'u"订金/报名费"),
                        ('tution'u"学费"),
                        ('refund'u"退款"),
                        )
    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)
    consultant = models.ForeignKey(UserProfile, verbose_name="负责老师", help_text="谁签的单就选谁")
    def __str__(self):
        return "%s, 类型:%s,数额:%s" %(self.enrollment.customer, self.pay_type, self.paid_fee)

    class Meta:
        verbose_name = '交款纪录'
        verbose_name_plural = "交款纪录"

PaymentRecord

好啦,表基本都建完了,接下来同步数据库,不过在同步数据库前,要改一下settings.py, 因为我们自定义了django的认证表,所以需要明确的告诉django,用我们改过的过来做默认的认证系统。

在settings.py中添加以下行,格式为 app.modelname 

AUTH_USER_MODEL = 'crm.UserProfile'

最后一步,同步数据库! 

python3 manage.py makemigrations
python3 manage.py migrate


(0)

分享至