FRESHMANS

crm示例

创建应用

python manage.py starapp crm

 

settings.py注册新创建的app

INSTALLED_APPS = [
    \'django.contrib.admin\',
    \'django.contrib.auth\',
    \'django.contrib.contenttypes\',
    \'django.contrib.sessions\',
    \'django.contrib.messages\',
    \'django.contrib.staticfiles\',
    \'crm\',
    \'cmdb\',
]

 

settings.py配置使用mysql数据库

DATABASES = {
    \'default\': {
        \'ENGINE\': \'django.db.backends.mysql\',
        \'NAME\': \'crm\',
        \'USER\': \'crm\',
        \'PASSWORD\': \'crm\',
        \'HOST\': \'10.10.10.11\',
        \'PORT\': \'3306\',
    }
}

 

models.py

from django.db import models
from django.contrib.auth.models import User     #自带的认证模块

# Create your models here.

#客户信息表(客户是否已报名,)
class Customer(models.Model):
    name = models.CharField(max_length=32,blank=True,null=True)
    qq = models.CharField(max_length=64,unique=True,null=False)
    phone = models.CharField(max_length=64,blank=True,null=True)
    source_choice = (
        (\'1\',\'学员介绍\'),
        (\'2\',\'QQ群\'),
        (\'3\',\'官网\'),
        (\'4\',\'百度推广\'),
        (\'5\',\'51cto\'),
        (\'6\',\'其他\')
    )
    source = models.SmallIntegerField(choices=source_choice)
    referral_from = models.CharField(verbose_name="介绍人QQ",max_length=64,null=True)
    consult_source = models.ForeignKey("Course",verbose_name="咨询的课程名称")
    content = models.TextField(verbose_name="咨询详情")
    tags = models.ManyToManyField("Tag",blank=True,null=True)
    note = models.TextField(verbose_name="备注")
    date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.qq

class Tag(models.Model):
    name = models.CharField(max_length=64,unique=True)

    def __str__(self):
        return self.name

#客户跟进表
class CustomerFllowUp(models.Model):
    customer = models.ForeignKey("Customer")
    content = models.TextField(verbose_name="跟进信息")
    consultant = models.ForeignKey("UserProfile",verbose_name="跟进人")
    date = models.DateTimeField(auto_now_add=True)

    intention_choices = (
        (1,"2周内报名"),
        (2,"一个月内报名"),
        (3,"已报名"),
        (4,"拉黑")
    )
    intention = models.SmallIntegerField(choices=intention_choices)

    def __str__(self):
        return self.customer.qq,self.intention


#课程名称表
class Course(models.Model):
    name = models.CharField(max_length=64,unique=True)
    price = models.PositiveSmallIntegerField()             #positive 正数
    period = models.PositiveSmallIntegerField(verbose_name="周期")
    outline = models.TextField(verbose_name="课程大纲")

    def __str__(self):
        return self.name

class Branch(models.Model):
    name = models.CharField(max_length=128,verbose_name="校区名称",unique=True)
    address = models.CharField(max_length=128)

    def __str__(self):
        return self.name

#班级表
class ClassList(models.Model):
    branch = models.ForeignKey("Branch")
    course = models.ForeignKey("Course")
    semester = models.PositiveSmallIntegerField(verbose_name="学期")
    teachers = models.ManyToManyField("UserProfile",verbose_name="讲师")
    class_type_choice = (
        (1,"面授脱产"),
        (2,"面授周末"),
        (3,"网络"),

    )
    class_type = models.SmallIntegerField(choices=class_type_choice,verbose_name="班级类型")
    start_date = models.DateField(verbose_name="开班日期")

    def __str__(self):
        return self.branch,self.course

    class Meta:
        unique_together = ("branch","course","semester")

#上课记录表
class CourseRecord(models.Model):
    classmate  = models.ForeignKey("ClassList",verbose_name="班级")
    day_num = models.PositiveSmallIntegerField(verbose_name="第几天")
    teacher = models.ForeignKey("UserProfile")
    has_homework = models.BooleanField(default=True)
    homework_title=models.CharField(max_length=128,blank=True,null=True)

    homework_content = models.TextField(blank=True,null=True)
    outline = models.TextField(verbose_name="本节课程大纲")
    date = models.DateField(auto_now_add=True)

    def __str__(self):
        return self.classmate,self.day_num

#学习记录表
class StudyRecord(models.Model):
    student = models.ForeignKey("Enrollment")       #学生信息
    course_record = models.ForeignKey("CourseRecord")
    attendence_choice = (
        (1,"已签到"),
        (2,"迟到"),
        (3,"缺勤"),
        (4,"早退")
    )

    attendence = models.SmallIntegerField(choices=attendence_choice,default=0)

    score_choice = (
        (100,"A+"),
        (90,"A"),
        (85,"B+"),
        (80,"B"),
        (60,"C")
    )

    score = models.SmallIntegerField(verbose_name="成绩")
    memo = models.TextField(blank=True,null=True)
    date = models.DateField(auto_now_add=True)

    def __str__(self):
        return self.student,self.course_record,self.score

#学生报名注册表(合同,报名信息,报名日期等信息)
class Enrollment(models.Model):
    customer = models.ForeignKey("Customer")
    enrolled_class = models.ForeignKey("ClassList",verbose_name="所报班级")
    consultant = models.ForeignKey("UserProfile",verbose_name="课程顾问")
    contract_agreed = models.BooleanField(default=False,verbose_name="学员已同意条款")
    contract_approved = models.BooleanField(default=False,verbose_name="合同已审核")
    date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.customer,self.enrolled_class

    class Meta:
        unique_together = ("customer","enrolled_class")


class Payment(models.Model):
    customer = models.ForeignKey("Customer")
    amount = models.PositiveIntegerField(verbose_name="所缴金额",default=500)
    consultant = models.ForeignKey("UserProfile",verbose_name="经办人")
    date = models.DateTimeField(auto_now_add=True)
    course = models.ForeignKey("Course",verbose_name="所报课程")

    def __str__(self):
        return self.customer,self.amount
#用户表
class UserProfile(models.Model):
    user = models.OneToOneField(User)
    name = models.CharField(max_length=32)
    role = models.ManyToManyField("Role",blank=True,null=True)

    def __str__(self):
        return self.name

#角色表
class Role(models.Model):
    name = models.CharField(max_length=32,unique=True)

    def __str__(self):
        return self.name

 

admin.py注册数据模型到admin后台(在admin后台会显示相应的表菜单)

from django.contrib import admin

# Register your models here.
from crm import models

admin.site.register(models.Customer)
admin.site.register(models.CustomerFllowUp)
admin.site.register(models.Course)
admin.site.register(models.ClassList)
admin.site.register(models.CourseRecord)
admin.site.register(models.Branch)
admin.site.register(models.Role)
admin.site.register(models.StudyRecord)
admin.site.register(models.UserProfile)
admin.site.register(models.Payment)
admin.site.register(models.Enrollment)
admin.site.register(models.Tag)

 

创建表

python manage.py makemigrations crm(可不写crm)
python manage.py migrate

 

创建超级用户

python manage.py createsuperuser

 

后台:127.0.0.1:8000/admin

默认情况下这里的表明为英文,如果换成中文,只需要在models.py里的每个class下添加:

    class Meta:
        verbose_name = "表名称"
        verbose_name_plural = "表名称"

添加完以后刷新页面自动生效

 

cmdb示例

models.py

from django.db import models

from django.db import models
from django.contrib.auth.models import (
    BaseUserManager, AbstractBaseUser,Group,PermissionsMixin
)
import django

#用来自定义后台创建后台超级用户的类
class UserManager(BaseUserManager):               def create_user(self, email, name, password=None): if not email: raise ValueError(\'Users must have an email address\') user = self.model( email=self.normalize_email(email),       #后台登录使用邮箱登录 name=name, #token=token, #department=department, #tel=tel, #memo=memo, ) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, email, name ,password): user = self.create_user(email, password=password, name=name, #token=token, #department=department, #tel=tel, #memo=memo, ) user.is_admin = True user.save(using=self._db) return user #用来自定义后台管理用户的类 class UserProfile(AbstractBaseUser,PermissionsMixin): email = models.EmailField( verbose_name=\'email address\', max_length=255, unique=True, ) is_active = models.BooleanField(default=True) is_admin = models.BooleanField(default=False) name = models.CharField(max_length=32) token = models.CharField(u\'token\', max_length=128,default=None,blank=True,null=True) department = models.CharField(u\'部门\', max_length=32,default=None,blank=True,null=True) #business_unit = models.ManyToManyField(BusinessUnit) tel = models.CharField(u\'座机\', max_length=32,default=None,blank=True,null=True) mobile = models.CharField(u\'手机\', max_length=32,default=None,blank=True,null=True) memo = models.TextField(u\'备注\', blank=True,null=True,default=None) date_joined = models.DateTimeField(blank=True, auto_now_add=True) #valid_begin = models.DateTimeField(blank=True, auto_now=True) valid_begin_time = models.DateTimeField(default=django.utils.timezone.now) valid_end_time = models.DateTimeField(blank=True,null=True) #groups = models.ManyToManyField 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): # __unicode__ 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_staff(self): "Is the user a member of staff?" # Simplest possible answer: All admins are staff return self.is_admin class Meta: verbose_name = u\'用户信息\' verbose_name_plural = u"用户信息" def __unicode__(self): return self.name objects = UserManager()
#资产信息类
class Asset(models.Model): asset_type_choices = ( (\'server\', u\'服务器\'), (\'networkdevice\', u\'网络设备\'), (\'storagedevice\', u\'存储设备\'), (\'securitydevice\', u\'安全设备\'), (\'idcdevice\', u\'机房设备\'), # (\'switch\', u\'交换机\'), # (\'router\', u\'路由器\'), # (\'firewall\', u\'防火墙\'), # (\'storage\', u\'存储设备\'), # (\'NLB\', u\'NetScaler\'), # (\'wireless\', u\'无线AP\'), (\'software\', u\'软件资产\'), #(\'others\', u\'其它类\'), ) asset_type = models.CharField(choices=asset_type_choices,max_length=64, default=\'server\') name = models.CharField(max_length=64,unique=True) sn = models.CharField(u\'资产SN号\',max_length=128, unique=True) manufactory = models.ForeignKey(\'Manufactory\',verbose_name=u\'制造商\',null=True, blank=True) #model = models.ForeignKey(\'ProductModel\', verbose_name=u\'型号\') #model = models.CharField(u\'型号\',max_length=128,null=True, blank=True ) management_ip = models.GenericIPAddressField(u\'管理IP\',blank=True,null=True) contract = models.ForeignKey(\'Contract\', verbose_name=u\'合同\',null=True, blank=True) trade_date = models.DateField(u\'购买时间\',null=True, blank=True) expire_date = models.DateField(u\'过保修期\',null=True, blank=True) price = models.FloatField(u\'价格\',null=True, blank=True) business_unit = models.ForeignKey(\'BusinessUnit\', verbose_name=u\'所属业务线\',null=True, blank=True) tags = models.ManyToManyField(\'Tag\' ,blank=True) admin = models.ForeignKey(\'UserProfile\', verbose_name=u\'资产管理员\',null=True, blank=True) idc = models.ForeignKey(\'IDC\', verbose_name=u\'IDC机房\',null=True, blank=True) status_choices = ((0,\'在线\'), (1,\'已下线\'), (2,\'未知\'), (3,\'故障\'), (4,\'备用\'), ) status = models.SmallIntegerField(choices=status_choices,default=0) #status = models.ForeignKey(\'Status\', verbose_name = u\'设备状态\',default=1) #Configuration = models.OneToOneField(\'Configuration\',verbose_name=\'配置管理\',blank=True,null=True) memo = models.TextField(u\'备注\', null=True, blank=True) create_date = models.DateTimeField(blank=True, auto_now_add=True) update_date = models.DateTimeField(blank=True, auto_now=True) class Meta: verbose_name = \'资产总表\' verbose_name_plural = "资产总表" def __str__(self): return \'<id:%s name:%s>\' %(self.id,self.name ) #服务器类 class Server(models.Model): asset = models.OneToOneField(\'Asset\') sub_assset_type_choices = ( (0,\'PC服务器\'), (1,\'刀片机\'), (2,\'小型机\'), ) created_by_choices = ( (\'auto\',\'Auto\'), (\'manual\',\'Manual\'), ) sub_asset_type = models.SmallIntegerField(choices=sub_assset_type_choices,verbose_name="服务器类型",default=0) created_by = models.CharField(choices=created_by_choices,max_length=32,default=\'auto\') #auto: auto created, manual:created manually #hosted_on = models.ForeignKey(\'self\',related_name=\'hosted_on_server\',blank=True,null=True) #for vitural server #sn = models.CharField(u\'SN号\',max_length=128) #management_ip = models.CharField(u\'管理IP\',max_length=64,blank=True,null=True) #manufactory = models.ForeignKey(verbose_name=u\'制造商\',max_length=128,null=True, blank=True) model = models.CharField(verbose_name=u\'型号\',max_length=128,null=True, blank=True ) # 若有多个CPU,型号应该都是一致的,故没做ForeignKey #nic = models.ManyToManyField(\'NIC\', verbose_name=u\'网卡列表\') #disk raid_type = models.CharField(u\'raid类型\',max_length=512, blank=True,null=True) #physical_disk_driver = models.ManyToManyField(\'Disk\', verbose_name=u\'硬盘\',blank=True,null=True) #raid_adaptor = models.ManyToManyField(\'RaidAdaptor\', verbose_name=u\'Raid卡\',blank=True,null=True) #memory #ram_capacity = models.IntegerField(u\'内存总大小GB\',blank=True) #ram = models.ManyToManyField(\'Memory\', verbose_name=u\'内存配置\',blank=True,null=True) os_type = models.CharField(u\'操作系统类型\',max_length=64, blank=True,null=True) os_distribution =models.CharField(u\'发型版本\',max_length=64, blank=True,null=True) os_release = models.CharField(u\'操作系统版本\',max_length=64, blank=True,null=True) class Meta: verbose_name = \'服务器\' verbose_name_plural = "服务器" #together = ["sn", "asset"] def __str__(self): return \'%s sn:%s\' %(self.asset.name,self.asset.sn) class SecurityDevice(models.Model): asset = models.OneToOneField(\'Asset\') sub_assset_type_choices = ( (0,\'防火墙\'), (1,\'入侵检测设备\'), (2,\'互联网网关\'), (4,\'运维审计系统\'), ) sub_asset_type = models.SmallIntegerField(choices=sub_assset_type_choices,verbose_name="服务器类型",default=0) def __str__(self): return self.asset.id class NetworkDevice(models.Model): asset = models.OneToOneField(\'Asset\') sub_assset_type_choices = ( (0,\'路由器\'), (1,\'交换机\'), (2,\'负载均衡\'), (4,\'VPN设备\'), ) sub_asset_type = models.SmallIntegerField(choices=sub_assset_type_choices,verbose_name="服务器类型",default=0) vlan_ip = models.GenericIPAddressField(u\'VlanIP\',blank=True,null=True) intranet_ip = models.GenericIPAddressField(u\'内网IP\',blank=True,null=True) #sn = models.CharField(u\'SN号\',max_length=128,unique=True) #manufactory = models.CharField(verbose_name=u\'制造商\',max_length=128,null=True, blank=True) model = models.CharField(u\'型号\',max_length=128,null=True, blank=True ) firmware = models.ForeignKey(\'Software\',blank=True,null=True) port_num = models.SmallIntegerField(u\'端口个数\',null=True, blank=True ) device_detail = models.TextField(u\'设置详细配置\',null=True, blank=True ) class Meta: verbose_name = \'网络设备\' verbose_name_plural = "网络设备" class Software(models.Model): \'\'\' only save software which company purchased \'\'\' sub_assset_type_choices = ( (0, \'OS\'), (1, \'办公\开发软件\'), (2, \'业务软件\'), ) sub_asset_type = models.SmallIntegerField(choices=sub_assset_type_choices,verbose_name="服务器类型",default=0) license_num = models.IntegerField(verbose_name="授权数") # os_distribution_choices = ((\'windows\',\'Windows\'), # (\'centos\',\'CentOS\'), # (\'ubuntu\', \'Ubuntu\')) # type = models.CharField(u\'系统类型\', choices=os_types_choice, max_length=64,help_text=u\'eg. GNU/Linux\',default=1) # distribution = models.CharField(u\'发型版本\', choices=os_distribution_choices,max_length=32,default=\'windows\') version = models.CharField(u\'软件/系统版本\', max_length=64, help_text=u\'eg. CentOS release 6.5 (Final)\', unique=True) # language_choices = ((\'cn\',u\'中文\'), # (\'en\',u\'英文\')) # language = models.CharField(u\'系统语言\',choices = language_choices, default=\'cn\',max_length=32) # #version = models.CharField(u\'版本号\', max_length=64,help_text=u\'2.6.32-431.3.1.el6.x86_64\' ) def __str__(self): return self.version class Meta: verbose_name = \'软件/系统\' verbose_name_plural = "软件/系统" #cpu信息类 class CPU(models.Model): asset = models.OneToOneField(\'Asset\') cpu_model = models.CharField(u\'CPU型号\', max_length=128,blank=True) cpu_count = models.SmallIntegerField(u\'物理cpu个数\') cpu_core_count = models.SmallIntegerField(u\'cpu核数\') memo = models.TextField(u\'备注\', null=True,blank=True) create_date = models.DateTimeField(auto_now_add=True) update_date = models.DateTimeField(blank=True,null=True) class Meta: verbose_name = \'CPU部件\' verbose_name_plural = "CPU部件" def __str__(self): return self.cpu_model
#内存信息类
class RAM(models.Model): asset = models.ForeignKey(\'Asset\') sn = models.CharField(u\'SN号\', max_length=128, blank=True,null=True) model = models.CharField(u\'内存型号\', max_length=128) slot = models.CharField(u\'插槽\', max_length=64) capacity = models.IntegerField(u\'内存大小(MB)\') memo = models.CharField(u\'备注\',max_length=128, blank=True,null=True) create_date = models.DateTimeField(blank=True, auto_now_add=True) update_date = models.DateTimeField(blank=True,null=True) def __str__(self): return \'%s:%s:%s\' % (self.asset_id,self.slot,self.capacity) class Meta: verbose_name = \'RAM\' verbose_name_plural = "RAM" unique_together = ("asset", "slot") auto_create_fields = [\'sn\',\'slot\',\'model\',\'capacity\']
#硬盘信息类
class Disk(models.Model): asset = models.ForeignKey(\'Asset\') sn = models.CharField(u\'SN号\', max_length=128, blank=True,null=True) slot = models.CharField(u\'插槽位\',max_length=64) #manufactory = models.CharField(u\'制造商\', max_length=64,blank=True,null=True) model = models.CharField(u\'磁盘型号\', max_length=128,blank=True,null=True) capacity = models.FloatField(u\'磁盘容量GB\') disk_iface_choice = ( (\'SATA\', \'SATA\'), (\'SAS\', \'SAS\'), (\'SCSI\', \'SCSI\'), (\'SSD\', \'SSD\'), ) iface_type = models.CharField(u\'接口类型\', max_length=64,choices=disk_iface_choice,default=\'SAS\') memo = models.TextField(u\'备注\', blank=True,null=True) create_date = models.DateTimeField(blank=True, auto_now_add=True) update_date = models.DateTimeField(blank=True,null=True) auto_create_fields = [\'sn\',\'slot\',\'manufactory\',\'model\',\'capacity\',\'iface_type\'] class Meta: unique_together = ("asset", "slot") verbose_name = \'硬盘\' verbose_name_plural = "硬盘" def __str__(self): return \'%s:slot:%s capacity:%s\' % (self.asset_id,self.slot,self.capacity) #网卡信息类 class NIC(models.Model): asset = models.ForeignKey(\'Asset\') name = models.CharField(u\'网卡名\', max_length=64, blank=True,null=True) sn = models.CharField(u\'SN号\', max_length=128, blank=True,null=True) model = models.CharField(u\'网卡型号\', max_length=128, blank=True,null=True) macaddress = models.CharField(u\'MAC\', max_length=64,unique=True) ipaddress = models.GenericIPAddressField(u\'IP\', blank=True,null=True) netmask = models.CharField(max_length=64,blank=True,null=True) bonding = models.CharField(max_length=64,blank=True,null=True) memo = models.CharField(u\'备注\',max_length=128, blank=True,null=True) create_date = models.DateTimeField(blank=True, auto_now_add=True) update_date = models.DateTimeField(blank=True,null=True) def __str__(self): return \'%s:%s\' % (self.asset_id,self.macaddress) class Meta: verbose_name = u\'网卡\' verbose_name_plural = u"网卡" #unique_together = ("asset_id", "slot") unique_together = ("asset", "macaddress") auto_create_fields = [\'name\',\'sn\',\'model\',\'macaddress\',\'ipaddress\',\'netmask\',\'bonding\']
#raid信息类
class RaidAdaptor(models.Model): asset = models.ForeignKey(\'Asset\') sn = models.CharField(u\'SN号\', max_length=128, blank=True,null=True) slot = models.CharField(u\'插口\',max_length=64) model = models.CharField(u\'型号\', max_length=64,blank=True,null=True) memo = models.TextField(u\'备注\', blank=True,null=True) create_date = models.DateTimeField(blank=True, auto_now_add=True) update_date = models.DateTimeField(blank=True,null=True) def __str__(self): return self.sn class Meta: unique_together = ("asset", "slot")
#厂商信息类
class Manufactory(models.Model): manufactory = models.CharField(u\'厂商名称\',max_length=64, unique=True) support_num = models.CharField(u\'支持电话\',max_length=30,blank=True) memo = models.CharField(u\'备注\',max_length=128,blank=True) def __str__(self): return self.manufactory class Meta: verbose_name = \'厂商\' verbose_name_plural = "厂商" class BusinessUnit(models.Model): parent_unit = models.ForeignKey(\'self\',related_name=\'parent_level\',blank=True,null=True) name = models.CharField(u\'业务线\',max_length=64) #contact = models.ForeignKey(\'UserProfile\',default=None) memo = models.CharField(u\'备注\',max_length=64, blank=True) def __str__(self): return self.name class Meta: verbose_name = \'业务线\' verbose_name_plural = "业务线" unique_together = ("parent_unit","name") class Contract(models.Model): sn = models.CharField(u\'合同号\', max_length=128,unique=True) name = models.CharField(u\'合同名称\', max_length=64 ) memo = models.TextField(u\'备注\', blank=True,null=True) price = models.IntegerField(u\'合同金额\') detail = models.TextField(u\'合同详细\',blank=True,null=True) start_date = models.DateField(blank=True) end_date = models.DateField(blank=True) license_num = models.IntegerField(u\'license数量\',blank=True) create_date = models.DateField(auto_now_add=True) update_date= models.DateField(auto_now=True) class Meta: verbose_name = \'合同\' verbose_name_plural = "合同" def __str__(self): return self.name class IDC(models.Model): name = models.CharField(u\'机房名称\',max_length=64,unique=True) memo = models.CharField(u\'备注\',max_length=128,blank=True,null=True) def __str__(self): return self.name class Meta: verbose_name = \'机房\' verbose_name_plural = "机房" class Tag(models.Model): name = models.CharField(\'Tag name\',max_length=32,unique=True ) creater = models.ForeignKey(\'UserProfile\') create_date = models.DateField(auto_now_add=True) def __str__(self): return self.name class Meta: verbose_name = \'标签\' verbose_name_plural = "标签" class EventLog(models.Model): name = models.CharField(u\'事件名称\', max_length=100) event_type_choices = ( (1,u\'硬件变更\'), (2,u\'新增配件\'), (3,u\'设备下线\'), (4,u\'设备上线\'), (5,u\'定期维护\'), (6,u\'业务上线\更新\变更\'), (7,u\'其它\'), ) event_type = models.SmallIntegerField(u\'事件类型\', choices= event_type_choices) asset = models.ForeignKey(\'Asset\') component = models.CharField(\'事件子项\',max_length=255, blank=True,null=True) detail = models.TextField(u\'事件详情\') date = models.DateTimeField(u\'事件时间\',auto_now_add=True) user = models.ForeignKey(\'UserProfile\',verbose_name=u\'事件源\') memo = models.TextField(u\'备注\', blank=True,null=True) def __str__(self): return self.name class Meta: verbose_name = \'事件纪录\' verbose_name_plural = "事件纪录" def colored_event_type(self): if self.event_type == 1: cell_html = \'<span style="background: orange;">%s</span>\' elif self.event_type == 2 : cell_html = \'<span style="background: yellowgreen;">%s</span>\' else: cell_html = \'<span >%s</span>\' return cell_html % self.get_event_type_display() colored_event_type.allow_tags = True colored_event_type.short_description = u\'事件类型\' class NewAssetApprovalZone(models.Model): sn = models.CharField(u\'资产SN号\',max_length=128, unique=True) asset_type_choices = ( (\'server\', u\'服务器\'), (\'switch\', u\'交换机\'), (\'router\', u\'路由器\'), (\'firewall\', u\'防火墙\'), (\'storage\', u\'存储设备\'), (\'NLB\', u\'NetScaler\'), (\'wireless\', u\'无线AP\'), (\'software\', u\'软件资产\'), (\'others\', u\'其它类\'), ) asset_type = models.CharField(choices=asset_type_choices,max_length=64,blank=True,null=True) manufactory = models.CharField(max_length=64,blank=True,null=True) model = models.CharField(max_length=128,blank=True,null=True) ram_size = models.IntegerField(blank=True,null=True) cpu_model = models.CharField(max_length=128,blank=True,null=True) cpu_count = models.IntegerField(blank=True,null=True) cpu_core_count = models.IntegerField(blank=True,null=True) os_distribution = models.CharField(max_length=64,blank=True,null=True) os_type = models.CharField(max_length=64,blank=True,null=True) os_release = models.CharField(max_length=64,blank=True,null=True) data = models.TextField(u\'资产数据\') date = models.DateTimeField(u\'汇报日期\',auto_now_add=True) approved = models.BooleanField(u\'已批准\',default=False) approved_by = models.ForeignKey(\'UserProfile\',verbose_name=u\'批准人\',blank=True,null=True) approved_date = models.DateTimeField(u\'批准日期\',blank=True,null=True) def __str__(self): return self.sn class Meta: verbose_name = \'新上线待批准资产\' verbose_name_plural = "新上线待批准资产"

 

admin.py注册表到后台

#_*_coding:utf8_*_

from django import forms
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import ReadOnlyPasswordHashField
from cmdb import models
# Register your models here.

#后台管理页面用户创建时的相关表单
class UserCreationForm(forms.ModelForm):
        password1 = forms.CharField(label=\'Password\', widget=forms.PasswordInput)          #第一次输入密码
    password2 = forms.CharField(label=\'Password confirmation\', widget=forms.PasswordInput)   #确认输入的密码

    class Meta:
        model = models.UserProfile
        fields = (\'email\',\'token\')

    def clean_password2(self):
        # Check that the two password entries match
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("Passwords don\'t match")
        return password2

    def save(self, commit=True):
        # Save the provided password in hashed format
        user = super(UserCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user


class UserChangeForm(forms.ModelForm):
        password = ReadOnlyPasswordHashField(label="Password",
        help_text=("Raw passwords are not stored, so there is no way to see "
                    "this user\'s password, but you can change the password "
                    "using <a href=\"password/\">this form</a>."))

    class Meta:
        model = models.UserProfile
        fields = (\'email\', \'password\',\'is_active\', \'is_admin\')

    def clean_password(self):
        # Regardless of what the user provides, return the initial value.
        # This is done here, rather than on the field, because the
        # field does not have access to the initial value
        return self.initial["password"]


class UserProfileAdmin(UserAdmin):
    # The forms to add and change user instances
    form = UserChangeForm
    add_form = UserCreationForm

    # The fields to be used in displaying the User model.
    # These override the definitions on the base UserAdmin
    # that reference specific fields on auth.User.
    list_display = (\'id\',\'email\',\'is_admin\',\'is_active\')      #表示在用户信息界面列出的字段名
    list_filter = (\'is_admin\',)
    fieldsets = (
        (None, {\'fields\': (\'email\', \'password\')}),
        (\'Personal info\', {\'fields\': (\'department\',\'tel\',\'mobile\',\'memo\')}),
        (\'API TOKEN info\', {\'fields\': (\'token\',)}),
        (\'Permissions\', {\'fields\': (\'is_active\',\'is_admin\')}),
        (\'账户有效期\', {\'fields\': (\'valid_begin_time\',\'valid_end_time\')}),
    )
    # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin
    # overrides get_fieldsets to use this attribute when creating a user.
    add_fieldsets = (
        (None, {
            \'classes\': (\'wide\',),
            \'fields\': (\'email\',  \'password1\', \'password2\',\'is_active\',\'is_admin\')}
        ),
    )
    search_fields = (\'email\',)
    ordering = (\'email\',)
    filter_horizontal = ()

class ServerInline(admin.TabularInline):
    model = models.Server
    exclude = (\'memo\',)
    #readonly_fields = [\'create_date\']

class CPUInline(admin.TabularInline):
    model = models.CPU
    exclude = (\'memo\',)
    readonly_fields = [\'create_date\']
class NICInline(admin.TabularInline):
    model = models.NIC
    exclude = (\'memo\',)
    readonly_fields = [\'create_date\']
class RAMInline(admin.TabularInline):
    model = models.RAM
    exclude = (\'memo\',)
    readonly_fields = [\'create_date\']
class DiskInline(admin.TabularInline):
    model = models.Disk
    exclude = (\'memo\',)
    readonly_fields = [\'create_date\']

class AssetAdmin(admin.ModelAdmin):
    list_display = (\'id\',\'asset_type\',\'sn\',\'name\',\'manufactory\',\'management_ip\',\'idc\',\'business_unit\',\'admin\',\'trade_date\',\'status\')
    inlines = [ServerInline,CPUInline,RAMInline,DiskInline,NICInline]
    search_fields = [\'sn\',]
    list_filter = [\'idc\',\'manufactory\',\'business_unit\',\'asset_type\']      #fileter表示在详细界面最右侧列出的菜单栏
    choice_fields = (\'asset_type\',\'status\')
    fk_fields = (\'manufactory\',\'idc\',\'business_unit\',\'admin\')
    list_per_page = 10
    list_filter = (\'asset_type\',\'status\',\'manufactory\',\'idc\',\'business_unit\',\'admin\',\'trade_date\')
    dynamic_fk = \'asset_type\'
    dynamic_list_display = (\'model\',\'sub_asset_type\',\'os_type\',\'os_distribution\')
    dynamic_choice_fields = (\'sub_asset_type\',)
    m2m_fields = (\'tags\',)

class NicAdmin(admin.ModelAdmin):
    list_display = (\'name\',\'macaddress\',\'ipaddress\',\'netmask\',\'bonding\')    #表示在网卡详细信息界面列出的字段值
    search_fields = (\'macaddress\',\'ipaddress\')


class EventLogAdmin(admin.ModelAdmin):
    list_display = (\'name\',\'colored_event_type\',\'asset\',\'component\',\'detail\',\'date\',\'user\')  #详细信息界面显示的字段
    search_fields = (\'asset\',)
    list_filter = (\'event_type\',\'component\',\'date\',\'user\')


from django.contrib.contenttypes.models import ContentType
from django.http import HttpResponseRedirect

class NewAssetApprovalZoneAdmin(admin.ModelAdmin):
    list_display = (\'sn\',\'asset_type\',\'manufactory\',\'model\',\'cpu_model\',\'cpu_count\',\'cpu_core_count\',\'ram_size\',\'os_distribution\',\'os_release\',\'date\',\'approved\',\'approved_by\',\'approved_date\')
    actions = [\'approve_selected_objects\']

    def approve_selected_objects(modeladmin, request, queryset):
        selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
        print("query set model ",selected)
        ct = ContentType.objects.get_for_model(queryset.model)
        #print("ct ", ct,ct.pk, type(ct))
        return HttpResponseRedirect("/asset/new_assets/approval/?ct=%s&ids=%s" % (ct.pk, ",".join(selected)))
    approve_selected_objects.short_description = "批准入库"

# Now register the new UserAdmin...
admin.site.register(models.UserProfile, UserProfileAdmin)
# ... and, since we\'re not using Django\'s built-in permissions,
# unregister the Group model from admin.
#admin.site.unregister(Group)
admin.site.register(models.Asset,AssetAdmin)
admin.site.register(models.Server)
admin.site.register(models.NetworkDevice)
admin.site.register(models.IDC)
admin.site.register(models.BusinessUnit)
admin.site.register(models.Contract)
admin.site.register(models.CPU)
admin.site.register(models.Disk)
admin.site.register(models.NIC,NicAdmin)
admin.site.register(models.RAM)
admin.site.register(models.Manufactory)
admin.site.register(models.Tag)
admin.site.register(models.Software)
admin.site.register(models.EventLog,EventLogAdmin)
admin.site.register(models.NewAssetApprovalZone,NewAssetApprovalZoneAdmin)

 

settings.py 

AUTH_USER_MODEL = \'cmdb.UserProfile\'

 

分类:

技术点:

相关文章: