UserManger.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import logging
  4. import os
  5. import traceback
  6. import boto3
  7. import botocore
  8. from botocore import client
  9. import simplejson as json
  10. from django.core.files.storage import FileSystemStorage
  11. from django.http import HttpResponse
  12. from django.utils.decorators import method_decorator
  13. from django.views.decorators.csrf import csrf_exempt
  14. from django.views.generic import TemplateView, View
  15. from Ansjer.config import BASE_DIR, SERVER_TYPE, ACCESS_KEY_ID, SECRET_ACCESS_KEY, REGION_NAME, AVATAR_BUCKET
  16. from Ansjer.config import SERVER_DOMAIN
  17. from Model.models import Role, Device_User, UserOauth2Model, UserExModel, CountryLanguageModel
  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. # http://192.168.136.40:8077/account/showUserMore?token=test
  24. class showUserMoreView(TemplateView):
  25. @method_decorator(csrf_exempt)
  26. def dispatch(self, *args, **kwargs):
  27. return super(showUserMoreView, self).dispatch(*args, **kwargs)
  28. def post(self, request, *args, **kwargs):
  29. request.encoding = 'utf-8'
  30. token = request.POST.get('token', None)
  31. return self.ValidationError(token)
  32. def get(self, request, *args, **kwargs):
  33. request.encoding = 'gb2312'
  34. token = request.GET.get('token', None)
  35. return self.ValidationError(token)
  36. def ValidationError(self, token):
  37. response = ResponseObject()
  38. tko = TokenObject(token)
  39. response.lang = tko.lang
  40. if tko.code != 0:
  41. return response.json(tko.code)
  42. userID = tko.userID
  43. if not userID:
  44. return response.json(104)
  45. return self.showUserMore(userID, response)
  46. def showUserMore(self, userID, response):
  47. User = Device_User.objects.filter(userID=userID)
  48. if not User.exists():
  49. return response.json(104)
  50. sqlDict = CommonService.qs_to_dict(User)
  51. for k, v in enumerate(sqlDict["datas"]):
  52. sqlDict['datas'][k]['fields'].pop('password')
  53. userIconPath = sqlDict['datas'][k]['fields']['userIconPath']
  54. if userIconPath:
  55. if userIconPath.find('static/') != -1:
  56. userIconPath = userIconPath.replace('static/', '').replace('\\', '/')
  57. userIconUrl = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
  58. sqlDict['datas'][k]['fields']['userIconUrl'] = userIconUrl
  59. if len(v['fields']['role']):
  60. roleName = ModelService.getRole(rid=v['fields']['role'][0])
  61. sqlDict["datas"][k]['fields']['rolename'] = roleName
  62. region_country = sqlDict["datas"][k]['fields']['region_country']
  63. if not region_country == 0:
  64. country_qs = CountryLanguageModel.objects.filter(country_id=region_country).values(
  65. 'country__region__api')
  66. sqlDict["datas"][k]['fields']['api'] = country_qs[0]['country__region__api']
  67. else:
  68. sqlDict["datas"][k]['fields']['api'] = ''
  69. # 增加oauth2关联数据
  70. ua_qs = UserOauth2Model.objects.filter(userID_id=userID).values_list('authType', flat=True)
  71. sqlDict["oauth2"] = list(ua_qs)
  72. return response.json(0, sqlDict)
  73. # http://192.168.136.40:8077/account/perfectUserInfo?token=test&content={"NickName":"333"}
  74. class perfectUserInfoView(TemplateView):
  75. # 完善个人信息
  76. @method_decorator(csrf_exempt)
  77. def dispatch(self, *args, **kwargs):
  78. return super(perfectUserInfoView, self).dispatch(*args, **kwargs)
  79. def post(self, request, *args, **kwargs):
  80. request.encoding = 'utf-8'
  81. userContent = request.POST.get('content', None)
  82. userIcon = request.FILES.get('userIcon', None)
  83. token = request.POST.get('token', None)
  84. return self.ValidationError(token, userContent, userIcon)
  85. def get(self, request, *args, **kwargs):
  86. request.encoding = 'gb2312'
  87. userContent = request.GET.get('content', None)
  88. userIcon = request.FILES.get('userIcon', None)
  89. token = request.GET.get('token', None)
  90. return self.ValidationError(token, userContent, userIcon)
  91. def ValidationError(self, token, userContent, userIcon):
  92. response = ResponseObject()
  93. tko = TokenObject(token)
  94. response.lang = tko.lang
  95. if tko.code != 0:
  96. return response.json(tko.code)
  97. userID = tko.userID
  98. if not userID:
  99. return response.json(309)
  100. userIconPath = ''
  101. if userIcon:
  102. # 上传头像到aws s3
  103. aws_s3_client = boto3.client(
  104. 's3',
  105. region_name=REGION_NAME,
  106. aws_access_key_id=ACCESS_KEY_ID,
  107. aws_secret_access_key=SECRET_ACCESS_KEY,
  108. config=botocore.client.Config(signature_version='s3v4'),
  109. )
  110. Key = userID + '/' + userIcon.name
  111. aws_s3_client.put_object(Bucket=AVATAR_BUCKET, Key=Key, Body=userIcon)
  112. userIconPath = userID + '/' + userIcon.name
  113. if userContent:
  114. dataValid = json.loads(userContent)
  115. if 'userID' and 'password' and 'is_superuser' in dataValid.keys():
  116. return response.json(444)
  117. if not userIconPath and not userContent:
  118. return response.json(444)
  119. elif not userIconPath and userContent:
  120. return self.perfectUserInfoUpdate(userID, response, userContent=userContent)
  121. elif userIconPath and not userContent:
  122. return self.perfectUserInfoUpdate(userID, response, userIconPath=userIconPath)
  123. else:
  124. return self.perfectUserInfoUpdate(userID, response, userIconPath=userIconPath, userContent=userContent)
  125. def perfectUserInfoUpdate(slef, userID, response, **kwargs):
  126. """
  127. :param username:
  128. :param userContent:
  129. :param args:
  130. :param kwargs:
  131. :return:
  132. """
  133. User = Device_User.objects.filter(userID=userID)
  134. if not User.exists():
  135. return response.json(104)
  136. userIconPath = kwargs.get('userIconPath', None)
  137. userContent = kwargs.get('userContent', None)
  138. userIconUrl = ""
  139. if userIconPath:
  140. userIconUrl = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
  141. if userContent:
  142. try:
  143. UserData = json.loads(userContent)
  144. except Exception as e:
  145. return response.json(444, repr(e))
  146. try:
  147. if userIconPath and userContent:
  148. User.update(userIconPath=userIconPath, userIconUrl=userIconUrl, **UserData)
  149. elif not userIconPath and userContent:
  150. User.update(**UserData)
  151. elif userIconPath and not userContent:
  152. User.update(userIconPath=userIconPath, userIconUrl=userIconUrl)
  153. except Exception as e:
  154. return response.json(117, repr(e))
  155. else:
  156. res = CommonService.qs_to_dict(User)
  157. for k, v in enumerate(res["datas"]):
  158. res['datas'][k]['fields'].pop('password')
  159. userIconPath = res['datas'][k]['fields']['userIconPath']
  160. if userIconPath and userIconUrl != '':
  161. res['datas'][k]['fields']['userIconUrl'] = userIconUrl
  162. return response.json(0, res)
  163. class getAvatarView(TemplateView):
  164. @method_decorator(csrf_exempt)
  165. def dispatch(self, *args, **kwargs):
  166. return super(getAvatarView, self).dispatch(*args, **kwargs)
  167. def post(self, request, *args, **kwargs):
  168. request.encoding = 'utf-8'
  169. filePath = kwargs.get('filePath', '')
  170. filePath.encode(encoding='utf-8', errors='strict')
  171. return self.getAvatar(filePath)
  172. def get(self, request, *args, **kwargs):
  173. request.encoding = 'utf-8'
  174. filePath = kwargs.get('filePath', '')
  175. filePath.encode(encoding='utf-8', errors='strict')
  176. return self.getAvatar(filePath)
  177. def getAvatar(self, filePath):
  178. response = ResponseObject()
  179. if not filePath:
  180. return response.json(800)
  181. if filePath == 'User/default.png' or filePath == 'User/defaultUser.png':
  182. # 使用默认头像
  183. try:
  184. aws_s3_client = boto3.client(
  185. 's3',
  186. region_name=REGION_NAME,
  187. aws_access_key_id=ACCESS_KEY_ID,
  188. aws_secret_access_key=SECRET_ACCESS_KEY,
  189. config=botocore.client.Config(signature_version='s3v4'),
  190. )
  191. get_object_response = aws_s3_client.get_object(Bucket=AVATAR_BUCKET, Key='default/default.png')
  192. return HttpResponse(get_object_response['Body'], content_type="image/jpeg")
  193. except Exception as e:
  194. print(e)
  195. return response.json(500, repr(e))
  196. fullPath = os.path.join(BASE_DIR, "static", filePath).replace('\\', '/')
  197. if os.path.isfile(fullPath):
  198. try:
  199. imageData = open(fullPath, 'rb').read()
  200. return HttpResponse(imageData, content_type="image/jpeg")
  201. except Exception as e:
  202. return response.json(906, repr(e))
  203. else:
  204. try:
  205. aws_s3_client = boto3.client(
  206. 's3',
  207. region_name=REGION_NAME,
  208. aws_access_key_id=ACCESS_KEY_ID,
  209. aws_secret_access_key=SECRET_ACCESS_KEY,
  210. config=botocore.client.Config(signature_version='s3v4'),
  211. )
  212. get_object_response = aws_s3_client.get_object(Bucket=AVATAR_BUCKET, Key=filePath)
  213. return HttpResponse(get_object_response['Body'], content_type="image/jpeg")
  214. except Exception as e:
  215. return response.json(906, repr(e))
  216. @csrf_exempt
  217. def delUserInterface(request):
  218. response = ResponseObject()
  219. if request.method == 'POST':
  220. request_dict = request.POST
  221. elif request.method == 'GET':
  222. request_dict = request.GET
  223. else:
  224. return response.json(404)
  225. token = request_dict.get('token', None)
  226. delUserID = request_dict.get('delUserID', None)
  227. if not token or not delUserID:
  228. return response.json(444, 'token,delUserID')
  229. tko = TokenObject(token)
  230. response.lang = tko.lang
  231. if tko.code != 0:
  232. return response.json(tko.code)
  233. userID = tko.userID
  234. if not userID:
  235. return response.json(309)
  236. userValid = Device_User.objects.filter(userID=userID)
  237. if not userValid.exists():
  238. return response.json(104)
  239. own_perm = ModelService.check_perm(userID=userID, permID=10)
  240. if own_perm is not True:
  241. return response.json(404)
  242. delUser = Device_User.objects.filter(userID=delUserID)
  243. if not delUser.exists():
  244. return response.json(104)
  245. delUser.delete()
  246. return response.json(0)
  247. @csrf_exempt
  248. def showAllUserInterface(request):
  249. response = ResponseObject()
  250. if request.method == 'POST':
  251. request_dict = request.POST
  252. elif request.method == 'GET':
  253. request_dict = request.GET
  254. else:
  255. return response.json(404)
  256. token = request_dict.get('token', None)
  257. type = request_dict.get('type', None)
  258. tko = TokenObject(token)
  259. response.lang = tko.lang
  260. if tko.code != 0:
  261. return response.json(tko.code)
  262. userID = tko.userID
  263. if not userID:
  264. return response.json(104)
  265. if type == 'PC':
  266. line = int(request.POST.get('line', None))
  267. page = int(request.POST.get('page', None))
  268. userValid = Device_User.objects.filter(userID=userID).order_by('-data_joined')
  269. if not userValid:
  270. return response.json(104)
  271. # 管理员查询
  272. own_permission = ModelService.check_perm(userID=userID, permID=30)
  273. if own_permission is not True:
  274. return response.json(404)
  275. device_user_queryset = Device_User.objects.all()
  276. device_user_count = device_user_queryset.count()
  277. device_user_res = device_user_queryset.order_by('-data_joined')[(page - 1) * line:page * line]
  278. sqlDict = CommonService.qs_to_dict(device_user_res)
  279. redisObj = RedisObject(db=3)
  280. for k, v in enumerate(sqlDict["datas"]):
  281. if len(v['fields']['role']) > 0:
  282. role_query_set = Role.objects.get(rid=v['fields']['role'][0])
  283. sqlDict["datas"][k]['fields']['role'].append(role_query_set.roleName)
  284. if redisObj.get_data(key=v['pk']):
  285. sqlDict["datas"][k]['fields']['online'] = True
  286. else:
  287. sqlDict["datas"][k]['fields']['online'] = False
  288. ue = UserExModel.objects.filter(userID=sqlDict["datas"][k]['pk'])
  289. if ue.exists():
  290. sqlDict["datas"][k]['fields']['appBundleId'] = ue[0].appBundleId
  291. else:
  292. sqlDict["datas"][k]['fields']['appBundleId'] = ''
  293. sqlDict['count'] = device_user_count
  294. return response.json(0, sqlDict)
  295. else:
  296. own_permission = ModelService.check_perm(userID=userID, permID=30)
  297. if own_permission is not True:
  298. return response.json(404)
  299. qs = Device_User.objects.all().order_by('-data_joined')
  300. res = CommonService.qs_to_dict(qs)
  301. return response.json(0, res)
  302. class setUserValidView(View):
  303. @method_decorator(csrf_exempt)
  304. def dispatch(self, *args, **kwargs):
  305. return super(setUserValidView, self).dispatch(*args, **kwargs)
  306. def post(self, request, *args, **kwargs):
  307. request.encoding = 'utf-8'
  308. request_dict = request.POST
  309. return self.setUserValid(request_dict)
  310. def get(self, request, *args, **kwargs):
  311. request.encoding = 'utf-8'
  312. request_dict = request.GET
  313. return self.setUserValid(request_dict)
  314. def setUserValid(self, request_dict):
  315. token = request_dict.get('token', None)
  316. eUserID = request_dict.get('userID', None)
  317. isValid = request_dict.get('isValid', None)
  318. rid = request_dict.get('rid', None)
  319. response = ResponseObject()
  320. tko = TokenObject(token)
  321. response.lang = tko.lang
  322. if tko.code != 0:
  323. return response.json(tko.code)
  324. superID = tko.userID
  325. own_perm = ModelService.check_perm(userID=superID, permID=50)
  326. if own_perm is True or superID != None and superID != eUserID:
  327. if rid == None:
  328. return self.UserValidUpdate(superID, eUserID, isValid, response)
  329. else:
  330. return self.UserValidUpdatePC(superID, eUserID, isValid, rid, response)
  331. else:
  332. return response.json(444, 'superID or userID')
  333. def UserValidUpdatePC(self, superID, eUserID, isValid, rid, response):
  334. super = Device_User.objects.filter(userID=superID)
  335. eUser = Device_User.objects.filter(userID=eUserID)
  336. if not super.exists() or not eUser.exists():
  337. return response.json(104)
  338. own_permission = ModelService.check_perm(userID=superID, permID=50)
  339. if own_permission is True:
  340. try:
  341. eUser.update(user_isValid=isValid)
  342. device_user_query_set = Device_User.objects.get(userID=eUserID)
  343. if device_user_query_set.role.all():
  344. device_user_query_set.role.set([rid])
  345. else:
  346. role_user_query_set = Role.objects.get(rid=rid)
  347. device_user_query_set.role.add(role_user_query_set)
  348. except Exception as e:
  349. errorInfo = traceback.format_exc()
  350. print('更新数据库错误:%s' % errorInfo)
  351. return response.json(177, repr(e))
  352. else:
  353. return response.json(0)
  354. else:
  355. return response.json(404)
  356. def UserValidUpdate(self, superID, eUserID, isValid, response):
  357. super = Device_User.objects.filter(userID=superID)
  358. eUser = Device_User.objects.filter(userID=eUserID)
  359. if not super.exists():
  360. return response.json(104)
  361. if not eUser.exists():
  362. return response.json(104)
  363. if super[0].is_superuser != 100 or super[0].is_superuser == eUser[0].is_superuser:
  364. return response.json(404)
  365. try:
  366. eUser.update(user_isValid=isValid)
  367. except Exception as e:
  368. errorInfo = traceback.format_exc()
  369. print('更新数据库错误: %s' % errorInfo)
  370. return response.json(177, repr(e))
  371. return response.json(0)
  372. @csrf_exempt
  373. def success(request):
  374. return HttpResponse(status=200)