EvaluationActivityController.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. import os
  2. import time
  3. from django.views.generic.base import View
  4. from obs import ObsClient
  5. from Model.models import FreeEvaluationActivity, ActivityTime, ActivityUser, Device_User
  6. from Object.AWS.AmazonS3Util import AmazonS3Util
  7. from Object.Enums.RedisKeyConstant import RedisKeyConstant
  8. from Object.RedisObject import RedisObject
  9. from Object.ResponseObject import ResponseObject
  10. from Object.TokenObject import TokenObject
  11. from Ansjer.config import SERVER_DOMAIN, HUAWEICLOUD_OBS_SERVER, HUAWEICLOUD_SERVER_BUKET
  12. from Ansjer.cn_config.config_formal import REGION_NAME
  13. from django.db import transaction
  14. from django.conf import settings
  15. ACCESS_KEY_ID = settings.ACCESS_KEY_ID
  16. SECRET_ACCESS_KEY = settings.SECRET_ACCESS_KEY
  17. HUAWEICLOUD_AK = settings.HUAWEICLOUD_AK
  18. HUAWEICLOUD_SK = settings.HUAWEICLOUD_SK
  19. class EvaluationActivityView(View):
  20. def get(self, request, *args, **kwargs):
  21. request.encoding = 'utf-8'
  22. operation = kwargs.get('operation')
  23. return self.validation(request.GET, request, operation)
  24. def post(self, request, *args, **kwargs):
  25. request.encoding = 'utf-8'
  26. operation = kwargs.get('operation')
  27. return self.validation(request.POST, request, operation)
  28. def validation(self, request_dict, request, operation):
  29. language = request_dict.get('language', 'en')
  30. response = ResponseObject(language, 'pc')
  31. tko = TokenObject(request.META.get('HTTP_AUTHORIZATION'), returntpye='pc')
  32. if tko.code != 0:
  33. return response.json(tko.code)
  34. response.lang = tko.lang
  35. user_id = tko.userID
  36. if operation == 'getActivity':
  37. return self.get_activity(user_id, request_dict, response)
  38. elif operation == 'getActivityList':
  39. return self.get_activity_list(request_dict, response)
  40. elif operation == 'addOrEditActivity':
  41. return self.add_or_edit_activity(request, request_dict, response)
  42. elif operation == 'getActivityUser':
  43. return self.get_user_list(request_dict, response)
  44. elif operation == 'addActivityUser':
  45. return self.add_activity_user(user_id, request_dict, response)
  46. elif operation == 'editActivityUser':
  47. return self.edit_activity_user(request_dict, response)
  48. elif operation == 'addStoryCollectionUser': # 新增故事征集客户信息
  49. return self.add_story_collection_user(user_id, request_dict, response)
  50. elif operation == 'addStoryCollectionUserSuccess': # 新增故事征集客户信息成功回调
  51. return self.add_story_collection_user_success(user_id, request_dict, response)
  52. else:
  53. return response.json(404)
  54. @staticmethod
  55. def get_activity(user_id, request_dict, response):
  56. try:
  57. now_time = int(time.time())
  58. activity_id = request_dict.get('activityId')
  59. activity_qs = FreeEvaluationActivity.objects.filter(is_show=1)
  60. if activity_id:
  61. activity_qs = activity_qs.filter(id=int(activity_id))
  62. activity_qs = activity_qs.values('activity_name', 'carousel_image_url',
  63. 'details_image_url', 'issue', 'id',
  64. 'product_number', 'original_price',
  65. 'product_name')
  66. if activity_qs.exists():
  67. activity = activity_qs[0]
  68. time_qs = ActivityTime.objects.filter(activity_id=activity['id']).values('node_content', 'start_time',
  69. 'end_time').order_by('sort')
  70. activity['activity_start_time'] = time_qs.first()['start_time']
  71. activity['activity_end_time'] = time_qs.last()['end_time']
  72. activity['activity_process'] = list(time_qs)
  73. user_qs = ActivityUser.objects.filter(activity_id=activity['id'])
  74. activity['user_count'] = user_qs.count()
  75. if user_qs.exists():
  76. user = user_qs.filter(user_id=user_id).values('registration_status')
  77. if user.exists():
  78. if user[0]['registration_status']:
  79. activity['activity_status'] = 2 # 1:可报名;2:已报名;3:报名截止;4:活动结束
  80. else:
  81. activity['activity_status'] = 1
  82. else:
  83. activity['activity_status'] = 1
  84. user_qs = user_qs.filter(is_selected=1).values('user_name', 'phone', 'user_id')
  85. for item in user_qs:
  86. users = Device_User.objects.filter(userID=item['user_id']).values('userIconPath')
  87. if users.exists():
  88. user_icon_path = str(users[0]['userIconPath'])
  89. if user_icon_path and user_icon_path.find('static/') != -1:
  90. user_icon_path = user_icon_path.replace('static/', '').replace('\\', '/')
  91. item['user_icon'] = SERVER_DOMAIN + 'account/getAvatar/' + user_icon_path
  92. else:
  93. item['user_icon'] = ''
  94. else:
  95. item['user_icon'] = ''
  96. item['phone'] = item['phone'][:3] + "****" + item['phone'][7:]
  97. activity['activity_user'] = list(user_qs)
  98. else:
  99. activity['activity_status'] = 1
  100. activity['activity_user'] = []
  101. if now_time > time_qs.first()['end_time']:
  102. activity['activity_status'] = 3
  103. if now_time > time_qs.last()['end_time']:
  104. activity['activity_status'] = 4
  105. return response.json(0, activity)
  106. else:
  107. return response.json(0, {})
  108. except Exception as e:
  109. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  110. @staticmethod
  111. def add_activity_user(user_id, request_dict, response):
  112. activity_id = request_dict.get('activity_id', None)
  113. user_name = request_dict.get('user_name', None)
  114. phone = request_dict.get('phone', None)
  115. address = request_dict.get('address', None)
  116. sex = request_dict.get('sex', None)
  117. age = request_dict.get('age', None)
  118. usage_environment = request_dict.get('usage_environment', None)
  119. is_reports = request_dict.get('is_reports', None)
  120. if not all([activity_id, user_name, phone, address, sex, age, usage_environment, is_reports]):
  121. return response.json(404)
  122. now_time = int(time.time())
  123. try:
  124. user = ActivityUser.objects.filter(user_id=user_id, activity_id=activity_id)
  125. if user.exists():
  126. user.update(phone=phone, address=address, sex=sex, user_name=user_name, is_reports=is_reports, age=age,
  127. usage_environment=usage_environment, update_time=now_time)
  128. else:
  129. ActivityUser.objects.create(activity_id=activity_id, user_id=user_id, phone=phone, address=address,
  130. sex=sex, age=age, usage_environment=usage_environment, user_name=user_name,
  131. is_reports=is_reports, created_time=now_time, update_time=now_time)
  132. return response.json(0)
  133. except Exception as e:
  134. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  135. @staticmethod
  136. def add_or_edit_activity(request, request_dict, response):
  137. activity_id = request_dict.get('activity_id', None)
  138. activity_name = request_dict.get('activity_name', None)
  139. carousel_image = request.FILES.get('carousel_image', None)
  140. details_image = request.FILES.get('details_image', None)
  141. issue = request_dict.get('issue', None)
  142. product_number = request_dict.get('product_number', None)
  143. product_name = request_dict.get('product_name', None)
  144. original_price = request_dict.get('original_price', None)
  145. activity_process = request_dict.get('activity_process', None)
  146. is_show = request_dict.get('is_show', None)
  147. if not all([activity_name, issue, product_number, original_price, is_show, activity_process, product_name]):
  148. return response.json(404)
  149. now_time = int(time.time())
  150. activity_process = eval(activity_process)
  151. try:
  152. bucket = "ansjerfilemanager"
  153. s3_obj = AmazonS3Util(ACCESS_KEY_ID, SECRET_ACCESS_KEY, REGION_NAME)
  154. s3_url = 'https://{}.s3.{}.amazonaws.com.cn/'.format(bucket, REGION_NAME)
  155. with transaction.atomic():
  156. if activity_id: # 编辑活动
  157. activity = FreeEvaluationActivity.objects.get(id=activity_id)
  158. activity.activity_name = activity_name
  159. activity.issue = issue
  160. activity.product_number = product_number
  161. activity.product_name = product_name
  162. activity.original_price = original_price
  163. activity.is_show = is_show
  164. activity.update_time = now_time
  165. # 上传轮播图
  166. if carousel_image:
  167. carousel_image_path = '前端/EvaluationActivity/carousel_image_{}.jpg'.format(activity_id)
  168. s3_obj.upload_file_obj(
  169. bucket,
  170. carousel_image_path,
  171. carousel_image,
  172. {"ContentType": carousel_image.content_type, "ACL": "public-read"},
  173. )
  174. activity.carousel_image_url = s3_url + carousel_image_path
  175. # 上传详情图
  176. if details_image:
  177. details_image_path = '前端/EvaluationActivity/details_image_{}.jpg'.format(activity_id)
  178. s3_obj.upload_file_obj(
  179. bucket,
  180. details_image_path,
  181. details_image,
  182. {"ContentType": details_image.content_type, "ACL": "public-read"},
  183. )
  184. activity.details_image_url = s3_url + details_image_path
  185. activity.save()
  186. # 处理活动时间节点
  187. ActivityTime.objects.filter(activity_id=activity_id).delete()
  188. for index, item in enumerate(activity_process):
  189. ActivityTime.objects.create(
  190. activity_id=activity_id,
  191. node_content=item['node_content'],
  192. start_time=item['start_time'],
  193. end_time=item['end_time'],
  194. sort=index
  195. )
  196. else: # 添加活动
  197. if not all([carousel_image, details_image]):
  198. return response.json(404)
  199. # 创建活动对象(先不保存图片URL)
  200. activity = FreeEvaluationActivity.objects.create(
  201. activity_name=activity_name,
  202. issue=issue,
  203. product_number=product_number,
  204. product_name=product_name,
  205. original_price=original_price,
  206. is_show=is_show,
  207. created_time=now_time,
  208. update_time=now_time,
  209. carousel_image_url='', # 初始化为空
  210. details_image_url=''
  211. )
  212. activity_id = activity.id
  213. # 上传轮播图并更新URL
  214. carousel_image_path = '前端/EvaluationActivity/carousel_image_{}.jpg'.format(activity_id)
  215. s3_obj.upload_file_obj(
  216. bucket,
  217. carousel_image_path,
  218. carousel_image,
  219. {"ContentType": carousel_image.content_type, "ACL": "public-read"},
  220. )
  221. activity.carousel_image_url = s3_url + carousel_image_path
  222. # 上传详情图并更新URL
  223. details_image_path = '前端/EvaluationActivity/details_image_{}.jpg'.format(activity_id)
  224. s3_obj.upload_file_obj(
  225. bucket,
  226. details_image_path,
  227. details_image,
  228. {"ContentType": details_image.content_type, "ACL": "public-read"},
  229. )
  230. activity.details_image_url = s3_url + details_image_path
  231. activity.save() # 保存图片URL
  232. # 创建活动时间节点
  233. for index, item in enumerate(activity_process):
  234. ActivityTime.objects.create(
  235. activity_id=activity_id,
  236. node_content=item['node_content'],
  237. start_time=item['start_time'],
  238. end_time=item['end_time'],
  239. sort=index
  240. )
  241. # 初始化Redis客户端,使用4号数据库
  242. redis_client = RedisObject(4)
  243. redis_key = RedisKeyConstant.ACTIVITY_INFO.value
  244. redis_client.del_data(redis_key)
  245. return response.json(0)
  246. except Exception as e:
  247. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  248. @staticmethod
  249. def get_activity_list(request_dict, response):
  250. page = request_dict.get('page', None)
  251. line = request_dict.get('line', None)
  252. if not all([page, line]):
  253. return response.json(444)
  254. try:
  255. page = int(page)
  256. line = int(line)
  257. activity_qs = FreeEvaluationActivity.objects.all()
  258. count = activity_qs.count()
  259. activity_qs = activity_qs.values('id', 'activity_name', 'carousel_image_url', 'details_image_url', 'issue',
  260. 'is_show', 'product_number', 'original_price', 'product_name')[
  261. (page - 1) * line: page * line]
  262. for item in activity_qs:
  263. time_qs = ActivityTime.objects.filter(activity_id=item['id']).values('node_content', 'start_time',
  264. 'end_time').order_by('sort')
  265. item['activity_process'] = list(time_qs)
  266. return response.json(0, {'list': list(activity_qs), 'count': count})
  267. except Exception as e:
  268. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  269. @staticmethod
  270. def get_user_list(request_dict, response):
  271. activity_id = request_dict.get('activity_id', None)
  272. user_name = request_dict.get('user_name', None)
  273. phone = request_dict.get('phone', None)
  274. page = request_dict.get('page', None)
  275. line = request_dict.get('line', None)
  276. if not all([activity_id, page, line]):
  277. return response.json(444)
  278. try:
  279. page = int(page)
  280. line = int(line)
  281. user_qs = ActivityUser.objects.filter(activity_id=activity_id)
  282. if user_name:
  283. user_qs = user_qs.filter(user_name=user_name)
  284. if phone:
  285. user_qs = user_qs.filter(phone=phone)
  286. count = user_qs.count()
  287. # 华为云
  288. obs_client = ObsClient(
  289. access_key_id=HUAWEICLOUD_AK, secret_access_key=HUAWEICLOUD_SK, server=HUAWEICLOUD_OBS_SERVER)
  290. user_qs = user_qs.values('id', 'user_name', 'phone', 'age', 'address', 'sex', 'is_selected', 'activity_id',
  291. 'usage_environment', 'is_reports', 'story',
  292. 'file_1_name', 'file_2_name')[(page - 1) * line:page * line]
  293. activity_list = []
  294. for item in user_qs:
  295. activity_dict = {'id': item['id'], 'user_name': item['user_name'], 'phone': item['phone'],
  296. 'age': item['age'], 'address': item['address'], 'sex': item['sex'],
  297. 'is_selected': item['is_selected'], 'activity_id': item['activity_id'],
  298. 'usage_environment': item['usage_environment'], 'is_reports': item['is_reports'],
  299. 'story': item['story'], 'file_1_name': '', 'file_2_name': ''}
  300. if item['file_1_name']:
  301. create_res = obs_client.createSignedUrl(
  302. method='GET', bucketName=HUAWEICLOUD_SERVER_BUKET, objectKey=item['file_1_name'], expires=300)
  303. activity_dict['file_1_name'] = create_res.signedUrl
  304. if item['file_2_name']:
  305. create_res = obs_client.createSignedUrl(
  306. method='GET', bucketName=HUAWEICLOUD_SERVER_BUKET, objectKey=item['file_1_name'], expires=300)
  307. activity_dict['file_2_name'] = create_res.signedUrl
  308. activity_list.append(activity_dict)
  309. return response.json(0, {'list': activity_list, 'count': count})
  310. except Exception as e:
  311. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  312. @staticmethod
  313. def edit_activity_user(request_dict, response):
  314. activity_id = request_dict.get('activity_id', None)
  315. user_id = request_dict.get('user_id', None)
  316. is_selected = request_dict.get('is_selected', None)
  317. try:
  318. ActivityUser.objects.filter(activity_id=activity_id, id=user_id).update(is_selected=is_selected)
  319. return response.json(0)
  320. except Exception as e:
  321. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  322. @staticmethod
  323. def add_story_collection_user(user_id, request_dict, response):
  324. activity_id = request_dict.get('activity_id', None)
  325. user_name = request_dict.get('user_name', None)
  326. phone = request_dict.get('phone', None)
  327. address = request_dict.get('address', None)
  328. sex = request_dict.get('sex', None)
  329. age = request_dict.get('age', None)
  330. usage_environment = request_dict.get('usage_environment', None)
  331. story = request_dict.get('story', None)
  332. file_name_list = request_dict.get('file_name_list')
  333. if not all([activity_id, user_name, phone, address, sex, age, usage_environment, story]):
  334. return response.json(404)
  335. now_time = int(time.time())
  336. try:
  337. data = {
  338. 'user_name': user_name,
  339. 'phone': phone,
  340. 'address': address,
  341. 'sex': sex,
  342. 'age': age,
  343. 'story': story,
  344. 'usage_environment': usage_environment,
  345. 'update_time': now_time
  346. }
  347. signed_url = []
  348. # 如果上传文件,生成华为云OBS上传链接
  349. if file_name_list:
  350. # 报名状态暂时设置为不成功
  351. data['registration_status'] = 0
  352. obs_client = ObsClient(
  353. access_key_id=HUAWEICLOUD_AK,
  354. secret_access_key=HUAWEICLOUD_SK,
  355. server=HUAWEICLOUD_OBS_SERVER
  356. )
  357. file_name_list = eval(file_name_list)
  358. for index, file_name in enumerate(file_name_list):
  359. file_name = str(index) + os.path.splitext(file_name)[1]
  360. file_name = 'story-collection/{}/{}'.format(user_id, file_name)
  361. if index == 0:
  362. data['file_1_name'] = file_name
  363. else:
  364. data['file_2_name'] = file_name
  365. res = obs_client.createSignedUrl(
  366. method='PUT', bucketName=HUAWEICLOUD_SERVER_BUKET, objectKey=file_name, expires=3600
  367. )
  368. signed_url.append(res.signedUrl)
  369. user = ActivityUser.objects.filter(user_id=user_id, activity_id=activity_id)
  370. if user.exists():
  371. user.update(**data)
  372. else:
  373. data['activity_id'] = activity_id
  374. data['user_id'] = user_id
  375. data['created_time'] = now_time
  376. ActivityUser.objects.create(**data)
  377. if signed_url:
  378. res = {
  379. 'signed_url': signed_url
  380. }
  381. return response.json(0, res)
  382. else:
  383. return response.json(0)
  384. except Exception as e:
  385. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  386. @staticmethod
  387. def add_story_collection_user_success(user_id, request_dict, response):
  388. activity_id = request_dict.get('activity_id', None)
  389. try:
  390. ActivityUser.objects.filter(user_id=user_id, activity_id=activity_id).update(registration_status=1)
  391. return response.json(0)
  392. except Exception as e:
  393. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))