from itertools import chain from django.contrib.auth.models import BaseUserManager, AbstractBaseUser from django.db import models # from django.utils import six from django.utils.encoding import python_2_unicode_compatible from imagekit.models import ProcessedImageField from imagekit.processors import ResizeToFill import six from AnsjerPush.config import SERVER_DOMAIN class 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_compatible class 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): rid = models.SmallIntegerField(primary_key=True, unique=True, verbose_name=u'用户角色组ID') roleName = models.CharField(max_length=32, 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 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 permslist class Device_User(AbstractBaseUser): userID = models.CharField(blank=True, max_length=32, primary_key=True, verbose_name=u'用户ID', unique=True) role = models.ManyToManyField(to='Role', blank=True, verbose_name=u'用户角色', db_table='user_role') username = models.CharField(max_length=64, verbose_name=u'用户名', default='', blank=True) password = models.CharField(max_length=128, verbose_name=u'密码') userEmail = models.EmailField(max_length=64, verbose_name=u'邮箱', default='', 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=64, 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, max_length=16, default='en', verbose_name=u'语言地区') # 手机注册增加字段 phone = models.CharField(max_length=16, verbose_name=u'手机号', default='', 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_role_id(self): rids = [] roles = self.role.all() for role in roles: rids.append(role.rid) return rids 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 @property def is_staff(self): return self.is_superuser class Equipment_Info(models.Model): id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID') devUid = models.CharField(default='', blank=True, max_length=32, verbose_name=u'设备ID') devNickName = models.CharField(blank=True, max_length=32, default='', verbose_name=u'设备昵称') Channel = models.IntegerField(default=1, blank=True, verbose_name=u'设备通道') eventType = models.IntegerField(default=0, blank=True, 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, default='', max_length=16, verbose_name=u'设备报警时间') receiveTime = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间') userID = models.ForeignKey(Device_User, null=True, blank=True, to_field='userID', on_delete=models.CASCADE) is_st = models.SmallIntegerField(default=0, verbose_name='是否截图') # 0 否,1 是图,2,视频 addTime = models.IntegerField(verbose_name='添加时间', default=0) def __str__(self): return self.id class Meta: db_table = 'equipment_info' verbose_name = u'设备信息推送表' verbose_name_plural = verbose_name ordering = ('-id',) # 存储通表 class VodBucketModel(models.Model): id = models.AutoField(primary_key=True, verbose_name='主键') bucket = models.CharField(max_length=30, verbose_name='设备UID') storeDay = models.IntegerField(default=0, verbose_name='存储生命周期(天)') content = models.TextField(verbose_name='描述') endpoint = models.CharField(max_length=125, default='', verbose_name='存储节点') area = models.CharField(max_length=16, default='', verbose_name='区域') region = models.CharField(max_length=16, default='', verbose_name='regionID') addTime = models.IntegerField(verbose_name='添加时间', default=0) updTime = models.IntegerField(verbose_name='更新时间', default=0) def __str__(self): return self.id class Meta: db_table = 'vod_bucket' verbose_name = u'存储通信息' verbose_name_plural = verbose_name ordering = ('-id',) class VodHlsModel(models.Model): id = models.AutoField(primary_key=True, verbose_name='回放列表主键') uid = models.CharField(max_length=20, verbose_name='设备UID') channel = models.SmallIntegerField(default=0, verbose_name='通道') time = models.IntegerField(verbose_name='播放列表名字时间戳', default=0, db_index=True) endTime = models.IntegerField(verbose_name='删除时间', default=0) sec = models.IntegerField(verbose_name='秒数', default=0) bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE, default=1, verbose_name='存储空间') def __str__(self): return self.id class Meta: db_table = 'vod_hls' verbose_name = u'云存回放信息表' verbose_name_plural = verbose_name ordering = ('-id',) class OssCrdModel(models.Model): id = models.AutoField(primary_key=True, verbose_name='主键') uid = models.CharField(max_length=20, verbose_name='设备UID') channel = models.SmallIntegerField(default=0, verbose_name='通道') data = models.TextField(verbose_name='设备sts') addTime = models.IntegerField(verbose_name='添加时间', default=0) bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE, default=1, verbose_name='存储空间') def __str__(self): return self.id class Meta: db_table = 'osscrd' verbose_name = u'设备证书' verbose_name_plural = verbose_name ordering = ('-id',) class UID_Bucket(models.Model): id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID') uid = models.CharField(max_length=20, verbose_name='设备UID') channel = models.SmallIntegerField(default=0, verbose_name='通道') bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE, verbose_name='存储空间') status = models.SmallIntegerField(default=0, verbose_name='状态[0:开启,1:关闭]') endTime = models.IntegerField(verbose_name='结束时间', default=0) class Meta: db_table = 'vod_uid_bucket' verbose_name = u'设备关联套餐表' verbose_name_plural = verbose_name ordering = ('id',) class UID_Preview(models.Model): id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID') uid = models.CharField(default='', max_length=20, db_index=True, verbose_name='设备UID') channel = models.SmallIntegerField(verbose_name=u'通道号', default=0) addTime = models.IntegerField(verbose_name='添加时间', default=0) updTime = models.IntegerField(verbose_name='更新时间', default=0) class Meta: db_table = 'uid_preview' verbose_name = '设备预览图' verbose_name_plural = verbose_name ordering = ('id',) # 设备推送重构 # 设备配置表,新 class UidSetModel(models.Model): id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID') uid = models.CharField(max_length=20, db_index=True, unique=True, verbose_name='设备UID') channel = models.SmallIntegerField(default=0, verbose_name='通道数量') # detect_status = models.SmallIntegerField(default=0, verbose_name='推送开关') # 状态[0:关闭,1:开启,2:用户解绑] detect_interval = models.IntegerField(verbose_name='推送间隔', default=60) # 秒 addTime = models.IntegerField(verbose_name='添加时间', default=0) updTime = models.IntegerField(verbose_name='更新时间', default=0) ucode = models.CharField(max_length=32, verbose_name='设备产品码', default='') version = models.CharField(max_length=32, verbose_name='设备版本', default='') p2p_region = models.CharField(max_length=16, verbose_name='设备区域', default='ALL') # ALL CN EU US cloud_vod = models.SmallIntegerField(default=2, verbose_name='云存开关') # 0,关闭,1开启,2,不支持 tz = models.CharField(default='', max_length=16, verbose_name='设备时区') # +8 video_code = models.SmallIntegerField(default=0, verbose_name='编码类型') # 0:264,1:265 nickname = models.CharField(default='', max_length=64, verbose_name='设备昵称') ip = models.CharField(max_length=20, default='', verbose_name=u'设备ip') pwd = models.CharField(max_length=32, default='', verbose_name=u'设备密码') # 设备重置后第一次启动时间 resetTime = models.IntegerField(default=0, verbose_name='设备重置时间') class Meta: db_table = 'uid_set' verbose_name = u'设备配置表' verbose_name_plural = verbose_name ordering = ('id',) # 设备关联用户推送 class UidPushModel(models.Model): id = models.AutoField(primary_key=True, verbose_name='自增id') userID = models.ForeignKey(Device_User, to_field='userID', on_delete=models.CASCADE) uid_set = models.ForeignKey(UidSetModel, to_field='id', on_delete=models.CASCADE) appBundleId = models.CharField(blank=True, max_length=32, verbose_name=u'appID') app_type = models.IntegerField(default=0, verbose_name=u'app类型 1:ios,2:安卓') push_type = models.IntegerField(default=0, verbose_name=u'推送类型') # 0,apns 1,安卓gcm 2,极光 token_val = models.CharField(default='', max_length=160, verbose_name=u'设备验证令牌') m_code = models.CharField(default='', max_length=64, verbose_name='手机唯一标识') addTime = models.IntegerField(verbose_name='添加时间', default=0) updTime = models.IntegerField(verbose_name='更新时间', default=0) lang = models.CharField(max_length=8, verbose_name='推送语言类型', default='en') # en英文 cn中文 tz = models.CharField(max_length=8, verbose_name='utc时区', default='0') class Meta: db_table = 'uid_push' verbose_name = '设备绑定' verbose_name_plural = verbose_name ordering = ('-id',)