Python2—0911筆記

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
相關文章
相關標籤/搜索