UserBrandController.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. @Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
  5. @AUTHOR: ASJRD019
  6. @NAME: AnsjerFormal
  7. @software: PyCharm
  8. @DATE: 2019/5/9 11:50
  9. @Version: python3.6
  10. @MODIFY DECORD:ansjer dev
  11. @file: AliPayObject.py
  12. @Contact: pzb3076@163.com
  13. """
  14. from django.views.generic.base import View
  15. from django.utils.decorators import method_decorator
  16. from django.views.decorators.csrf import csrf_exempt
  17. from Service.ModelService import ModelService
  18. from Model.models import User_Brand,Device_User
  19. from django.utils import timezone
  20. import traceback,time,json,urllib.request
  21. from Object.ResponseObject import ResponseObject
  22. from Object.TokenObject import TokenObject
  23. from Service.CommonService import CommonService
  24. from collections import Counter
  25. '''
  26. http://192.168.136.39:8000/userbrandinfo/queryByAdmin?token=test&page=1&line=10 全部记录
  27. http://192.168.136.39:8000/userbrandinfo/queryArea?token=test 市的区域统计
  28. http://192.168.136.39:8000/userbrandinfo/queryDeviceSupplier?token=test 品牌统计
  29. http://192.168.136.39:8000/userbrandinfo/queryAllByAdmin?token=test&page=1&line=10 全部记录中过滤查询每个用户的最新一条数据
  30. http://192.168.136.39:8000/userbrandinfo/queryAll?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySUQiOiIxNTQzOTA5MDUwNDEzMTM4MDAxMzgwMDAiLCJsYW5nIjoiY24iLCJ1c2VyIjoiMTM4MDAxMzgwMDEiLCJtX2NvZGUiOiIxMjM0MTMyNDMyMTQiLCJleHAiOjE1NTk4OTY4NTd9.nhK3VSghSGjyXKjel4woz7R_3bhjgqQDlX-ypYsklNU&page=1&line=5
  31. '''
  32. # coding:utf-8
  33. from boto3 import Session
  34. from botocore.exceptions import ClientError
  35. from boto3.dynamodb.conditions import Key, Attr
  36. import logging
  37. import json
  38. logger = logging.getLogger(__name__)
  39. class MyserviceDynamodb(object):
  40. def __init__(self, **kwargs):
  41. self.region = 'us-west-1'
  42. self.access_key = 'AKIA2E67UIMD4PZTYKYD'
  43. self.secret_key = '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'
  44. self.session = self.__session()
  45. def __session(self):
  46. try:
  47. session = Session(aws_access_key_id=self.access_key, aws_secret_access_key=self.secret_key,region_name=self.region)
  48. except:
  49. print("Failed to connect session in region{0}".format(self.region))
  50. return session
  51. # 创建user_brand_all表
  52. def user_brand_all_table_create(self, table_name):
  53. dynamodb = self.session.resource('dynamodb')
  54. try:
  55. table = dynamodb.create_table(
  56. TableName=table_name,
  57. KeySchema=[
  58. {
  59. 'AttributeName': 'userID',
  60. 'KeyType': 'HASH'
  61. },
  62. {
  63. 'AttributeName': 'addTime',
  64. 'KeyType': 'RANGE'
  65. }
  66. ],
  67. AttributeDefinitions=[
  68. {
  69. 'AttributeName': 'userID',
  70. 'AttributeType': 'S'
  71. },
  72. {
  73. 'AttributeName': 'addTime',
  74. 'AttributeType': 'N'
  75. },
  76. ],
  77. ProvisionedThroughput={
  78. 'ReadCapacityUnits': 5,
  79. 'WriteCapacityUnits': 5,
  80. }
  81. )
  82. except Exception:
  83. print ('已经创建该表了')
  84. # 创建user_brand表
  85. def table_create(self,table_name):
  86. dynamodb = self.session.resource('dynamodb')
  87. try:
  88. table = dynamodb.create_table(
  89. TableName=table_name,
  90. KeySchema=[
  91. {
  92. 'AttributeName': 'userID',
  93. 'KeyType': 'HASH'
  94. },
  95. {
  96. 'AttributeName': 'username',
  97. 'KeyType': 'RANGE'
  98. }
  99. ],
  100. AttributeDefinitions=[
  101. {
  102. 'AttributeName': 'userID',
  103. 'AttributeType': 'S'
  104. },
  105. {
  106. 'AttributeName': 'username',
  107. 'AttributeType': 'S'
  108. },
  109. ],
  110. ProvisionedThroughput={
  111. 'ReadCapacityUnits': 5,
  112. 'WriteCapacityUnits': 5,
  113. }
  114. )
  115. except Exception:
  116. print ('已经创建该表了')
  117. # 添加user_brand_all表数据
  118. def user_brand_all_item_put(self, table_name,user_id, add_time,username,device_supplier,device_model,os_type,os_version,country,province,city,area,street,longitude,latitude,app_id,status_all,ip):
  119. dynamodb = self.session.resource('dynamodb')
  120. table = dynamodb.Table(table_name)
  121. table.put_item(
  122. Item={
  123. 'userID': user_id,
  124. 'addTime': add_time,
  125. 'username': username,
  126. 'deviceSupplier': device_supplier,
  127. 'deviceModel': device_model,
  128. 'osType': os_type,
  129. 'osVersion': os_version,
  130. 'country' : country,
  131. 'province': province,
  132. 'city': city,
  133. 'area': area,
  134. 'street': street,
  135. 'longitude': longitude,
  136. 'latitude': latitude,
  137. 'appId': app_id,
  138. 'status_all': status_all,
  139. 'ip': ip,
  140. }
  141. )
  142. print ('添加数据成功!')
  143. # 添加user_brand表数据
  144. def user_brand_item_put(self, table_name, user_id, username,add_time, device_supplier, device_model, os_type,
  145. os_version, country, province, city, area, street, longitude, latitude, app_id,
  146. status_all, ip):
  147. dynamodb = self.session.resource('dynamodb')
  148. table = dynamodb.Table(table_name)
  149. table.put_item(
  150. Item={
  151. 'userID': user_id,
  152. 'username': username,
  153. 'addTime': add_time,
  154. 'deviceSupplier': device_supplier,
  155. 'deviceModel': device_model,
  156. 'osType': os_type,
  157. 'osVersion': os_version,
  158. 'country': country,
  159. 'province': province,
  160. 'city': city,
  161. 'area': area,
  162. 'street': street,
  163. 'longitude': longitude,
  164. 'latitude': latitude,
  165. 'appId': app_id,
  166. 'status_all': status_all,
  167. 'ip': ip,
  168. }
  169. )
  170. print ('添加数据成功!')
  171. # page分页数,line条数,table_name表名称,last_evaluated查询开始值,page_value记录分页开始值
  172. def get_page_line(self, page, line, table_name, last_evaluated,page_value):
  173. dynamodb = self.session.resource('dynamodb')
  174. if not dynamodb:
  175. raise DynamodbConnectionError("Failed to get resource for dynamodb!")
  176. table = dynamodb.Table(table_name)
  177. last_evaluated_key = last_evaluated
  178. try:
  179. if last_evaluated_key is None:
  180. response = table.scan(
  181. Limit=line,
  182. )
  183. page_value.append(last_evaluated_key)
  184. else:
  185. # 构建分页的起点,传入下一页面的起点,这是由主键来控制的,last_evaluated_key的值就是本表中的uid
  186. response = table.scan(
  187. Limit=line,
  188. ExclusiveStartKey=last_evaluated_key)
  189. try:
  190. last_evaluated_key = response['LastEvaluatedKey']
  191. # 如果有知就追加在该值的后面
  192. page_value.append(last_evaluated_key)
  193. my.get_page_line(page, line, table_name, last_evaluated_key,page_value)
  194. except Exception:
  195. return page_value
  196. except Exception as e:
  197. logger.error("Failed to get table {0}, error".format(table_name, e))
  198. return page_value
  199. def item_get(self,line,table_name,last_evaluated_key):
  200. dynamodb = self.session.resource('dynamodb')
  201. table = dynamodb.Table(table_name)
  202. if last_evaluated_key is None:
  203. response = table.scan(
  204. Limit=line,
  205. )
  206. else:
  207. # 构建分页的起点,传入下一页面的起点,这是由主键来控制的,last_evaluated_key的值就是本表中的uid
  208. response = table.scan(
  209. Limit=line,
  210. ExclusiveStartKey=last_evaluated_key)
  211. return response
  212. def item_get_count(self,table_name):
  213. dynamodb = self.session.resource('dynamodb')
  214. table = dynamodb.Table(table_name)
  215. response = table.scan(
  216. )
  217. return len(response['Items'])
  218. def item_get_brand(self,table_name):
  219. dynamodb = self.session.resource('dynamodb')
  220. table = dynamodb.Table(table_name)
  221. response = table.scan()
  222. response = response['Items']
  223. return response
  224. def put_item(self, table, item_dict=None):
  225. try:
  226. response = table.put_item(Item=item_dict)
  227. except Exception as e:
  228. logger.error("Failed to put item in to {0}:error{1}".format(table,e))
  229. return response
  230. def get_item(self, table_name,queryname ,username):
  231. dynamodb = self.session.resource('dynamodb')
  232. if not dynamodb:
  233. raise DynamodbConnectionError("Failed to get resource for dynamodb!")
  234. try:
  235. table = dynamodb.Table(table_name)
  236. response = table.scan(
  237. FilterExpression=Attr(queryname).eq(username)
  238. )
  239. items = response['Items']
  240. except Exception as e:
  241. logger.error("Failed to get table {0}, error".format(table_name, e))
  242. return items
  243. def update_table(self, table_name, user_id,username, add_time, deviceSupplier, deviceModel, osType, osVersion, country, province, city, area, street, longitude , latitude,appId, ip,status_all
  244. ):
  245. dynamodb = self.session.resource('dynamodb')
  246. table = dynamodb.Table(table_name)
  247. try:
  248. response = table.update_item(
  249. Key = {
  250. 'userID': user_id,
  251. 'username':username
  252. },UpdateExpression = "SET addTime = :add_time, deviceSupplier= :deviceSupplier, deviceModel = :deviceModel, osType = :osType, osVersion = :osVersion, country = :country, province = :province, city = :city, area= :area, street= :street, longitude= :longitude, latitude= :latitude, appId= :appId, ip= :ip, status_all= :status_all",
  253. ExpressionAttributeValues={
  254. ':add_time': add_time,
  255. ':deviceSupplier': deviceSupplier,
  256. ':deviceModel': deviceModel,
  257. ':osType':osType,
  258. ':osVersion':osVersion,
  259. ':country':country,
  260. ':province':province,
  261. ':city': city,
  262. ':area': area,
  263. ':street': street,
  264. ':longitude': longitude,
  265. ':latitude': latitude,
  266. ':appId': appId,
  267. ':ip': ip,
  268. ':status_all': status_all,
  269. },ReturnValues="UPDATED_NEW")
  270. except ClientError as e:
  271. if e.response['Error']['Code'] == "ConditionalCheckFailedException":
  272. logger.error(e.response['Error']['Message'])
  273. else:
  274. print('Failed update the dynamodb by event_id,not Failed Conditional')
  275. else:
  276. print ('修改成功')
  277. def table_delete(self, table_name):
  278. dynamodb = self.session.resource('dynamodb')
  279. table = dynamodb.Table(table_name)
  280. table.delete()
  281. print ('删除表成功')
  282. def item_delete(self, table_name,user_id,user_name,add_time):
  283. dynamodb = self.session.resource('dynamodb')
  284. table = dynamodb.Table(table_name)
  285. try:
  286. print (str(table_name))
  287. if str(table_name) == str('user_brand'):
  288. table.delete_item(
  289. Key={
  290. 'userID': user_id,
  291. 'username': user_name,
  292. }
  293. )
  294. else:
  295. table.delete_item(
  296. Key={
  297. 'userID': user_id,
  298. 'addTime': int(add_time),
  299. }
  300. )
  301. return 'ok'
  302. except Exception:
  303. logger.error("Failed to put item in to {0}:error{1}".format(table))
  304. return 'no'
  305. my = MyserviceDynamodb()
  306. # print(my.table_delete('user_brand'))
  307. # print(my.table_delete('user_brand_all'))
  308. my.table_create('user_brand')
  309. my.user_brand_all_table_create('user_brand_all')
  310. # print(my.item_put('user_brand'))
  311. # table_value = my.get_table('user_brand')
  312. class UserBrandInfo(View):
  313. @method_decorator(csrf_exempt)
  314. def dispatch(self, *args, **kwargs):
  315. return super(UserBrandInfo, self).dispatch(*args, **kwargs)
  316. def get(self, request, *args, **kwargs):
  317. request.encoding = 'utf-8'
  318. operation = kwargs.get('operation')
  319. return self.validation(request.GET, request, operation)
  320. def post(self, request, *args, **kwargs):
  321. request.encoding = 'utf-8'
  322. operation = kwargs.get('operation')
  323. return self.validation(request.POST, request, operation)
  324. def validation(self, request_dict, request, operation):
  325. if operation is None:
  326. return response.json(444, 'error path')
  327. self.clientIP = CommonService.get_ip_address(request)
  328. response = ResponseObject()
  329. token = request_dict.get('token', None)
  330. if token is not None:
  331. tko = TokenObject(token)
  332. response.lang = tko.lang
  333. if tko.code == 0:
  334. userID = tko.userID
  335. if userID is not None:
  336. if operation == 'queryByAdmin':
  337. return self.query_info(request_dict, userID,response)
  338. elif operation == 'add':
  339. return self.add_info(request_dict, userID,response)
  340. elif operation == 'queryAllByAdmin':
  341. return self.query_all_info(request_dict, userID,response)
  342. elif operation == 'deleteByAdmin':
  343. return self.delete_by_admin(request_dict, userID,response)
  344. elif operation == 'queryDeviceSupplier':
  345. return self.query_deviceSupplier_info(request_dict, userID,response)
  346. elif operation == 'queryArea':
  347. return self.query_area_info(request_dict, userID,response)
  348. else:
  349. return response.json(444)
  350. else:
  351. return response.json(309)
  352. else:
  353. return response.json(tko.code)
  354. else:
  355. return response.json(309)
  356. # 获取外网IP
  357. # http://192.168.136.39:8000/userbrandinfo?operation=add&token=test&deviceSupplier=小米&deviceModel=HM NOTE 1TD&osType=WEB&osVersion=4.0.0
  358. def add_info(self, request_dict, userID,response):
  359. deviceSupplier = request_dict.get('deviceSupplier', None)
  360. deviceModel = request_dict.get('deviceModel', None)
  361. osType = request_dict.get('osType', None)
  362. osVersion = request_dict.get('osVersion', None)
  363. country = request_dict.get('country', None)
  364. province = request_dict.get('province', None)
  365. city = request_dict.get('city', None)
  366. area = request_dict.get('area', None)
  367. street = request_dict.get('street', None)
  368. longitude = request_dict.get('longitude', None)
  369. latitude = request_dict.get('latitude', None)
  370. appId = request_dict.get('appId', None)
  371. if city is None:
  372. city='无'
  373. if area is None:
  374. area='无'
  375. if street is None:
  376. street='无'
  377. if longitude is None:
  378. longitude='无'
  379. if latitude is None:
  380. latitude='无'
  381. param_area = CommonService.get_param_flag(data=[country,province,city])
  382. must_fill_in = CommonService.get_param_flag(data=[appId,deviceSupplier,deviceModel,osType,osVersion])
  383. if must_fill_in is False:
  384. return response.json(444,'appId,deviceSupplier,deviceModel,osType,osVersion')
  385. if param_area is True:
  386. if '省' in province:
  387. province = province.replace('省','')
  388. if '市' in city:
  389. city = city.replace('市','')
  390. status = 1
  391. country = country
  392. province = province
  393. city = city
  394. area = area
  395. street = street
  396. longitude = longitude
  397. latitude = latitude
  398. else:
  399. status = 0
  400. jsonData = CommonService.getIpIpInfo(ip=self.clientIP,lang='CN')
  401. country = jsonData['country_name']
  402. province = jsonData['region_name']
  403. city = jsonData['city_name']
  404. area = '无'
  405. street = '无'
  406. longitude = jsonData['longitude']
  407. latitude = jsonData['latitude']
  408. if country == '局域网':
  409. city = '无'
  410. longitude = '无'
  411. latitude = '无'
  412. param_flag = CommonService.get_param_flag(data=[deviceSupplier, deviceModel,osType,osVersion])
  413. if param_flag is True:
  414. try:
  415. addTime = int(time.time())
  416. username = Device_User.objects.filter(userID = userID).values('userID','username','NickName')
  417. username = username[0]['username']
  418. # 添加user_brand_all表信息
  419. my.user_brand_all_item_put('user_brand_all', userID, addTime, username, deviceSupplier, deviceModel, osType, osVersion,
  420. country, province, city, area, street, longitude , latitude, appId, status,
  421. self.clientIP)
  422. # 添加user_brand表信息
  423. my.user_brand_item_put('user_brand', userID, username, addTime, deviceSupplier, deviceModel,
  424. osType, osVersion,
  425. country, province, city, area, street, longitude, latitude, appId, status,
  426. self.clientIP)
  427. except Exception:
  428. errorInfo = traceback.format_exc()
  429. return response.json(424, {'details': errorInfo})
  430. else:
  431. return response.json(0,{'OK':int(time.time())})
  432. else:
  433. # 参数错误
  434. return response.json(444)
  435. # 查询每个用户的最新登录数据表
  436. def query_info(self, request_dict, userID,response):
  437. page = int(request_dict.get('page', None))
  438. line = int(request_dict.get('line', None))
  439. username = request_dict.get('username',None)
  440. param_flag = CommonService.get_param_flag(data=[page, line])
  441. if param_flag is True:
  442. check_perm = ModelService.check_perm(userID=userID,permID=30)
  443. page_value=[]
  444. if check_perm is True:
  445. if username is None or username is '':
  446. table_Limit_value = my.get_page_line(page,line,'user_brand',None,page_value)
  447. # 页面减1
  448. page = page-1
  449. if page < len(table_Limit_value):
  450. # 分页后查询
  451. table_value = my.item_get(line,'user_brand',table_Limit_value[page])
  452. table_value = table_value['Items']
  453. count = my.item_get_count('user_brand')
  454. return response.json(0, {'datas': table_value, 'count': count})
  455. else:
  456. # 查询
  457. table_value = my.get_item('user_brand', 'username' ,username)
  458. return response.json(0, {'datas': table_value, 'count': len(table_value)})
  459. else:
  460. return response.json(404)
  461. else:
  462. return response.json(444)
  463. def delete_by_admin(self, request_dict, userID,response):
  464. id = request_dict.getlist('id', None)
  465. username = request_dict.getlist('username', None)
  466. add_time = request_dict.getlist('add_time', None)
  467. table_name = request_dict.getlist('table_name', None)
  468. param_flag = CommonService.get_param_flag(data=[id,username])
  469. print (table_name[0])
  470. if param_flag is True:
  471. check_perm = ModelService.check_perm(userID=userID, permID=10)
  472. if check_perm is True:
  473. if str(table_name[0])==str('user_brand'):
  474. is_delete = my.item_delete('user_brand', id[0],username[0], add_time[0])
  475. else:
  476. is_delete = my.item_delete('user_brand_all', id[0],add_time[0], add_time[0])
  477. return response.json(0, {'delete_count': is_delete[0]})
  478. else:
  479. return response.json(404)
  480. else:
  481. return response.json(444)
  482. # 查询每个用户最新的一条记录统计信息
  483. def query_all_info(self, request_dict, userID,response):
  484. page = int(request_dict.get('page', None))
  485. line = int(request_dict.get('line', None))
  486. username = request_dict.get('username', None)
  487. param_flag = CommonService.get_param_flag(data=[page, line])
  488. if param_flag is True:
  489. check_perm = ModelService.check_perm(userID=userID,permID=30)
  490. page_value = []
  491. if check_perm is True:
  492. if username is None or username is '':
  493. table_Limit_value = my.get_page_line(page, line, 'user_brand_all', None, page_value)
  494. page = page - 1
  495. if page < len(table_Limit_value):
  496. table_value = my.item_get(line, 'user_brand_all', table_Limit_value[page])
  497. table_value = table_value['Items']
  498. count = my.item_get_count('user_brand_all')
  499. return response.json(0, {'datas': table_value, 'count': count})
  500. else:
  501. # 查询
  502. table_value = my.get_item('user_brand_all', 'username', username)
  503. return response.json(0, {'datas': table_value, 'count': len(table_value)})
  504. else:
  505. return response.json(404)
  506. else:
  507. return response.json(444)
  508. # 品牌统计的接口
  509. def query_deviceSupplier_info(self, request_dict, userID,response):
  510. check_perm = ModelService.check_perm(userID=userID,permID=30)
  511. if check_perm is True:
  512. table_value = my.item_get_brand('user_brand')
  513. send_jsons = []
  514. counts = 0
  515. for i in table_value:
  516. send_jsons.append(table_value[counts]['deviceSupplier'])
  517. counts = counts + 1
  518. send_jsons = Counter(send_jsons)
  519. return response.json(0, {'datas': send_jsons,'counts':counts})
  520. else:
  521. return response.json(404)
  522. # 区域统计的接口
  523. def query_area_info(self, request_dict, userID,response):
  524. check_perm = ModelService.check_perm(userID=userID,permID=30)
  525. district = request_dict.get('district', None)
  526. if check_perm is True:
  527. # 按照用户去重复查询
  528. table_value = my.item_get_brand('user_brand')
  529. send_jsons = []
  530. counts = 0
  531. for i in table_value:
  532. send_jsons.append(table_value[counts][district])
  533. counts = counts + 1
  534. send_jsons = Counter(send_jsons)
  535. return response.json(0, {'datas': send_jsons, 'counts': counts})
  536. else:
  537. return response.json(404)