UserManger.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  1. import os
  2. import traceback
  3. import boto3
  4. import botocore
  5. from botocore import client
  6. import simplejson as json
  7. from django.http import HttpResponse
  8. from django.utils.decorators import method_decorator
  9. from django.views.decorators.csrf import csrf_exempt
  10. from django.views.generic import TemplateView, View
  11. from Ansjer.cn_config.config_test import REGION_NAME2
  12. from Ansjer.config import BASE_DIR, ACCESS_KEY_ID, SECRET_ACCESS_KEY, REGION_NAME, AVATAR_BUCKET, CONFIG_INFO, \
  13. CONFIG_CN, CONFIG_TEST, LOGGER
  14. from Ansjer.config import SERVER_DOMAIN
  15. from Model.models import Role, Device_User, UserOauth2Model, UserExModel, CountryLanguageModel, LanguageModel, App_Info, \
  16. IcloudUseDetails, CountryModel
  17. from Object.ContentSecurityObject import ContentSecurity
  18. from Object.RedisObject import RedisObject
  19. from Object.ResponseObject import ResponseObject
  20. from Object.TokenObject import TokenObject
  21. from Service.CommonService import CommonService
  22. from Service.ModelService import ModelService
  23. class showUserMoreView(TemplateView):
  24. @method_decorator(csrf_exempt)
  25. def dispatch(self, *args, **kwargs):
  26. return super(showUserMoreView, self).dispatch(*args, **kwargs)
  27. def post(self, request, *args, **kwargs):
  28. request.encoding = 'utf-8'
  29. return self.validation(request.POST)
  30. def get(self, request, *args, **kwargs):
  31. request.encoding = 'gb2312'
  32. return self.validation(request.GET)
  33. def validation(self, request_dict):
  34. response = ResponseObject()
  35. token = request_dict.get('token', None)
  36. lang = request_dict.get('lang', 'en')
  37. app_bundle_id = request_dict.get('app_bundle_id', None)
  38. tko = TokenObject(token)
  39. response.lang = tko.lang
  40. if tko.code != 0:
  41. return response.json(tko.code)
  42. user_id = tko.userID
  43. if not user_id:
  44. return response.json(104)
  45. return self.show_user_more(user_id, lang, app_bundle_id, response)
  46. @staticmethod
  47. def show_user_more(user_id, lang, app_bundle_id, response):
  48. """
  49. 获取用户完整信息
  50. @param user_id: 用户id
  51. @param lang: 语言
  52. @param app_bundle_id: app包id
  53. @param response: 响应
  54. @return: response
  55. """
  56. device_user_qs = Device_User.objects.filter(userID=user_id)
  57. if not device_user_qs.exists():
  58. return response.json(104)
  59. try:
  60. sqlDict = CommonService.qs_to_dict(device_user_qs)
  61. for k, v in enumerate(sqlDict["datas"]):
  62. sqlDict['datas'][k]['fields'].pop('password')
  63. userIconPath = sqlDict['datas'][k]['fields']['userIconPath']
  64. region_status = sqlDict['datas'][k]['fields']['region_status']
  65. if userIconPath:
  66. if userIconPath.find('static/') != -1:
  67. userIconPath = userIconPath.replace('static/', '').replace('\\', '/')
  68. userIconUrl = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
  69. sqlDict['datas'][k]['fields']['userIconUrl'] = userIconUrl
  70. # 判断用户是否开通云盘
  71. icloud_user_qs = IcloudUseDetails.objects.filter(user_id=user_id)
  72. v['fields']['is_cloudDrive'] = 1 if icloud_user_qs.exists() else 0
  73. # 确认地区字段
  74. sqlDict['datas'][k]['fields']['region_status'] = 1 if region_status else 0
  75. if len(v['fields']['role']):
  76. roleName = ModelService.getRole(rid=v['fields']['role'][0])
  77. sqlDict["datas"][k]['fields']['rolename'] = roleName
  78. # 根据region_country的值返回api和region数据
  79. sqlDict["datas"][k]['fields']['api'] = ''
  80. sqlDict['datas'][k]['fields']['region'] = ''
  81. region_country = sqlDict["datas"][k]['fields']['region_country']
  82. if region_country != 0:
  83. # api数据
  84. country_qs = CountryLanguageModel.objects.filter(country_id=region_country).values(
  85. 'country__region__api', 'country__region__zosi_api', 'country__region__loocam_api')
  86. sqlDict["datas"][k]['fields']['api'] = country_qs[0]['country__region__api']
  87. if region_country == 1: # 中国返回美洲域名
  88. sqlDict["datas"][k]['fields']['api'] = 'https://www.dvema.com/'
  89. # 根据app_bundle_id返回对应域名
  90. if app_bundle_id:
  91. # 查询app名
  92. app_inf_qs = App_Info.objects.filter(appBundleId=app_bundle_id).values('appName')
  93. if app_inf_qs.exists():
  94. app_name = app_inf_qs[0]['appName']
  95. if 'Zosi' in app_name:
  96. sqlDict['datas'][k]['fields']['api'] = country_qs[0]['country__region__zosi_api']
  97. if region_country == 1:
  98. sqlDict['datas'][k]['fields']['api'] = 'https://api.zositech2.com/'
  99. elif 'Loocam' in app_name:
  100. sqlDict['datas'][k]['fields']['api'] = country_qs[0]['country__region__loocam_api']
  101. if region_country == 1:
  102. sqlDict['datas'][k]['fields']['api'] = 'https://api.loocam2.com/'
  103. # region数据
  104. region_country = sqlDict['datas'][k]['fields']['region_country']
  105. language_qs = LanguageModel.objects.filter(lang=lang).values('id')
  106. # 语言不存在返回英语
  107. if not language_qs.exists():
  108. language_qs = LanguageModel.objects.filter(lang='en').values('id')
  109. region_qs = CountryLanguageModel.objects.filter(country_id=region_country,
  110. language_id=language_qs[0]['id']). \
  111. values('country_name')
  112. sqlDict['datas'][k]['fields']['region'] = region_qs[0]['country_name'] if region_qs.exists() else ''
  113. # 夏令时标识
  114. country_qs = CountryModel.objects.filter(id=region_country).values('DST')
  115. sqlDict['datas'][k]['fields']['DST_AREA'] = country_qs[0]['DST'] if country_qs.exists() else 0
  116. # 增加oauth2关联数据
  117. ua_qs = UserOauth2Model.objects.filter(userID_id=user_id).values_list('authType', flat=True)
  118. sqlDict['oauth2'] = list(ua_qs)
  119. return response.json(0, sqlDict)
  120. except Exception as e:
  121. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  122. class perfectUserInfoView(TemplateView):
  123. # 完善个人信息
  124. @method_decorator(csrf_exempt)
  125. def dispatch(self, *args, **kwargs):
  126. return super(perfectUserInfoView, self).dispatch(*args, **kwargs)
  127. def post(self, request, *args, **kwargs):
  128. request.encoding = 'utf-8'
  129. userContent = request.POST.get('content', None)
  130. userIcon = request.FILES.get('userIcon', None)
  131. token = request.POST.get('token', None)
  132. return self.ValidationError(token, userContent, userIcon)
  133. def get(self, request, *args, **kwargs):
  134. request.encoding = 'gb2312'
  135. userContent = request.GET.get('content', None)
  136. userIcon = request.FILES.get('userIcon', None)
  137. token = request.GET.get('token', None)
  138. return self.ValidationError(token, userContent, userIcon)
  139. def ValidationError(self, token, userContent, userIcon):
  140. response = ResponseObject()
  141. tko = TokenObject(token)
  142. response.lang = tko.lang
  143. if tko.code != 0:
  144. return response.json(tko.code)
  145. userID = tko.userID
  146. if not userID:
  147. return response.json(309)
  148. userIconPath = ''
  149. if userIcon:
  150. # 上传头像到aws s3
  151. aws_s3_client = boto3.client(
  152. 's3',
  153. region_name=REGION_NAME,
  154. aws_access_key_id=ACCESS_KEY_ID,
  155. aws_secret_access_key=SECRET_ACCESS_KEY,
  156. config=botocore.client.Config(signature_version='s3v4'),
  157. )
  158. Key = userID + '/' + userIcon.name
  159. aws_s3_client.put_object(Bucket=AVATAR_BUCKET, Key=Key, Body=userIcon)
  160. userIconPath = userID + '/' + userIcon.name
  161. # 测试/国内服,验证头像是否合规
  162. if CONFIG_INFO == CONFIG_CN or CONFIG_INFO == CONFIG_TEST:
  163. # 测试服头像地区为us-west-1
  164. if CONFIG_INFO == CONFIG_TEST:
  165. aws_s3_client = boto3.client(
  166. 's3',
  167. region_name=REGION_NAME2,
  168. aws_access_key_id=ACCESS_KEY_ID,
  169. aws_secret_access_key=SECRET_ACCESS_KEY,
  170. config=botocore.client.Config(signature_version='s3v4'),
  171. )
  172. params = {'Bucket': AVATAR_BUCKET, 'Key': Key}
  173. image_url = aws_s3_client.generate_presigned_url('get_object', Params=params)
  174. service = 'profilePhotoCheck'
  175. LOGGER.info('头像链接:{}'.format(image_url))
  176. service_dict = {'imageUrl': image_url}
  177. service_parameters = json.dumps(service_dict)
  178. legal = ContentSecurity().image_review(service, service_parameters)
  179. if not legal:
  180. return response.json(106)
  181. if userContent:
  182. dataValid = json.loads(userContent)
  183. if 'userID' and 'password' and 'is_superuser' in dataValid.keys():
  184. return response.json(444)
  185. if not userIconPath and not userContent:
  186. return response.json(444)
  187. elif not userIconPath and userContent:
  188. return self.perfectUserInfoUpdate(userID, response, userContent=userContent)
  189. elif userIconPath and not userContent:
  190. return self.perfectUserInfoUpdate(userID, response, userIconPath=userIconPath)
  191. else:
  192. return self.perfectUserInfoUpdate(userID, response, userIconPath=userIconPath, userContent=userContent)
  193. def perfectUserInfoUpdate(slef, userID, response, **kwargs):
  194. """
  195. :param username:
  196. :param userContent:
  197. :param args:
  198. :param kwargs:
  199. :return:
  200. """
  201. User = Device_User.objects.filter(userID=userID)
  202. if not User.exists():
  203. return response.json(104)
  204. userIconPath = kwargs.get('userIconPath', None)
  205. userContent = kwargs.get('userContent', None)
  206. userIconUrl = ""
  207. if userIconPath:
  208. userIconUrl = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
  209. if userContent:
  210. try:
  211. UserData = json.loads(userContent)
  212. except Exception as e:
  213. return response.json(444, repr(e))
  214. # 测试/国内服,验证昵称是否合规
  215. if CONFIG_INFO == CONFIG_CN or CONFIG_INFO == CONFIG_TEST:
  216. nickname = UserData.get('NickName')
  217. if nickname:
  218. service = 'nickname_detection'
  219. service_dict = {'content': nickname}
  220. service_parameters = json.dumps(service_dict)
  221. legal = ContentSecurity().text_review(service, service_parameters)
  222. if not legal:
  223. return response.json(108)
  224. try:
  225. if userIconPath and userContent:
  226. User.update(userIconPath=userIconPath, userIconUrl=userIconUrl, **UserData)
  227. elif not userIconPath and userContent:
  228. User.update(**UserData)
  229. elif userIconPath and not userContent:
  230. User.update(userIconPath=userIconPath, userIconUrl=userIconUrl)
  231. except Exception as e:
  232. return response.json(117, repr(e))
  233. else:
  234. res = CommonService.qs_to_dict(User)
  235. for k, v in enumerate(res["datas"]):
  236. res['datas'][k]['fields'].pop('password')
  237. userIconPath = res['datas'][k]['fields']['userIconPath']
  238. region_status = res['datas'][k]['fields']['region_status']
  239. if region_status is True:
  240. res['datas'][k]['fields']['region_status'] = 1
  241. else:
  242. res['datas'][k]['fields']['region_status'] = 0
  243. if userIconPath and userIconUrl != '':
  244. res['datas'][k]['fields']['userIconUrl'] = userIconUrl
  245. return response.json(0, res)
  246. class getAvatarView(TemplateView):
  247. @method_decorator(csrf_exempt)
  248. def dispatch(self, *args, **kwargs):
  249. return super(getAvatarView, self).dispatch(*args, **kwargs)
  250. def post(self, request, *args, **kwargs):
  251. request.encoding = 'utf-8'
  252. filePath = kwargs.get('filePath', '')
  253. filePath.encode(encoding='utf-8', errors='strict')
  254. return self.getAvatar(filePath)
  255. def get(self, request, *args, **kwargs):
  256. request.encoding = 'utf-8'
  257. filePath = kwargs.get('filePath', '')
  258. filePath.encode(encoding='utf-8', errors='strict')
  259. return self.getAvatar(filePath)
  260. def getAvatar(self, filePath):
  261. response = ResponseObject()
  262. if not filePath:
  263. return response.json(800)
  264. if filePath == 'User/default.png' or filePath == 'User/defaultUser.png':
  265. # 使用默认头像
  266. try:
  267. aws_s3_client = boto3.client(
  268. 's3',
  269. region_name=REGION_NAME,
  270. aws_access_key_id=ACCESS_KEY_ID,
  271. aws_secret_access_key=SECRET_ACCESS_KEY,
  272. config=botocore.client.Config(signature_version='s3v4'),
  273. )
  274. get_object_response = aws_s3_client.get_object(Bucket=AVATAR_BUCKET, Key='default/default.png')
  275. return HttpResponse(get_object_response['Body'], content_type="image/jpeg")
  276. except Exception as e:
  277. print(e)
  278. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  279. fullPath = os.path.join(BASE_DIR, "static", filePath).replace('\\', '/')
  280. if os.path.isfile(fullPath):
  281. try:
  282. imageData = open(fullPath, 'rb').read()
  283. return HttpResponse(imageData, content_type="image/jpeg")
  284. except Exception as e:
  285. return response.json(906, repr(e))
  286. else:
  287. try:
  288. aws_s3_client = boto3.client(
  289. 's3',
  290. region_name=REGION_NAME,
  291. aws_access_key_id=ACCESS_KEY_ID,
  292. aws_secret_access_key=SECRET_ACCESS_KEY,
  293. config=botocore.client.Config(signature_version='s3v4'),
  294. )
  295. get_object_response = aws_s3_client.get_object(Bucket=AVATAR_BUCKET, Key=filePath)
  296. return HttpResponse(get_object_response['Body'], content_type="image/jpeg")
  297. except Exception as e:
  298. return response.json(906, repr(e))
  299. @csrf_exempt
  300. def delUserInterface(request):
  301. response = ResponseObject()
  302. if request.method == 'POST':
  303. request_dict = request.POST
  304. elif request.method == 'GET':
  305. request_dict = request.GET
  306. else:
  307. return response.json(404)
  308. token = request_dict.get('token', None)
  309. delUserID = request_dict.get('delUserID', None)
  310. if not token or not delUserID:
  311. return response.json(444, 'token,delUserID')
  312. tko = TokenObject(token)
  313. response.lang = tko.lang
  314. if tko.code != 0:
  315. return response.json(tko.code)
  316. userID = tko.userID
  317. if not userID:
  318. return response.json(309)
  319. userValid = Device_User.objects.filter(userID=userID)
  320. if not userValid.exists():
  321. return response.json(104)
  322. own_perm = ModelService.check_perm(userID=userID, permID=10)
  323. if own_perm is not True:
  324. return response.json(404)
  325. delUser = Device_User.objects.filter(userID=delUserID)
  326. if not delUser.exists():
  327. return response.json(104)
  328. delUser.delete()
  329. return response.json(0)
  330. @csrf_exempt
  331. def showAllUserInterface(request):
  332. response = ResponseObject()
  333. if request.method == 'POST':
  334. request_dict = request.POST
  335. elif request.method == 'GET':
  336. request_dict = request.GET
  337. else:
  338. return response.json(404)
  339. token = request_dict.get('token', None)
  340. type = request_dict.get('type', None)
  341. tko = TokenObject(token)
  342. response.lang = tko.lang
  343. if tko.code != 0:
  344. return response.json(tko.code)
  345. userID = tko.userID
  346. if not userID:
  347. return response.json(104)
  348. if type == 'PC':
  349. line = int(request.POST.get('line', None))
  350. page = int(request.POST.get('page', None))
  351. userValid = Device_User.objects.filter(userID=userID).order_by('-data_joined')
  352. if not userValid:
  353. return response.json(104)
  354. # 管理员查询
  355. own_permission = ModelService.check_perm(userID=userID, permID=30)
  356. if own_permission is not True:
  357. return response.json(404)
  358. device_user_queryset = Device_User.objects.all()
  359. device_user_count = device_user_queryset.count()
  360. device_user_res = device_user_queryset.order_by('-data_joined')[(page - 1) * line:page * line]
  361. sqlDict = CommonService.qs_to_dict(device_user_res)
  362. redisObj = RedisObject(db=3)
  363. for k, v in enumerate(sqlDict["datas"]):
  364. if len(v['fields']['role']) > 0:
  365. role_query_set = Role.objects.get(rid=v['fields']['role'][0])
  366. sqlDict["datas"][k]['fields']['role'].append(role_query_set.roleName)
  367. if redisObj.get_data(key=v['pk']):
  368. sqlDict["datas"][k]['fields']['online'] = True
  369. else:
  370. sqlDict["datas"][k]['fields']['online'] = False
  371. ue = UserExModel.objects.filter(userID=sqlDict["datas"][k]['pk'])
  372. if ue.exists():
  373. sqlDict["datas"][k]['fields']['appBundleId'] = ue[0].appBundleId
  374. else:
  375. sqlDict["datas"][k]['fields']['appBundleId'] = ''
  376. sqlDict['count'] = device_user_count
  377. return response.json(0, sqlDict)
  378. else:
  379. own_permission = ModelService.check_perm(userID=userID, permID=30)
  380. if own_permission is not True:
  381. return response.json(404)
  382. qs = Device_User.objects.all().order_by('-data_joined')
  383. res = CommonService.qs_to_dict(qs)
  384. return response.json(0, res)
  385. class setUserValidView(View):
  386. @method_decorator(csrf_exempt)
  387. def dispatch(self, *args, **kwargs):
  388. return super(setUserValidView, self).dispatch(*args, **kwargs)
  389. def post(self, request, *args, **kwargs):
  390. request.encoding = 'utf-8'
  391. request_dict = request.POST
  392. return self.setUserValid(request_dict)
  393. def get(self, request, *args, **kwargs):
  394. request.encoding = 'utf-8'
  395. request_dict = request.GET
  396. return self.setUserValid(request_dict)
  397. def setUserValid(self, request_dict):
  398. token = request_dict.get('token', None)
  399. eUserID = request_dict.get('userID', None)
  400. isValid = request_dict.get('isValid', None)
  401. rid = request_dict.get('rid', None)
  402. response = ResponseObject()
  403. tko = TokenObject(token)
  404. response.lang = tko.lang
  405. if tko.code != 0:
  406. return response.json(tko.code)
  407. superID = tko.userID
  408. own_perm = ModelService.check_perm(userID=superID, permID=50)
  409. if own_perm is True or superID != None and superID != eUserID:
  410. if rid == None:
  411. return self.UserValidUpdate(superID, eUserID, isValid, response)
  412. else:
  413. return self.UserValidUpdatePC(superID, eUserID, isValid, rid, response)
  414. else:
  415. return response.json(444, 'superID or userID')
  416. def UserValidUpdatePC(self, superID, eUserID, isValid, rid, response):
  417. super = Device_User.objects.filter(userID=superID)
  418. eUser = Device_User.objects.filter(userID=eUserID)
  419. if not super.exists() or not eUser.exists():
  420. return response.json(104)
  421. own_permission = ModelService.check_perm(userID=superID, permID=50)
  422. if own_permission is True:
  423. try:
  424. eUser.update(user_isValid=isValid)
  425. device_user_query_set = Device_User.objects.get(userID=eUserID)
  426. if device_user_query_set.role.all():
  427. device_user_query_set.role.set([rid])
  428. else:
  429. role_user_query_set = Role.objects.get(rid=rid)
  430. device_user_query_set.role.add(role_user_query_set)
  431. except Exception as e:
  432. errorInfo = traceback.format_exc()
  433. print('更新数据库错误:%s' % errorInfo)
  434. return response.json(177, repr(e))
  435. else:
  436. return response.json(0)
  437. else:
  438. return response.json(404)
  439. def UserValidUpdate(self, superID, eUserID, isValid, response):
  440. super = Device_User.objects.filter(userID=superID)
  441. eUser = Device_User.objects.filter(userID=eUserID)
  442. if not super.exists():
  443. return response.json(104)
  444. if not eUser.exists():
  445. return response.json(104)
  446. if super[0].is_superuser != 100 or super[0].is_superuser == eUser[0].is_superuser:
  447. return response.json(404)
  448. try:
  449. eUser.update(user_isValid=isValid)
  450. except Exception as e:
  451. errorInfo = traceback.format_exc()
  452. print('更新数据库错误: %s' % errorInfo)
  453. return response.json(177, repr(e))
  454. return response.json(0)
  455. @csrf_exempt
  456. def success(request):
  457. return HttpResponse(status=200)