]> de.git.xonotic.org Git - xonotic/xonstat.git/blob - xonstat/views/search.py
Merge pull request #27 from antzucaro/elo-ping-latency
[xonotic/xonstat.git] / xonstat / views / search.py
1 import logging
2
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
7
8 log = logging.getLogger(__name__)
9
10 def search_q(nick=None, server_name=None, map_name=None, create_dt=None,
11         gametypes=[]):
12     session     = DBSession()
13     result_type = None
14     q           = None
15
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)
21         if nick:
22             q = q.filter(
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)
27
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)
32         if server_name:
33             q = q.filter(func.upper(Server.name).like('%'+server_name.upper()+'%'))\
34                 .filter(Server.active_ind)\
35                 .order_by(Server.server_id)
36
37     # map-only searches
38     elif map_name and not nick and not server_name and not create_dt \
39         and len(gametypes) < 1:
40         result_type = "map"
41         q = session.query(Map)
42         if map_name:
43             q = q.filter(func.upper(Map.name).\
44                     like('%'+map_name.upper()+'%')).\
45                     order_by(Map.map_id)
46
47     # game searches (all else)
48     else:
49         result_type = "game"
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))
57         if nick:
58             q = q.filter(func.upper(PlayerGameStat.stripped_nick).\
59                     like('%'+nick.upper()+'%')).\
60                 filter(PlayerGameStat.game_id == Game.game_id)
61         if map_name:
62             q = q.filter(func.upper(Map.name).\
63                     like('%'+map_name.upper()+'%'))
64         if server_name:
65             q = q.filter(func.upper(Server.name).\
66                     like('%'+server_name.upper()+'%'))
67
68     return (result_type, q)
69
70 def _search_data(request):
71     fs = None
72     nick = None
73     server_name = None
74     map_name = None
75     gametypes = []
76     result_type = None
77     results = None
78     query = None
79     _query = {}
80
81
82     if request.params.has_key('page'):
83         current_page = request.params['page']
84     else:
85         current_page = 1
86
87     if request.params.has_key('fs'):
88         query = {'fs':''}
89         if request.params.has_key('nick'):
90             if request.params['nick'] != '':
91                 nick = request.params['nick']
92                 query['nick'] = 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')
103                 query['dm'] = ''
104         if request.params.has_key('duel'):
105                 gametypes.append('duel')
106                 query['duel'] = ''
107         if request.params.has_key('ctf'):
108                 gametypes.append('ctf')
109                 query['ctf'] = ''
110         if request.params.has_key('tdm'):
111                 gametypes.append('tdm')
112                 query['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":
117                 query['nick'] = sval
118                 nick = sval
119             if stype == "servers":
120                 query['server_name'] = sval
121                 server_name = sval
122             if stype == "maps":
123                 query['map_name'] = sval
124                 map_name = sval
125
126         (result_type, q) = search_q(nick=nick, server_name=server_name,
127                 map_name=map_name, gametypes=gametypes)
128
129         try:
130             if q != None:
131                 results = Page(q, current_page, items_per_page=10, url=page_url)
132         except Exception as e:
133             raise e
134             result_type = None
135             results = None
136
137     return {'result_type':result_type,
138             'results':results,
139             'query':query,
140             }
141
142
143 def search(request):
144     return _search_data(request)
145
146
147 def search_json(request):
148     return [{'status':'not implemented'}]