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)
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)