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