from django.db import models from django.utils import six from imagekit.processors import ResizeToFill from imagekit.models import ProcessedImageField import Ansjer.settings as api_settings from django.utils.encoding import python_2_unicode_compatible from django.contrib.auth.models import BaseUserManager, AbstractBaseUser 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, 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) password = models.CharField(max_length=128, verbose_name=u'密码') userEmail = models.EmailField(max_length = 64, verbose_name=u'邮箱', unique = True, default='AnonymousUser@qq.com') # 实际的路径就是 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=api_settings.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'语言地区') objects = UserManager() USERNAME_FIELD = 'username' # 必须有一个唯一标识 REQUIRED_FIELDS = ['userID', '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 def toJSON(self, fields=None, exclude=None): Fields = [] for field in self._meta.fields: Fields.append(field.name) data = {} for attr in Fields: if fields and attr not in fields: continue if exclude and attr in exclude: continue if isinstance(getattr(self, attr), datetime.datetime): data[attr] = getattr(self, attr).strftime('%Y-%m-%d %H:%M:%S') elif isinstance(getattr(self, attr), datetime.date): data[attr] = getattr(self, attr).strftime('%Y-%m-%d') elif isinstance(getattr(self, attr), ProcessedImageFieldFile): data[attr] = str(getattr(self, attr)) else: data[attr] = getattr(self, attr) import simplejson as json return json.dumps(data, ensure_ascii=False) ''' @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) # to_field 指定当前关系与被关联对象中的哪个字段关联。默认情况下,to_field 指向被关联对象的主键 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=100, null=True, verbose_name=u'设备区域ip') area = models.CharField(blank=True, max_length=100, null=True, verbose_name=u'设备区域area') REQUIRED_FIELDS = [] def __str__(self): return self.NickName ''' def toJSON(self, fields=None, exclude=None): Fields = [] for field in self._meta.fields: Fields.append(field.name) data = {} for attr in Fields: if fields and attr not in fields: continue if exclude and attr in exclude: continue if isinstance(getattr(self, attr), datetime.datetime): data[attr] = getattr(self, attr).strftime('%Y-%m-%d %H:%M:%S') elif isinstance(getattr(self, attr), datetime.date): data[attr] = getattr(self, attr).strftime('%Y-%m-%d') elif isinstance(getattr(self, attr), Device_User): data[attr] = getattr(self, attr).userID else: data[attr] = getattr(self, attr) import simplejson as json return json.dumps(data,ensure_ascii=False) 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 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_name class 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_name class Access_Log(models.Model): id = models.AutoField(primary_key=True,verbose_name=u'自增标记ID') user = models.CharField(max_length=100,null=True,blank=True,verbose_name=u'用户') operation = models.CharField(max_length=100,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_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(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'接收到报警时间') 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.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,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) 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) def __str__(self): return self.id class Meta: db_table = 'app_info' verbose_name = u'app信息表' verbose_name_plural=verbose_name ordering = ('id',)