models.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. from itertools import chain
  2. from django.contrib.auth.models import AbstractBaseUser,BaseUserManager
  3. from django.db import models
  4. from imagekit.models import ProcessedImageField
  5. from imagekit.processors import ResizeToFill
  6. from AnsjerPush.config import SERVER_DOMAIN
  7. from django.utils.encoding import python_2_unicode_compatible
  8. from django.utils import six
  9. class PermissionsManager(models.Manager):
  10. use_in_migrations = True
  11. def get_by_natural_key(self, permName):
  12. return self.get(
  13. permName=permName
  14. )
  15. class RoleManager(models.Manager):
  16. """
  17. The manager for the auth's Role model.
  18. """
  19. use_in_migrations = True
  20. def get_by_natural_key(self, roleName):
  21. return self.get(roleName=roleName)
  22. @python_2_unicode_compatible
  23. class Permissions(models.Model):
  24. permName = models.CharField(blank=True, null=True, max_length=32, unique=True, verbose_name=u'权限名称')
  25. description = models.CharField(blank=True, null=True, max_length=128, verbose_name=u'描述信息', default='')
  26. objects = PermissionsManager()
  27. def __str__(self):
  28. return "%s" % (
  29. six.text_type(self.description))
  30. class Meta:
  31. ordering = ['permName']
  32. db_table = 'permissions'
  33. verbose_name = u'role permission'
  34. verbose_name_plural = verbose_name
  35. unique_together = (('permName'),)
  36. def natural_key(self):
  37. return (self.permName)
  38. class Role(models.Model):
  39. rid = models.SmallIntegerField(primary_key=True, unique=True, verbose_name=u'用户角色组ID')
  40. roleName = models.CharField(max_length=32, unique=True,
  41. default='User', verbose_name=u'角色名称')
  42. permission = models.ManyToManyField(to='Permissions', blank=True, verbose_name=u'权限', db_table='role_permissions')
  43. Description = models.TextField(blank=True, default='', verbose_name=u'描述信息')
  44. objects = RoleManager()
  45. class Meta:
  46. ordering = ['roleName']
  47. db_table = 'role'
  48. verbose_name = u'用户角色'
  49. verbose_name_plural = verbose_name
  50. def __str__(self):
  51. return self.roleName
  52. def natural_key(self):
  53. return (self.roleName,)
  54. def get_all_permission(self):
  55. perms = self.permission.all()
  56. permslist = []
  57. if self.rid == 100:
  58. perms = Permissions.objects.all()
  59. for perm in perms:
  60. permslist.append(perm.permName)
  61. return permslist
  62. else:
  63. permlist_tmp = []
  64. for perm in perms:
  65. permlist_tmp.append(perm.permName)
  66. permSet = set(permlist_tmp)
  67. permslist = list(permSet)
  68. permslist.sort()
  69. return permslist
  70. class UserManager(BaseUserManager):
  71. def create_user(self, username, password, userID, is_active,
  72. user_isValid, **extra_fields):
  73. user = self.model(
  74. username=username,
  75. userID=userID,
  76. is_active=is_active,
  77. user_isValid=user_isValid,
  78. **extra_fields
  79. )
  80. user.set_password(password)
  81. user.save(using=self._db)
  82. role = Role.objects.get(rid=1)
  83. user.role.add(role)
  84. return user
  85. def create_superuser(self, username, password, userID, is_active,
  86. user_isValid, **extra_fields):
  87. # extra_fields.setdefault('is_superuser', is_superuser)
  88. is_superuser = extra_fields.get('is_superuser', None)
  89. if is_superuser != 100 and is_superuser != 1:
  90. raise ValueError('Superuser must have is_superuser=1 or 100.')
  91. return self.create_user(username, password, userID, is_active,
  92. user_isValid, **extra_fields)
  93. class Device_User(AbstractBaseUser):
  94. userID = models.CharField(blank=True, max_length=32, primary_key=True,
  95. verbose_name=u'用户ID', unique=True)
  96. role = models.ManyToManyField(to='Role', blank=True, verbose_name=u'用户角色', db_table='user_role')
  97. username = models.CharField(max_length=64, verbose_name=u'用户名', default='', blank=True)
  98. password = models.CharField(max_length=128, verbose_name=u'密码')
  99. userEmail = models.EmailField(max_length=64, verbose_name=u'邮箱', default='', blank=True)
  100. # 实际的路径就是 MEDIA_ROOT/Image/filename,所以可用upload_to来指定文件存放的前缀路径
  101. userIconPath = ProcessedImageField(blank=True, upload_to='User/Images/', default='static/User/default.png',
  102. verbose_name=u'头像',
  103. # 图片将处理成85x85的尺寸
  104. processors=[ResizeToFill(85, 85)], )
  105. userIconUrl = models.URLField(blank=True, max_length=128, default=SERVER_DOMAIN
  106. + 'account/getAvatar/User/defaultUser.png')
  107. NickName = models.CharField(blank=True, max_length=64, default='', verbose_name=u'用户昵称')
  108. is_superuser = models.IntegerField(blank=True, default=0, verbose_name=u'用户类型')
  109. is_active = models.BooleanField(blank=True, default=False, verbose_name=u'用户活动状态')
  110. data_joined = models.DateTimeField(blank=True, verbose_name=u'加入时间', auto_now_add=True)
  111. last_login = models.DateTimeField(blank=True, verbose_name='u最后登录时间', auto_now=True)
  112. user_isValid = models.BooleanField(blank=True, default=False, verbose_name=u'用户有效性', help_text=u'是否是认证通过的用户')
  113. online = models.BooleanField(blank=True, default=False, verbose_name=u'用户登录状态')
  114. machine_code = models.CharField(blank=True, max_length=128, default='', verbose_name=u'机械码')
  115. language = models.CharField(blank=True, max_length=16, default='en', verbose_name=u'语言地区')
  116. # 手机注册增加字段
  117. phone = models.CharField(max_length=16, verbose_name=u'手机号', default='', blank=True)
  118. objects = UserManager()
  119. USERNAME_FIELD = 'userID' # 必须有一个唯一标识
  120. REQUIRED_FIELDS = ['is_superuser'] # 创建superuser时的必须字段
  121. class Meta:
  122. ordering = ('-data_joined',)
  123. verbose_name = u'用户信息'
  124. db_table = 'device_user'
  125. get_latest_by = 'last_login'
  126. def __str__(self):
  127. return self.username
  128. def get_role_id(self):
  129. rids = []
  130. roles = self.role.all()
  131. for role in roles:
  132. rids.append(role.rid)
  133. return rids
  134. def get_all_permission(self):
  135. roles = self.role.all()
  136. perms = self.permission.all()
  137. permslist = []
  138. for role in roles:
  139. if role.rid == 100:
  140. perms = Permissions.objects.all()
  141. for perm in perms:
  142. permslist.append(perm.permName)
  143. return permslist
  144. for perm in perms:
  145. permslist.append(perm.permName)
  146. permSet = set(permslist)
  147. for role in roles:
  148. permlist_tmp = []
  149. for perm in role.permission.all():
  150. permlist_tmp.append(perm.permName)
  151. permSet_tmp = set(permlist_tmp)
  152. permSet = permSet.union(permSet_tmp)
  153. permslist = list(permSet)
  154. permslist.sort()
  155. return permslist
  156. @property
  157. def is_staff(self):
  158. return self.is_superuser
  159. # 设备表是建项目开发者设计的,自己看着办
  160. class Device_Info(models.Model):
  161. id = models.CharField(blank=True, max_length=32, primary_key=True)
  162. userID = models.ForeignKey(Device_User, blank=True, to_field='userID', on_delete=models.CASCADE)
  163. NickName = models.CharField(blank=True, max_length=32, verbose_name=u'设备名称')
  164. UID = models.CharField(blank=True, max_length=32, verbose_name=u'设备UID', default='')
  165. SID = models.CharField(blank=True, max_length=32, verbose_name=u'服务器ID', default='')
  166. View_Account = models.CharField(blank=True, max_length=32, verbose_name=u'设备用户名称', default='')
  167. View_Password = models.CharField(blank=True, max_length=32, verbose_name=u'设备密码', default='')
  168. AudioFormat = models.IntegerField(blank=True, default=1, verbose_name=u'初始化影像')
  169. EventNotification = models.IntegerField(blank=True, verbose_name=u'报警类型', default=0)
  170. ChannelIndex = models.IntegerField(blank=True, verbose_name=u'通道号', default=0)
  171. Online = models.BooleanField(blank=True, default=False, verbose_name=u'设备是否在线')
  172. mMonitorIndex = models.IntegerField(blank=True, default=-1)
  173. Type = models.IntegerField(blank=True, verbose_name='设备类型')
  174. DebugMode = models.IntegerField(blank=True, verbose_name=u'调试模式', default=0)
  175. NotificationMode = models.IntegerField(blank=True, verbose_name=u'是否报警', default=0)
  176. qvgaLevel = models.BooleanField(blank=True, verbose_name=u'SD与HD画面', default=0,
  177. help_text=u'0代表:SD、1代表:HD')
  178. isShare = models.BooleanField(blank=True, verbose_name=u'共享设备',
  179. help_text=u'是否为共享获取的设备', default=False)
  180. primaryUserID = models.CharField(blank=True, verbose_name='主用户id', max_length=32, default='')
  181. primaryMaster = models.CharField(max_length=64, verbose_name=u'主用户名', default='')
  182. data_joined = models.DateTimeField(blank=True, verbose_name=u'设备添加时间', auto_now_add=True)
  183. update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True, null=True)
  184. ip = models.CharField(blank=True, max_length=20, default='', verbose_name=u'设备区域ip')
  185. area = models.CharField(blank=True, max_length=100, default='', verbose_name=u'设备区域area')
  186. # ios要求新增字段
  187. version = models.CharField(blank=True, max_length=20, default='', verbose_name=u'版本号')
  188. SpaceUsable = models.CharField(blank=True, max_length=20, default='', verbose_name=u'可用空间')
  189. SpaceSum = models.CharField(blank=True, max_length=20, default='', verbose_name=u'总空间')
  190. WIFIName = models.CharField(blank=True, max_length=50, default='', verbose_name=u'无线名称')
  191. WIFIIP = models.CharField(blank=True, max_length=20, default='', verbose_name=u'无线ip')
  192. WIFIPwd = models.CharField(blank=True, max_length=50, default='', verbose_name=u'无线密码')
  193. isDetector = models.BooleanField(blank=True, verbose_name=u'侦测开关0:关闭,1:开启)', default=False)
  194. DetectorRank = models.IntegerField(blank=True, default=0, verbose_name=u'侦测灵敏度 1:低,2:中,3:高4:最高')
  195. iSNotification = models.BooleanField(blank=True, verbose_name=u'报警通知 0:关闭,1:开启)', default=False)
  196. MirrorType = models.IntegerField(blank=True, default=0, verbose_name=u'镜像类型 0:关闭镜像,1:上下镜像,2:左右镜像,3:上下左右镜像')
  197. RecordType = models.IntegerField(blank=True, default=0, verbose_name=u'录像模式(0:关闭,1:全是录像,3:报警录像)')
  198. TimeZone = models.CharField(blank=True, max_length=50, default='', verbose_name=u'时区')
  199. isVod = models.SmallIntegerField(blank=True, default=0, verbose_name='是否支持云存') # 是否支持云存设备
  200. isExist = models.SmallIntegerField(blank=True, default=1, verbose_name='是否被删除') # 是否被删除了(需主用户交互) 1存在,0不存在
  201. ###
  202. REQUIRED_FIELDS = []
  203. def __str__(self):
  204. return self.NickName
  205. def model_to_dict(self, fields=None, exclude=None):
  206. opts = self._meta
  207. data = {}
  208. for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many):
  209. if not getattr(f, 'editable', False):
  210. continue
  211. if fields and f.name not in fields:
  212. continue
  213. if exclude and f.name in exclude:
  214. continue
  215. data[f.name] = f.value_from_object(self)
  216. return data
  217. class Meta:
  218. db_table = 'device_info'
  219. ordering = ('-data_joined',)
  220. verbose_name = u'用户设备信息表'
  221. verbose_name_plural = verbose_name
  222. class Equipment_Info(models.Model):
  223. id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
  224. devUid = models.CharField(default='', blank=True, max_length=32, verbose_name=u'设备ID')
  225. devNickName = models.CharField(blank=True, max_length=32, default='', verbose_name=u'设备昵称')
  226. Channel = models.IntegerField(default=1, blank=True, verbose_name=u'设备通道')
  227. eventType = models.IntegerField(default=0, blank=True, verbose_name=u'事件类型')
  228. status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态')
  229. alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
  230. eventTime = models.CharField(blank=True, default='', max_length=16, verbose_name=u'设备报警时间')
  231. receiveTime = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
  232. userID = models.ForeignKey(Device_User, null=True, blank=True, to_field='userID', on_delete=models.CASCADE)
  233. is_st = models.SmallIntegerField(default=0, verbose_name='是否截图') # 0 否,1 是图,2,视频
  234. addTime = models.IntegerField(verbose_name='添加时间', default=0)
  235. def __str__(self):
  236. return self.id
  237. class Meta:
  238. db_table = 'equipment_info'
  239. verbose_name = u'设备信息推送表'
  240. verbose_name_plural = verbose_name
  241. ordering = ('-id',)
  242. # 设备推送重构
  243. # 设备配置表,新
  244. class UidSetModel(models.Model):
  245. id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
  246. uid = models.CharField(max_length=20, verbose_name='设备UID')
  247. channel = models.SmallIntegerField(default=0, verbose_name='通道数量') #
  248. detect_status = models.SmallIntegerField(default=0, verbose_name='推送开关') # 状态[0:关闭,1:开启,2:用户解绑]
  249. detect_interval = models.IntegerField(verbose_name='推送间隔', default=0) # 秒
  250. addTime = models.IntegerField(verbose_name='添加时间', default=0)
  251. updTime = models.IntegerField(verbose_name='更新时间', default=0)
  252. # addTime 2019年 05月 27日 星期一 16:52:55 CST
  253. ucode = models.CharField(max_length=32, verbose_name='设备产品码', default='')
  254. version = models.CharField(max_length=32, verbose_name='设备版本', default='')
  255. p2p_region = models.CharField(max_length=16, verbose_name='设备区域', default='ALL') # ALL CN EU US
  256. # addTime Thu Jun 27 02:32:45 UTC 2019
  257. cloud_vod = models.SmallIntegerField(default=2, verbose_name='云存开关') # 0,关闭,1开启,2,不支持
  258. tz = models.CharField(default='', max_length=16, verbose_name='设备时区') # utc+8
  259. video_code = models.SmallIntegerField(default=0, verbose_name='编码类型') # 0:264,1:265
  260. nickname = models.CharField(default='', max_length=64, verbose_name='设备昵称')
  261. ip = models.CharField(blank=True, max_length=20, default='', verbose_name=u'设备ip')
  262. class Meta:
  263. db_table = 'uid_set'
  264. verbose_name = u'设备配置'
  265. verbose_name_plural = verbose_name
  266. ordering = ('id',)
  267. # 设备关联用户推送
  268. class UidPushModel(models.Model):
  269. id = models.AutoField(primary_key=True, verbose_name='自增id')
  270. userID = models.ForeignKey(Device_User, to_field='userID', on_delete=models.CASCADE)
  271. uid_set = models.ForeignKey(UidSetModel, to_field='id', on_delete=models.CASCADE)
  272. appBundleId = models.CharField(blank=True, max_length=32, verbose_name=u'appID')
  273. app_type = models.IntegerField(default=0, verbose_name=u'app类型 1:ios,2:安卓')
  274. push_type = models.IntegerField(default=0, verbose_name=u'推送类型') # 0,apns 1,安卓gcm 2,极光
  275. token_val = models.CharField(default='', max_length=160, verbose_name=u'设备验证令牌')
  276. m_code = models.CharField(default='', max_length=64, verbose_name='手机唯一标识')
  277. addTime = models.IntegerField(verbose_name='添加时间', default=0)
  278. updTime = models.IntegerField(verbose_name='更新时间', default=0)
  279. lang = models.CharField(max_length=8, verbose_name='推送语言类型', default='en') # en英文 cn中文
  280. class Meta:
  281. db_table = 'uid_push'
  282. verbose_name = '设备绑定'
  283. verbose_name_plural = verbose_name
  284. ordering = ('-id',)