3 from sqlalchemy import func
4 from webhelpers.paginate import Page
5 from xonstat.models import DBSession, Server, Map, Game, PlayerGameStat, Player
6 from xonstat.util import page_url
8 log = logging.getLogger(__name__)
10 def search_q(nick=None, server_name=None, map_name=None, create_dt=None,
16 # player-only searches
17 if nick and not server_name and not map_name and not create_dt \
18 and len(gametypes) < 1:
19 result_type = "player"
20 q = session.query(Player)
23 func.upper(Player.stripped_nick).like('%'+nick.upper()+'%')).\
24 filter(Player.player_id > 2).\
25 filter(Player.active_ind == True).\
26 order_by(Player.player_id)
28 # server-only searches
29 elif server_name and not nick and not map_name and not create_dt and len(gametypes) < 1:
30 result_type = "server"
31 q = session.query(Server)
33 q = q.filter(func.upper(Server.name).like('%'+server_name.upper()+'%'))\
34 .filter(Server.active_ind)\
35 .order_by(Server.server_id)
38 elif map_name and not nick and not server_name and not create_dt \
39 and len(gametypes) < 1:
41 q = session.query(Map)
43 q = q.filter(func.upper(Map.name).\
44 like('%'+map_name.upper()+'%')).\
47 # game searches (all else)
50 q = session.query(Game, Server, Map).\
51 filter(Game.server_id == Server.server_id).\
52 filter(Server.active_ind).\
53 filter(Game.map_id == Map.map_id).\
54 order_by(Game.game_id.desc())
55 if len(gametypes) > 0:
56 q = q.filter(Game.game_type_cd.in_(gametypes))
58 q = q.filter(func.upper(PlayerGameStat.stripped_nick).\
59 like('%'+nick.upper()+'%')).\
60 filter(PlayerGameStat.game_id == Game.game_id)
62 q = q.filter(func.upper(Map.name).\
63 like('%'+map_name.upper()+'%'))
65 q = q.filter(func.upper(Server.name).\
66 like('%'+server_name.upper()+'%'))
68 return (result_type, q)
70 def _search_data(request):
82 if request.params.has_key('page'):
83 current_page = request.params['page']
87 if request.params.has_key('fs'):
89 if request.params.has_key('nick'):
90 if request.params['nick'] != '':
91 nick = request.params['nick']
93 if request.params.has_key('server_name'):
94 if request.params['server_name'] != '':
95 server_name = request.params['server_name']
96 query['server_name'] = server_name
97 if request.params.has_key('map_name'):
98 if request.params['map_name'] != '':
99 map_name = request.params['map_name']
100 query['map_name'] = map_name
101 if request.params.has_key('dm'):
102 gametypes.append('dm')
104 if request.params.has_key('duel'):
105 gametypes.append('duel')
107 if request.params.has_key('ctf'):
108 gametypes.append('ctf')
110 if request.params.has_key('tdm'):
111 gametypes.append('tdm')
113 if request.params.has_key('stype') and request.params.has_key('sval'):
114 stype = request.params['stype']
115 sval = request.params['sval']
116 if stype == "players":
119 if stype == "servers":
120 query['server_name'] = sval
123 query['map_name'] = sval
126 (result_type, q) = search_q(nick=nick, server_name=server_name,
127 map_name=map_name, gametypes=gametypes)
131 results = Page(q, current_page, items_per_page=10, url=page_url)
132 except Exception as e:
137 return {'result_type':result_type,
144 return _search_data(request)
147 def search_json(request):
148 return [{'status':'not implemented'}]