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()
示例#3
0
 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)
示例#4
0
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("调用派队推送接口失败"))
示例#5
0
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)
示例#7
0
    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)
示例#8
0
 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)
示例#10
0
 def post(self, match_id):
     match = Match.get_or_404(id=match_id)
     MatchService.cancel(match, self.current_user)
     self.write_success()
示例#11
0
 def test_new_application(self):
     match = mixer.blend(Match)
     user = mixer.blend(User)
     MatchService.settlement_application(user=user, match=match)
示例#12
0
 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)