利用xadmin制作简单数据管理系统(二)

2014-08-08 22:38:00
CJL
原创
9249
摘要:要点:自定义权限,自定义过滤器,自定义默认值 场景介绍 需要利用xadmin制作一套数据管理系统 需要三级权限 系统管理员->所有权限,包括增删查改 部门管理员->审查权限(仅限数据查看),仅限查看本地区的数据,无编辑权限,赋予下级人员编辑权限 录入员->仅可以查看自己提交的内容,在特定的时间段内允许增删改,超过特定的时间需向上级部门申请
python学习笔记 篇二   (欢迎大家进行添加修正,需要样例源码的请发送邮件到chujilu1991@163.com索取)

利用xadmin制作简单数据管理系统
要点:自定义权限,自定义过滤器,自定义默认值
场景介绍
需要利用xadmin制作一套数据管理系统
需要三级权限
系统管理员->所有权限,包括增删查改
部门管理员->审查权限(仅限数据查看),仅限查看本地区的数据,无编辑权限,赋予下级人员编辑权限
录入员->仅可以查看自己提交的内容,在特定的时间段内允许增删改,超过特定的时间需向上级部门申请

(1) 录入员仅限查看自己提交的内容
实现思路:先定义一个自定义权限(list_by_user),在表上添加一个录入人的字段(inputuser),然后在get_list_queryset上添加一个过滤器,过滤器根据权限不同进行不同内容的过滤
实现关键代码:
models.py
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Qhproject(models.Model):
    name = models.CharField(u'项目名称',max_length=50)
    progress = models.CharField(u'项目进度',max_length=200,blank=True)
    adep = models.CharField(u'委托部门',max_length=50,blank=True)
    aname = models.CharField(u'委托人',max_length=50,blank=True)
    anum = models.CharField(u'委托人联系电话',max_length=50,blank=True)
    bname = models.CharField(u'项目经理',max_length=50,blank=True,default="盛伟")
    bnum = models.CharField(u'项目经理联系电话',max_length=50,blank=True)
    bmem = models.CharField(u'项目组成员',max_length=50,blank=True)
    startdate = models.DateField(u'项目开始时间',blank=True,null=True)
    enddate = models.DateField(u'项目结束时间',blank=True,null=True)
    needenddate = models.DateField(u'需求分析结束时间',blank=True,null=True)
    teststartdate = models.DateField(u'软件测试开始时间',blank=True,null=True)
    inputuser = models.ForeignKey(User, verbose_name='创建者', blank=True, null=True )
    fee = models.CharField(u'项目收费(¥)',max_length=50,blank=True,help_text='单位(元)')
    description = models.TextField(u'项目简介',blank=True)
    remark = models.TextField(u'备注',blank=True)
    class Meta:
        verbose_name = u"项目"
        verbose_name_plural = u"项目"
        #添加自定义权限
        permissions = (
            ("editpname","edit project manager name"),
        )
adminx.py
import xadmin
from xadmin import views
from projectArc.models import Qhproject
#注册允许xadmin管理的类
class QhprojectAdmin(object):
    list_display = ('name','bname','progress','fee','startdate','enddate')
    readonly_fields = ('bname','inputuser',)
    #查询过滤
    def get_list_queryset(self):
        #self.user.id获取当前登陆用户的id
        #判断权限,如果是超级管理员不进行过滤
        if(not self.user.is_superuser):
             return super(QhprojectAdmin, self).get_list_queryset().filter(inputuser=self.user.id)
        return super(QhprojectAdmin, self).get_list_queryset()
xadmin.site.register(Qhproject,QhprojectAdmin)

(2)录入人员字段的自动填充
实现思路:装饰edit类的models_save方法,在保存之前给inputuser赋值,在编辑页面将inputuser字段置为只读
实现关键代码:
adminx.py
#其他代码见第一例,后面代码均为在其基础上添加或修改.前后均用....代替
....
    #只读字段
    readonly_fields = ('inputuser',)
....
    #保存默认值
    def save_models(self):
        #第一次编辑的时候才会进行修改 
        if(self.new_obj.inputuser==""):
            self.new_obj.inputuser = self.user
        self.new_obj.save()
....

(3)根据权限不同可编辑字段不同
实现思路:装饰get_readonly_fields方法使其根据权限不同返回不同的只读字段
实现关键代码:
adminx.py
....
    #只读字段  默认字段都有编辑权限
    readonly_fields = ('inputuser',)
....
    #根据权限设置 区分编辑内容
    def get_readonly_fields(self):
        #获得原只读字段 使用list()方法将tuple转化为list
        r_f_n = list(super(QhprojectAdmin, self).get_readonly_fields())
        #权限标记为appname.permitionname 如果没有权限编辑也不是超级管理员则添加只读字段
        if (not self.request.user.has_perm('projectArc.editpname')) and (not self.request.user.is_superuser):
            r_f_n.append('bname')
        return r_f_n
....

(4)仅限查看本地区的数据
实现思路:添加一个根据地区或部门进行的分组,如"部门_开发部",同时添加一个查看同部门提交内容的权限.对部门管理员进行该权限的赋权,并将本部门员工都加入该分组.
在过滤器处根据权限进行修改过滤器,返回不同的内容
实现关键代码:
models.py
....
    permissions = (
            ("editpname","edit project manager name"),
            ("editpnameallgroup","edit his group's project manager name"),
        )
....
adminx.py
....
        #判断权限,如果是超级管理员不进行过滤
        if(not self.request.user.is_superuser):
            #print self.request.user.has_perm('projectArc.editpnameallgroup'),"权限检查"
            #对是否有查看同组人员内容权限进行判断
            if(self.request.user.has_perm('projectArc.editpnameallgroup')):
                #获得同组人员list 组以部门开头的组名称为准
                same_group_users = self.request.user.groups.get(name__startswith="部门").user_set.all()
                return super(QhprojectAdmin, self).get_list_queryset().filter(inputuser__in=same_group_users)
            return super(QhprojectAdmin, self).get_list_queryset().filter(inputuser=self.request.user.id)
        
        return super(QhprojectAdmin, self).get_list_queryset()
....

(5)特定的时间有编辑权限
实现思路:装饰判断权限的方法加入根据日期判断或日期临时权限,日期根据表进行存储
实现关键代码:明天再写....


(6)杂项
filter
条件选取querySet的时候,filter表示=,exclude表示!=。
querySet.distinct()  去重复
__exact        精确等于 like 'aaa'
 __iexact    精确等于 忽略大小写 ilike 'aaa'
 __contains    包含 like '%aaa%'
 __icontains    包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。
__gt    大于
__gte    大于等于
__lt    小于
__lte    小于等于
__in     存在于一个list范围内
__startswith   以...开头
__istartswith   以...开头 忽略大小写
__endswith     以...结尾
__iendswith    以...结尾,忽略大小写
__range    在...范围内
__year       日期字段的年份
__month    日期字段的月份
__day        日期字段的日
__isnull=True/False
例子:
>> q1 = Entry.objects.filter(headline__startswith="What")
>> q2 = q1.exclude(pub_date__gte=datetime.date.today())
发表评论
评论通过审核后显示。
流量统计