]> de.git.xonotic.org Git - xonotic/xonstat.git/blob - xonstat/views/search.py
Game searches.
[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     session     = DBSession()
19     result_type = None
20     q           = None
21
22     # player-only searches
23     if nick and not server_name and not map_name and not create_dt:
24         result_type = "player"
25         q = session.query(Player)
26         if nick:
27             q = q.filter(
28                     func.upper(Player.stripped_nick).like('%'+nick.upper()+'%'))
29
30     # server-only searches
31     elif server_name and not nick and not map_name and not create_dt:
32         result_type = "server"
33         q = session.query(Server)
34         if server_name:
35             q = q.filter(func.upper(Server.name).\
36                     like('%'+server_name.upper()+'%'))
37
38     # map-only searches
39     elif map_name and not nick and not server_name and not create_dt:
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
46     # game searches (all else)
47     else:
48         result_type = "game"
49         q = session.query(Game, Server, Map).\
50                 filter(Game.server_id == Server.server_id).\
51                 filter(Game.map_id == Map.map_id).\
52                 order_by(Game.game_id.desc())
53         if nick:
54             q = q.filter(func.upper(PlayerGameStat.stripped_nick).\
55                     like('%'+nick.upper()+'%')).\
56                 filter(PlayerGameStat.game_id == Game.game_id)
57         if map_name:
58             q = q.filter(func.upper(Map.name).\
59                     like('%'+map_name.upper()+'%'))
60         if server_name:
61             q = q.filter(func.upper(Server.name).\
62                     like('%'+server_name.upper()+'%'))
63
64     return (result_type, q)
65
66 def search(request):
67     form_submitted = None
68     nick = None
69     server_name = None
70     map_name = None
71     result_type = None
72     results = None
73
74     if request.params.has_key('form_submitted'):
75         nick = request.params['nick']
76         server_name = request.params['server_name']
77         map_name = request.params['map_name']
78         (result_type, q) = search_q(nick=nick, server_name=server_name,
79                 map_name=map_name)
80         log.debug(q)
81
82         try:
83             if q != None:
84                 results = q.all()
85         except Exception as e:
86             raise e
87             result_type = None
88             results = None
89
90     return {'result_type':result_type,
91             'results':results,
92             }