views.py 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712
  1. # coding=utf-8
  2. from __future__ import unicode_literals
  3. import requests
  4. import random,datetime
  5. import json
  6. import uuid
  7. from django.contrib import auth
  8. from django.core.cache import cache
  9. from django.conf import settings
  10. import common.error_info as ce
  11. from common import core_views as cv
  12. import common.common_control as ccc
  13. import common.common_functions as ccf
  14. import weixin.control_auth as ca
  15. import weixin.controls as ctl
  16. import weixin.wzhifuSDK as wzf
  17. class OpenidView(cv.BaseView):
  18. def get(self,request):
  19. """
  20. #获取openid(小程序)
  21. @code:1212
  22. """
  23. code = request.json.get("code")
  24. open_id = cache.get(code)
  25. if open_id:
  26. return cv.to_suc({"openid":open_id})
  27. else:
  28. get_token_url = 'https://api.weixin.qq.com/sns/jscode2session?appid={}&secret={}&js_code={}&grant_type=authorization_code' .format(wzf.WxPayConf_pub.APPID,wzf.WxPayConf_pub.APPSECRET,code)
  29. res = requests.get(get_token_url).json()
  30. if res.has_key('openid'):
  31. open_id = res['openid']
  32. cache.set(code,open_id,24*3600)
  33. else:
  34. open_id = ''
  35. if open_id:
  36. return cv.to_suc({"openid":open_id})
  37. else:
  38. return cv.to_fail(u"获取用户信息出错!")
  39. class UploadFileView(cv.BaseView):
  40. def post(self, request):
  41. """
  42. #文件上传(小程序)
  43. @file:"",文件对象
  44. """
  45. import time
  46. upload_file = request.FILES['file']
  47. dest = settings.STATIC_ROOT + "/upload/"+str(int(time.time())) + upload_file.name
  48. with open(dest,"wb+") as f:
  49. for chunk in upload_file.chunks():
  50. f.write(chunk)
  51. f.close()
  52. url = dest.replace(settings.STATIC_ROOT,settings.HOST)
  53. print url
  54. return cv.to_suc({"url":url})
  55. class TopicUploadFileView(cv.BaseView):
  56. def post(self, request):
  57. """
  58. #文件上传(WEB端)
  59. @file:"",文件对象
  60. """
  61. import time
  62. upload_file = request.FILES['file']
  63. dest = settings.STATIC_ROOT + "/upload/"+str(int(time.time())) + upload_file.name
  64. with open(dest,"wb+") as f:
  65. for chunk in upload_file.chunks():
  66. f.write(chunk)
  67. f.close()
  68. url = dest.replace(settings.STATIC_ROOT,settings.HOST)
  69. return cv.to_suc({"url":url})
  70. class AuthView(cv.BaseView):
  71. def post(self, request):
  72. """#保存微信授权信息(小程序)
  73. @nickname:"新",昵称
  74. @avatar:"",头像
  75. @openid:"",openid
  76. """
  77. try:
  78. rst = ca.add_wxauth_info(request)
  79. return cv.to_suc({"uid":rst.id})
  80. except Exception as e:
  81. cv.tracefail()
  82. return cv.to_fail(e)
  83. class AuthinfoView(cv.AuthView):
  84. def get(self,request):
  85. """#获取用户信息(小程序)
  86. """
  87. try:
  88. rst = ca.get_wxauth_info(request)
  89. return cv.to_suc(rst)
  90. except Exception as e:
  91. cv.tracefail()
  92. return cv.to_fail(e)
  93. def put(self, request):
  94. """#修改个人信息(小程序)
  95. """
  96. try:
  97. rst = ca.update_wxauth_info(request)
  98. return cv.to_suc()
  99. except Exception as e:
  100. cv.tracefail()
  101. return cv.to_fail(e)
  102. class LoginView(cv.BaseView):
  103. def post(self, request):
  104. """#小程序登录(小程序)
  105. @usercode:"用户代号"
  106. @nickanme:"微信昵称"
  107. @avatar:"微信头像"
  108. @openid:"openid"
  109. """
  110. try:
  111. rst = ca.login_user(request)
  112. return cv.to_suc(rst)
  113. except Exception as e:
  114. return cv.to_fail(e)
  115. class IndexView(cv.AuthView):
  116. def get(self, request):
  117. """#首页数据(小程序)
  118. """
  119. try:
  120. rst = ctl.get_index_data(request)
  121. return cv.to_suc(rst)
  122. except Exception as e:
  123. cv.tracefail()
  124. return cv.to_fail(e)
  125. class PlayerRecordView(cv.AuthView):
  126. def get(self, request):
  127. """#每日数据详情(小程序)
  128. @id:1
  129. """
  130. qdata = request.json
  131. need_params = ["id"]
  132. mse = ccf.check_params(*need_params,**qdata)
  133. if mse:
  134. raise ce.TipException(mse)
  135. try:
  136. vals = ccf.get_need_params(*need_params,**qdata)
  137. rcid = vals.get("id")
  138. #rst = ctl.get_detail_info(self,**vals)
  139. rst = ctl.get_record_info(rcid)
  140. return cv.to_suc(rst)
  141. except Exception as e:
  142. cv.tracefail()
  143. return cv.to_fail(e)
  144. def post(self, request):
  145. """#新增每日数据(小程序)
  146. @stock_date:"2021-07-30"
  147. @today_fund:100
  148. @today_stock:[{name:"江苏国泰",code:121221}]
  149. @today_stock_img:["http://test.png"]
  150. """
  151. #return cv.to_fail(u"系统升级维护请稍后再试....")
  152. qdata = request.json
  153. player = request.player
  154. now = datetime.datetime.now()
  155. #if not now.isoweekday() in [1,2,3,4,5] or not "09:30"<now.strftime("%H:%S")<"15:30":
  156. # raise ce.TipException(u"只有每周一至周五 9:30 - 15:30 之间才可以提交数据!")
  157. need_params = ["stock_date","today_fund"]
  158. mse = ccf.check_params(*need_params,**qdata)
  159. if mse:
  160. raise ce.TipException(mse)
  161. try:
  162. need_params.extend(["is_markt","today_stock","today_stock_img","experience"])
  163. vals = ccf.get_need_params(*need_params,**qdata)
  164. vals["player_id"] = player.id
  165. vals["match_id"] = player.match_id
  166. vals["today_fund"] = round(float(vals["today_fund"]),4)
  167. rst = ctl.add_model(self,**vals)
  168. return cv.to_suc(rst)
  169. except Exception as e:
  170. cv.tracefail()
  171. return cv.to_fail(e)
  172. class PlayerMatchListView(cv.AuthView):
  173. def get(self, request):
  174. """#选手参赛列表(小程序)
  175. """
  176. try:
  177. rst = ctl.get_player_match_list(request)
  178. return cv.to_suc(rst)
  179. except Exception as e:
  180. cv.tracefail()
  181. return cv.to_fail(e)
  182. class PlayerMatchView(cv.AuthView):
  183. def get(self, request):
  184. """#选手参赛详情(小程序)
  185. """
  186. try:
  187. rst = ctl.get_player_match_detail(request)
  188. return cv.to_suc(rst)
  189. except Exception as e:
  190. cv.tracefail()
  191. return cv.to_fail(e)
  192. class PlayerMatchRecordListView(cv.AuthView):
  193. def get(self, request):
  194. """#选手参赛每日持股(小程序)
  195. @id:1,赛事id
  196. @page:1
  197. @page_size:20
  198. """
  199. try:
  200. total,rst = ctl.get_player_match_records(request)
  201. return cv.to_suc({"total":total,"list":rst})
  202. except Exception as e:
  203. cv.tracefail()
  204. return cv.to_fail(e)
  205. class StockSearchView(cv.AuthView):
  206. def get(self, request):
  207. """#股票搜索列表(小程序)
  208. @name:名称
  209. """
  210. try:
  211. qdata = request.json
  212. rst = ctl.get_search_list(self,**qdata)
  213. return cv.to_suc(rst)
  214. except Exception as e:
  215. cv.tracefail()
  216. return cv.to_fail(e)
  217. class GroupRankListView(cv.AuthView):
  218. def get(self, request):
  219. """#排名列表(小程序)
  220. """
  221. try:
  222. rst = ctl.get_rank_list(request)
  223. return cv.to_suc(rst)
  224. except Exception as e:
  225. cv.tracefail()
  226. return cv.to_fail(e)
  227. class GroupRankView(cv.AuthView):
  228. def get(self, request):
  229. """#分组排名(小程序)
  230. """
  231. try:
  232. rst = ctl.get_group_rank_list(request)
  233. return cv.to_suc(rst)
  234. except Exception as e:
  235. cv.tracefail()
  236. return cv.to_fail(e)
  237. class PlayerRecordSingleView(cv.BaseView):
  238. def post(self, request):
  239. """#新增每日数据(WEB端)
  240. @usercode:"选手code"
  241. @match_id:"赛事id"
  242. @stock_date:"持股日期"
  243. @today_fund:"今日净资产"
  244. @today_stock:"今日持股"
  245. @today_stock_img:"今日持股截图"
  246. """
  247. qdata = request.json
  248. now = datetime.datetime.now()
  249. #if not now.isoweekday() in [1,2,3,4,5] or not "09:30"<now.strftime("%H:%S")<"15:30":
  250. # raise ce.TipException(u"只有每周一至周五 9:30 - 15:30 之间才可以提交数据!")
  251. need_params = ["match_id","usercode","stock_date","today_fund","today_stock_img"]
  252. mse = ccf.check_params(*need_params,**qdata)
  253. if mse:
  254. raise ce.TipException(mse)
  255. try:
  256. need_params.extend(["is_markt","today_stock","experience"])
  257. vals = ccf.get_need_params(*need_params,**qdata)
  258. vals["today_fund"] = round(float(vals["today_fund"]),4)
  259. rst = ctl.add_player_record_single(**vals)
  260. return cv.to_suc(rst)
  261. except Exception as e:
  262. cv.tracefail()
  263. return cv.to_fail(e)
  264. class PlayerRecordSingleMatchView(cv.BaseView):
  265. def get(self, request):
  266. """#获取赛事数据(WEB端)
  267. @id:"赛事id"
  268. """
  269. qdata = request.json
  270. match_id = qdata.get("id")
  271. try:
  272. now_date,rst = ctl.get_single_match_info(match_id)
  273. return cv.to_suc({"stock_date":now_date,"match":rst})
  274. except Exception as e:
  275. cv.tracefail()
  276. return cv.to_fail(e)
  277. class PlayerCurRecordView(cv.AuthView):
  278. def get(self, request):
  279. """#当前数据(小程序)
  280. @id:1
  281. """
  282. qdata = request.json
  283. try:
  284. rst = ctl.get_cur_record(request)
  285. return cv.to_suc(rst)
  286. except Exception as e:
  287. cv.tracefail()
  288. return cv.to_fail(e)
  289. class ArticleView(cv.AuthView):
  290. def get(self, request):
  291. """#公告详情(小程序)
  292. @id:1
  293. """
  294. qdata = request.json
  295. need_params = ["id"]
  296. mse = ccf.check_params(*need_params,**qdata)
  297. if mse:
  298. raise ce.TipException(mse)
  299. try:
  300. vals = ccf.get_need_params(*need_params,**qdata)
  301. rst = ctl.get_detail_info(self,**vals)
  302. return cv.to_suc(rst)
  303. except Exception as e:
  304. cv.tracefail()
  305. return cv.to_fail(e)
  306. class FollowUserView(cv.AuthView):
  307. def post(self, request):
  308. """#关注选手(2.0小程序)
  309. @follow_id:1,被关注选手id
  310. @action:"cancel",取消关注
  311. """
  312. qdata = request.json
  313. need_params = ["follow_id"]
  314. mse = ccf.check_params(*need_params,**qdata)
  315. if mse:
  316. raise ce.TipException(mse)
  317. try:
  318. need_params.extend(["action"])
  319. vals = ccf.get_need_params(*need_params,**qdata)
  320. vals["player_id"] = request.player.id
  321. rst = ctl.follow_player(**vals)
  322. return cv.to_suc(rst)
  323. except Exception as e:
  324. cv.tracefail()
  325. return cv.to_fail(e)
  326. class FollowUserListView(cv.AuthView):
  327. def get(self, request):
  328. """#我的关注(2.0小程序)
  329. """
  330. try:
  331. total,rst = ctl.get_user_follows(request)
  332. return cv.to_suc({"total":total,"list":rst})
  333. except Exception as e:
  334. cv.tracefail()
  335. return cv.to_fail(e)
  336. class HotStockListView(cv.AuthView):
  337. def get(self, request):
  338. """#热门股票(2.0小程序)
  339. @stock_date:"",持股日期
  340. """
  341. qdata = request.json
  342. need_params = ["stock_date"]
  343. mse = ccf.check_params(*need_params,**qdata)
  344. if mse:
  345. raise ce.TipException(mse)
  346. try:
  347. need_params.extend(["name"])
  348. vals = ccf.get_need_params(*need_params,**qdata)
  349. rst = ctl.get_hot_stock_rank(**vals)
  350. return cv.to_suc(rst)
  351. except Exception as e:
  352. cv.tracefail()
  353. return cv.to_fail(e)
  354. class HotFollowListView(cv.AuthView):
  355. def get(self, request):
  356. """#热门关注(2.0小程序)
  357. @stock_date:"",持股日期
  358. @page:1
  359. @page_size:20
  360. """
  361. qdata = request.json
  362. need_params = ["stock_date"]
  363. mse = ccf.check_params(*need_params,**qdata)
  364. if mse:
  365. raise ce.TipException(mse)
  366. try:
  367. need_params.extend(["name"])
  368. vals = ccf.get_need_params(*need_params,**qdata)
  369. total,rst = ctl.get_hot_follow(**vals)
  370. return cv.to_suc({"total":total,"list":rst})
  371. except Exception as e:
  372. cv.tracefail()
  373. return cv.to_fail(e)
  374. class HotStockBuyListView(cv.AuthView):
  375. def get(self, request):
  376. """#热门持仓股票(2.0小程序)
  377. @stock_date:"",持股日期
  378. @page:1
  379. @page_size:20
  380. """
  381. qdata = request.json
  382. need_params = ["stock_date"]
  383. mse = ccf.check_params(*need_params,**qdata)
  384. if mse:
  385. raise ce.TipException(mse)
  386. try:
  387. need_params.extend(["name"])
  388. vals = ccf.get_need_params(*need_params,**qdata)
  389. total,rst = ctl.get_hot_stock_buy(**vals)
  390. return cv.to_suc({"total":total,"list":rst})
  391. except Exception as e:
  392. cv.tracefail()
  393. return cv.to_fail(e)
  394. class HotStockSellListView(cv.AuthView):
  395. def get(self, request):
  396. """#热门清仓股票(2.0小程序)
  397. @stock_date:"",持股日期
  398. @page:1
  399. @page_size:20
  400. """
  401. qdata = request.json
  402. need_params = ["stock_date"]
  403. mse = ccf.check_params(*need_params,**qdata)
  404. if mse:
  405. raise ce.TipException(mse)
  406. try:
  407. vals = ccf.get_need_params(*need_params,**qdata)
  408. total,rst = ctl.get_hot_stock_sell(**vals)
  409. return cv.to_suc({"total":total,"list":rst})
  410. except Exception as e:
  411. cv.tracefail()
  412. return cv.to_fail(e)
  413. class HotStockSellPlayersListView(cv.AuthView):
  414. def get(self, request):
  415. """#获取股票清仓选手列表(2.0小程序)
  416. @id:"",股票id
  417. @stock_date:"",持股日期
  418. @page:1
  419. @page_size:20
  420. """
  421. qdata = request.json
  422. need_params = ["stock_date","id"]
  423. mse = ccf.check_params(*need_params,**qdata)
  424. if mse:
  425. raise ce.TipException(mse)
  426. try:
  427. vals = ccf.get_need_params(*need_params,**qdata)
  428. _id = vals["id"]
  429. total,rst = ctl.get_hot_stock_sell_players(**vals)
  430. data = {"total":total,"list":rst}
  431. stock = ctl.get_stock_info(_id)
  432. data.update(stock)
  433. return cv.to_suc(data)
  434. except Exception as e:
  435. cv.tracefail()
  436. return cv.to_fail(e)
  437. class WinRateRankView(cv.AuthView):
  438. def get(self, request):
  439. """#胜率榜(2.0小程序)
  440. """
  441. try:
  442. total,rst = ctl.get_win_rate_rank(request)
  443. return cv.to_suc({"total":total,"list":rst})
  444. except Exception as e:
  445. cv.tracefail()
  446. return cv.to_fail(e)
  447. class DefendRankView(cv.AuthView):
  448. def get(self, request):
  449. """#防守榜(2.0小程序)
  450. """
  451. try:
  452. total,rst = ctl.get_defend_rank(request)
  453. return cv.to_suc({"total":total,"list":rst})
  454. except Exception as e:
  455. cv.tracefail()
  456. return cv.to_fail(e)
  457. class ChampionArticleListView(cv.AuthView):
  458. def get(self, request):
  459. """#冠军心得(2.0小程序)
  460. """
  461. try:
  462. total,rst = ctl.get_champion_articles_list(request)
  463. return cv.to_suc({"total":total,"list":rst})
  464. except Exception as e:
  465. cv.tracefail()
  466. return cv.to_fail(e)
  467. class WanzhuCommentListView(cv.AuthView):
  468. def get(self, request):
  469. """#顽主点评(2.0小程序)
  470. @group_id:1,分组id
  471. @page:1
  472. @page_size:20
  473. """
  474. qdata = request.json
  475. need_params = ["group_id","page","page_size"]
  476. mse = ccf.check_params(*need_params,**qdata)
  477. if mse:
  478. raise ce.TipException(mse)
  479. try:
  480. vals = ccf.get_need_params(*need_params,**qdata)
  481. vals["match_id"] = request.player.match_id
  482. total,rst = ctl.get_wanzhu_comment(**vals)
  483. return cv.to_suc({"total":total,"list":rst})
  484. except Exception as e:
  485. cv.tracefail()
  486. return cv.to_fail(e)
  487. class EnumListView(cv.AuthView):
  488. def get(self, request):
  489. """#枚举值(2.0小程序)
  490. """
  491. try:
  492. rst = ctl.get_enum_list(request)
  493. return cv.to_suc(rst)
  494. except Exception as e:
  495. cv.tracefail()
  496. return cv.to_fail(e)
  497. class PlayerListView(cv.AuthView):
  498. def get(self, request):
  499. """#选手列表搜索(2.0小程序)
  500. @name:"选手名"
  501. @zq:"短线",周期
  502. @cw:"分仓",仓位
  503. @df:"首板",打法
  504. @page:1
  505. @page_size:20
  506. """
  507. qdata = request.json
  508. need_params = ["page","page_size"]
  509. mse = ccf.check_params(*need_params,**qdata)
  510. if mse:
  511. raise ce.TipException(mse)
  512. try:
  513. need_params.extend(["name","zq","cw","df"])
  514. vals = ccf.get_need_params(*need_params,**qdata)
  515. vals["match_id"] = request.player.match_id
  516. total,rst = ctl.get_player_list(**vals)
  517. return cv.to_suc({"total":total,"list":rst})
  518. except Exception as e:
  519. cv.tracefail()
  520. return cv.to_fail(e)
  521. class MineStyleView(cv.AuthView):
  522. def get(self, request):
  523. """#我的风格(2.0小程序)
  524. """
  525. try:
  526. rst = ctl.get_mine_style(request)
  527. return cv.to_suc(rst)
  528. except Exception as e:
  529. cv.tracefail()
  530. return cv.to_fail(e)
  531. def put(self, request):
  532. """#修改我的风格(小程序)
  533. @zq:"",周期
  534. @cw:"",仓位
  535. @df:"",打法
  536. @pz:"",品种
  537. @join_time:"",入市时间
  538. @init_fund:"",参数金额
  539. @account_img:"",账号截图
  540. """
  541. qdata = request.json
  542. need_params = ["zq","cw","df","pz","join_time","account_img"]
  543. mse = ccf.check_params(*need_params,**qdata)
  544. if mse:
  545. raise ce.TipException(mse)
  546. try:
  547. need_params.extend(["init_fund"])
  548. vals = ccf.get_need_params(*need_params,**qdata)
  549. vals["user_id"] = request.user.id
  550. vals["player_id"] = request.player.id if request.player else None
  551. rst = ctl.update_user_style(**vals)
  552. return cv.to_suc(rst)
  553. except Exception as e:
  554. cv.tracefail()
  555. return cv.to_fail(e)
  556. class PlayerFundView(cv.AuthView):
  557. def put(self, request):
  558. """#修改初始资金(小程序)
  559. @init_fund:"",参数金额
  560. """
  561. qdata = request.json
  562. need_params = ["init_fund"]
  563. mse = ccf.check_params(*need_params,**qdata)
  564. if mse:
  565. raise ce.TipException(mse)
  566. try:
  567. vals = ccf.get_need_params(*need_params,**qdata)
  568. vals["user_id"] = request.user.id
  569. vals["player_id"] = request.player.id if request.player else None
  570. rst = ctl.update_user_fund(**vals)
  571. return cv.to_suc(rst)
  572. except Exception as e:
  573. cv.tracefail()
  574. return cv.to_fail(e)
  575. class StockView(cv.AuthView):
  576. def get(self, request):
  577. """#股票詳情(2.0小程序)
  578. @id:1
  579. @page:1
  580. @page_size:1
  581. """
  582. qdata = request.json
  583. need_params = ["id"]
  584. mse = ccf.check_params(*need_params,**qdata)
  585. if mse:
  586. raise ce.TipException(mse)
  587. try:
  588. need_params.extend(["page","page_size","stock_date"])
  589. vals = ccf.get_need_params(*need_params,**qdata)
  590. vals["user_id"] = request.user.id
  591. vals["player_id"] = request.player.id if request.player else None
  592. rst = ctl.get_detail_info(self,**vals)
  593. vals["stock_id"] = rst["id"]
  594. rst["list"] = ctl.get_stock_players(**vals)
  595. return cv.to_suc(rst)
  596. except Exception as e:
  597. cv.tracefail()
  598. return cv.to_fail(e)
  599. class DefaultDateView(cv.AuthView):
  600. def get(self, request):
  601. """#默认日期(2.0小程序)
  602. @id:1
  603. """
  604. try:
  605. rst = ctl.get_today_date()
  606. return cv.to_suc(rst)
  607. except Exception as e:
  608. cv.tracefail()
  609. return cv.to_fail(e)
  610. class NoticesListView(cv.AuthView):
  611. def get(self, request):
  612. """#公告列表(2.0小程序)
  613. @id:1
  614. """
  615. try:
  616. rst = ctl.get_notices()
  617. return cv.to_suc(rst)
  618. except Exception as e:
  619. cv.tracefail()
  620. return cv.to_fail(e)
  621. class PlayerMatchCalendarView(cv.AuthView):
  622. def get(self, request):
  623. """#获取日历收益(2.0小程序)
  624. @match_id:1
  625. @player_id:1
  626. @month:2021-12
  627. """
  628. qdata = request.json
  629. need_params = ["player_id","match_id","month"]
  630. mse = ccf.check_params(*need_params,**qdata)
  631. if mse:
  632. raise ce.TipException(mse)
  633. try:
  634. vals = ccf.get_need_params(*need_params,**qdata)
  635. rst = ctl.get_player_match_calendar(**vals)
  636. return cv.to_suc(rst)
  637. except Exception as e:
  638. cv.tracefail()
  639. return cv.to_fail(e)