3 import pyramid.httpexceptions
6 from pyramid.response import Response
7 from sqlalchemy import desc
8 from sqlalchemy.orm.exc import MultipleResultsFound, NoResultFound
9 from sqlalchemy import func
10 from xonstat.models import *
11 from xonstat.util import strip_colors, qfont_decode
12 from xonstat.util import page_url, html_colors
13 from webhelpers.paginate import Page, PageURL
15 log = logging.getLogger(__name__)
17 def search_q(nick=None, server_name=None, map_name=None, create_dt=None,
23 # player-only searches
24 if nick and not server_name and not map_name and not create_dt \
25 and len(gametypes) < 1:
26 result_type = "player"
27 q = session.query(Player)
30 func.upper(Player.stripped_nick).like('%'+nick.upper()+'%')).\
31 filter(Player.player_id > 2).\
32 filter(Player.active_ind == True).\
33 order_by(Player.player_id)
35 # server-only searches
36 elif server_name and not nick and not map_name and not create_dt \
37 and len(gametypes) < 1:
38 result_type = "server"
39 q = session.query(Server)
41 q = q.filter(func.upper(Server.name).\
42 like('%'+server_name.upper()+'%')).\
43 order_by(Server.server_id)
46 elif map_name and not nick and not server_name and not create_dt \
47 and len(gametypes) < 1:
49 q = session.query(Map)
51 q = q.filter(func.upper(Map.name).\
52 like('%'+map_name.upper()+'%')).\
55 # game searches (all else)
58 q = session.query(Game, Server, Map).\
59 filter(Game.server_id == Server.server_id).\
60 filter(Game.map_id == Map.map_id).\
61 order_by(Game.game_id.desc())
62 if len(gametypes) > 0:
63 q = q.filter(Game.game_type_cd.in_(gametypes))
65 q = q.filter(func.upper(PlayerGameStat.stripped_nick).\
66 like('%'+nick.upper()+'%')).\
67 filter(PlayerGameStat.game_id == Game.game_id)
69 q = q.filter(func.upper(Map.name).\
70 like('%'+map_name.upper()+'%'))
72 q = q.filter(func.upper(Server.name).\
73 like('%'+server_name.upper()+'%'))
75 return (result_type, q)
77 def _search_data(request):
89 if request.params.has_key('page'):
90 current_page = request.params['page']
94 if request.params.has_key('fs'):
96 if request.params.has_key('nick'):
97 if request.params['nick'] != '':
98 nick = request.params['nick']
100 if request.params.has_key('server_name'):
101 if request.params['server_name'] != '':
102 server_name = request.params['server_name']
103 query['server_name'] = server_name
104 if request.params.has_key('map_name'):
105 if request.params['map_name'] != '':
106 map_name = request.params['map_name']
107 query['map_name'] = map_name
108 if request.params.has_key('dm'):
109 gametypes.append('dm')
111 if request.params.has_key('duel'):
112 gametypes.append('duel')
114 if request.params.has_key('ctf'):
115 gametypes.append('ctf')
117 if request.params.has_key('tdm'):
118 gametypes.append('tdm')
120 if request.params.has_key('stype') and request.params.has_key('sval'):
121 stype = request.params['stype']
122 sval = request.params['sval']
123 if stype == "players":
126 if stype == "servers":
127 query['server_name'] = sval
130 query['map_name'] = sval
133 (result_type, q) = search_q(nick=nick, server_name=server_name,
134 map_name=map_name, gametypes=gametypes)
138 results = Page(q, current_page, items_per_page=10, url=page_url)
139 except Exception as e:
144 return {'result_type':result_type,
151 return _search_data(request)