def get_object(self, match_id: int, preview: bool = False):
     try:
         if preview:
             query = Match.select().where(Match.id == match_id)
         else:
             query = Match.select()\
                 .where(Match.id == match_id,
                        (Match.state == Match.MatchState.closed.value) |
                        (Match.state == Match.MatchState.cancelled.value) |
                        (Match.state == Match.MatchState.opening.value) |
                        (Match.state == Match.MatchState.finished.value))
         obj = query.get()
     except Match.DoesNotExist:
         raise ApiException(404, "赛事不存在")
     return obj
    def get(self, user_id):
        """ 获取用户参与的比赛
        """

        paid = self.get_argument("paid", None)

        query = Match.select(Match, MatchMember, Team).join(
            MatchMember,
            on=(MatchMember.match_id == Match.id
                ).alias("member")).switch(Match).join(
                    Team, on=(Match.team_id == Team.id).alias("team")).where(
                        MatchMember.user_id == user_id)

        if paid == "0":
            query = query.where(
                MatchMember.state == MatchMember.MatchMemberState.wait_pay)
        elif paid == "1":
            query = query.where(
                MatchMember.state > MatchMember.MatchMemberState.wait_pay)

        query = self.paginate_query(query)
        filtered = self.filter_query(query)
        page = self.paginate_query(filtered)

        data = self.get_paginated_data(page=page, alias='matches')

        self.write(data)
Example #3
0
def scan_match_start_time():
    """
    定时扫描 Match 表, 提前两小时发送比赛开始通知
    :return:
    """
    now = datetime.now()
    max_dt = now + timedelta(hours=2)
    min_dt = now - timedelta(minutes=10)
    matches = Match.select().where(Match.pushed.is_null(),
                                   Match.start_time >= min_dt,
                                   Match.start_time <= max_dt)
    for match in matches:
        match_start.delay(match_id=match.id)
        Match.update(pushed=now).where(Match.id == match.id).execute()
    def get(self):

        keyword = self.get_argument("kw", "")
        filter_state = intval(self.get_argument("state", -1))
        sort = intval(self.get_argument("sort", 0))

        query = Match.select()

        # 这里是根据 match.user_id 指向用户的区域进行的过滤
        is_restrict_by_areas = self.current_user.is_restrict_by_areas()
        if is_restrict_by_areas:
            query = query.join(User, on=(User.id == Match.user_id)).where(
                User.province << self.current_user.valid_manage_provinces)

        # 已取消
        if filter_state == 0:
            query = query.where(Match.state == Match.MatchState.cancelled)

        # 等待审核
        elif filter_state == 1:
            query = query.where(Match.state == Match.MatchState.wait_review)
        # 进行中
        elif filter_state == 2:
            query = query.where(Match.state == Match.MatchState.opening)
        # 已结束
        elif filter_state == 3:
            query = query.where(Match.state == Match.MatchState.finished)

        if keyword:
            query = query.where(Match.title.contains(keyword))

        if sort == 2:
            query = query.order_by(Match.start_time.desc())
        else:
            query = query.order_by(Match.id.desc())

        matches = self.paginate_query(query)

        self.render(
            "match/list.html",
            matches=matches,
        )
    def get(self):

        keyword = self.get_argument("kw", "")
        filter_state = intval(self.get_argument("state", -1))
        sort = intval(self.get_argument("sort", 0))

        query = Match.select(
            Match, ).where(Match.team_id == self.current_team.id)

        # 已取消
        if filter_state == 0:
            query = query.where(Match.state == Match.MatchState.cancelled)

        # 等待审核
        elif filter_state == 1:
            query = query.where(Match.state == Match.MatchState.wait_review)
        # 进行中
        elif filter_state == 2:
            query = query.where(Match.state == Match.MatchState.opening)
        # 已结束
        elif filter_state == 3:
            query = query.where(Match.state == Match.MatchState.finished)

        if keyword:
            query = query.where(Match.title.contains(keyword))

        if sort == 2:
            query = query.order_by(Match.start_time.desc())
        else:
            query = query.order_by(Match.id.desc())

        matches = self.paginate_query(query)

        self.render(
            "match/list.html",
            matches=matches,
        )
    def get(self):
        """ 获取赛事列表
        """

        team_id = self.get_argument("team_id", None)
        keyword = self.get_argument("keyword", None)
        sport = self.get_argument("sport", None)
        province = self.get_argument("province", None)
        city = self.get_argument("city", None)
        sort = self.get_argument("sort", 'newest')

        query = Match.select(
            Match,
            Team,
        ).join(
            Team,
            on=(Team.id == Match.team_id).alias("team")).where(Match.state << (
                Match.MatchState.opening, Match.MatchState.finished))

        if team_id:
            query = query.where(Match.team_id == team_id)

        if keyword:
            query = query.where(Match.title.contains(keyword))

        if sport:
            sport = sport.split(",")
            query = query.where(Match.sport_id << sport)

        if province:
            province = province.split(",")
            query = query.where(Match.province << province)

        if city:
            city = city.split(",")
            query = query.where(Match.city << city)

        if sort == 'newest':
            # 未结束的
            query = query.where(Match.end_time >= datetime.now())

            # 按开始时间排序
            query = query.order_by("start_time")

        elif sort == 'hottest':
            # 未结束的
            query = query.where(Match.end_time >= datetime.now())

            # 按报名要数排序
            query = query.order_by("-members_count")

        elif sort == 'colsest':
            # 已结束的
            query = query.where(Match.end_time <= datetime.now())

            # 按结束时间倒序
            query = query.order_by("-end_time")
        if sort == "distance":
            lat = self.get_query_argument("lat", None)
            lon = self.get_query_argument("lng", None)
            distance = intval(self.get_query_argument("distance", 10))
            if distance > 100:
                distance = 100
            if distance < 1:
                distance = 1

            if not (lat and lon):
                raise ApiException(400, "按距离排序需要提供经纬值")
            lat, lon = float(lat), float(lon)
            min_lat, min_lon, max_lat, max_lon = \
                self.calculate_range(distance, lat, lon)
            tmp_query = query.where(Match.lat.between(min_lat, max_lat),
                                    Match.lng.between(min_lon, max_lon))
            sorted_matches = self.sorting_by_distance(tmp_query, lat, lon)
            data = self.render_page_info(self.paginate_query(tmp_query))
            paged = self.paged_data(sorted_matches)
            data["matches"] = [
                SimpleMatchSerializer(row).data for row in paged
            ]
        else:
            page = self.paginate_query(query)

            data = self.get_paginated_data(page=page,
                                           alias='matches',
                                           serializer=SimpleMatchSerializer)
        self.write(data)