09 modelform
10 反向生成url
modelform
models.pyhtml
代码vue
from django.db import models environment_choices = ( (1, '开发环境'), (2, '测试环境'), (3, '灰度环境'), (4, '压测环境'), (5, '生产环境'), ) ########权限相关 class Menu(models.Model): """菜单组""" name = models.CharField(max\_length=32,verbose\_name='菜单', blank=True, null=True) is\_menu=models.ForeignKey(to='Menu',null=True,blank=True,verbose\_name='母菜单') class Meta: verbose\_name\_plural = "菜单表" def \_\_str\_\_(self): return self.name class Group(models.Model): """权限组""" #主机 name = models.CharField(verbose\_name='组名称',max\_length=16, blank=True, null=True) menu = models.ForeignKey(verbose_name='所属菜单',to='Menu', blank=True,null=True) class Meta: verbose\_name\_plural = "权限组" def \_\_str\_\_(self): return self.name class Permission(models.Model): """权限表URL""" name = models.CharField(verbose\_name='标题', max\_length=32) url = models.CharField(verbose\_name="含正则URL", max\_length=64) menu\_gp = models.ForeignKey(verbose\_name='默认选中的组内权限ID', to='Permission', null=True, blank=True, related_name='x1') code = models.CharField(verbose\_name="代码", max\_length=16) group = models.ForeignKey(verbose_name='所属组', to="Group") class Meta: verbose\_name\_plural = "权限URL表" def \_\_str\_\_(self): return self.name class PteamPermission(models.Model): """职位表""" #1 运维 2 开发 3 运维+开发 name = models.CharField(max\_length=32, blank=True,null=True,verbose\_name='项目读写') permissions = models.ManyToManyField(verbose_name='具备的全部权限', to='Permission', blank=True,null=True) class Meta: verbose\_name\_plural = "项目权限表" def \_\_str\_\_(self): return self.name class User(models.Model): """用户表""" name = models.CharField(max\_length=32, verbose\_name='真实名称', blank=True, null=True) username=models.CharField(max\_length=16, blank=True, null=True, verbose\_name='用户名') password=models.CharField(max\_length=32, blank=True, null=True, verbose\_name='密码') token=models.CharField(max\_length=64, blank=True, null=True, verbose\_name='token') pteamper = models.ForeignKey(verbose\_name='项目权限表', to="PteamPermission", blank=True,null=True,related\_name='user') pteams = models.ManyToManyField(verbose\_name='项目组', to="Pteam", blank=True,null=True,related\_name='user') # pteam = models.ForeignKey(verbose\_name='项目组', to="Pteam", blank=True,null=True,related\_name='user') class Meta: verbose\_name\_plural = "用户表" def \_\_str\_\_(self): return self.name class Pteam(models.Model): name=models.CharField(max\_length=16, verbose\_name='项目组名', blank=True, null=True) groupname=models.CharField(max\_length=16, verbose\_name='项目组', blank=True, null=True) class Meta: verbose\_name\_plural = "项目组" def \_\_str\_\_(self): return self.groupname ############################host 相关 class Memory(models.Model): '''内存''' size=models.CharField(max\_length=32, blank=True, null=True, verbose\_name='内存/G') width=models.CharField(max\_length=8, blank=True, null=True, verbose\_name='位数') locator=models.CharField(max\_length=16, blank=True, null=True, verbose\_name='插槽') type=models.CharField(max\_length=16, blank=True, null=True, verbose\_name='内存类型') def \_\_str\_\_(self): return self.size class Meta: verbose\_name\_plural = "内存表" class Disk(models.Model): '''磁盘''' path = models.CharField(max\_length=64, blank=True, null=True, verbose\_name='挂载路径') size = models.CharField(max\_length=16, blank=True, null=True, verbose\_name='磁盘大小/G') remarks = models.CharField(max\_length=2048, blank=True, null=True, verbose\_name='备注') def \_\_str\_\_(self): return self.size class Meta: verbose\_name\_plural = "磁盘表" class Os(models.Model): '''系统''' name=models.CharField(max\_length=16, blank=True, null=True, verbose\_name='系统名称') def \_\_str\_\_(self): return self.name class Meta: verbose\_name\_plural = "操做系统表" class Login(models.Model): '''登陆相关''' login\_name = models.CharField(max\_length=16, default='root', verbose_name='登陆用户名') login\_pwd= models.CharField(max\_length=64, blank=True, null=True, verbose_name='登陆密码') auth=models.CharField(max\_length=8,blank=True, null=True, verbose\_name='具备权限') def \_\_str\_\_(self): return self.login_name class Meta: verbose\_name\_plural = "主机用户表" class Lable(models.Model): #标签 name = models.CharField(max\_length=16, blank=True, null=True, verbose\_name='标签') def \_\_str\_\_(self): return self.name class Meta: verbose\_name\_plural = "标签" class VpcNet(models.Model): title=models.CharField(max\_length=32, blank=True, null=True, verbose\_name='VPC网络ID') def \_\_str\_\_(self): return self.title class Meta: verbose\_name\_plural = "VPC网络ID" class VpcSwitch(models.Model): title=models.CharField(max\_length=32, blank=True, null=True, verbose\_name='VPC交换机ID') def \_\_str\_\_(self): return self.title class Meta: verbose\_name\_plural = "VPC交换机" class Host(models.Model): '''主机,阿里云eth0 内网网卡, eth1 公网网卡''' hostname= models.CharField(max\_length=64, blank=True, null=True, verbose\_name='阿里云主机名') ecsname= models.CharField(max\_length=64, blank=True, null=True, verbose\_name='阿里云实例ID') logining=models.ManyToManyField(to='Login',blank=True, null=True, verbose_name='受权用户') login\_port = models.CharField(max\_length=16, default='22',blank=True, null=True, verbose_name='ssh登陆端口') cpu= models.CharField(max\_length=8,blank=True, null=True, verbose\_name='CPU') lab= models.ForeignKey(to='Lable',blank=True, null=True, verbose_name='标签') mem= models.CharField(max\_length=8,blank=True, null=True, verbose\_name='内存/M') # mem= models.ForeignKey(to='Memory',blank=True, null=True, verbose_name='内存/M') speed = models.CharField(max\_length=8,blank=True, default='5',null=True, verbose\_name='带宽/M') disks= models.ManyToManyField(to='Disk', blank=True, null=True, verbose_name='磁盘') eth1\_network= models.CharField(max\_length=32, blank=True, null=True, verbose_name='公网IP') eth0\_network= models.CharField(max\_length=32,verbose_name='私网IP') sn= models.CharField(max\_length=64, blank=True, null=True, verbose\_name='sn') os= models.ForeignKey(to='Os', blank=True, null=True, verbose_name='操做系统') #os+版本号 kernel= models.CharField(max\_length=64, blank=True, null=True, verbose\_name='系统内核') #内核+版本号 the\_upper=models.ForeignKey(to='Host',blank=True,null=True,verbose\_name='宿主机',related_name='upper') source=models.ForeignKey(to='Source',blank=True,null=True,verbose\_name='来源类型',related\_name='qq') remarks = models.CharField(max\_length=2048, blank=True, null=True, verbose\_name='备注') createtime = models.CharField(max\_length=32, blank=True, null=True, verbose\_name='建立时间') expirytime = models.CharField(max\_length=32, blank=True, null=True, verbose\_name='到期时间') vpcnet = models.ForeignKey(to='VpcNet', blank=True, null=True, verbose\_name='VPC网络',related\_name='vpcnet') vpcsw = models.ForeignKey(to='VpcSwitch', blank=True, null=True, verbose_name='VPC交换机') vpccon = models.ForeignKey(to='VpcNet', blank=True, null=True, verbose\_name='VPC链接',related\_name='vpccon') state_choices=( (1,'Running'), (2,'下线'), (3,'关机'), (4,'删除'), ) state = models.SmallIntegerField(verbose\_name='主机状态', choices=state\_choices,blank=True,null=True,) def \_\_str\_\_(self): return self.eth0_network class Meta: verbose\_name\_plural = "主机表" class Source(models.Model): '''来源:阿里云、物理机(某机房等)''' name=models.CharField(max\_length=16,blank=True,null=True,verbose\_name='来源') def \_\_str\_\_(self): return self.name class Meta: verbose\_name\_plural = "主机来源表" class HostMonitor(models.Model): '''主机使用率数据(监控)''' timestamp=models.CharField(max\_length=64,blank=True,null=True,verbose\_name='UTC时间') host=models.ForeignKey(to='Host',blank=True,null=True,verbose\_name='实例id',related\_name='hm') cpu=models.IntegerField(blank=True,null=True,verbose_name='cpu使用率') mem=models.IntegerField(blank=True,null=True,verbose_name='内存使用率') load=models.IntegerField(blank=True,null=True,verbose_name='系统负载') iopswrite=models.IntegerField(blank=True,null=True,verbose_name='系统盘IO写次数/s') iopsread=models.IntegerField(blank=True,null=True,verbose_name='系统盘IO读次数/s') bpsread=models.IntegerField(blank=True,null=True,verbose_name='系统盘IO读带宽Byte/s') bpswrite=models.IntegerField(blank=True,null=True,verbose_name='系统盘IO写带宽Byte/s') intranetbandwidth=models.IntegerField(blank=True,null=True,verbose_name='内网带宽kbits/s') internetbandwidth=models.IntegerField(blank=True,null=True,verbose_name='公网带宽kbits/s') internetrx=models.IntegerField(blank=True,null=True,verbose_name='接收的公网流量 kbits') internettx=models.IntegerField(blank=True,null=True,verbose_name='发送的公网流量 kbits') intranetrx=models.IntegerField(blank=True,null=True,verbose_name='接受的内网流量 kbits') intranettx=models.IntegerField(blank=True,null=True,verbose_name='发送的内网流量 kbits') def \_\_str\_\_(self): return self.timestamp class Meta: verbose\_name\_plural = '主机监控数据' ##########业务表 class App(models.Model): name=models.CharField(max\_length=64,blank=True,null=True,verbose\_name='应用名') path=models.CharField(max\_length=256,blank=True,null=True,verbose\_name='应用路径') remarks = models.CharField(max\_length=2048, blank=True, null=True, verbose\_name='备注') ab_choices = ((1, 'A'), (2, 'B'),(3, 'VPC')) ab = models.SmallIntegerField(blank=True, null=True,verbose\_name='A/B组', choices=ab\_choices) environment_choices = ( (1, '开发环境'), (2, '测试环境'), (3, '灰度环境'), (4, '压测环境'), (5, '生产环境'), ) environment =models.SmallIntegerField(blank=True, null=True,verbose\_name='环境',choices=environment\_choices) pteamrole = models.ForeignKey(to='Pteam', blank=True, null=True, verbose\_name='项目组', related\_name='appteam') hosts = models.ManyToManyField(to='Host', blank=True, null=True, verbose\_name='对应主机', related\_name='apphost') class Meta: verbose\_name\_plural = "项目组应用" unique_together=\[ ('name','ab','environment'), \] def \_\_str\_\_(self): return self.name [@property](https://my.oschina.net/property) def ab_tag(self): return self.get\_ab\_display() [@property](https://my.oschina.net/property) def environment_tag(self): return self.get\_environment\_display() class JiraVersion(models.Model): time = models.CharField(max\_length=64, blank=True, null=True, verbose\_name='流程号') version = models.CharField(max\_length=32, blank=True, null=True, verbose\_name='版本号') jira=models.ForeignKey(to='Jira',blank=True, null=True, verbose\_name='jira', related\_name='jiraver') def \_\_str\_\_(self): return self.time class Meta: verbose\_name\_plural = "版本" class Jira(models.Model): name=models.CharField(max\_length=32,blank=True,null=True,verbose\_name='Jira需求编号') def \_\_str\_\_(self): return self.name class Meta: verbose\_name\_plural = "jira_id" class Project(models.Model): name=models.CharField(max\_length=32,blank=True,null=True,verbose\_name='项目名') tag_choices=((1,'刚录入'),(2,'提测'),(3,'已完结')) #标识,若是 本次应用上线完成后, 标识变为True tag=models.SmallIntegerField(verbose\_name='进度',default=1,choices=tag\_choices) jira=models.ForeignKey(to='Jira', blank=True, null=True, verbose\_name='jira', related\_name='jr') def \_\_str\_\_(self): return self.name class Meta: verbose\_name\_plural = "项目" class Package(models.Model): name = models.CharField(max\_length=64, blank=True, null=True, verbose\_name='包名') bool = models.BooleanField(default=0, verbose_name='是否应用') disname=models.CharField(max\_length=64, blank=True, null=True, verbose\_name='原包名') osspath = models.CharField(max\_length=128, blank=True, null=True, verbose\_name='oss路径') serverpath = models.CharField(max\_length=128, blank=True, null=True, verbose\_name='服务器路径') packagetype_choices = ( (1, 'war'), (2, 'jar'), (3, 'sql'), (4, 'xml'), (5, 'class'), (6, 'properties'), (7, 'key'), (8, 'other'), ) type=models.SmallIntegerField(blank=True, null=True,verbose\_name='类型',choices=packagetype\_choices) ctime=models.CharField(max\_length=32, blank=True, null=True, verbose\_name='建立时间') md5=models.CharField(max\_length=64, blank=True, null=True, verbose\_name='md5') packenv=models.CharField(max\_length=16,blank=True, null=True, default='全部环境', verbose\_name='配置所属环境') proj=models.ForeignKey(to='Project',blank=True, null=True, verbose\_name='所属项目',related\_name='pj') def \_\_str\_\_(self): return self.disname class Meta: verbose\_name\_plural = "包" class Record(models.Model): timestamp = models.CharField(max\_length=64, blank=True, null=True, verbose\_name='时间') status = models.CharField(max\_length=64, blank=True, null=True, verbose\_name='状态') project=models.ForeignKey(to='Project', blank=True, null=True, verbose\_name='项目', related\_name='proj') package=models.ManyToManyField(to='Package',blank=True, null=True, verbose\_name='包', related\_name='pack') env=models.ForeignKey(to='RecordEnv',blank=True, null=True, verbose\_name='环境', related\_name='env') def \_\_str\_\_(self): return self.timestamp class Meta: verbose\_name\_plural = "部署记录" class RecordEnv(models.Model): name=models.CharField(max\_length=64, blank=True, null=True, verbose\_name='环境') def \_\_str\_\_(self): return self.name class Meta: verbose\_name\_plural = "部署环境" ''' class Task(models.Model): jira=models.CharField(max\_length=32,blank=True,null=True,verbose\_name='jira_id') projectname=models.CharField(max\_length=32,blank=True,null=True,verbose\_name='项目') def \_\_str\_\_(self): return self.jira class Meta: verbose\_name\_plural = "发布流程" class TaskFile(models.Model): name=models.CharField(max\_length=64,blank=True,null=True,verbose\_name='文件名') disname=models.CharField(max\_length=64,blank=True,null=True,verbose\_name='显示文件名') osspath=models.CharField(max\_length=128,blank=True,null=True,verbose\_name='oss路径') timestamp=models.CharField(max\_length=64,blank=True,null=True,verbose\_name='时间') environment =models.SmallIntegerField(blank=True, null=True,verbose\_name='环境',choices=environment\_choices) packagetype = models.SmallIntegerField(blank=True, null=True, verbose\_name='包类型', choices=packagetype\_choices) task=models.ForeignKey(to='Task', blank=True, null=True, verbose\_name='项目', related\_name='ta') packagestate = models.ManyToManyField(to='FileState', blank=True, null=True, verbose\_name='包状态', related\_name='sta') def \_\_str\_\_(self): return self.disname class Meta: verbose\_name\_plural = "包详情" class FileState(models.Model): title=models.CharField(max\_length=16,blank=True,null=True,verbose\_name='状态') def \_\_str\_\_(self): return self.title class Meta: verbose\_name\_plural = "包状态" ''' #############系统操做日志记录表 class OperationLog(models.Model): user = models.ForeignKey(to='User', blank=True, null=True, verbose\_name='操做员', related\_name='us') ctime = models.DateTimeField(auto\_now\_add = True, verbose_name='访问时间') url = models.CharField(max\_length=256, blank=True, null=True, verbose\_name='访问url') proj = models.CharField(max\_length=32, blank=True, null=True, verbose\_name='project') action = models.CharField(max\_length=32, blank=True, null=True, verbose\_name='动做') explain = models.CharField(max\_length=128, blank=True, null=True, verbose\_name='说明') ##########中间件 #阿里云帐号 class ALiCloud(models.Model): username = models.CharField(max\_length=32, blank=True, null=True, verbose\_name='登陆用户') password = models.CharField(max\_length=128, blank=True, null=True, verbose\_name='登陆密码') remarks = models.CharField(max\_length=2048, blank=True, null=True, verbose\_name='备注') accesskey\_id = models.CharField(max\_length=128, blank=True, null=True, verbose_name='AccessKey') accesskeysecret = models.CharField(max\_length=128, blank=True, null=True, verbose\_name='AccessKeySecret') class Meta: verbose\_name\_plural = "阿里云" def \_\_str\_\_(self): return self.username #zk class Zookeeper(models.Model): ip=models.ForeignKey(to='Host',blank=True, null=True, verbose\_name='主机ip',related\_name='ip_zk') port=models.CharField(verbose\_name='端口号',blank=True, null=True,default='2181',max\_length=8) start\_user=models.CharField(max\_length=16,blank=True,null=True,verbose_name='启动用户',default='appuser') zk\_tag = models.CharField(max\_length=64, blank=True, null=True, verbose_name='标识') remarks = models.CharField(max\_length=2048, blank=True, null=True, verbose\_name='备注') apps=models.ManyToManyField(to='App', blank=True, null=True, verbose\_name='使用应用',related\_name='zk') class Meta: verbose\_name\_plural = "Zookeeper" def \_\_str\_\_(self): return self.ip.eth0_network+':'+self.port # return self.zk_tag #kafka class Kafka(models.Model): ip=models.ForeignKey(to='Host',blank=True, null=True, verbose\_name='主机ip',related\_name='ip_kafka') port=models.CharField(verbose\_name='端口号',blank=True, null=True,max\_length=8,default='9092') start\_user=models.CharField(max\_length=16,blank=True,null=True,verbose_name='启动用户',default='appuser') kafka\_tag = models.CharField(max\_length=64, blank=True, null=True, verbose_name='标识') remarks = models.CharField(max\_length=2048, blank=True, null=True, verbose\_name='备注') apps=models.ManyToManyField(to='App', blank=True, null=True, verbose\_name='使用应用',related\_name='kafka') class Meta: verbose\_name\_plural = "Kafka" def \_\_str\_\_(self): return self.ip.eth0_network+':'+self.port # return self.kafka_tag #oss class Oss(models.Model): login=models.ForeignKey(to='ALiCloud',blank=True, null=True, verbose_name='登陆') apps=models.ManyToManyField(to='App', blank=True, null=True, verbose\_name='相关应用',related\_name='oss') backetname=models.ManyToManyField(to='BacketName', blank=True, null=True, verbose_name='BacketName') oss\_tag = models.CharField(max\_length=64, blank=True, null=True, verbose_name='标识') remarks = models.CharField(max\_length=2048, blank=True, null=True, verbose\_name='备注') class Meta: verbose\_name\_plural = "Oss" def \_\_str\_\_(self): # from . import models as models_oss # print(models_oss.Oss.backetname.name) return self.oss_tag class BacketName(models.Model): name=models.CharField(max\_length=32,blank=True,null=True,verbose\_name='BacketName') oss\_auth\_choices = ((1, '私有'), (2, '公共读'), (3, '公共写'), ) ossauth = models.SmallIntegerField(verbose\_name='用户权限', choices=oss\_auth_choices) remarks = models.CharField(max\_length=2048, blank=True, null=True, verbose\_name='备注') class Meta: verbose\_name\_plural = "BacketName" def \_\_str\_\_(self): return self.name #mq class Consumer(models.Model): title=models.CharField(max\_length=32,blank=True,null=True,verbose\_name='CID') remarks = models.CharField(max\_length=2048, blank=True, null=True, verbose\_name='备注') class Meta: verbose\_name\_plural = "消费者" def \_\_str\_\_(self): return self.title class Producer(models.Model): title=models.CharField(max\_length=32,blank=True,null=True,verbose\_name='PID') remarks = models.CharField(max\_length=2048, blank=True, null=True, verbose\_name='备注') class Meta: verbose\_name\_plural = "生产者" def \_\_str\_\_(self): return self.title class Topic(models.Model): title = models.CharField(max\_length=32, blank=True, null=True, verbose\_name='TopicID') producer = models.ManyToManyField(to='Producer', blank=True, null=True, verbose_name='生产者') consumer = models.ManyToManyField(to='Consumer', blank=True, null=True, verbose_name='消费者') remarks = models.CharField(max\_length=2048, blank=True, null=True, verbose\_name='备注') class Meta: verbose\_name\_plural = "队列" def \_\_str\_\_(self): return self.title class MqCase(models.Model): url = models.CharField(max\_length=128, blank=True, null=True, verbose\_name='连接') name = models.CharField(max\_length=32, blank=True, null=True, verbose\_name='实例名') region = models.CharField(max\_length=16, blank=True, null=True, verbose\_name='区域') remarks = models.CharField(max\_length=2048, blank=True, null=True, verbose\_name='备注') class Meta: verbose\_name\_plural = "Mq实例" def \_\_str\_\_(self): return self.url class RabbitMQ(models.Model): case=models.ForeignKey(to='MqCase',blank=True, null=True, verbose_name='RabbitMQ实例') mq\_login=models.ForeignKey(to='ALiCloud',blank=True, null=True, verbose\_name='登陆') topic = models.ManyToManyField(to='Topic', blank=True, null=True, verbose_name='队列') remarks = models.CharField(max\_length=2048, blank=True, null=True, verbose\_name='备注') apps=models.ManyToManyField(to='App', blank=True, null=True, verbose\_name='相关应用',related\_name='mq') class Meta: verbose\_name\_plural = "RabbitMQ" def \_\_str\_\_(self): return self.case.name #redis class Redis(models.Model): port=models.CharField(max\_length=64, blank=True, null=True, verbose\_name='端口',default='6379') password=models.CharField(max\_length=128, blank=True, null=True, verbose\_name='登陆密码') url = models.CharField(verbose\_name='连接',max\_length=64, blank=True, null=True) redis\_tag = models.CharField(max\_length=1024, blank=True, null=True, verbose_name='标识') remarks = models.CharField(max\_length=2048, blank=True, null=True, verbose\_name='备注') apps=models.ManyToManyField(to='App', blank=True, null=True, verbose\_name='相关应用',related\_name='redis') class Meta: verbose\_name\_plural = "Redis" def \_\_str\_\_(self): return self.url #mysql class MysqlLogin(models.Model): title = models.CharField(max\_length=64, blank=True, null=True, verbose\_name='受权帐户') username = models.CharField(max\_length=32, blank=True, null=True, verbose\_name='用户名') password = models.CharField(max\_length=128, blank=True, null=True, verbose\_name='密码') mysql\_auth\_choices = ((1, 'ReadOnly'), (2, 'ReadWrite'), (3, 'root'), ) mysqlauth = models.SmallIntegerField(verbose\_name='用户权限', choices=mysql\_auth_choices) database=models.ManyToManyField(to='DataBase', blank=True, null=True, verbose\_name='库名',related\_name='logindatabase') remarks = models.CharField(max\_length=2048, blank=True, null=True, verbose\_name='备注') class Meta: verbose\_name\_plural = "MysqlLogin" def \_\_str\_\_(self): return self.username class Mysql(models.Model): url = models.CharField(max\_length=64, blank=True, null=True, verbose\_name='实例url') name = models.CharField(max\_length=32, blank=True, null=True, verbose\_name='实例名') hostname = models.CharField(max\_length=32, blank=True, null=True, verbose\_name='实例id') type = models.CharField(max\_length=16, blank=True, null=True, verbose\_name='数据库版本') cpu = models.IntegerField(max\_length=4, blank=True, null=True, verbose\_name='cpu') memory = models.IntegerField(blank=True, null=True, verbose_name='内存') iops = models.IntegerField( blank=True, null=True, verbose_name='IOPS') maxconnet = models.IntegerField( blank=True, null=True, verbose_name='最大链接数') maxstorage = models.CharField(max\_length=16, blank=True, null=True, verbose\_name='存储空间/G') usestorage = models.CharField(max\_length=16, blank=True, null=True, verbose\_name='使用空间/G') remarks = models.CharField(max\_length=2048, blank=True, null=True, verbose\_name='备注') # mysql\_login = models.ManyToManyField(to='MysqlLogin',blank=True, null=True, verbose\_name='登陆',related_name='mysqlcase') class Meta: verbose\_name\_plural = "Mysql实例" def \_\_str\_\_(self): return self.name class DataBase(models.Model): name=models.CharField(max\_length=64, blank=True, null=True, verbose\_name='库') databases = models.ForeignKey(to='Mysql', blank=True, null=True, verbose\_name='实例名', related\_name='databasecase') class Meta: verbose\_name\_plural = "库" def \_\_str\_\_(self): return self.name \# class Mysql(models.Model): # case=models.ForeignKey(to='MysqlCase',verbose_name='实例',blank=True, null=True) # remarks = models.CharField(max\_length=2048, blank=True, null=True, verbose\_name='备注') # port=models.CharField(max\_length=8, blank=True, null=True, verbose\_name='端口',default='3306') # mysql\_login=models.ManyToManyField(to='MysqlLogin',blank=True, null=True, verbose\_name='登陆',related_name='mysql') # type_choices = ((1,'mysql'), # (2,'mongodb'), # ) # type=models.SmallIntegerField(default=1,verbose\_name='类型', choices=type\_choices) # mysql\_tag = models.CharField(max\_length=1024, blank=True, null=True, verbose_name='标识') # class Meta: # verbose\_name\_plural = "Mysql" # def \_\_str\_\_(self): # return self.case.name class Ftp(models.Model): username = models.CharField(max\_length=64, blank=True, null=True, verbose\_name='用户') password = models.CharField(max\_length=64, blank=True, null=True, verbose\_name='密码') path = models.CharField(max\_length=64, blank=True, null=True, verbose\_name='项目') remarks = models.CharField(max\_length=2048, blank=True, null=True, verbose\_name='备注') class Meta: verbose\_name\_plural = "Ftp" def \_\_str\_\_(self): return self.username class Svn(models.Model): path=models.CharField(max\_length=64, blank=True, null=True, verbose\_name='项目') remarks=models.CharField(max\_length=2048, blank=True, null=True, verbose\_name='备注') auth_choices = ((1, 'r'), (2, 'rw'), ) svnauth = models.SmallIntegerField(verbose\_name='权限', choices=auth\_choices) groups=models.ManyToManyField(to='SvnGroup',blank=True, null=True,verbose_name='Svn组') class Meta: verbose\_name\_plural = "Svn" def \_\_str\_\_(self): return self.path class SvnGroup(models.Model): name = models.CharField(max\_length=32, blank=True, null=True, verbose\_name='组名') username = models.CharField(max\_length=32, blank=True, null=True, verbose\_name='用户') password = models.CharField(max\_length=64, blank=True, null=True, verbose\_name='密码') remarks = models.CharField(max\_length=2048, blank=True, null=True, verbose\_name='备注') class Meta: verbose\_name\_plural = "Svn用户组" def \_\_str\_\_(self): return self.name class GitLab(models.Model): pass
water.pymysql
代码git
import json import string from django.core.exceptions import ValidationError from django.forms import ModelForm from django.forms import Form from django.forms import fields from django.forms import widgets from django.db.models import Q from django.conf import settings from django.utils.safestring import mark_safe from django.core.urlresolvers import reverse from django.conf.urls import url,include from django.shortcuts import HttpResponse,render,redirect from water.service import v1 from rbac import models from utlis import jiami_class from utlis import time_class from utlis import arya_func from utlis import webssh_class from utlis.log_class import Logger #主机 class LableConfig(v1.AryaConfig): list_display = \['name'\] # show_add = True v1.site.register(models.Lable, LableConfig) class MemoryConfig(v1.AryaConfig): list_display = \['size','width','locator','type'\] # show_add = True v1.site.register(models.Memory, MemoryConfig) class DiskConfig(v1.AryaConfig): list_display = \['path','size',\] v1.site.register(models.Disk, DiskConfig) class LoginConfig(v1.AryaConfig): def login\_pwd\_base(self,row=None,is_title=None): if is_title: return '登陆密码' obj=models.Login.objects.filter(pk=row.id).first() ret=jiami\_class.jiami().base\_str\_decrypt(obj.login\_pwd) return ret list\_display = \['id','login\_name',login\_pwd\_base\] def add(self,req): ''' 传递self对象 传递req 传递 加密解密的 在前段页面中的关键字 ''' ret=arya\_func.core\_add(self,req,'login_pwd') self.\_log\_in\_db(req, url=self.add\_log_url, proj=self.mod, action='add', msg='add' + self.mod) return ret def change(self,req,nid): ''' 传递self对象 传递req 传递被修改者id 传递 加密解密的 在前段页面中的关键字 ''' ret=arya\_func.core\_change(self,req,nid,'login_pwd') self.\_log\_in\_db(req, url=self.update\_log_url, proj=self.mod, action='update', msg='update' + self.mod) return ret v1.site.register(models.Login, LoginConfig) class OsConfig(v1.AryaConfig): list_display = \['name',\] v1.site.register(models.Os, OsConfig) class NetworkConfig(v1.AryaConfig): list\_display = \['ip\_address','mac_address'\] \# v1.site.register(models.Network,NetworkConfig) class HostConfig(v1.AryaConfig): show_ali=True _monitor = True #网页登陆ssh开关 # _webssh = True def detail\_view(self,row=None,is\_title=None): if is_title: return '详情' app=self.model\_class.\_meta.app_label mod=self.model\_class.\_meta.model_name \_str='water:%s\_%s_detail' %(app,mod) url=reverse(viewname=_str,args=(row.id,)) result='<a href="{0}" class="btn btn-info">查看详情</a>'.format(url) return mark_safe(result) # def gouzi(self): #经过 钩子函数 增长能够解析的URL # return \[url('^(\\d+)/detail.html/', self.detail, name='%s_%s_detail' % (self.app, self.mod)),\] def detail(self,req,nid): if req.method=='GET': obj = models.Host.objects.filter(pk=nid).first() else: hostname=req.POST.get('hostname').strip().lstrip('主机名:') from client.bin.run import JG_info JG\_func = JG\_info.\_begin(no\_all_in=hostname) # print(JG_func) return HttpResponse(JG_func) return render(req, 'detail.html', locals()) def disk(self,row=None,is_title=None): if is_title: return '磁盘' value\_list=models.Host.objects.filter(pk=row.id).values('disks\_\_size') ret_li=\[\] for value in value_list: ret\_li.append(value\['disks\_\_size'\]) try: ret='+'.join(ret_li) except TypeError: ret = '' return ret def get\_model\_form(self): if self.model_f: return self.model_f class Dynamic(ModelForm): # def \_\_init\_\_(self, \*args, \*\*kwargs): # super(Dynamic, self).\_\_init\_\_(\*args, \*\*kwargs) # print(self.base_fields.values()) # print(self.base\_fields\['hostname'\].\_\_dict__) # print(self.base\_fields\['logining'\].\_\_dict__) loginname=fields.CharField(widget=widgets.Textarea(),label='登陆用户') # #PasswordInput loginpwd=fields.CharField(widget=widgets.Textarea(),label='登陆密码') # eth0\_network=fields.CharField(max\_length=32,error_messages=) class Meta: model=models.Host # fields='\_\_all\_\_' # exclude=\['logining'\] fields=\['hostname','ecsname','loginname','loginpwd', 'loginname','loginpwd','login_port','logining', 'cpu','lab','mem','speed','disks', 'eth1\_network','eth0\_network','sn','os', 'kernel','the_upper','source', 'state','remarks','state' \] error_messages={ 'eth0_network':{ 'required': 'ip不能为空' }, } widgets={ 'hostname': widgets.TextInput(attrs={'class': 'done'}), 'ecsname': widgets.TextInput(attrs={'class': 'done'}), 'login_port': widgets.TextInput(attrs={'class': 'done'}), 'cpu': widgets.TextInput(attrs={'class': 'done'}), 'mem': widgets.TextInput(attrs={'class': 'done', }), 'eth1_network': widgets.TextInput(attrs={'class': 'done',}), 'eth0_network': widgets.TextInput(attrs={'class': 'done', }), 'sn': widgets.TextInput(attrs={'class': 'done',}), 'speed': widgets.TextInput(attrs={'class': 'done', }), 'kernel': widgets.TextInput(attrs={'class': 'done', }), 'remarks': widgets.Textarea(attrs={'class': 'done', }), 'createtime': widgets.TextInput(attrs={'class': 'done', }), 'disks': widgets.SelectMultiple(attrs={'class': 'done', }), 'os': widgets.Select(attrs={'class': 'done', }), 'state': widgets.Select(attrs={'class': 'done',}), # 'logining':widgets.SelectMultiple(attrs={'class':'displaynone'}) , } # def \_\_init\_\_(self,\*args,\*\*kwargs): # super(Dynamic, self).\_\_init\_\_(\*args,\*\*kwargs) # self.base_fields\['logining'\].widget.attr.update({'display':'none'}) def clean(self): login_li=\[\] user\_li=self.cleaned\_data\['loginname'\].strip().split('\\r\\n') pwd\_li=self.cleaned\_data\['loginpwd'\].strip().split('\\r\\n') if len(user\_li) != len(pwd\_li): self.add_error('loginname',ValidationError('用户名密码数量不一致')) return self.cleaned_data for line in range(len(user_li)): jiami\_pwd = jiami\_class.jiami().base\_str\_encrypt(pwd_li\[line\]) login\_obj=models.Login.objects.filter(login\_name=user\_li\[line\],login\_pwd=jiami_pwd).first() if not login_obj: login\_obj=models.Login.objects.create(login\_name=user\_li\[line\], login\_pwd=jiami_pwd) login\_li.append(login\_obj.id) self.cleaned\_data\['logining'\]=login\_li return self.cleaned_data return Dynamic def list(self,request): self.request=request search_q=request.GET.get('q') candition_q=Q() search\_list=self.aget.get\_search_list() if search\_list and search\_q: for search\_item in search\_list: temp_q=Q() temp\_q.children.append((search\_item,search_q)) candition\_q.add(temp\_q,'OR') pteam\_obj=request.session.get(settings.PTEAM\_OBJ) if pteam_obj != 1: host\_list=request.session.get(settings.PERMISSION\_HOST)\['host'\] queryset=models.Host.objects.filter(candition\_q,pk\_\_in=host\_list).order\_by('-id') else: queryset=models.Host.objects.filter(candition\_q).order\_by('-id') data=v1.ChangeList(self, queryset) self.\_log\_in\_db(request, url=self.list\_log_url, proj=self.mod, action='list', msg='list' + self.mod) return render(request,'list.html',{'data':data,'req':request}) def change(self,req,nid): log_dic={'user':None,'pwd':None,'hero':None} logger=Logger(loglevel=1, logger="fox",num=1).getlog() dynamic\_form = self.get\_model_form() obj=self.model_class.objects.filter(id=nid).first() if req.method=='GET': form = dynamic_form(instance=obj) login\_name\_li=\[\] login\_pwd\_li=\[\] #剔除loginning中的多对多显示 form.fields.pop('logining') ##拿出loginning中的多对多数据 logining=form.initial.pop('logining') for login_item in logining: base\_str=jiami\_class.jiami().base\_str\_decrypt(login\_item.login\_pwd) login\_name\_li.append(login\_item.login\_name) login\_pwd\_li.append(base_str) #经过换行拼接 \_loginname='\\r\\n'.join(login\_name_li) \_loginpwd='\\r\\n'.join(login\_pwd_li) form.initial\['loginname'\]=_loginname form.initial\['loginpwd'\]=_loginpwd log\_dic\['user'\]='\\t'.join(login\_name_li) log\_dic\['pwd'\]='\\t'.join(login\_pwd_li) logger.info('%s,%s' %(log\_dic\['user'\],log\_dic\['pwd'\])) return render(req,'edit.html',{'data':form,'req':req,'tag':True}) else: form = dynamic_form(instance=obj,data=req.POST) if form.is_valid(): form.save() log_dic\['hero'\]=req.session.get(settings.USER) logger.info('------------The above is %s modification',log_dic\['hero'\]) self.\_log\_in\_db(req, url=self.update\_log_url, proj=self.mod, action='update', msg='update' + self.mod) return redirect(self.jump.list_url) return render(req, 'edit.html', {'data': form,'req':req}) #显示月租金 def cost(self, row=None, is_title=None): if is_title: return '月租/元' obj = models.Host.objects.filter(pk=row.id).first() try: return obj.remarks except: return '' #监控 def monitor(self, req, nid): if req.method == 'GET': start\_time,end\_time=time\_class.Time().ali\_def_monitor() obj = self.model_class.objects.filter(id=nid) monitor_obj=obj.first().hm.filter( # timestamp__gte='2018-08-10T06:49:58Z', # timestamp__lte='2018-08-10T06:54:58Z') timestamp\_\_gte=start\_time, timestamp\_\_lte=end\_time) #默认请求 return render(req, 'monitor.html', locals()) else: get_dic=req.POST if get_dic.get('tag'): #有条件 pass else: #无条件 obj_li=models.Host.objects.filter(id=nid) obj = self.model_class.objects.filter(id=nid).delete() self.site.\_log\_in\_db(req, url=self.site.delete\_log_url, proj=self.site.mod, action='del', msg='del_' + self.site.mod) return redirect(self.jump.list_url) def add(self,req): dynamic\_form=self.get\_model_form() if req.method=='GET': form=dynamic_form() form.fields.pop('logining') # print(form.clean_logining()) return render(req,'hosts/add.html',{'data':form,'req':req}) else: form=dynamic_form(data=req.POST) if form.is_valid(): form.save() self.\_log\_in\_db(req, url=self.add\_log_url, proj=self.mod, action='add', msg='add' + self.mod) return redirect(self.jump.list_url) return render(req, 'hosts/add.html', {'data': form,'req':req}) def app\_name(self,row=None,is\_title=None): if is_title: return '应用' obj = models.Host.objects.filter(pk=row.id).first() str='<a href="/water/rbac/app/list.html?k={0}">{1}</a>' #删除结尾数字 ret='' for item in obj.apphost.all(): ret+=str.format(item.name.rstrip(string.digits),item.name.rstrip(string.digits)) return mark_safe(ret) list\_display = \['hostname',app\_name,'cpu','mem',disk,'eth1\_network','eth0\_network'\] # list\_display = \['hostname',app\_name,'cpu','mem',disk,'eth1\_network','eth0\_network'\] search\_list = \['eth1\_network\_\_contains','eth0\_network\_\_contains','hostname\_\_contains'\] v1.site.register(models.Host, HostConfig) class VpcNetConfig(v1.AryaConfig): list_display = \['title',\] v1.site.register(models.VpcNet, VpcNetConfig) class VpcSwitchConfig(v1.AryaConfig): list_display = \['title',\] v1.site.register(models.VpcSwitch, VpcSwitchConfig) class SourceConfig(v1.AryaConfig): list_display = \['name'\] v1.site.register(models.Source, SourceConfig) #应用 class AppConfig(v1.AryaConfig): def get\_model\_form(self): if self.model_f: return self.model_f class Dynamic(ModelForm): class Meta: model=self.model_class fields='\_\_all\_\_' # widgets={ # 'hosts':widgets.Select(attrs={'size':10}), # } return Dynamic def ab(self,row=None,is_title=None): if is_title: return 'AB组' ret = models.App.objects.filter(pk=row.id).first().get\_ab\_display() return ret def environment(self,row=None,is_title=None): if is_title: return '主机环境' ret = models.App.objects.filter(pk=row.id).first().get\_environment\_display() return ret def app\_name(self,row=None,is\_title=None): if is_title: return '应用' obj = models.App.objects.filter(pk=row.id).first() str='<a href="/water/rbac/app/list.html?k={0}">{1}</a>' #删除结尾数字 q_str=obj.name.rstrip(string.digits) ret=str.format(q\_str,q\_str) return mark_safe(ret) def hosts(self,row=None,is_title=None): if is_title: return '主机列表' value\_list = models.App.objects.filter(pk=row.id).values('hosts\_\_eth0_network') str='<a href="/water/rbac/host/list.html?q={0}">{1}</a>' ret='' for value in value_list: val=value\['hosts\_\_eth0\_network'\] jg_str=str.format(val,val) ret+=jg_str return mark_safe(ret) def list(self,req): self.request=req pteam\_obj = req.session.get(settings.PTEAM\_OBJ) if req.GET.get('pteamrole') or req.GET.get('ab') or req.GET.get('environment'): get_pteamrole=req.GET.get('pteamrole','') get_ab=req.GET.get('ab','') get_environment=req.GET.get('environment','') search_q = req.GET.get('q','') candition_q = Q() search\_list = self.aget.get\_search_list() if search\_list and search\_q: for search\_item in search\_list: temp_q = Q() temp\_q.children.append((search\_item, search_q)) candition\_q.add(temp\_q, 'OR') get\_ab\_tag='' get\_environment\_tag='' filter_q={} if get_pteamrole: filter\_q\['pteamrole\_\_groupname'\]=get_pteamrole if get_ab: for i in models.App.ab_choices: if get_ab in i : filter_q\['ab'\]=i\[0\] continue if get_environment: for i in models.App.environment_choices: if get_environment in i : filter_q\['environment'\]=i\[0\] continue if pteam_obj != 1: app\_list = req.session.get(settings.PERMISSION\_HOST)\['app'\] queryset = models.App.objects.filter(candition\_q,**filter\_q,pk\_\_in=app\_list).order_by('-id') else: queryset=models.App.objects.filter(candition\_q,**filter\_q).order_by('-id') #经过点击A标签的跳转 elif req.GET.get('k'): self.request = req search_q = req.GET.get('k') candition_q = Q() #拿到须要匹配的列表 accurate\_list = self.aget.get\_accurate_list() if accurate\_list and search\_q: for accurate\_item in accurate\_list: #因为测试、灰度环境的应用名不带数字,生产环境的带数字,因此要匹配到xxx1,xxx,xxx2等 ser\_li=\['','temp\_a', 'temp\_b', 'temp\_c', 'temp\_d', 'temp\_e'\] for i in ser_li: #列表第一个值为了匹配 没有数字的(灰度,测试等环境) JG=str(ser\_li.index(i)) if ser\_li.index(i) !=0 else '' # JG=str(ser_li.index(i) + 1) i = Q() #拼接生产环境的字符串偶偶额怒 i.children.append((accurate\_item, search\_q+JG)) candition_q.add(i, 'OR') if pteam_obj != 1: #获取 权限所能看见的主机列表 app\_list = req.session.get(settings.PERMISSION\_HOST)\['app'\] queryset = models.App.objects.filter(candition\_q, pk\_\_in=app\_list).order\_by('-id') else: queryset = models.App.objects.filter(candition\_q).order\_by('-id') else: self.request = req search_q = req.GET.get('q') candition_q = Q() search\_list = self.aget.get\_search_list() if search\_list and search\_q: for search\_item in search\_list: temp_q = Q() temp\_q.children.append((search\_item, search_q)) candition\_q.add(temp\_q, 'OR') if pteam_obj != 1: app\_list = req.session.get(settings.PERMISSION\_HOST)\['app'\] queryset = models.App.objects.filter(candition\_q,pk\_\_in=app\_list).order\_by('-id') else: queryset = models.App.objects.filter(candition\_q).order\_by('-id') data = v1.ChangeList(self, queryset) return render(req, 'list.html', {'data': data, 'req': req}) list\_display = \[app\_name, 'pteamrole',ab,environment,hosts\] search\_list = \['name\_\_contains', 'hosts\_\_eth0\_network__contains', # 'name' \] accurate_list=\['name',\] def search\_button\_list(self): button_list = \[ \['项目组', \[\], 'pteamrole'\], \['组', \['A', 'B', 'VPC'\], 'ab'\], \['环境', \['开发环境', '测试环境', '灰度环境', '压测环境', '生产环境'\], 'environment'\] \] obj_l=models.Pteam.objects.all() for obj in obj_l: button_list\[0\]\[1\].append(obj.groupname) return button_list v1.site.register(models.App, AppConfig)
v1.pyweb
代码ajax
import copy from django.shortcuts import HttpResponse,render,redirect from django.utils.safestring import mark_safe \# from django.urls import reverse from django.core.urlresolvers import reverse from django.forms import ModelForm from rbac import models from django.conf.urls import url,include from django.db.models import Q from ..utils.page import Pagination from rbac.views import init from django.conf import settings \# from clientapi.views import ret\_salt\_api \# from clientapi.views import client_func \# from keras.models import load_model from clientapi import views from app01.task import log_indb class ChangeList(object): #data=ChangeList(self,queryset) def \_\_init\_\_(self,site,queryset): self.model\_class=site.model\_class self.get\_list\_display=site.get\_list\_display(site.request) self.site=site self.get\_show\_ali=site.get\_show\_ali(site.request) self.get\_show\_all\_data=site.get\_show\_all\_data(site.request) self.get\_show\_add=site.get\_show\_add(site.request) self.get\_show\_dels=site.get\_show\_dels(site.request) self.add\_url=site.add\_url self.get\_search\_list=site.get\_search\_list self.get\_accurate\_list=site.get\_accurate\_list self.get\_search\_button=site.get\_search\_button self.get_q=site.request.GET.get('q','') self.pteamrole=site.request.GET.get('pteamrole','') self.ab=site.request.GET.get('ab','') self.environment=site.request.GET.get('environment','') # par\_page=site.par\_page page\_count=site.page\_count request=site.request query_get=copy.deepcopy(request.GET) #获取页码 request_page=site.request.GET.get('page','1') #获取每页显示多少条信息 par\_page = int(site.request.GET.get('page\_list', '10')) all_count=queryset.count() page\_url=site.list\_url pag\_obj=Pagination(request\_page,all\_count,page\_url,query\_get,par\_page,page_count) self.queryset=queryset\[pag\_obj.start:pag\_obj.end\] self.page\_html=pag\_obj.page_html() self.page\_list\_html=pag\_obj.page\_list_html() def table_head(self): result = \[\] for item in self.get\_list\_display: if isinstance(item,str): temp=self.model\_class.\_meta.get\_field(item).verbose\_name else: temp=item(self.site,is_title=True) result.append(temp) return result def table_body(self): result=\[\] for obj in self.queryset: ret=\[\] for item in self.get\_list\_display: if isinstance(item,str): temp=getattr(obj,item) else: try: temp = item(row=obj) except TypeError: temp = item(self.site,row=obj) # temp=item(self,row=obj) ret.append(temp) result.append(ret) return result class AryaConfig(object): def \_\_init\_\_(self,model_class,site): self.model\_class=model\_class self.app=self.model\_class.\_meta.app_label self.mod=self.model\_class.\_meta.model_name self.site=site self.list\_log\_url = '/water/' + self.app + '/' + self.mod + '/list.html' self.remarks\_log\_url = '/water/' + self.app + '/' + self.mod + '/remarks.html' self.add\_log\_url = '/water/' + self.app + '/' + self.mod + '/add.html' self.update\_log\_url = '/water/' + self.app + '/' + self.mod + '/update.html' self.delete\_log\_url = '/water/' + self.app + '/' + self.mod + '/delete.html' # sf\_model=load\_model('model\_v0.314\_epoch-07-loss0.0742-valLoss0.1214.hdf5') # request.session\['model'\]=sf_model _remarks=True _confpro=False _edit=True _add=True _del=True _dels = True show_ali=False show\_all\_data = False list_display=\[\] show_add=False show_dels=False model_f=False search_list=\[\] accurate_list=\[\] search\_button\_list=\[\] # par_page=10 page_count=7 [@property](https://my.oschina.net/property) def urls(self): parttents = \[ url('^$', self.list,name='%s_%s_list' %(self.app,self.mod)), url('list.html', self.list,name='%s_%s_list' %(self.app,self.mod)), url('^add.html', self.add,name='%s_%s_add' %(self.app,self.mod)), url('^(\\d+)/delete.html', self.delete,name='%s_%s_del' %(self.app,self.mod)), url('^(\\d+)/update.html', self.change,name='%s_%s_edit' %(self.app,self.mod)), url('^(\\d+)/remarks.html', self.remarks,name='%s_%s_remarks' %(self.app,self.mod)), \] parttents+=self.gouzi() return parttents,None,None def gouzi(self): return \[\] def get\_show\_ali(self,request): return self.show_ali def get\_show\_all_data(self,request): return self.show\_all\_data def get\_show\_add(self,request): if not self._add: return self.show_add if 'add' in request.permission\_code\_list: # if True: self.show_add=True return self.show_add def get\_show\_dels(self,request): if not self._dels: return self.show_dels if 'del' in request.permission\_code\_list: # if True: self.show_dels=True else: self.show_dels = False return self.show_dels def get\_search\_list(self): result=\[\] result.extend(self.search_list) return result def get\_accurate\_list(self): result = \[\] result.extend(self.accurate_list) return result def get\_search\_button(self): result=\[\] try: JG\_l = self.search\_button_list() result.extend(JG_l) except TypeError: result.extend(self.search\_button\_list) return result def get\_list\_display(self,request): result=\[\] result.extend(self.list_display) # 若是有查看详情权限 # if self._confpro: # if 'confpro' in request.permission\_code\_list: # result.append(self.configproj_view) #若是有查看备注权限 if self._remarks: if 'remarks' in request.permission\_code\_list: result.append(self.remarks_view) # 若是有编辑权限 # if True: if self._edit: if 'edit' in request.permission\_code\_list: # result.append(AryaConfig.change_view) result.append(self.change_view) # 若是有删除权限 # if True: if self._del: if 'del' in request.permission\_code\_list: result.append(AryaConfig.delete_view) result.insert(0,AryaConfig.checkbox_view) return result def remarks\_view(self,row=None,is\_title=None): if is_title: return '备注' \_str='water:%s\_%s_remarks' %(self.app,self.mod) url=reverse(viewname=_str,args=(row.id,)) result='<a href="{0}" class="btn btn-info">查看备注</a>'.format(url) return mark_safe(result) def checkbox\_view(self,row=None,is\_title=None): if is_title: return '' result='<input type="checkbox" value={0}>'.format(row.id) return mark_safe(result) def change\_view(self,row=None,is\_title=None): if is_title: return '修改' \_str='water:%s\_%s_edit' %(self.app,self.mod) url=reverse(viewname=_str,args=(row.id,)) result='<a href="{0}" class="btn btn-warning">修改</a>'.format(url) return mark_safe(result) def delete\_view(self,row=None,is\_title=None): if is_title: return '删除' \_str='water:%s\_%s_del' %(self.app,self.mod) url=reverse(viewname=_str,args=(row.id,)) result='<a href="{0}" class="btn btn-danger">删除</a>'.format(url) return mark_safe(result) def get\_model\_form(self): if self.model_f: return self.model_f class Dynamic(ModelForm): class Meta: model=self.model_class fields='\_\_all\_\_' return Dynamic #调用celery 请求日志入库 def \_log\_in_db(self,req,url,proj=None, action=None,explain=None,msg=None): log_indb(req.session.get(settings.USERID), url, proj=proj, action=action, msg=msg) def list(self,req): self.request=req search_q=req.GET.get('q') candition_q=Q() search\_list=self.get\_search_list() if search\_list and search\_q: for search\_item in search\_list: temp_q=Q() temp\_q.children.append((search\_item,search_q)) candition\_q.add(temp\_q,'OR') queryset=self.model\_class.objects.filter(candition\_q).order_by('-id') data=ChangeList(self,queryset) self.\_log\_in\_db(req,url=self.list\_log_url, proj=self.mod, action='list',msg='list_'+self.mod) return render(req,'list.html',{'data':data,'req':req}) def remarks(self,req,nid): # dynamic\_form = self.get\_model_form() obj = self.model_class.objects.filter(id=nid) if req.method=='POST': remarks=req.POST.get('remarks') obj.update(remarks=remarks) return redirect(self.list_url) self.\_log\_in\_db(req, url=self.remarks\_log_url, proj=self.mod, action='remarks', msg='remarks_'+self.mod) return render(req, 'remarks.html', locals()) def add(self,req): dynamic\_form=self.get\_model_form() if req.method=='GET': form=dynamic_form() return render(req,'add.html',{'data':form,'req':req}) else: form=dynamic_form(data=req.POST) if form.is_valid(): form.save() self.\_log\_in\_db(req, url=self.add\_log_url, proj=self.mod, action='add', msg='add_' + self.mod) return redirect(self.list_url) return render(req, 'add.html', {'data': form,'req':req}) def delete(self,req,nid): if req.method=='GET': return render(req,'del.html',{'req':req}) else: obj=self.model_class.objects.filter(id=nid).delete() self.\_log\_in\_db(req, url=self.delete\_log_url, proj=self.mod, action='del', msg='del_'+self.mod) return redirect(self.list_url) def change(self,req,nid): dynamic\_form = self.get\_model_form() obj=self.model_class.objects.filter(id=nid).first() if req.method=='GET': form = dynamic_form(instance=obj) return render(req,'edit.html',{'data':form,'req':req}) else: form = dynamic_form(instance=obj,data=req.POST) if form.is_valid(): form.save() self.\_log\_in\_db(req, url=self.update\_log_url, proj=self.mod, action='update', msg='update_'+self.mod) return redirect(self.list_url) return render(req, 'edit.html', {'data': form,'req':req}) [@property](https://my.oschina.net/property) def list_url(self): str='water:%s_%s_list' %(self.app,self.mod) result=reverse(viewname=str) return result [@property](https://my.oschina.net/property) def del_url(self): str='water:%s_%s_del' %(self.app,self.mod) result=reverse(viewname=str) return result @property def add_url(self): str = 'water:%s_%s_add' % (self.app, self.mod) result = reverse(viewname=str) return result class AryaSite(object): def \_\_init\_\_(self): self._registry={} def register(self,model\_class,model\_config): #实例化 self.\_registry\[model\_class\]=model\_config(model\_class,self) #用于 ali_func 的反向url # self.app = model\_class.\_meta.app_label # self.mod = model\_class.\_meta.model_name @property def urls(self): parttents=\[ url('^login/', init.login), url('^logout/', init.logout), url('^register/', init.register), url('^sendmail/', init.sendmail), url('^home/', init.home), url('^ali\_client\_api.html/', views.ali\_ret\_api ), url('^db\_func.html/', views.db\_func ), url('^ali\_main.html/', views.ali\_main ), url('^celery\_status.html/', views.celery\_status ), url('^alirds\_client\_api.html/', views.alirds\_ret\_api ), \] for model\_class,model\_config in self._registry.items(): ''' url("^rbac/lable/" ), url("^db/host/" , url), url("^db/host/" (\[\],None,None)), ''' #rbac #Lable JG="^{0}/{1}/".format(model\_class.\_meta.app\_label,model\_class.\_meta.model\_name) pt=url(JG,model_config.urls) parttents.append(pt) return parttents site=AryaSite()
views.pyredis
代码sql
import json import os import time import datetime import importlib import re import requests from datetime import timedelta from io import BytesIO from django.db import transaction from django.db.models import Q from rest_framework.views import APIView from django.http import JsonResponse from django.shortcuts import render,HttpResponse,redirect from rbac import models from django.conf import settings from rbac.service.init\_permission import init\_permission from rbac.service.init\_permission import rest\_init_menu from django.views.decorators.csrf import csrf\_exempt,csrf\_protect from utlis import check_code from utlis.mail_class import SendMail from utlis.form_class import LoginForm from utlis.jiami_class import jiami from utlis.form_class import RegisterForm \# from utlis.salt_api import SaltApi from django.views.decorators.csrf import csrf\_exempt,csrf\_protect from app01.task import log_indb class Init(object): def \_\_init\_\_(self): self.token='' self.key='0SM35tyB%' self.name=\['jenkins','ansible'\] def home(self,request): if request.method=='GET': return render(request,'home.html',{'req':request}) else: time_li = \[\] ms_li = \[\] ret\_dic={'status':True,'time':time\_li,'ms':ms_li} path = '/mnt/www/pinglog/' D = datetime.datetime.now().strftime('%Y%m%d') path = path + D with open('1', 'r') as r: # with open(path, 'r') as r: JG_li = r.read().split('\\n') for item in JG_li: try: t, ms = item.split(' ') # print(t,ms) time_li.append(t) ms_li.append(ms) except ValueError: pass if len(time_li)>60: ret\_dic\['time'\]=time\_li\[-60:\] ret\_dic\['ms'\]=ms\_li\[-60:\] return HttpResponse(json.dumps(ret_dic)) def login(self,request): if request.method=='GET': form=LoginForm() return render(request,'login.html',locals()) else: tag = {'msg': True, 'data': None, 'status': True} form = LoginForm(data=request.POST) if form.is_valid(): code = request.POST.get('code').upper() if request.session\[settings.CODEIMG\].upper() != code: tag\['status'\] = False tag\['data'\] = '验证码错误' else: form.cleaned\_data\['password'\]=jiami().base\_str\_encrypt(form.cleaned\_data\['password'\]).strip() obj = models.User.objects.filter(**form.cleaned_data) if not obj: tag\['status'\] = False tag\['data'\] = '用户名密码错误' else: #初始化 用户数据 init_permission(obj, request) #打入日志,登陆成功 log_indb.delay(request.session.get(settings.USERID), '/water/login/',explain='login',msg='login') else: tag\['msg'\]=False tag\['data'\]=form.errors return HttpResponse(json.dumps(tag)) def logout(self,request): log_indb.delay(request.session.get(settings.USERID), '/water/logout/', explain='logout', msg='logout') request.session.clear() return redirect('/water/login/') def register(self,request): if request.method == 'GET': form = RegisterForm() return render(request, 'register.html', locals()) if request.method == 'POST': tag = {'status': True, 'data': None, 'msg': True} form = RegisterForm(data=request.POST) if form.is_valid(): username = form.cleaned_data\['username'\] obj = models.User.objects.filter(username=username) if obj: tag\['status'\] = False tag\['data'\] = '用户名已存在' else: password = form.cleaned_data\['password'\] password = jiami().base\_str\_encrypt(password) models.User.objects.create(username=username, password=password) else: tag\['msg'\] = False tag\['data'\] = form.errors return HttpResponse(json.dumps(tag)) return render(request,'register.html',locals()) def sendmail(self,req): mailto_list = \['liang@scloudpay.com'\] # mailto_list = \['liang@scloudpay.com','quhebin@scloudpay.com'\] today = str(datetime.date.today() + timedelta(days=15)) host='' val=models.Host.objects.filter(expirytime\_\_lt=today).values('eth1\_network') for item in val: if item.get('eth1_network'): host+=item.get('eth1_network')+'\\r\\n' if not host: return HttpResponse("failed!") sm\_obj = SendMail(mailto\_list) for i in range(len(mailto_list)): # 发送1封,上面的列表是几我的,这个就填几 if sm\_obj.send\_mail(mailto_list, "服务器到期预警", '还有15天到期的服务器ip'+host): # 邮件主题和邮件内容 # 这是最好写点中文,若是随便写,可能会被网易当作垃圾邮件退信 return HttpResponse('done!') else: return HttpResponse("failed!") def Code(request): img\_obj, code = check\_code.create\_validate\_code() stream = BytesIO() img_obj.save(stream, 'png') request.session\[settings.CODEIMG\] = code return HttpResponse(stream.getvalue()) @csrf_exempt def Test(request): from rbac.models import User obj = User.objects.filter(username='liang') ret = rest\_init\_menu(obj, request) # dic={'name':None,'osspath':None,'type':None} # get_sql=request.FILES.get('sql','') # get_conf = request.FILES.get('conf','') # get_package = request.FILES.get('package','') # if get_sql: # dic\['name'\]=get_sql.name # dic\['osspath'\]='/1/2/x.sql' # dic\['type'\]=get_sql.name.rsplit('.')\[-1\] # if get_conf: # dic\['name'\] = get_conf.name # dic\['osspath'\] = '/1/2/x.sql' # dic\['type'\] = get_conf.name.rsplit('.')\[-1\] # if get_package: # dic\['name'\] = get_package.name # dic\['osspath'\] = '/1/2/x.sql' # dic\['type'\] = get_package.name.rsplit('.')\[-1\] return HttpResponse(json.dumps(ret)) #系统日志 ajax 请求 暂时没用 class OperationLog(APIView): authentication_classes = \[\] def get(self,request,\*args,\*\*kwargs): get\_num = request.query\_params.get('num') ret_dic={'data':None,'status':True} ret_li = \[\] if get_num: obj\_li = models.OperationLog.objects.all().order\_by('-id')\[int(get_num):\] for obj in obj_li: ret\_str = '<div class="log\_remark">' ret_str += '<span style="color: red">{0} </span>'.format(obj.user.name) ret_str += '操做时间:' ret_str += '<span style="color: red">{0} </span> '.format(obj.ctime) ret_str += 'url:' ret_str += '<span style="color: red">{0} </span>'.format(obj.url) ret_str += 'proj:' ret_str += '<span style="color: red">{0} </span>'.format(obj.proj) ret_str += '动做:' ret_str += '<span style="color: red">{0} </span>'.format(obj.action) ret_str += '说明:' ret_str += '<span style="color: red">{0} </span>'.format(obj.explain) ret_str += '</div>' ret\_li.append(ret\_str) ret\_dic\['data'\]=ret\_li return JsonResponse(ret_dic) def post(self,request,\*args,\*\*kwargs): self.dispatch() init=Init()
反向生成url
urls.pymongodb
代码数据库
print('url') from django.conf.urls import url,include from django.contrib import admin from rest\_framework.authtoken import views as rest\_view from rbac import views \# from svn import views as svn_views from app01 import views as app1views from rbac.views import init from django.conf import settings from water.service import v1 \# print(settings.LOGGING_CONFIG) urlpatterns = \[ url(r'^admin/', admin.site.urls), # View.as_view() -->view url(r'^water/', (v1.site.urls, None, 'water')), url(r'^code.html', views.Code), url(r'^test', views.Test), url(r'^api/',include('release.urls')), url(r'^vueapi',include('VueApi.urls')), # url(r'^log/',views.OperationLog), url(r'^log/',include('rbac.urls')), url('^login/test/', app1views.host), url('^host/page/', app1views.host_page), # url(r'^api-token-auth/', init.obtain\_auth\_token) # url(r'^api-token-auth/', rest\_view.obtain\_auth_token) \]
v1.py
代码
import copy from django.shortcuts import HttpResponse,render,redirect from django.utils.safestring import mark_safe \# from django.urls import reverse from django.core.urlresolvers import reverse from django.forms import ModelForm from rbac import models from django.conf.urls import url,include from django.db.models import Q from ..utils.page import Pagination from rbac.views import init from django.conf import settings \# from clientapi.views import ret\_salt\_api \# from clientapi.views import client_func \# from keras.models import load_model from clientapi import views from app01.task import log_indb class ChangeList(object): #data=ChangeList(self,queryset) def \_\_init\_\_(self,site,queryset): self.model\_class=site.model\_class self.get\_list\_display=site.get\_list\_display(site.request) self.site=site self.get\_show\_ali=site.get\_show\_ali(site.request) self.get\_show\_all\_data=site.get\_show\_all\_data(site.request) self.get\_show\_add=site.get\_show\_add(site.request) self.get\_show\_dels=site.get\_show\_dels(site.request) self.add\_url=site.add\_url self.get\_search\_list=site.get\_search\_list self.get\_accurate\_list=site.get\_accurate\_list self.get\_search\_button=site.get\_search\_button self.get_q=site.request.GET.get('q','') self.pteamrole=site.request.GET.get('pteamrole','') self.ab=site.request.GET.get('ab','') self.environment=site.request.GET.get('environment','') # par\_page=site.par\_page page\_count=site.page\_count request=site.request query_get=copy.deepcopy(request.GET) #获取页码 request_page=site.request.GET.get('page','1') #获取每页显示多少条信息 par\_page = int(site.request.GET.get('page\_list', '10')) all_count=queryset.count() page\_url=site.list\_url pag\_obj=Pagination(request\_page,all\_count,page\_url,query\_get,par\_page,page_count) self.queryset=queryset\[pag\_obj.start:pag\_obj.end\] self.page\_html=pag\_obj.page_html() self.page\_list\_html=pag\_obj.page\_list_html() def table_head(self): result = \[\] for item in self.get\_list\_display: if isinstance(item,str): temp=self.model\_class.\_meta.get\_field(item).verbose\_name else: temp=item(self.site,is_title=True) result.append(temp) return result def table_body(self): result=\[\] for obj in self.queryset: ret=\[\] for item in self.get\_list\_display: if isinstance(item,str): temp=getattr(obj,item) else: try: temp = item(row=obj) except TypeError: temp = item(self.site,row=obj) # temp=item(self,row=obj) ret.append(temp) result.append(ret) return result class AryaConfig(object): def \_\_init\_\_(self,model_class,site): self.model\_class=model\_class self.app=self.model\_class.\_meta.app_label self.mod=self.model\_class.\_meta.model_name self.site=site self.list\_log\_url = '/water/' + self.app + '/' + self.mod + '/list.html' self.remarks\_log\_url = '/water/' + self.app + '/' + self.mod + '/remarks.html' self.add\_log\_url = '/water/' + self.app + '/' + self.mod + '/add.html' self.update\_log\_url = '/water/' + self.app + '/' + self.mod + '/update.html' self.delete\_log\_url = '/water/' + self.app + '/' + self.mod + '/delete.html' # sf\_model=load\_model('model\_v0.314\_epoch-07-loss0.0742-valLoss0.1214.hdf5') # request.session\['model'\]=sf_model _remarks=True _confpro=False _edit=True _add=True _del=True _dels = True show_ali=False show\_all\_data = False list_display=\[\] show_add=False show_dels=False model_f=False search_list=\[\] accurate_list=\[\] search\_button\_list=\[\] # par_page=10 page_count=7 @property def urls(self): parttents = \[ url('^$', self.list,name='%s_%s_list' %(self.app,self.mod)), url('list.html', self.list,name='%s_%s_list' %(self.app,self.mod)), url('^add.html', self.add,name='%s_%s_add' %(self.app,self.mod)), url('^(\\d+)/delete.html', self.delete,name='%s_%s_del' %(self.app,self.mod)), url('^(\\d+)/update.html', self.change,name='%s_%s_edit' %(self.app,self.mod)), url('^(\\d+)/remarks.html', self.remarks,name='%s_%s_remarks' %(self.app,self.mod)), \] parttents+=self.gouzi() return parttents,None,None def gouzi(self): return \[\] def get\_show\_ali(self,request): return self.show_ali def get\_show\_all_data(self,request): return self.show\_all\_data def get\_show\_add(self,request): if not self._add: return self.show_add if 'add' in request.permission\_code\_list: # if True: self.show_add=True return self.show_add def get\_show\_dels(self,request): if not self._dels: return self.show_dels if 'del' in request.permission\_code\_list: # if True: self.show_dels=True else: self.show_dels = False return self.show_dels def get\_search\_list(self): result=\[\] result.extend(self.search_list) return result def get\_accurate\_list(self): result = \[\] result.extend(self.accurate_list) return result def get\_search\_button(self): result=\[\] try: JG\_l = self.search\_button_list() result.extend(JG_l) except TypeError: result.extend(self.search\_button\_list) return result def get\_list\_display(self,request): result=\[\] result.extend(self.list_display) # 若是有查看详情权限 # if self._confpro: # if 'confpro' in request.permission\_code\_list: # result.append(self.configproj_view) #若是有查看备注权限 if self._remarks: if 'remarks' in request.permission\_code\_list: result.append(self.remarks_view) # 若是有编辑权限 # if True: if self._edit: if 'edit' in request.permission\_code\_list: # result.append(AryaConfig.change_view) result.append(self.change_view) # 若是有删除权限 # if True: if self._del: if 'del' in request.permission\_code\_list: result.append(AryaConfig.delete_view) result.insert(0,AryaConfig.checkbox_view) return result def remarks\_view(self,row=None,is\_title=None): if is_title: return '备注' \_str='water:%s\_%s_remarks' %(self.app,self.mod) url=reverse(viewname=_str,args=(row.id,)) result='<a href="{0}" class="btn btn-info">查看备注</a>'.format(url) return mark_safe(result) def checkbox\_view(self,row=None,is\_title=None): if is_title: return '' result='<input type="checkbox" value={0}>'.format(row.id) return mark_safe(result) def change\_view(self,row=None,is\_title=None): if is_title: return '修改' \_str='water:%s\_%s_edit' %(self.app,self.mod) url=reverse(viewname=_str,args=(row.id,)) result='<a href="{0}" class="btn btn-warning">修改</a>'.format(url) return mark_safe(result) def delete\_view(self,row=None,is\_title=None): if is_title: return '删除' \_str='water:%s\_%s_del' %(self.app,self.mod) url=reverse(viewname=_str,args=(row.id,)) result='<a href="{0}" class="btn btn-danger">删除</a>'.format(url) return mark_safe(result) def get\_model\_form(self): if self.model_f: return self.model_f class Dynamic(ModelForm): class Meta: model=self.model_class fields='\_\_all\_\_' return Dynamic #调用celery 请求日志入库 def \_log\_in_db(self,req,url,proj=None, action=None,explain=None,msg=None): log_indb(req.session.get(settings.USERID), url, proj=proj, action=action, msg=msg) def list(self,req): self.request=req search_q=req.GET.get('q') candition_q=Q() search\_list=self.get\_search_list() if search\_list and search\_q: for search\_item in search\_list: temp_q=Q() temp\_q.children.append((search\_item,search_q)) candition\_q.add(temp\_q,'OR') queryset=self.model\_class.objects.filter(candition\_q).order_by('-id') data=ChangeList(self,queryset) self.\_log\_in\_db(req,url=self.list\_log_url, proj=self.mod, action='list',msg='list_'+self.mod) return render(req,'list.html',{'data':data,'req':req}) def remarks(self,req,nid): # dynamic\_form = self.get\_model_form() obj = self.model_class.objects.filter(id=nid) if req.method=='POST': remarks=req.POST.get('remarks') obj.update(remarks=remarks) return redirect(self.list_url) self.\_log\_in\_db(req, url=self.remarks\_log_url, proj=self.mod, action='remarks', msg='remarks_'+self.mod) return render(req, 'remarks.html', locals()) def add(self,req): dynamic\_form=self.get\_model_form() if req.method=='GET': form=dynamic_form() return render(req,'add.html',{'data':form,'req':req}) else: form=dynamic_form(data=req.POST) if form.is_valid(): form.save() self.\_log\_in\_db(req, url=self.add\_log_url, proj=self.mod, action='add', msg='add_' + self.mod) return redirect(self.list_url) return render(req, 'add.html', {'data': form,'req':req}) def delete(self,req,nid): if req.method=='GET': return render(req,'del.html',{'req':req}) else: obj=self.model_class.objects.filter(id=nid).delete() self.\_log\_in\_db(req, url=self.delete\_log_url, proj=self.mod, action='del', msg='del_'+self.mod) return redirect(self.list_url) def change(self,req,nid): dynamic\_form = self.get\_model_form() obj=self.model_class.objects.filter(id=nid).first() if req.method=='GET': form = dynamic_form(instance=obj) return render(req,'edit.html',{'data':form,'req':req}) else: form = dynamic_form(instance=obj,data=req.POST) if form.is_valid(): form.save() self.\_log\_in\_db(req, url=self.update\_log_url, proj=self.mod, action='update', msg='update_'+self.mod) return redirect(self.list_url) return render(req, 'edit.html', {'data': form,'req':req}) @property def list_url(self): str='water:%s_%s_list' %(self.app,self.mod) result=reverse(viewname=str) return result @property def del_url(self): str='water:%s_%s_del' %(self.app,self.mod) result=reverse(viewname=str) return result @property def add_url(self): str = 'water:%s_%s_add' % (self.app, self.mod) result = reverse(viewname=str) return result class AryaSite(object): def \_\_init\_\_(self): self._registry={} def register(self,model\_class,model\_config): #实例化 self.\_registry\[model\_class\]=model\_config(model\_class,self) #用于 ali_func 的反向url # self.app = model\_class.\_meta.app_label # self.mod = model\_class.\_meta.model_name @property def urls(self): parttents=\[ url('^login/', init.login), url('^logout/', init.logout), url('^register/', init.register), url('^sendmail/', init.sendmail), url('^home/', init.home), url('^ali\_client\_api.html/', views.ali\_ret\_api ), url('^db\_func.html/', views.db\_func ), url('^ali\_main.html/', views.ali\_main ), url('^celery\_status.html/', views.celery\_status ), url('^alirds\_client\_api.html/', views.alirds\_ret\_api ), \] for model\_class,model\_config in self._registry.items(): ''' url("^rbac/lable/" ), url("^db/host/" , url), url("^db/host/" (\[\],None,None)), ''' #rbac #Lable JG="^{0}/{1}/".format(model\_class.\_meta.app\_label,model\_class.\_meta.model\_name) pt=url(JG,model_config.urls) parttents.append(pt) return parttents site=AryaSite()
rbac.py
代码
import re from django.shortcuts import redirect,HttpResponse,render from django.conf import settings from rbac.views import init class MiddlewareMixin(object): def \_\_init\_\_(self, get_response=None): self.get\_response = get\_response super(MiddlewareMixin, self).\_\_init\_\_() def \_\_call\_\_(self, request): response = None if hasattr(self, 'process_request'): response = self.process_request(request) if not response: response = self.get_response(request) if hasattr(self, 'process_response'): response = self.process_response(request, response) return response class RbacMiddleware(MiddlewareMixin): def process_request(self,request): # 1\. 获取当前请求的URL # request.path_info # 2\. 获取Session中保存当前用户的权限 # request.session.get("permission\_url\_list') current\_url = request.path\_info # 当前请求不须要执行权限验证 for url in settings.VALID_URL: if re.match(url,current_url): return None """ { 1:{ codes: \[list,add\], urls: \[ /userinfo/, /userinfo/add/, /userinfo/... \] }, 2:{ codes: \[list,add,edit,del\], urls: \[ /userinfo/, /userinfo/add/, /userinfo/... \] } 3:{ codes: \[list,add,edit,del\], urls: \[ /userinfo/, /userinfo/add/, /userinfo/... \] } } """ permission\_dict = request.session.get(settings.PERMISSION\_URL\_DICT\_KEY) if not permission_dict: return redirect('/water/login/') flag = False for group\_id,code\_url in permission_dict.items(): for db\_url in code\_url\['urls'\]: regax = "^{0}$".format(db_url) if re.match(regax, current_url): # 获取当前用户对当前组内的全部code,并赋值给request request.permission\_code\_list = code_url\['codes'\] flag = True break if flag: break if not flag: return render(request,'errors.html'
init_permisson.py
代码
from django.conf import settings from utlis.log_class import Logger from rbac import models def init_permission(user,request): logger = Logger(loglevel=1, logger="fox").getlog() """ 初始化权限信息,获取权限信息并放置到session中。 :param user: Rbac :param request: :return: """ permission\_list =user.filter(pteamper\_\_permissions\_\_id\_\_isnull=False).values( 'pteamper__name', 'pteamper\_\_permissions\_\_id', 'pteamper\_\_permissions\_\_name', # 用户列表 'pteamper\_\_permissions\_\_url', 'pteamper\_\_permissions\_\_code', 'pteamper\_\_permissions\_\_menu\_gp\_id', # 组内菜单ID,Null表示是菜单 'pteamper\_\_permissions\_\_group_id', # 权限的组ID 'pteamper\_\_permissions\_\_group\_\_menu\_id', # 权限的组的菜单ID 'pteamper\_\_permissions\_\_group\_\_menu\_\_name', # 权限的组的菜单名称 ).distinct() # 菜单相关(之后再匹配),inclusion_tag menu\_permission\_list = \[\] auth\_permission\_list = \[\] request.session\[settings.USER\]=user.first().username request.session\[settings.USERID\]=user.first().id for item in permission_list: auth_tpl = { 'id': item\['pteamper\_\_permissions\_\_id'\], 'title': item\['pteamper\_\_permissions\_\_name'\], 'url': item\['pteamper\_\_permissions\_\_url'\], 'menu\_gp\_id': item\['pteamper\_\_permissions\_\_menu\_gp\_id'\], 'menu\_id': item\['pteamper\_\_permissions\_\_group\_\_menu_id'\], 'menu\_title': item\['pteamper\_\_permissions\_\_group\_\_menu__name'\], } #用于权限使用 auth\_permission\_list.append(auth_tpl) if '实例' in item\['pteamper\_\_permissions\_\_name'\] or 'BacketName' in item\['pteamper\_\_permissions\_\_name'\]\ or '受权用户' in item\['pteamper\_\_permissions\_\_name'\] or '生产者' in item\['pteamper\_\_permissions\_\_name'\]\ or '消费者' in item\['pteamper\_\_permissions\_\_name'\] or 'Topic' in item\['pteamper\_\_permissions\_\_name'\]: if user.first().username != 'boss': continue menu_tpl = { 'id': item\['pteamper\_\_permissions\_\_id'\], 'title': item\['pteamper\_\_permissions\_\_name'\], 'url': item\['pteamper\_\_permissions\_\_url'\], 'menu\_gp\_id': item\['pteamper\_\_permissions\_\_menu\_gp\_id'\], 'menu\_id': item\['pteamper\_\_permissions\_\_group\_\_menu_id'\], 'menu\_title': item\['pteamper\_\_permissions\_\_group\_\_menu__name'\], } #用于菜单使用(删除了不少内容) menu\_permission\_list.append(menu_tpl) request.session\[settings.PERMISSION\_MENU\_KEY\] = menu\_permission\_list request.session\[settings.PERMISSION\_AUTH\_KEY\] = auth\_permission\_list permission_dict={'app':\[\],'host':\[\],} pteam_obj=user.filter().values('pteams') #角色 request.session\[settings.PTEAM\_OBJ\] = pteam\_obj.first()\['pteams'\] app\_id=models.App.objects.filter(pteamrole\_\_in=user.first().pteams.all()).values_list('id','hosts') # host\_id=models.App.objects.filter(pteamrole=orm\_pteam).values('hosts') for num in app_id: permission_dict\['app'\].append(num\[0\]) permission_dict\['host'\].append(num\[1\]) request.session\[settings.PERMISSION\_HOST\] = permission\_dict # 权限相关,中间件 """ { 1:{ codes: \[list,add,edit,del\], urls: \[ /userinfo/, /userinfo/add/, /userinfo/... \] }, 2:{ codes: \[list,add,edit,del\], urls: \[ /userinfo/, /userinfo/add/, /userinfo/... \] } 3:{ codes: \[list,add,edit,del\], urls: \[ /userinfo/, /userinfo/add/, /userinfo/... \] } } """ result = {} for item in permission_list: try: group\_id = item\['pteamper\_\_permissions\_\_group\_id'\] code = item\['pteamper\_\_permissions\_\_code'\] url = item\['pteamper\_\_permissions\_\_url'\] if group_id in result: result\[group_id\]\['codes'\].append(code) result\[group_id\]\['urls'\].append(url) else: result\[group_id\] = { 'codes':\[code,\], 'urls':\[url,\] } except KeyError as e: logger.error('auth,init_permission') logger.error(type(e)) logger.error(e) request.session\[settings.PERMISSION\_URL\_DICT_KEY\] = result ########### restful 使用 def rest\_init\_permission(user,request): permission\_list = user.filter(pteamper\_\_permissions\_\_id\_\_isnull=False).values( 'pteamper__name', 'pteamper\_\_permissions\_\_id', 'pteamper\_\_permissions\_\_name', # 用户列表 'pteamper\_\_permissions\_\_url', 'pteamper\_\_permissions\_\_code', 'pteamper\_\_permissions\_\_menu\_gp\_id', # 组内菜单ID,Null表示是菜单 'pteamper\_\_permissions\_\_group_id', # 权限的组ID 'pteamper\_\_permissions\_\_group\_\_menu\_id', # 权限的组的菜单ID 'pteamper\_\_permissions\_\_group\_\_menu\_\_name', # 权限的组的菜单名称 ).distinct() return permission_list def rest\_init\_menu(user,request): menu\_permission\_list = \[\] ret_dic={} permission\_list=rest\_init_permission(user, request) for item in permission_list: # 用于不显示一些特殊的内容,显得很乱 if '实例' in item\['pteamper\_\_permissions\_\_name'\] or 'BacketName' in item\['pteamper\_\_permissions\_\_name'\] \ or '受权用户' in item\['pteamper\_\_permissions\_\_name'\] or '生产者' in item\['pteamper\_\_permissions\_\_name'\] \ or '消费者' in item\['pteamper\_\_permissions\_\_name'\] or 'Topic' in item\['pteamper\_\_permissions\_\_name'\]: if user.first().username != 'boss': continue if item\['pteamper\_\_permissions\_\_menu\_gp\_id'\]: #排除增删改 # print('111111111',item\['pteamper\_\_permissions\_\_name'\]) continue menu_tpl = { 'id': item\['pteamper\_\_permissions\_\_id'\], 'title': item\['pteamper\_\_permissions\_\_name'\], 'name': item\['pteamper\_\_permissions\_\_name'\], 'path': item\['pteamper\_\_permissions\_\_url'\].lstrip('/'), 'menu\_gp\_id': item\['pteamper\_\_permissions\_\_menu\_gp\_id'\], 'pid': item\['pteamper\_\_permissions\_\_group\_\_menu\_id'\], 'menu\_title': item\['pteamper\_\_permissions\_\_group\_\_menu__name'\], } menu\_permission\_list.append(menu_tpl) # print('222222',menu\_permission\_list) for item in menu\_permission\_list: menu_dic = {} if item\['pid'\] in ret_dic.keys(): ret_dic\[item\['pid'\]\]\['nextItem'\].append(item) else: menu_dic\['id'\]=item\['id'\] menu\_dic\['name'\]=item\['menu\_title'\] menu\_dic\['title'\]=item\['menu\_title'\] menu_dic\['nextItem'\]=\[item,\] ret\_dic\[item\['pid'\]\] = menu\_dic return ret_dic def rest\_init\_auth(user,request): auth\_permission\_list = \[\] ret_dic={} permission\_list = rest\_init_permission(user, request) for item in permission_list: auth_tpl = { 'id': item\['pteamper\_\_permissions\_\_id'\], 'title': item\['pteamper\_\_permissions\_\_name'\], 'name': item\['pteamper\_\_permissions\_\_name'\], 'path': item\['pteamper\_\_permissions\_\_url'\], 'menu\_gp\_id': item\['pteamper\_\_permissions\_\_menu\_gp\_id'\], 'pid': item\['pteamper\_\_permissions\_\_group\_\_menu\_id'\], 'menu\_title': item\['pteamper\_\_permissions\_\_group\_\_menu__name'\], } # 用于权限使用 auth\_permission\_list.append(auth_tpl) for item in auth\_permission\_list: menu_dic = {} if item\['pid'\] in ret_dic.keys(): ret_dic\[item\['pid'\]\]\['nextItem'\].append(item) else: menu_dic\['id'\]=item\['id'\] menu\_dic\['name'\]=item\['menu\_title'\] menu\_dic\['title'\]=item\['menu\_title'\] menu_dic\['nextItem'\]=\[item,\] ret\_dic\[item\['pid'\]\] = menu\_dic return auth\_permission\_list