]> de.git.xonotic.org Git - xonotic/xonstat.git/blob - xonstat/views/search.py
42f18875f7d28a72d8bfa13b7ed5642daa1e931b
[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(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
87     if 'page' in request.matchdict:
88         current_page = request.matchdict['page']
89     else:
90         current_page = 1
91
92     if request.params.has_key('fs'):
93         query = {'fs':''}
94         if request.params.has_key('nick'):
95             if request.params['nick'] != '':
96                 nick = request.params['nick']
97                 query['nick'] = nick
98         if request.params.has_key('server_name'):
99             if request.params['server_name'] != '':
100                 server_name = request.params['server_name']
101                 query['server_name'] = server_name
102         if request.params.has_key('map_name'):
103             if request.params['map_name'] != '':
104                 map_name = request.params['map_name']
105                 query['map_name'] = map_name
106         if request.params.has_key('dm'):
107                 gametypes.append('dm')
108                 query['dm'] = ''
109         if request.params.has_key('duel'):
110                 gametypes.append('duel')
111                 query['duel'] = ''
112         if request.params.has_key('ctf'):
113                 gametypes.append('ctf')
114                 query['ctf'] = ''
115         if request.params.has_key('tdm'):
116                 gametypes.append('tdm')
117                 query['tdm'] = ''
118         if request.params.has_key('stype') and request.params.has_key('sval'):
119             stype = request.params['stype']
120             sval = request.params['sval']
121             if stype == "players":
122                 nick = sval
123             if stype == "servers":
124                 server_name = sval
125             if stype == "maps":
126                 map_name = sval
127
128         (result_type, q) = search_q(nick=nick, server_name=server_name,
129                 map_name=map_name, gametypes=gametypes)
130
131         try:
132             if q != None:
133                 results = Page(q, current_page, url=page_url)
134         except Exception as e:
135             raise e
136             result_type = None
137             results = None
138
139     return {'result_type':result_type,
140             'results':results,
141             'query':query,
142             }