From: Ant Zucaro Date: Fri, 19 Apr 2013 00:59:52 +0000 (-0400) Subject: Merge zykure-approved, my fixes, and merge fixes :D X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonstat.git;a=commitdiff_plain;h=66fc4afcf0da79994ac252700177bb897ebea77d;hp=9a9f9d23837618cd316d9cdf34731b30e61532dc Merge zykure-approved, my fixes, and merge fixes :D --- diff --git a/xonstat/models.py b/xonstat/models.py index 91901d6..bda038b 100644 --- a/xonstat/models.py +++ b/xonstat/models.py @@ -19,11 +19,11 @@ Base = declarative_base() # define objects for all tables class Player(object): - def nick_html_colors(self): + def nick_html_colors(self, limit=None): if self.nick is None: return "Anonymous Player" else: - return html_colors(self.nick) + return html_colors(self.nick, limit) def nick_strip_colors(self): if self.nick is None: @@ -102,7 +102,7 @@ class Map(object): class Game(object): - def __init__(self, game_id=None, start_dt=None, game_type_cd=None, + def __init__(self, game_id=None, start_dt=None, game_type_cd=None, server_id=None, map_id=None, winner=None): self.game_id = game_id self.start_dt = start_dt @@ -144,11 +144,11 @@ class PlayerGameStat(object): else: return strip_colors(self.nick) - def nick_html_colors(self): + def nick_html_colors(self, limit=None): if self.nick is None: return "Anonymous Player" else: - return html_colors(self.nick) + return html_colors(self.nick, limit) def team_html_color(self): if self.team == 5: @@ -230,11 +230,11 @@ class PlayerElo(object): class PlayerRank(object): - def nick_html_colors(self): + def nick_html_colors(self, limit=None): if self.nick is None: return "Anonymous Player" else: - return html_colors(self.nick) + return html_colors(self.nick, limit) def __repr__(self): return "" % (self.player_id, self.game_type_cd, self.rank) diff --git a/xonstat/static/css/app.css b/xonstat/static/css/app.css index 48c91a3..7cabed5 100644 --- a/xonstat/static/css/app.css +++ b/xonstat/static/css/app.css @@ -239,6 +239,12 @@ table td { float: left; } +/* elo colors */ +.eloup { color: green; } +.elodown { color: rgb(190,0,0); } +.eloneutral { color: gray; } + +/* limit player nick lengths */ .player-nick { overflow: hidden; text-overflow: ellipsis; diff --git a/xonstat/static/css/app.min.css b/xonstat/static/css/app.min.css index 889ff7e..c8ada11 100644 --- a/xonstat/static/css/app.min.css +++ b/xonstat/static/css/app.min.css @@ -1 +1 @@ -@font-face{font-family:'XoloniumNormal';src:url('fonts/xolonium-webfont.eot');src:url('fonts/xolonium-webfont.eot?#iefix') format('embedded-opentype'),url('fonts/xolonium-webfont.woff') format('woff'),url('fonts/xolonium-webfont.ttf') format('truetype'),url('fonts/xolonium-webfont.svg#XoloniumNormal') format('svg');font-weight:normal;font-style:normal}body{background:url("img/web_background_4.jpg") no-repeat fixed center center / cover black;background-color:black;color:#d0d0d0;font-family:"XoloniumNormal","Helvetica Neue",Helvetica,Arial,sans-serif}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999}h1{font-size:30px;line-height:36px}h1 small{font-size:18px}h2{font-size:24px;line-height:36px}h2 small{font-size:18px}h3{line-height:27px;font-size:18px}h3 small{font-size:14px}h4,h5,h6{line-height:18px}h4{font-size:14px}h4 small{font-size:12px}h5{font-size:12px}h6{font-size:11px;color:#999;text-transform:uppercase}table{background:#000;background:none repeat scroll 0 0 rgba(0,0,0,0.7);border:1px solid #436688}table th{border:1px solid #436688;background-color:#001021}table td{border:1px solid #436688;font-size:10px}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#222}.table th,.table td{border:1px solid #436688}.table td{vertical-align:middle}.table .tdcenter{text-align:center}.accordion-group{border:1px solid #272525}.accordion-inner{border:0}#statline{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;position:relative;top:-25px}#xonborder{background:#000;background:none repeat scroll 0 0 rgba(0,0,0,0.5);border-radius:15px 15px 15px 15px;margin-bottom:30px;margin-left:0;padding:20px}#title{color:#08c;font-size:30px;margin-bottom:15px;position:relative;text-align:center;text-shadow:2px 2px 3px #333}.indexform{margin:20px 0 20px 0}.indexbox{width:250px}.navbar-brand{margin-left:0;padding-bottom:0;padding-top:10px;text-align:left}.navbar-inverse{background:none repeat scroll 0 0 rgba(0,0,0,0.6)}.navbar-inverse .nav>.active>a,.navbar-inverse .nav>.active>a:hover,.navbar-inverse .nav>.active>a:focus{background:none repeat scroll 0 0 rgba(49,49,49,0.6)}.navbar-inverse .nav>li>a,.navbar-brand{font-family:XoloniumNormal}.search,input[type="search"]{background-color:#606060;border:1px solid #202020;color:#aaa;width:100px}.game{float:left;margin-bottom:30px;min-width:700px;padding:10px 7px}.game a{color:#CCC}.game a:hover{color:#d95f00;text-decoration:none}.game tr{background-color:#000}.game tr.red{background-color:#4d0000}.game tr.blue{background-color:#00004d}.game tr.yellow{background-color:#4d4d00}.game tr.pink{background-color:#4d004d}.game tr:hover{background-color:#222}.weapon-nav{height:70px;margin-bottom:20px}.weapon-nav ul{display:block;list-style:none outside none}.weapon-nav li{cursor:pointer;float:left;margin-right:10px}.weapon-nav li:hover{border-bottom:2px solid #001021}.weapon-nav .weapon-active{border-bottom:2px solid #436688}.weapon-nav p{text-align:center}.flot table,.flot td{background-color:black;border:0}#gbtabcontainer{margin-top:10px}#gbtab{font-size:12px}.tabbable p{font-size:14px}.tabs-below .nav-tabs>li>a{border-radius:4px 4px 4px 4px}.nav-tabs>.active>a,.nav-tabs>.active>a:hover{background-color:#111;color:#aaa;border-color:#222}.nav-tabs>li>a{border-radius:4px 4px 4px 4px;text-align:center}.nav-tabs>li>a:hover{background-color:#111;border-color:#333}.nav-tabs{border-bottom:0 solid #000}.table .tdcenter{text-align:center}.game-detail img{float:left;margin-right:10px;margin-bottom:5px}.game img{float:left;margin-right:5px;margin-bottom:5px}.game-detail p,.game h4{float:left}.player-nick{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}.pagination>li>a,.pagination>li>span{background-color:#111;border-color:#313131;color:#797979}.pagination>li>a:hover,.pagination>li>a:focus,.pagination>.active>a,.pagination>.active>span{background-color:#2b2222}@media(min-width:768px){.navbar-form{float:right}} +@font-face{font-family:'XoloniumNormal';src:url('fonts/xolonium-webfont.eot');src:url('fonts/xolonium-webfont.eot?#iefix') format('embedded-opentype'),url('fonts/xolonium-webfont.woff') format('woff'),url('fonts/xolonium-webfont.ttf') format('truetype'),url('fonts/xolonium-webfont.svg#XoloniumNormal') format('svg');font-weight:normal;font-style:normal}body{background:url("img/web_background_4.jpg") no-repeat fixed center center / cover black;background-color:black;color:#d0d0d0;font-family:"XoloniumNormal","Helvetica Neue",Helvetica,Arial,sans-serif}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999}h1{font-size:30px;line-height:36px}h1 small{font-size:18px}h2{font-size:24px;line-height:36px}h2 small{font-size:18px}h3{line-height:27px;font-size:18px}h3 small{font-size:14px}h4,h5,h6{line-height:18px}h4{font-size:14px}h4 small{font-size:12px}h5{font-size:12px}h6{font-size:11px;color:#999;text-transform:uppercase}table{background:#000;background:none repeat scroll 0 0 rgba(0,0,0,0.7);border:1px solid #436688}table th{border:1px solid #436688;background-color:#001021}table td{border:1px solid #436688;font-size:10px}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#222}.table th,.table td{border:1px solid #436688}.table td{vertical-align:middle}.table .tdcenter{text-align:center}.accordion-group{border:1px solid #272525}.accordion-inner{border:0}#statline{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;position:relative;top:-25px}#xonborder{background:#000;background:none repeat scroll 0 0 rgba(0,0,0,0.5);border-radius:15px 15px 15px 15px;margin-bottom:30px;margin-left:0;padding:20px}#title{color:#08c;font-size:30px;margin-bottom:15px;position:relative;text-align:center;text-shadow:2px 2px 3px #333}.indexform{margin:20px 0 20px 0}.indexbox{width:250px}.navbar-brand{margin-left:0;padding-bottom:0;padding-top:10px;text-align:left}.navbar-inverse{background:none repeat scroll 0 0 rgba(0,0,0,0.6)}.navbar-inverse .nav>.active>a,.navbar-inverse .nav>.active>a:hover,.navbar-inverse .nav>.active>a:focus{background:none repeat scroll 0 0 rgba(49,49,49,0.6)}.navbar-inverse .nav>li>a,.navbar-brand{font-family:XoloniumNormal}.search,input[type="search"]{background-color:#606060;border:1px solid #202020;color:#aaa;width:100px}.game{float:left;margin-bottom:30px;min-width:700px;padding:10px 7px}.game a{color:#CCC}.game a:hover{color:#d95f00;text-decoration:none}.game tr{background-color:#000}.game tr.red{background-color:#4d0000}.game tr.blue{background-color:#00004d}.game tr.yellow{background-color:#4d4d00}.game tr.pink{background-color:#4d004d}.game tr:hover{background-color:#222}.weapon-nav{height:70px;margin-bottom:20px}.weapon-nav ul{display:block;list-style:none outside none}.weapon-nav li{cursor:pointer;float:left;margin-right:10px}.weapon-nav li:hover{border-bottom:2px solid #001021}.weapon-nav .weapon-active{border-bottom:2px solid #436688}.weapon-nav p{text-align:center}.flot table,.flot td{background-color:black;border:0}#gbtabcontainer{margin-top:10px}#gbtab{font-size:12px}.tabbable p{font-size:14px}.tabs-below .nav-tabs>li>a{border-radius:4px 4px 4px 4px}.nav-tabs>.active>a,.nav-tabs>.active>a:hover{background-color:#111;color:#aaa;border-color:#222}.nav-tabs>li>a{border-radius:4px 4px 4px 4px;text-align:center}.nav-tabs>li>a:hover{background-color:#111;border-color:#333}.nav-tabs{border-bottom:0 solid #000}.table .tdcenter{text-align:center}.game-detail img{float:left;margin-right:10px;margin-bottom:5px}.game img{float:left;margin-right:5px;margin-bottom:5px}.game-detail p,.game h4{float:left}.eloup{color:green}.elodown{color:#be0000}.eloneutral{color:gray}.player-nick{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pagination>li>a,.pagination>li>span{background-color:#111;border-color:#313131;color:#797979}.pagination>li>a:hover,.pagination>li>a:focus,.pagination>.active>a,.pagination>.active>span{background-color:#2b2222}@media(min-width:768px){.navbar-form{float:right}} \ No newline at end of file diff --git a/xonstat/templates/main_index.mako b/xonstat/templates/main_index.mako index 7e7b0d8..4e84cbb 100644 --- a/xonstat/templates/main_index.mako +++ b/xonstat/templates/main_index.mako @@ -56,8 +56,8 @@ Leaderboard % for r in rs: ${i} - ${r.nick_html_colors()|n} - ${round(r.elo, 3)} + ${r.nick_html_colors()|n} + ${int(round(r.elo))} <% i = i+1 %> % endfor diff --git a/xonstat/templates/map_index.mako b/xonstat/templates/map_index.mako index d6fd85e..62dac7e 100644 --- a/xonstat/templates/map_index.mako +++ b/xonstat/templates/map_index.mako @@ -26,12 +26,18 @@ Map Index ID Name Added + % for map in maps: ${map.map_id} ${map.name} ${map.fuzzy_date()} + + + + + % endfor diff --git a/xonstat/templates/player_index.mako b/xonstat/templates/player_index.mako index 418d57e..d23deca 100644 --- a/xonstat/templates/player_index.mako +++ b/xonstat/templates/player_index.mako @@ -26,12 +26,18 @@ Player Index Player ID Nick Joined + % for player in players: ${player.player_id} ${player.nick_html_colors()|n} ${player.joined_pretty_date()} + + + + + % endfor diff --git a/xonstat/templates/player_info.mako b/xonstat/templates/player_info.mako index f51dac9..70fd74e 100644 --- a/xonstat/templates/player_info.mako +++ b/xonstat/templates/player_info.mako @@ -476,14 +476,14 @@ Player Information % if rg.elo_delta is not None: % if round(rg.elo_delta,2) > 0: - + % elif round(rg.elo_delta,2) < 0: - + % else: - + % endif % else: - + % endif diff --git a/xonstat/templates/rank_index.mako b/xonstat/templates/rank_index.mako index e501aa7..fbfdd8a 100644 --- a/xonstat/templates/rank_index.mako +++ b/xonstat/templates/rank_index.mako @@ -29,8 +29,8 @@ Capture The Flag Rank Index % for rank in ranks: ${rank.rank} - ${rank.nick_html_colors()|n} - ${round(rank.elo, 3)} + ${rank.nick_html_colors()|n} + ${int(round(rank.elo))} <% i += 1 %> % endfor diff --git a/xonstat/templates/server_index.mako b/xonstat/templates/server_index.mako index 3217bed..d266ba3 100644 --- a/xonstat/templates/server_index.mako +++ b/xonstat/templates/server_index.mako @@ -15,7 +15,7 @@ Server Index % else:
-
+
@@ -26,12 +26,18 @@ Server Index ID Name Added + % for server in servers: ${server.server_id} ${server.name} ${server.fuzzy_date()} + + + + + % endfor diff --git a/xonstat/util.py b/xonstat/util.py index af8809c..b400d2a 100644 --- a/xonstat/util.py +++ b/xonstat/util.py @@ -23,7 +23,7 @@ _qfont_table = [ 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', '<', - + '<', '=', '>', '#', '#', '.', '#', '#', '#', '#', ' ', '#', ' ', '>', '.', '.', '[', ']', '0', '1', '2', '3', '4', '5', @@ -103,13 +103,37 @@ def hex_repl(match): return '' % (255 * r, 255 * g, 255 * b) -def html_colors(qstr=''): - qstr = html_escape(qfont_decode(qstr).replace('^^', '^')) +def html_colors(qstr='', limit=None): + qstr = html_escape(qfont_decode(qstr)) + qstr = qstr.replace('^^', '^') + + if limit is not None and limit > 0: + qstr = limit_printable_characters(qstr, limit) + html = _dec_colors.sub(lambda match: _dec_spans[int(match.group(1))], qstr) html = _hex_colors.sub(hex_repl, html) return html + "" * len(_all_colors.findall(qstr)) +def limit_printable_characters(qstr, limit): + # initialize assuming all printable characters + pc = [1 for i in range(len(qstr))] + + groups = _all_colors.finditer(qstr) + for g in groups: + pc[g.start():g.end()] = [0 for i in range(g.end() - g.start())] + + # printable characters in the string is less than or equal to what was requested + if limit >= len(qstr) or sum(pc) <= limit: + return qstr + else: + sumpc = 0 + for i,v in enumerate(pc): + sumpc += v + if sumpc == limit: + return qstr[0:i+1] + + def page_url(page): return current_route_url(request, page=page, _query=request.GET)