| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607 | from itertools import chainfrom django.contrib.auth.models import BaseUserManager, AbstractBaseUserfrom django.db import modelsfrom django.utils import sixfrom django.utils.encoding import python_2_unicode_compatiblefrom imagekit.models import ProcessedImageFieldfrom imagekit.processors import ResizeToFillfrom Ansjer.config import SERVER_DOMAINfrom Service.CommonService import CommonServiceclass PermissionsManager(models.Manager):    use_in_migrations = True    def get_by_natural_key(self, permName):        return self.get(            permName=permName        )class RoleManager(models.Manager):    """    The manager for the auth's Role model.    """    use_in_migrations = True    def get_by_natural_key(self, roleName):        return self.get(roleName=roleName)class UserManager(BaseUserManager):    def create_user(self, username, password, userID, is_active,                    user_isValid, **extra_fields):        user = self.model(            username=username,            userID=userID,            is_active=is_active,            user_isValid=user_isValid,            **extra_fields        )        user.set_password(password)        user.save(using=self._db)        role = Role.objects.get(rid=1)        user.role.add(role)        return user    def create_superuser(self, username, password, userID, is_active,                         user_isValid, **extra_fields):        # extra_fields.setdefault('is_superuser', is_superuser)        is_superuser = extra_fields.get('is_superuser', None)        if is_superuser != 100 and is_superuser != 1:            raise ValueError('Superuser must have is_superuser=1 or 100.')        return self.create_user(username, password, userID, is_active,                                user_isValid, **extra_fields)@python_2_unicode_compatibleclass Permissions(models.Model):    permName = models.CharField(blank=True, null=True, max_length=32, unique=True, verbose_name=u'权限名称')    description = models.CharField(blank=True, null=True, max_length=128, verbose_name=u'描述信息', default='')    objects = PermissionsManager()    def __str__(self):        return "%s" % (            six.text_type(self.description))    class Meta:        ordering = ['permName']        db_table = 'permissions'        verbose_name = u'role permission'        verbose_name_plural = verbose_name        unique_together = (('permName'),)    def natural_key(self):        return (self.permName)class Role(models.Model):    ROLE_TYPES = (        ('Guests', u'Guests'),        ('Users', u'Users'),        ('Admins', u'Admins'),        ('SysAdmins', u'SysAdmins'),        ('LOGAdmins', u'LOGAdmins'),        ('OTAAdmins', u'OTAAdmins'),        ('DBAAdmins', u'DBAAdmins'),        ('SuperAdmins', u'SuperAdmins'),    )    rid = models.SmallIntegerField(primary_key=True, unique=True, verbose_name=u'用户角色组ID')    roleName = models.CharField(max_length=32, choices=ROLE_TYPES, unique=True,                                default='User', verbose_name=u'角色名称')    permission = models.ManyToManyField(to='Permissions', blank=True, verbose_name=u'权限', db_table='role_permissions')    Description = models.TextField(blank=True, default='', verbose_name=u'描述信息')    objects = RoleManager()    class Meta:        ordering = ['roleName']        db_table = 'role'        verbose_name = u'用户角色'        verbose_name_plural = verbose_name    def __str__(self):        return self.roleName    def natural_key(self):        return (self.roleName,)    def has_perm(self, permission, obj=None):        if self.rid == 100:            return True        permlist = self.permission.all()        for perm in permlist:            if perm.permName == permission:                return True        return False    def get_all_perms_id(self):        perms = self.permission.all()        permslist = []        if self.rid == 100:            perms = Permissions.objects.all()            for perm in perms:                permslist.append(perm.id)            return permslist        else:            permlist_tmp = []            for perm in perms:                permlist_tmp.append(perm.id)            permSet = set(permlist_tmp)            permslist = list(permSet)            permslist.sort()            return permslist    def get_all_permission(self):        perms = self.permission.all()        permslist = []        if self.rid == 100:            perms = Permissions.objects.all()            for perm in perms:                permslist.append(perm.permName)            return permslist        else:            permlist_tmp = []            for perm in perms:                permlist_tmp.append(perm.permName)            permSet = set(permlist_tmp)            permslist = list(permSet)            permslist.sort()            return permslistclass Device_User(AbstractBaseUser):    userID = models.CharField(blank=True, max_length=32, primary_key=True,                              verbose_name=u'用户ID', unique=True, default=CommonService.getUserID(getUser=True))    role = models.ManyToManyField(to='Role', blank=True, verbose_name=u'用户角色', db_table='user_role')    username = models.CharField(max_length=40, verbose_name=u'用户名', unique=True, null=True, blank=True)    password = models.CharField(max_length=128, verbose_name=u'密码')    userEmail = models.EmailField(max_length=64, verbose_name=u'邮箱', unique=True, null=True, blank=True)    # 实际的路径就是 MEDIA_ROOT/Image/filename,所以可用upload_to来指定文件存放的前缀路径    userIconPath = ProcessedImageField(blank=True, upload_to='User/Images/', default='static/User/default.png',                                       verbose_name=u'头像',                                       # 图片将处理成85x85的尺寸                                       processors=[ResizeToFill(85, 85)], )    userIconUrl = models.URLField(blank=True, max_length=128, default=SERVER_DOMAIN                                                                      + '/account/getAvatar/User/defaultUser.png')    NickName = models.CharField(blank=True, max_length=32, default='', verbose_name=u'用户昵称')    is_superuser = models.IntegerField(blank=True, default=0, verbose_name=u'用户类型')    is_active = models.BooleanField(blank=True, default=False, verbose_name=u'用户活动状态')    data_joined = models.DateTimeField(blank=True, verbose_name=u'加入时间', auto_now_add=True)    last_login = models.DateTimeField(blank=True, verbose_name='u最后登录时间', auto_now=True)    user_isValid = models.BooleanField(blank=True, default=False, verbose_name=u'用户有效性', help_text=u'是否是认证通过的用户')    online = models.BooleanField(blank=True, default=False, verbose_name=u'用户登录状态')    machine_code = models.CharField(blank=True, max_length=128, default='', verbose_name=u'机械码')    language = models.CharField(blank=True, null=True, max_length=16, default='', verbose_name=u'语言地区')    # 手机注册增加字段    phone = models.CharField(max_length=16, verbose_name=u'手机号', unique=True, null=True, blank=True)    objects = UserManager()    USERNAME_FIELD = 'userID'  # 必须有一个唯一标识    REQUIRED_FIELDS = ['is_superuser']  # 创建superuser时的必须字段    class Meta:        ordering = ('-data_joined',)        verbose_name = u'用户信息'        db_table = 'device_user'        get_latest_by = 'last_login'    def __str__(self):        return self.username    def get_full_name(self):        return self.userEmail    def get_short_name(self):        return self.username    def get_role_id(self):        rids = []        roles = self.role.all()        for role in roles:            rids.append(role.rid)        return rids    def has_perm(self, permission, obj=None):        roles = self.role.all()        for role in roles:            if role.rid == 100:                return True        permlist = self.permission.all()        for perm in permlist:            if perm.permName == permission:                return True        for role in roles:            permlist = role.permission.all()            for perm in permlist:                if perm.permName == permission:                    return True        return False    def get_all_perms_id(self):        roles = self.role.all()        perms = self.permission.all()        permslist = []        for role in roles:            if role.rid == 100:                perms = Permissions.objects.all()                for perm in perms:                    permslist.append(perm.id)                return permslist        for perm in perms:            permslist.append(perm.id)        permSet = set(permslist)        for role in roles:            permlist_tmp = []            for perm in role.permission.all():                permlist_tmp.append(perm.id)            permSet_tmp = set(permlist_tmp)            permSet = permSet.union(permSet_tmp)            permslist = list(permSet)            permslist.sort()            return permslist    def get_all_permission(self):        roles = self.role.all()        perms = self.permission.all()        permslist = []        for role in roles:            if role.rid == 100:                perms = Permissions.objects.all()                for perm in perms:                    permslist.append(perm.permName)                return permslist        for perm in perms:            permslist.append(perm.permName)        permSet = set(permslist)        for role in roles:            permlist_tmp = []            for perm in role.permission.all():                permlist_tmp.append(perm.permName)            permSet_tmp = set(permlist_tmp)            permSet = permSet.union(permSet_tmp)            permslist = list(permSet)            permslist.sort()            return permslist    def has_module_perms(self, app_label):        return True    @property    def is_staff(self):        return self.is_superuserclass Device_Info(models.Model):    id = models.CharField(blank=True, max_length=32, primary_key=True)    userID = models.ForeignKey(Device_User, blank=True, to_field='userID',                               on_delete=models.CASCADE)    NickName = models.CharField(blank=True, max_length=32, verbose_name=u'设备名称')    UID = models.CharField(blank=True, max_length=32, verbose_name=u'设备UID')    SID = models.CharField(blank=True, max_length=32, verbose_name=u'服务器ID')    View_Account = models.CharField(blank=True, max_length=32, verbose_name=u'设备用户名称')    View_Password = models.CharField(blank=True, max_length=32, verbose_name=u'设备密码')    AudioFormat = models.IntegerField(blank=True, default=1, verbose_name=u'初始化影像')    EventNotification = models.IntegerField(blank=True, verbose_name=u'报警类型')    ChannelIndex = models.IntegerField(blank=True, verbose_name=u'通道号')    Online = models.BooleanField(blank=True, default=False, verbose_name=u'设备是否在线')    mMonitorIndex = models.IntegerField(blank=True, default=-1)    Type = models.IntegerField(blank=True)    DebugMode = models.IntegerField(blank=True, verbose_name=u'调试模式')    NotificationMode = models.IntegerField(blank=True, verbose_name=u'是否报警')    qvgaLevel = models.BooleanField(blank=True, verbose_name=u'SD与HD画面', default=0,                                    help_text=u'0代表:SD、1代表:HD')    isShare = models.BooleanField(blank=True, verbose_name=u'共享设备',                                  help_text=u'是否为共享获取的设备', default=False)    primaryUserID = models.CharField(blank=True, verbose_name='主用户',                                     help_text=u'该设备的主用户', max_length=32, default='')    data_joined = models.DateTimeField(blank=True, verbose_name=u'设备添加时间', auto_now_add=True)    update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True, null=True)    ip = models.CharField(blank=True, max_length=20, null=True, verbose_name=u'设备区域ip')    area = models.CharField(blank=True, max_length=100, null=True, verbose_name=u'设备区域area')    # ios要求新增字段    version = models.CharField(blank=True, max_length=20, null=True, verbose_name=u'版本号')    SpaceUsable = models.CharField(blank=True, max_length=20, null=True, verbose_name=u'可用空间')    SpaceSum = models.CharField(blank=True, max_length=20, null=True, verbose_name=u'总空间')    WIFIName = models.CharField(blank=True, max_length=50, null=True, verbose_name=u'无线名称')    WIFIIP = models.CharField(blank=True, max_length=20, null=True, verbose_name=u'无线ip')    WIFIPwd = models.CharField(blank=True, max_length=50, null=True, verbose_name=u'无线密码')    isDetector = models.BooleanField(blank=True, verbose_name=u'侦测开关0:关闭,1:开启)', default=False)    DetectorRank = models.IntegerField(blank=True, default=0, verbose_name=u'侦测灵敏度 1:低,2:中,3:高4:最高')    iSNotification = models.BooleanField(blank=True, verbose_name=u'报警通知 0:关闭,1:开启)', default=False)    MirrorType = models.IntegerField(blank=True, default=0, verbose_name=u'镜像类型 0:关闭镜像,1:上下镜像,2:左右镜像,3:上下左右镜像')    RecordType = models.IntegerField(blank=True, default=0, verbose_name=u'录像模式(0:关闭,1:全是录像,3:报警录像)')    TimeZone = models.CharField(blank=True, max_length=50, null=True, verbose_name=u'时区')    ###    REQUIRED_FIELDS = []    def __str__(self):        return self.NickName    def model_to_dict(self, fields=None, exclude=None):        opts = self._meta        data = {}        for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many):            if not getattr(f, 'editable', False):                continue            if fields and f.name not in fields:                continue            if exclude and f.name in exclude:                continue            data[f.name] = f.value_from_object(self)        return data    class Meta:        db_table = 'device_info'        ordering = ('-data_joined',)        verbose_name = u'用户设备信息表'        verbose_name_plural = verbose_nameclass AuthToken_Token(models.Model):    tokenID = models.OneToOneField(Device_User, blank=True, on_delete=models.CASCADE,                                   primary_key=True)  # 定义一对一关系    access_token = models.CharField(blank=True, max_length=256)    refresh_token = models.CharField(blank=True, max_length=256)    last_update = models.DateTimeField(blank=True, auto_now=True)    iCode = models.CharField(blank=True, max_length=12, verbose_name=u'干扰码')    mCode = models.CharField(blank=True, max_length=64, verbose_name=u'设备码')    class Meta:        verbose_name = u'用户Token'        db_table = 'authtoken_token'        ordering = ('-last_update',)class AuthToken_JWT(models.Model):    jwtID = models.OneToOneField(Device_User, blank=True, on_delete=models.CASCADE,                                 primary_key=True, verbose_name=u'token userID')    access_token = models.CharField(blank=True, max_length=384, verbose_name=u'Access Token')    refresh_token = models.CharField(blank=True, max_length=384, verbose_name=u'Refresh Token')    secret = models.CharField(blank=True, max_length=32, verbose_name=u'Secret')    last_update = models.DateTimeField(blank=True, auto_now=True, verbose_name=u'Last Update')    class Meta:        verbose_name = u'用户JWT'        verbose_name_plural = verbose_name        db_table = 'authtoken_jwt'        ordering = ('-last_update',)class Email_Captcha(models.Model):    userCaptcha = models.CharField(max_length=10, verbose_name=u'验证码')    userEmail = models.EmailField(max_length=50, verbose_name=u'邮箱')    sendType = models.CharField(choices=(("register", u"注册"), ("forget", u"找回密码")), max_length=15)    sendTime = models.DateField(auto_now_add=True)    class Meta:        db_table = 'email_captcha'        ordering = ('-sendTime',)        verbose_name = u'邮箱验证码'        verbose_name_plural = verbose_nameclass Auth_Captcha(models.Model):    username = models.CharField(max_length=50, help_text=u'用户名(邮箱或电话号码)')    authcaptca = models.CharField(max_length=6, help_text=u'验证码')    sendtype = models.CharField(max_length=15, choices=(("register", u"注册"), ("forget", u"找回密码")))    sendtime = models.DateTimeField(auto_now_add=True)    class Meta:        db_table = 'auth_captcha'        ordering = ('-sendtime',)        verbose_name = u'邮箱验证码'        verbose_name_plural = verbose_nameclass Access_Log(models.Model):    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')    user = models.CharField(max_length=100, null=True, db_index=True, blank=True, verbose_name=u'用户')    operation = models.CharField(max_length=100, db_index=True, null=True, blank=True, verbose_name=u'操作')    ip = models.CharField(max_length=100, null=True, blank=True, verbose_name=u'访问ip地址')    url = models.CharField(max_length=150, null=True, blank=True, verbose_name=u'访问路径')    status = models.IntegerField(null=True, blank=True, verbose_name=u'状态')    time = models.DateTimeField(null=True, blank=True, db_index=True, verbose_name=u'访问时间')    content = models.TextField(blank=True, null=True, verbose_name=u'参数内容')    class Meta:        db_table = 'access_log'        verbose_name = u'访问日志表'        verbose_name_plural = verbose_nameclass Equipment_Stream(models.Model):    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')    userID = models.CharField(blank=True, max_length=32, verbose_name=u'用户ID')    status = models.IntegerField(null=True, blank=True, verbose_name=u'状态')    uid = models.CharField(null=True, blank=True, max_length=32, verbose_name=u'设备ID')    channel = models.IntegerField(null=True, blank=True, verbose_name=u'设备通道')    access_token = models.CharField(blank=True, max_length=128, verbose_name=u'设备推流验证令牌')    total_flow = models.FloatField(null=True, blank=True, verbose_name=u'传输总容量')    add_time = models.DateTimeField(blank=True, null=True, verbose_name=u'加入时间', auto_now_add=True)    update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True)    rank = models.IntegerField(null=True, blank=True, verbose_name=u'推流套餐类型')    class Meta:        db_table = 'equipment_stream'        verbose_name = u'用户设备推流表'        verbose_name_plural = verbose_nameclass Equipment_Sensor(models.Model):    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')    status = models.IntegerField(null=True, blank=True, verbose_name=u'状态')    type = models.IntegerField(null=True, blank=True, verbose_name=u'类型')    name = models.CharField(null=True, blank=True, max_length=128, verbose_name=u'传感器名称')    add_time = models.DateTimeField(blank=True, null=True, verbose_name=u'加入时间', auto_now_add=True)    update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True)    uid = models.CharField(null=True, blank=True, max_length=32, verbose_name=u'设备ID')    def __str__(self):        return self.id    class Meta:        db_table = 'equipment_sensor'        verbose_name = u'设备传感器表'        verbose_name_plural = verbose_name        ordering = ('id',)class Equipment_Info(models.Model):    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')    devUid = models.CharField(null=True, blank=True, max_length=32, verbose_name=u'设备ID')    devNickName = models.CharField(blank=True, max_length=32, default='', verbose_name=u'设备昵称')    Channel = models.IntegerField(null=True, blank=True, verbose_name=u'设备通道')    eventType = models.IntegerField(null=True, blank=True, verbose_name=u'事件类型')    viewAccont = models.CharField(blank=True, null=True, max_length=32, verbose_name=u'设备账户')    viewPwd = models.CharField(blank=True, null=True, max_length=32, verbose_name=u'设备密码')    status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态')    alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')    eventTime = models.CharField(blank=True, null=True, max_length=16, verbose_name=u'设备报警时间')    receiveTime = models.CharField(blank=True, null=True, max_length=16, verbose_name=u'接收到报警时间')    userID = models.ForeignKey(Device_User, null=True, blank=True, to_field='userID',                               on_delete=models.CASCADE)    def __str__(self):        return self.id    class Meta:        db_table = 'equipment_info'        verbose_name = u'设备信息推送表'        verbose_name_plural = verbose_name        ordering = ('-id',)class Feedback_Info(models.Model):    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')    userID = models.CharField(blank=True, max_length=32, verbose_name=u'用户ID')    status = models.BooleanField(blank=True, default=False, verbose_name=u'状态:0未解决/解决')    content = models.TextField(blank=True, null=True, verbose_name=u'反馈描述')    add_time = models.DateTimeField(blank=True, null=True, verbose_name=u'加入时间/反馈时间', auto_now_add=True)    update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True)    def __str__(self):        return self.id    class Meta:        db_table = 'feedback_info'        verbose_name = u'用户反馈信息表'        verbose_name_plural = verbose_name        ordering = ('id',)class Store_Meal(models.Model):    id = models.AutoField(primary_key=True, verbose_name=u'自增ID')    title = models.CharField(blank=True, max_length=32, verbose_name=u'标题')    price = models.CharField(blank=True, max_length=32, verbose_name=u'价格')    day = models.IntegerField(null=True, blank=True, verbose_name=u'存储时间')    content = models.TextField(blank=True, null=True, verbose_name=u'描述')    add_time = models.DateTimeField(blank=True, null=True, verbose_name=u'加入时间', auto_now_add=True)    update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True)    def __str__(self):        return self.id    class Meta:        db_table = 'store_meal'        verbose_name = u'存储套餐'        verbose_name_plural = verbose_name        ordering = ('id',)class Device_Meal(models.Model):    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')    status = models.IntegerField(null=True, blank=True, verbose_name=u'状态')    uid = models.CharField(null=True, blank=True, max_length=32, verbose_name=u'设备ID')    channel = models.IntegerField(null=True, blank=True, verbose_name=u'设备通道')    add_time = models.DateTimeField(blank=True, null=True, verbose_name=u'加入时间', auto_now_add=True)    update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True)    end_time = models.DateTimeField(blank=True, verbose_name=u'最后时间')    rank = models.ForeignKey(Store_Meal, blank=True, to_field='id',                             on_delete=models.CASCADE, verbose_name='套餐类型')    class Meta:        db_table = 'device_meal'        verbose_name = u'设备关联套餐表'        verbose_name_plural = verbose_name        ordering = ('id',)    def __str__(self):        return self.idclass Equipment_Version(models.Model):    eid = models.CharField(blank=True, max_length=32, primary_key=True)    ESN = models.CharField(blank=True, max_length=32, verbose_name=u'设备规格名称')    code = models.CharField(blank=True, max_length=32, verbose_name=u'设备规格代码')    version = models.CharField(blank=True, max_length=32, verbose_name=u'设备版本')    softwareVersion = models.CharField(blank=True, max_length=32, verbose_name=u'软件版本')    chipModelList2Code = models.CharField(max_length=32, blank=True, verbose_name=u'主芯片码')    channel = models.IntegerField(blank=True, verbose_name=u'通道数')    resolutionRatio = models.IntegerField(blank=True, verbose_name=u'分辨率')    type = models.CharField(blank=True, max_length=16, verbose_name=u'设备机型')    companyCode = models.CharField(blank=True, max_length=128, verbose_name=u'用户公司名称')    data_joined = models.DateTimeField(blank=True, verbose_name=u'加入时间', auto_now_add=True)    fileSize = models.IntegerField(blank=True, verbose_name=u'文件总大小')    filePath = models.CharField(blank=True, max_length=256, verbose_name=u'升级文件路径')    Description = models.TextField(blank=True, default='', verbose_name=u'描述信息')    fileMd5 = models.CharField(blank=True, max_length=32, null=True, verbose_name=u'上传文件MD5加密')    status = models.BooleanField(blank=True, default=True, verbose_name=u'是否开启更新状态')    update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True)    lang = models.CharField(blank=True, null=True, default=0, max_length=32, verbose_name=u'ota包内置语言')    def __str__(self):        return self.eid    class Meta:        verbose_name = '设备版本信息'        ordering = ('-data_joined',)        db_table = 'equipment_version'class App_Info(models.Model):    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')    appBundleId = models.CharField(blank=True, max_length=32, verbose_name=u'appID')    appName = models.CharField(blank=True, max_length=32, verbose_name=u'app名称')    systemLanguage = models.CharField(blank=True, max_length=32, verbose_name=u'系统语言')    newAppversion = models.CharField(blank=True, max_length=12, verbose_name=u'系统版本')    bundleVersion = models.CharField(blank=True, max_length=12, verbose_name=u'项目版本')    content = models.TextField(blank=True, null=True, verbose_name=u'更新内容')    app_type = models.IntegerField(null=True, blank=True, verbose_name=u'app类型')    add_time = models.DateTimeField(blank=True, null=True, verbose_name=u'加入时间', auto_now_add=True)    update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True)    downloadLink = models.TextField(blank=True, null=True, verbose_name='升级')    def __str__(self):        return self.id    class Meta:        db_table = 'app_info'        verbose_name = u'app信息表'        verbose_name_plural = verbose_name        ordering = ('id',)
 |