]> de.git.xonotic.org Git - xonotic/xonstat.git/blob - xonstat/views/search.py
Integrate the damage efficiency graph in player_info.
[xonotic/xonstat.git] / xonstat / views / search.py
1 import datetime
2 import logging
3 import pyramid.httpexceptions
4 import re
5 import time
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
14
15 log = logging.getLogger(__name__)
16
17 def search_q(nick=None, server_name=None, map_name=None, create_dt=None,
18         gametypes=[]):
19     session     = DBSession()
20     result_type = None
21     q           = None
22
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)
28         if nick:
29             q = q.filter(
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)
34
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)
40         if server_name:
41             q = q.filter(func.upper(Server.name).\
42                     like('%'+server_name.upper()+'%')).\
43                     order_by(Server.server_id)
44
45     # map-only searches
46     elif map_name and not nick and not server_name and not create_dt \
47         and len(gametypes) < 1:
48         result_type = "map"
49         q = session.query(Map)
50         if map_name:
51             q = q.filter(func.upper(Map.name).\
52                     like('%'+map_name.upper()+'%')).\
53                     order_by(Map.map_id)
54
55     # game searches (all else)
56     else:
57         result_type = "game"
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))
64         if nick:
65             q = q.filter(func.upper(PlayerGameStat.stripped_nick).\
66                     like('%'+nick.upper()+'%')).\
67                 filter(PlayerGameStat.game_id == Game.game_id)
68         if map_name:
69             q = q.filter(func.upper(Map.name).\
70                     like('%'+map_name.upper()+'%'))
71         if server_name:
72             q = q.filter(func.upper(Server.name).\
73                     like('%'+server_name.upper()+'%'))
74
75     return (result_type, q)
76
77 def _search_data(request):
78     fs = None
79     nick = None
80     server_name = None
81     map_name = None
82     gametypes = []
83     result_type = None
84     results = None
85     query = None
86     _query = {}
87
88
89     if request.params.has_key('page'):
90         current_page = request.params['page']
91     else:
92         current_page = 1
93
94     if request.params.has_key('fs'):
95         query = {'fs':''}
96         if request.params.has_key('nick'):
97             if request.params['nick'] != '':
98                 nick = request.params['nick']
99                 query['nick'] = 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')
110                 query['dm'] = ''
111         if request.params.has_key('duel'):
112                 gametypes.append('duel')
113                 query['duel'] = ''
114         if request.params.has_key('ctf'):
115                 gametypes.append('ctf')
116                 query['ctf'] = ''
117         if request.params.has_key('tdm'):
118                 gametypes.append('tdm')
119                 query['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":
124                 query['nick'] = sval
125                 nick = sval
126             if stype == "servers":
127                 query['server_name'] = sval
128                 server_name = sval
129             if stype == "maps":
130                 query['map_name'] = sval
131                 map_name = sval
132
133         (result_type, q) = search_q(nick=nick, server_name=server_name,
134                 map_name=map_name, gametypes=gametypes)
135
136         try:
137             if q != None:
138                 results = Page(q, current_page, items_per_page=10, url=page_url)
139         except Exception as e:
140             raise e
141             result_type = None
142             results = None
143
144     return {'result_type':result_type,
145             'results':results,
146             'query':query,
147             }
148
149
150 def search(request):
151     return _search_data(request)