def post(self, match_id: int): """ 提交退塞请求, http_form: reason: 退赛原因, insists: 强制退出, 强制退出比赛无退款 :param match_id: int, Match.id """ form = self.validated_arguments insists = form.pop("insists", False) match = Match.get_or_404(id=match_id) if not insists: self.can_leave(match, self.current_user.id) member = self.has_joined_match(match, user_id=self.current_user.id) notify_url = urljoin(self.request.full_url(), self.reverse_url("rest_matches_refund_callback")) try: MatchService.leave(user_id=self.current_user.id, match=match, notify_url=notify_url, insists=insists) except MatchException as e: logging.error(e) msg = "退出赛事失败, 原因: `{0}`".format(str(e)) raise ApiException(422, msg) self.set_status(204, "退出赛事成功") self.finish()
def _settlement_application(self, match_id): # 提交结算申请 match = Match.get_or_404(id=match_id) if not match.can_apply_settlement(): self.write_error(403, "此活动不能手动结算") else: MatchService.settlement_application(self.current_user, match) self.write_success()
def test_new_application_approved(self): user = mixer.blend(User) match = mixer.blend(Match) application = mixer.blend(SettlementApplication, match_id=match.id, user_id=user.id) with self.assertRaises(SettlementApplicationExist): MatchService.settlement_application(user, match)
def match_start(self, match_id: int): """ 赛事开始前, 调用派队消息推送接口 :param self: celery task Context :param match_id: :return: """ match = Match.get(id=match_id) # type: Match team = Team.get(id=match.team_id) # type: Team members = MatchService.members(match, state=MatchMember.MatchMemberState.normal) infos = [] for member in members: infos.append({"userId": member.user_id, "mobile": member.mobile}) message = MatchStartMessage( user_infos=infos, match_id=match_id, match_name=match.title, sponsor_name=team.name, sponsor_pic_url=team.get_cover_url(size="medium")) pt = Parteam(app.settings["parteam_api_url"]) if not pt.push_message(message=message): self.retry(exc=ParteamRequestError("调用派队推送接口失败"))
def new_match_status(self, match_id: int): """ 主办方发布新战报时向赛事成员推送信息 :param self: :param match_id: :return: """ match = Match.get(id=match_id) # type: Match team = Team.get(id=match.team_id) # type: Team members = MatchService.members(match, state=MatchMember.MatchMemberState.normal) infos = [] for member in members: infos.append({"mobile": member.mobile, "userId": member.user_id}) message = NewMatchScheduleMessage( user_infos=infos, match_id=match_id, match_name=match.title, sponsor_name=team.name, sponsor_pic_url=team.get_cover_url(size="medium")) pt = Parteam(app.settings["parteam_api_url"]) if not pt.push_message(message): self.retry(ParteamRequestError("调用派队推送接口失败"))
def get(self, match_id): match = Match.get_or_404(id=match_id) qr = MatchService.get_preview_qrcode(match.id) o = io.BytesIO() qr.save(o, format="JPEG") qr_obj = o.getvalue() o.close() self.set_header('Expires', '0') self.set_header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0') self.set_header('Content-type', 'image/jpg') self.set_header('Content-length', len(qr_obj)) self.write(qr_obj)
def test_cancel(self): faker = Faker() user = mixer.blend(User) team = mixer.blend(Team, sport=self.sport) match = mixer.blend(Match, state=Match.MatchState.opening.value, team_id=team.id) total_fee = 10.01 total_members = randint(1, 10) for _ in range(0, total_members): order = mixer.blend(TeamOrder, team=team, user=user, order_no=TeamOrder.get_new_order_no(), total_fee=total_fee, payment_fee=total_fee) mixer.blend(MatchMember, match_id=match.id, total_fee=total_fee, order_id=order.id, pt_order_no=faker.pystr()) MatchService.cancel(match, user)
def test_members_function(self): faker = Faker() match = mixer.blend(Match) mixer.blend(MatchMember, match_id=match.id, user_id=faker.random_int(), total_fee=0.01) mixer.blend(MatchMember, match_id=match.id, user_id=faker.random_int(), total_fee=0.01) members = MatchService.members(match) self.assertEqual(2, len(members)) for row in members: self.assertEqual(match.id, row.match_id)
def get(self, match_id): """ 获取赛事成员列表 :match_id: 赛事ID :returns: TODO """ match = Match.get_or_404(id=match_id) query = MatchService.members(match=match) filtered = self.filter_query(query) page = self.paginate_query(filtered) uids = self.get_parteam_uid(page) parteam_users = self.get_parteam_users(uids) if uids else {} data = self.render_page_info(page) data["members"] = self.serializing_members(page, parteam_users) self.write(data)
def post(self, match_id): match = Match.get_or_404(id=match_id) MatchService.cancel(match, self.current_user) self.write_success()
def test_new_application(self): match = mixer.blend(Match) user = mixer.blend(User) MatchService.settlement_application(user=user, match=match)
def test_cancel_already_canceled(self): user = mixer.blend(User) match = mixer.blend(Match, state=Match.MatchState.cancelled) with self.assertRaises(MatchStateError): MatchService.cancel(match, user)