EvaluationActivityController.py 21 KB

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