]> git.xonotic.org Git - xonotic/xonstat.git/blob - xonstat/views/search.py
Add gametypes to search.
[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.sql 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                     order_by(Player.player_id)
33
34     # server-only searches
35     elif server_name and not nick and not map_name and not create_dt \
36         and len(gametypes) < 1:
37         result_type = "server"
38         q = session.query(Server)
39         if server_name:
40             q = q.filter(func.upper(Server.name).\
41                     like('%'+server_name.upper()+'%')).\
42                     order_by(Server.server_id)
43
44     # map-only searches
45     elif map_name and not nick and not server_name and not create_dt \
46         and len(gametypes) < 1:
47         result_type = "map"
48         q = session.query(Map)
49         if map_name:
50             q = q.filter(func.upper(Map.name).\
51                     like('%'+map_name.upper()+'%')).\
52                     order_by(Map.map_id)
53
54     # game searches (all else)
55     else:
56         result_type = "game"
57         q = session.query(Game, Server, Map).\
58                 filter(Game.server_id == Server.server_id).\
59                 filter(Game.map_id == Map.map_id).\
60                 order_by(Game.game_id.desc())
61         if len(gametypes) > 0:
62             q = q.filter(Game.game_type_cd.in_(gametypes))
63         if nick:
64             q = q.filter(func.upper(PlayerGameStat.stripped_nick).\
65                     like('%'+nick.upper()+'%')).\
66                 filter(PlayerGameStat.game_id == Game.game_id)
67         if map_name:
68             q = q.filter(func.upper(Map.name).\
69                     like('%'+map_name.upper()+'%'))
70         if server_name:
71             q = q.filter(func.upper(Server.name).\
72                     like('%'+server_name.upper()+'%'))
73
74     return (result_type, q)
75
76 def search(request):
77     fs = None
78     nick = None
79     server_name = None
80     map_name = None
81     gametypes = []
82     result_type = None
83     results = None
84     query = None
85
86     if 'page' in request.matchdict:
87         current_page = request.matchdict['page']
88     else:
89         current_page = 1
90
91     if request.params.has_key('fs'):
92         query = {'fs':''}
93         if request.params.has_key('nick'):
94             if request.params['nick'] != '':
95                 nick = request.params['nick']
96                 query['nick'] = nick
97         if request.params.has_key('server_name'):
98             if request.params['server_name'] != '':
99                 server_name = request.params['server_name']
100                 query['server_name'] = server_name
101         if request.params.has_key('map_name'):
102             if request.params['map_name'] != '':
103                 map_name = request.params['map_name']
104                 query['map_name'] = map_name
105         if request.params.has_key('dm'):
106                 gametypes.append('dm')
107                 query['dm'] = ''
108         if request.params.has_key('duel'):
109                 gametypes.append('duel')
110                 query['duel'] = ''
111         if request.params.has_key('ctf'):
112                 gametypes.append('ctf')
113                 query['ctf'] = ''
114         if request.params.has_key('tdm'):
115                 gametypes.append('tdm')
116                 query['tdm'] = ''
117
118         (result_type, q) = search_q(nick=nick, server_name=server_name,
119                 map_name=map_name, gametypes=gametypes)
120
121         try:
122             if q != None:
123                 results = Page(q, current_page, url=page_url)
124         except Exception as e:
125             raise e
126             result_type = None
127             results = None
128
129     return {'result_type':result_type,
130             'results':results,
131             'query':query,
132             }