EvaluationActivityController.py 19 KB

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