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