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 from Ansjer.config import SERVER_DOMAIN from Service.CommonService import CommonService 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): 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 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=40, 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=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, 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_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_superuser # 设备表是建项目开发者设计的,自己看着办 class 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, default='', verbose_name=u'设备区域ip') area = models.CharField(blank=True, max_length=100, default='', verbose_name=u'设备区域area') # ios要求新增字段 version = models.CharField(blank=True, max_length=20, default='', verbose_name=u'版本号') SpaceUsable = models.CharField(blank=True, max_length=20, default='', verbose_name=u'可用空间') SpaceSum = models.CharField(blank=True, max_length=20, default='', verbose_name=u'总空间') WIFIName = models.CharField(blank=True, max_length=50, default='', verbose_name=u'无线名称') WIFIIP = models.CharField(blank=True, max_length=20, default='', verbose_name=u'无线ip') WIFIPwd = models.CharField(blank=True, max_length=50, default='', 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, default='', 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_name class Access_Log(models.Model): id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID') user = models.CharField(max_length=100, default='', db_index=True, blank=True, verbose_name=u'用户') operation = models.CharField(max_length=100, db_index=True, default='', blank=True, verbose_name=u'操作') ip = models.CharField(max_length=100, default='', db_index=True, blank=True, verbose_name=u'访问ip地址') url = models.CharField(max_length=150, default='', blank=True, verbose_name=u'访问路径') status = models.IntegerField(default=0, blank=True, verbose_name=u'状态') time = models.DateTimeField(null=True, blank=True, db_index=True, verbose_name=u'访问时间') content = models.TextField(blank=True, default='', verbose_name=u'参数内容') class Meta: db_table = 'access_log' verbose_name = u'访问日志表' verbose_name_plural = verbose_name class 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_name class 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(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) 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, null=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'标题') currency = models.CharField(blank=True,default='USD', max_length=32, verbose_name=u'货币') price = models.CharField(blank=True, max_length=32, verbose_name=u'价格') day = models.IntegerField(default=0, 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(default=0, blank=True, verbose_name=u'状态') uid = models.CharField(default='', blank=True, max_length=32, verbose_name=u'设备ID') channel = models.IntegerField(default=0, 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.id class 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, default='', 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, default='en', 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, default='', verbose_name=u'更新内容') app_type = models.IntegerField(default='', 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, default='', 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',) class Order_Model(models.Model): orderID = models.CharField(blank=True, max_length=20, primary_key=True, verbose_name=u'用户ID') # 订单关联用户 userID = models.ForeignKey(Device_User, to_field='userID', on_delete=models.CASCADE) UID = models.CharField(max_length=20, verbose_name='设备UID') channel = models.SmallIntegerField(default=0, verbose_name=u'通道数') desc = models.CharField(max_length=50, default='', verbose_name='商品描述') price = models.CharField(default='', max_length=16, verbose_name='价格') addTime = models.IntegerField(verbose_name='添加时间', default=0) updTime = models.IntegerField(verbose_name='更新时间', default=0) status = models.SmallIntegerField(default=0, verbose_name='付款状态') # 订单关联套餐 rank = models.ForeignKey(Store_Meal, to_field='id', default='', on_delete=models.CASCADE, verbose_name='套餐类型') paypal = models.CharField(max_length=150, default='', verbose_name='paypal付款url') def __str__(self): return self.orderID class Meta: db_table = 'orders' verbose_name = u'app信息表' verbose_name_plural = verbose_name ordering = ('-orderID',) 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) def __str__(self): return self.id class Meta: db_table = 'vodhls' 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='设备UID') addTime = models.IntegerField(verbose_name='添加事件',default=0) def __str__(self): return self.id class Meta: db_table = 'osscrd' verbose_name = u'设备证书' verbose_name_plural = verbose_name ordering = ('-id',)