This commit is contained in:
starschen
2015-07-21 09:32:48 +08:00
commit 7d22fdf57f
40 changed files with 20163 additions and 0 deletions

20
auth/models.py Normal file
View File

@@ -0,0 +1,20 @@
#encoding:utf8
from db import db
from flask.ext.security import UserMixin, RoleMixin
class Role(db.Document, RoleMixin):
name = db.StringField(max_length=80, unique=True)
description = db.StringField(max_length=255)
def __unicode__(self):
return self.name
class User(db.Document, UserMixin):
email = db.StringField(max_length=255)
password = db.StringField(max_length=255)
active = db.BooleanField(default=True)
confirmed_at = db.DateTimeField()
roles = db.ListField(db.ReferenceField(Role), default=[])
def __unicode__(self):
return self.email

12
auth/views.py Normal file
View File

@@ -0,0 +1,12 @@
#encoding: utf8
from flask.ext.admin.contrib.mongoengine import ModelView
from flask.ext.security import current_user
class UserAdmin(ModelView):
def is_accessible(self):
return current_user.has_role('admin')
class RoleAdmin(ModelView):
def is_accessible(self):
return current_user.has_role('admin')

3
babel.cfg Normal file
View File

@@ -0,0 +1,3 @@
[python: **.py]
[jinja2: **/templates/**.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_

View File

@@ -0,0 +1 @@
,bjh,bjh-virtual-machine,23.05.2015 19:35,file:///home/bjh/.config/libreoffice/4;

57
data/import_data.py Normal file
View File

@@ -0,0 +1,57 @@
#encoding: utf8
import xlrd
import sys
sys.path.append('..')
from mongodb import guandan_db
def import_namelist():
book = xlrd.open_workbook(u'掼蛋比赛名单.xls')
table = book.sheet_by_index(0)
nrows = table.nrows
ncols = table.ncols
game = guandan_db.game.find_one({'name':u'徐州市第十六届“中国大地保险杯”掼蛋比赛'})
for i in range(1, nrows):
record = {}
record['game'] = game['_id']
record['no'] = i
record['company'] = table.cell(i,0).value
record['team_no'] = table.cell(i,1).value
record['players'] = table.cell(i,2).value
guandan_db.name_list.insert(record)
def import_gamerecord():
book = xlrd.open_workbook(u'第二轮汇总表.xls')
table = book.sheet_by_index(0)
calced_teams = set()
nrows = table.nrows
ncols = table.ncols
count = 0
for i in range(1, nrows):
if table.cell(i,3).value in calced_teams:
continue
record = {}
record['round'] = 1
record['red'] = guandan_db.name_list.find_one(dict(team_no=table.cell(i,1).value))['_id']
record['blue'] = guandan_db.name_list.find_one(dict(team_no=table.cell(i,3).value))['_id']
scores = table.cell(i,4).value.split('/')
if int(scores[0]) == 2:
record['result'] = u'红方胜'
elif int(scores[0]) == 0:
record['result'] = u'蓝方胜'
elif int(scores[0]) == 1:
record['result'] = u'平局'
elif int(scores[0]) == -1:
record['result'] = u'红方弃权'
record['diff'] = abs(int(scores[1]))
count += 1
record['desk_no'] = count
calced_teams.add(table.cell(i,1).value)
calced_teams.add(table.cell(i,3).value)
#print record
guandan_db.game_record.insert(record)
import_gamerecord()

BIN
data/掼蛋比赛名单.xls Normal file

Binary file not shown.

BIN
data/第二轮汇总表.xls Normal file

Binary file not shown.

5
db.py Normal file
View File

@@ -0,0 +1,5 @@
#encoding:utf8
from flask.ext.mongoengine import MongoEngine
db = MongoEngine()

15
filters.py Normal file
View File

@@ -0,0 +1,15 @@
#encoding: utf8
from flask_admin.contrib.mongoengine.filters import BaseMongoEngineFilter
from game.models import Game
from flask_admin.babel import lazy_gettext
class FilterGame(BaseMongoEngineFilter):
def apply(self, query, value):
return query.filter(game__exact=Game.objects(name__exact=value).first().id)
def operation(self):
return lazy_gettext('exact')
def get_options(self, view):
game_list = [(obj.name, obj.name) for obj in Game.objects()]
return game_list

11
forms.py Normal file
View File

@@ -0,0 +1,11 @@
#encoding: utf8
from wtforms import Form, SelectField
class BallotForm(Form):
game = SelectField(u'赛事')
ballot_type = SelectField(u'首轮抽签方式', choices=[('random', u'随机'), ('sequence', u'顺序')])
class RankForm(Form):
game = SelectField(u'赛事')
rank_type = SelectField(u'排名类型', choices=[('team', u'队伍排名'), ('company', u'团体排名')])

2
game/__init__.py Normal file
View File

@@ -0,0 +1,2 @@
import models
import views

11
game/models.py Normal file
View File

@@ -0,0 +1,11 @@
#encoding: utf8
import sys
sys.path.append('..')
from db import db
class Game(db.Document):
name = db.StringField(verbose_name=u'赛事名称')
def __unicode__(self):
return self.name

9
game/views.py Normal file
View File

@@ -0,0 +1,9 @@
#encoding: utf8
from flask.ext.admin.contrib.mongoengine import ModelView
class GameAdmin(ModelView):
page_size = 15
column_labels = {
'name': u'赛事名称',
}

2
game_record/__init__.py Normal file
View File

@@ -0,0 +1,2 @@
import models
import views

16
game_record/models.py Normal file
View File

@@ -0,0 +1,16 @@
#encoding: utf8
import sys
sys.path.append('..')
from db import db
from namelist.models import NameList
from game.models import Game
class GameRecord(db.Document):
game = db.ReferenceField(Game, verbose_name=u'赛事')
round = db.IntField(verbose_name=u'轮次')
desk_no = db.IntField(verbose_name=u'桌号')
red = db.ReferenceField(NameList, verbose_name=u'红方')
blue = db.ReferenceField(NameList, verbose_name=u'蓝方')
result = db.StringField(choices=[(u'红方胜', u'红方胜'), (u'蓝方胜', u'蓝方胜'), (u'平局', u'平局'), (u'红方弃权', u'红方弃权'), (u'蓝方弃权', u'蓝方弃权')], verbose_name=u'赛果')
diff = db.IntField(default=6, verbose_name=u'级差') #级差

21
game_record/views.py Normal file
View File

@@ -0,0 +1,21 @@
#encoding: utf8
from flask.ext.admin.contrib.mongoengine import ModelView
from flask.ext.admin import BaseView, expose
import sys
sys.path.append('..')
from filters import FilterGame
class GameRecordAdmin(ModelView):
page_size = 15
column_labels = {
'game': u'赛事',
'round': u'轮次',
'desk_no': u'桌号',
'red': u'红方',
'blue': u'蓝方',
'result': u'赛果',
'diff': u'级差',
}
column_filters = ['round', FilterGame('game', u'赛事')]

33
main.py Normal file
View File

@@ -0,0 +1,33 @@
#encoding: utf8
from flask import Flask, render_template
from flask.ext.basicauth import BasicAuth
from flask.ext.babel import Babel
from flask.ext.admin import Admin, AdminIndexView
import namelist
import game_record
import game
from views import *
from db import db
app = Flask(__name__)
app.config.from_object("settings")
basic_auth = BasicAuth(app)
db.init_app(app)
babel = Babel(app)
#admin
admin = Admin(app, u'掼蛋赛事管理系统', template_mode='bootstrap3', index_view=AdminIndexView(
name=u'主页',
template='admin/index.html',
url='/'
))
admin.add_view(game.views.GameAdmin(game.models.Game, name=u'赛事', endpoint='game'))
admin.add_view(namelist.views.NameListAdmin(namelist.models.NameList, name=u'比赛名单', endpoint='namelist'))
admin.add_view(game_record.views.GameRecordAdmin(game_record.models.GameRecord, name=u'比赛记录', endpoint='game-record'))
admin.add_view(BallotView(name=u'抽签', endpoint='ballot'))
admin.add_view(RankView(name=u'排名', endpoint='rank'))
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)

15
mongodb.py Normal file
View File

@@ -0,0 +1,15 @@
#encoding: utf8
import pymongo
class MongoDB:
def __init__(self,user,password,dbname, host='127.0.0.1',port=27017):
self.host = host
self.port = port
self.user = user
self.password = password
self.conn = pymongo.Connection(self.host,int(self.port))
self.db = self.conn[dbname]
self.db.authenticate(self.user,self.password)
guandan_db = MongoDB(user='guandan', password='jiaojiao', dbname='guandan').db

128
name_list.json Normal file
View File

@@ -0,0 +1,128 @@
{"_id":{"$oid":"5558100beea2a606e8d791c5"},"company":"南京周周掼扑克牌俱乐部","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(1),"players":"徐建明/张发利","team_no":"01A"}
{"_id":{"$oid":"5558100beea2a606e8d791c6"},"company":"徐州民政医院","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(2),"players":"杜长军/许亚峰","team_no":"02A"}
{"_id":{"$oid":"5558100beea2a606e8d791c7"},"company":"徐州宣武集团","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(3),"players":"林一林/姚成光","team_no":"03A"}
{"_id":{"$oid":"5558100beea2a606e8d791c8"},"company":"新城区城管执法大队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(4),"players":"黄晓一/王继刚","team_no":"04A"}
{"_id":{"$oid":"5558100beea2a606e8d791c9"},"company":"徐州市粮食局","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(5),"players":"贾浙宁/谢秀杰","team_no":"05A"}
{"_id":{"$oid":"5558100beea2a606e8d791ca"},"company":"徐州市第三十六中学","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(6),"players":"陈飞荣/高 明","team_no":"06A"}
{"_id":{"$oid":"5558100beea2a606e8d791cb"},"company":"徐州市第一人民医院","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(7),"players":"谢 超/蔡军良","team_no":"07A"}
{"_id":{"$oid":"5558100beea2a606e8d791cc"},"company":"扬州富愉掼蛋俱乐部","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(8),"players":"刘霞/毕海燕","team_no":"08A"}
{"_id":{"$oid":"5558100beea2a606e8d791cd"},"company":"江苏中正房地产公司","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(9),"players":"杨 超/孟 强","team_no":"09A"}
{"_id":{"$oid":"5558100beea2a606e8d791ce"},"company":"徐州市计生委","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(10),"players":"李建光/薛 杰","team_no":"10A"}
{"_id":{"$oid":"5558100beea2a606e8d791cf"},"company":"徐州兴隆国际大酒店","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(11),"players":"张世龙/孟凡森","team_no":"11A"}
{"_id":{"$oid":"5558100beea2a606e8d791d0"},"company":"红星女子掼蛋队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(12),"players":"蒋 侠(女)/潘月梅(女)","team_no":"12A"}
{"_id":{"$oid":"5558100beea2a606e8d791d1"},"company":"徐州开元名都大酒店一队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(13),"players":"夏 铭/朱雪松","team_no":"13A"}
{"_id":{"$oid":"5558100beea2a606e8d791d2"},"company":"江苏雅黛掼蛋俱乐部","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(14),"players":"燕 文/谢旭红(女)","team_no":"14A"}
{"_id":{"$oid":"5558100beea2a606e8d791d3"},"company":"徐州市卫生计量检测所","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(15),"players":"张 勇/刘 易","team_no":"15A"}
{"_id":{"$oid":"5558100beea2a606e8d791d4"},"company":"镇江豪友扑克俱乐部","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(16),"players":"江杰豪/张 震","team_no":"16A"}
{"_id":{"$oid":"5558100beea2a606e8d791d5"},"company":"徐州市档案局","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(17),"players":"程昔刚/汪凤国","team_no":"17A"}
{"_id":{"$oid":"5558100beea2a606e8d791d6"},"company":"徐州永宏双升俱乐部","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(18),"players":"霍仁礼/戴茂生","team_no":"18A"}
{"_id":{"$oid":"5558100beea2a606e8d791d7"},"company":"江苏苏铝铝业公司一队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(19),"players":"忻培清/陈荣水","team_no":"19A"}
{"_id":{"$oid":"5558100beea2a606e8d791d8"},"company":"徐州市卫生局一队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(20),"players":"鹿启全/吴 兵","team_no":"20A"}
{"_id":{"$oid":"5558100beea2a606e8d791d9"},"company":"徐州市水务局","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(21),"players":"张 浩/贺恒利","team_no":"21A"}
{"_id":{"$oid":"5558100beea2a606e8d791da"},"company":"徐州市城市管理局一队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(22),"players":"张银河/高吉才","team_no":"22A"}
{"_id":{"$oid":"5558100beea2a606e8d791db"},"company":"徐矿集团有限公司","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(23),"players":"蒋宝淦/郭运良","team_no":"23A"}
{"_id":{"$oid":"5558100beea2a606e8d791dc"},"company":"东海移动公司","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(24),"players":"单新民/仉 东","team_no":"24A"}
{"_id":{"$oid":"5558100beea2a606e8d791dd"},"company":"徐州大地保险公司","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(25),"players":"毛 爽/段卫华","team_no":"25A"}
{"_id":{"$oid":"5558100beea2a606e8d791de"},"company":"云龙公园","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(26),"players":"高 磊/张茂让","team_no":"26A"}
{"_id":{"$oid":"5558100beea2a606e8d791df"},"company":"糖葫芦掼蛋俱乐部","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(27),"players":"张 虎/吴月锋","team_no":"27A"}
{"_id":{"$oid":"5558100beea2a606e8d791e0"},"company":"市侨联","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(28),"players":"吴 彬/田同峰","team_no":"28A"}
{"_id":{"$oid":"5558100beea2a606e8d791e1"},"company":"徐州质量技术监督局","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(29),"players":"刘 幸/王 珲","team_no":"29A"}
{"_id":{"$oid":"5558100beea2a606e8d791e2"},"company":"卡特彼勒徐州公司一队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(30),"players":"陈兴群/张 震","team_no":"30A"}
{"_id":{"$oid":"5558100beea2a606e8d791e3"},"company":"圣戈班(徐州)管道公司一队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(31),"players":"张爱民/申福勇","team_no":"31A"}
{"_id":{"$oid":"5558100beea2a606e8d791e4"},"company":"泰州海洋起亚掼蛋俱乐部","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(32),"players":"耿晓军/高志兵","team_no":"32A"}
{"_id":{"$oid":"5558100beea2a606e8d791e5"},"company":"徐州市第一中学","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(33),"players":"张帮程/程 猛","team_no":"33A"}
{"_id":{"$oid":"5558100beea2a606e8d791e6"},"company":"格力电器","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(34),"players":"陈玉顶/陈桂德","team_no":"34A"}
{"_id":{"$oid":"5558100beea2a606e8d791e7"},"company":"市侨办","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(35),"players":"郭振田/周建科","team_no":"35A"}
{"_id":{"$oid":"5558100beea2a606e8d791e8"},"company":"江苏万通酿造有限公司","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(36),"players":"王本强/王心强","team_no":"36A"}
{"_id":{"$oid":"5558100beea2a606e8d791e9"},"company":"徐州幼儿师范高等专科学校","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(37),"players":"李彦松/高 峰","team_no":"37A"}
{"_id":{"$oid":"5558100beea2a606e8d791ea"},"company":"弘扬掼蛋文化俱乐部","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(38),"players":"史先停/王茂军","team_no":"38A"}
{"_id":{"$oid":"5558100beea2a606e8d791eb"},"company":"江苏天勤机电设备公司","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(39),"players":"徐 君/陈光林","team_no":"39A"}
{"_id":{"$oid":"5558100beea2a606e8d791ec"},"company":"淮安市楚淮掼蛋俱乐部","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(40),"players":"王立涛/陈雪生","team_no":"40A"}
{"_id":{"$oid":"5558100beea2a606e8d791ed"},"company":"徐州工商行政管理局","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(41),"players":"朱卫国/彭 勇","team_no":"41A"}
{"_id":{"$oid":"5558100beea2a606e8d791ee"},"company":"徐州建行","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(42),"players":"刘 伟/孙 钢","team_no":"42A"}
{"_id":{"$oid":"5558100beea2a606e8d791ef"},"company":"徐州市城市管理局二队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(43),"players":"徐 品/石玉雷","team_no":"43A"}
{"_id":{"$oid":"5558100beea2a606e8d791f0"},"company":"万国掼蛋俱乐部","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(44),"players":"徐 跃/苏 可","team_no":"44A"}
{"_id":{"$oid":"5558100beea2a606e8d791f1"},"company":"徐州市彭祖园管理处","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(45),"players":"王继文/陈 明","team_no":"45A"}
{"_id":{"$oid":"5558100beea2a606e8d791f2"},"company":"徐州电大","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(46),"players":"潘 侠/单志毅","team_no":"46A"}
{"_id":{"$oid":"5558100beea2a606e8d791f3"},"company":"徐州医学院","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(47),"players":"刘兴刚/郑朝阳","team_no":"47A"}
{"_id":{"$oid":"5558100beea2a606e8d791f4"},"company":"连云港掼蛋俱乐部","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(48),"players":"江舜超/刘 琇","team_no":"48A"}
{"_id":{"$oid":"5558100beea2a606e8d791f5"},"company":"徐州市体育局","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(49),"players":"贺方全/杨友俊","team_no":"49A"}
{"_id":{"$oid":"5558100beea2a606e8d791f6"},"company":"徐州开元名都大酒店二队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(50),"players":"侯金栋/叶德波","team_no":"50A"}
{"_id":{"$oid":"5558100beea2a606e8d791f7"},"company":"沂沭泗水利管理局","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(51),"players":"杨 伟/范 宇","team_no":"51A"}
{"_id":{"$oid":"5558100beea2a606e8d791f8"},"company":"徐州出入境检验检疫局","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(52),"players":"吴亚力/顾建华","team_no":"52A"}
{"_id":{"$oid":"5558100beea2a606e8d791f9"},"company":"徐州市卫生局二队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(53),"players":"甘国永/朱卫东","team_no":"53A"}
{"_id":{"$oid":"5558100beea2a606e8d791fa"},"company":"卡特彼勒徐州公司二队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(54),"players":"袁 猛/江 楠","team_no":"54A"}
{"_id":{"$oid":"5558100beea2a606e8d791fb"},"company":"淮海蔬菜批发市场","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(55),"players":"贾 勇/宋 兵","team_no":"55A"}
{"_id":{"$oid":"5558100beea2a606e8d791fc"},"company":"宿迁市棋牌协会","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(56),"players":"朱林军/寺胜利","team_no":"56A"}
{"_id":{"$oid":"5558100beea2a606e8d791fd"},"company":"中石化管道储运有限公司","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(57),"players":"马 育/杨全友","team_no":"57A"}
{"_id":{"$oid":"5558100beea2a606e8d791fe"},"company":"润速达货运公司","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(58),"players":"宁连敏/戴建荣","team_no":"58A"}
{"_id":{"$oid":"5558100beea2a606e8d791ff"},"company":"徐州邮政局","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(59),"players":"王 东/张 立","team_no":"59A"}
{"_id":{"$oid":"5558100beea2a606e8d79200"},"company":"江苏苏铝铝业公司二队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(60),"players":"于徐生/蔡宗洲","team_no":"60A"}
{"_id":{"$oid":"5558100beea2a606e8d79201"},"company":"圣戈班(徐州)管道公司二队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(61),"players":"何家海/陈洪生","team_no":"61A"}
{"_id":{"$oid":"5558100beea2a606e8d79202"},"company":"徐州市植物园","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(62),"players":"徐万泰/郑百顺","team_no":"62A"}
{"_id":{"$oid":"5558100beea2a606e8d79203"},"company":"徐州农行","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(63),"players":"胡 勇/陈 勇","team_no":"63A"}
{"_id":{"$oid":"5558100beea2a606e8d79204"},"company":"江苏今世缘酒业公司","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(64),"players":"杨晓东/张锡瑞","team_no":"64A"}
{"_id":{"$oid":"5558100beea2a606e8d79205"},"company":"卡特彼勒徐州公司一队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(65),"players":"张 凯/宁 禹","team_no":"30B"}
{"_id":{"$oid":"5558100beea2a606e8d79206"},"company":"南京周周掼扑克牌俱乐部","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(66),"players":"杜雨光/徐 苏","team_no":"01B"}
{"_id":{"$oid":"5558100beea2a606e8d79207"},"company":"润速达货运公司","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(67),"players":"张 杰/韩 平","team_no":"58B"}
{"_id":{"$oid":"5558100beea2a606e8d79208"},"company":"徐州永宏双升俱乐部","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(68),"players":"刘道宇/吴洪雨","team_no":"18B"}
{"_id":{"$oid":"5558100beea2a606e8d79209"},"company":"徐州建行","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(69),"players":"王慎军/郭 杰","team_no":"42B"}
{"_id":{"$oid":"5558100beea2a606e8d7920a"},"company":"徐矿集团有限公司","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(70),"players":"赵 波/李永刚","team_no":"23B"}
{"_id":{"$oid":"5558100beea2a606e8d7920b"},"company":"淮海蔬菜批发市场","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(71),"players":"吴 宁/何如来","team_no":"55B"}
{"_id":{"$oid":"5558100beea2a606e8d7920c"},"company":"泰州海洋起亚掼蛋俱乐部","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(72),"players":"王小强/田正祥","team_no":"32B"}
{"_id":{"$oid":"5558100beea2a606e8d7920d"},"company":"中石化管道储运有限公司","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(73),"players":"孙成德/黄烈勇","team_no":"57B"}
{"_id":{"$oid":"5558100beea2a606e8d7920e"},"company":"徐州市彭祖园管理处","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(74),"players":"余 瑛(女)/王 霞(女)","team_no":"45B"}
{"_id":{"$oid":"5558100beea2a606e8d7920f"},"company":"徐州出入境检验检疫局","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(75),"players":"伊仰东/陈 焱","team_no":"52B"}
{"_id":{"$oid":"5558100beea2a606e8d79210"},"company":"徐州幼儿师范高等专科学校","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(76),"players":"王 震/严加明","team_no":"37B"}
{"_id":{"$oid":"5558100beea2a606e8d79211"},"company":"弘扬掼蛋文化俱乐部","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(77),"players":"顾再生/袁先林","team_no":"38B"}
{"_id":{"$oid":"5558100beea2a606e8d79212"},"company":"徐州宣武集团","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(78),"players":"盛建东/饶瑞泉","team_no":"03B"}
{"_id":{"$oid":"5558100beea2a606e8d79213"},"company":"江苏苏铝铝业公司一队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(79),"players":"马树申/汪永居","team_no":"19B"}
{"_id":{"$oid":"5558100beea2a606e8d79214"},"company":"东海移动公司","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(80),"players":"高 源/朱建华","team_no":"24B"}
{"_id":{"$oid":"5558100beea2a606e8d79215"},"company":"云龙公园","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(81),"players":"吕永斌/王元勋","team_no":"26B"}
{"_id":{"$oid":"5558100beea2a606e8d79216"},"company":"徐州市卫生计量检测所","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(82),"players":"陈 腾/陆 强","team_no":"15B"}
{"_id":{"$oid":"5558100beea2a606e8d79217"},"company":"市侨联","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(83),"players":"李秋絮(女)/邬文英(女)","team_no":"28B"}
{"_id":{"$oid":"5558100beea2a606e8d79218"},"company":"徐州开元名都大酒店二队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(84),"players":"郑 永/赵维灿","team_no":"50B"}
{"_id":{"$oid":"5558100beea2a606e8d79219"},"company":"徐州市卫生局一队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(85),"players":"史为栋/孙 萍(女)","team_no":"20B"}
{"_id":{"$oid":"5558100beea2a606e8d7921a"},"company":"徐州市第一人民医院","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(86),"players":"李玉强/时晓东","team_no":"07B"}
{"_id":{"$oid":"5558100beea2a606e8d7921b"},"company":"万国掼蛋俱乐部","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(87),"players":"郑 晨/郑庆国","team_no":"44B"}
{"_id":{"$oid":"5558100beea2a606e8d7921c"},"company":"江苏万通酿造有限公司","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(88),"players":"何建军/刘建华","team_no":"36B"}
{"_id":{"$oid":"5558100beea2a606e8d7921d"},"company":"镇江豪友扑克俱乐部","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(89),"players":"郦建纲/吴剑峰","team_no":"16B"}
{"_id":{"$oid":"5558100beea2a606e8d7921e"},"company":"徐州农行","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(90),"players":"张翠虎/赵支援","team_no":"63B"}
{"_id":{"$oid":"5558100beea2a606e8d7921f"},"company":"徐州市植物园","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(91),"players":"周海彬/刘 建","team_no":"62B"}
{"_id":{"$oid":"5558100beea2a606e8d79220"},"company":"圣戈班(徐州)管道公司一队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(92),"players":"许 明/郝 钢","team_no":"31B"}
{"_id":{"$oid":"5558100beea2a606e8d79221"},"company":"徐州民政医院","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(93),"players":"薛玉光/廖松峰","team_no":"02B"}
{"_id":{"$oid":"5558100beea2a606e8d79222"},"company":"徐州市城市管理局一队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(94),"players":"郝献宏/张继民","team_no":"22B"}
{"_id":{"$oid":"5558100beea2a606e8d79223"},"company":"格力电器","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(95),"players":"彭 权/徐 强","team_no":"34B"}
{"_id":{"$oid":"5558100beea2a606e8d79224"},"company":"扬州富愉掼蛋俱乐部","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(96),"players":"王义红/金 晨","team_no":"08B"}
{"_id":{"$oid":"5558100beea2a606e8d79225"},"company":"徐州市粮食局","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(97),"players":"孙 新/郭继升","team_no":"05B"}
{"_id":{"$oid":"5558100beea2a606e8d79226"},"company":"徐州市水务局","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(98),"players":"王志刚/张茂生","team_no":"21B"}
{"_id":{"$oid":"5558100beea2a606e8d79227"},"company":"江苏天勤机电设备公司","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(99),"players":"王雪峰/潘建峰","team_no":"39B"}
{"_id":{"$oid":"5558100beea2a606e8d79228"},"company":"新城区城管执法大队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(100),"players":"许 浒/田苏骥","team_no":"04B"}
{"_id":{"$oid":"5558100beea2a606e8d79229"},"company":"江苏雅黛掼蛋俱乐部","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(101),"players":"祝荣根/周柏林","team_no":"14B"}
{"_id":{"$oid":"5558100beea2a606e8d7922a"},"company":"江苏今世缘酒业公司","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(102),"players":"褚福利/陈 亮","team_no":"64B"}
{"_id":{"$oid":"5558100beea2a606e8d7922b"},"company":"徐州市计生委","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(103),"players":"周 峰/周英慧","team_no":"10B"}
{"_id":{"$oid":"5558100beea2a606e8d7922c"},"company":"徐州工商行政管理局","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(104),"players":"陈金彪/张恒桥","team_no":"41B"}
{"_id":{"$oid":"5558100beea2a606e8d7922d"},"company":"江苏中正房地产公司","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(105),"players":"张金武/丁会兵","team_no":"09B"}
{"_id":{"$oid":"5558100beea2a606e8d7922e"},"company":"沂沭泗水利管理局","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(106),"players":"黄耀光/王世祯","team_no":"51B"}
{"_id":{"$oid":"5558100beea2a606e8d7922f"},"company":"市侨办","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(107),"players":"葛 炜/陈茂林","team_no":"35B"}
{"_id":{"$oid":"5558100beea2a606e8d79230"},"company":"淮安市楚淮掼蛋俱乐部","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(108),"players":"杨鑫铭/杨国龙","team_no":"40B"}
{"_id":{"$oid":"5558100beea2a606e8d79231"},"company":"徐州电大","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(109),"players":"吴志丹/魏金森","team_no":"46B"}
{"_id":{"$oid":"5558100beea2a606e8d79232"},"company":"徐州兴隆国际大酒店","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(110),"players":"欧 晶/伏长海","team_no":"11B"}
{"_id":{"$oid":"5558100beea2a606e8d79233"},"company":"徐州大地保险公司","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(111),"players":"徐 庆/宋友亮","team_no":"25B"}
{"_id":{"$oid":"5558100beea2a606e8d79234"},"company":"徐州开元名都大酒店一队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(112),"players":"陈 鹏/石时民","team_no":"13B"}
{"_id":{"$oid":"5558100beea2a606e8d79235"},"company":"徐州市第一中学","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(113),"players":"赵 永/王德刚","team_no":"33B"}
{"_id":{"$oid":"5558100beea2a606e8d79236"},"company":"徐州市卫生局二队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(114),"players":"蒋连峰/杜 雷","team_no":"53B"}
{"_id":{"$oid":"5558100beea2a606e8d79237"},"company":"徐州市体育局","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(115),"players":"王 磊/戴礼军","team_no":"49B"}
{"_id":{"$oid":"5558100beea2a606e8d79238"},"company":"连云港掼蛋俱乐部","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(116),"players":"刘 斌/王华江","team_no":"48B"}
{"_id":{"$oid":"5558100beea2a606e8d79239"},"company":"徐州医学院","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(117),"players":"李汉春/张建忠","team_no":"47B"}
{"_id":{"$oid":"5558100beea2a606e8d7923a"},"company":"卡特彼勒徐州公司二队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(118),"players":"卢 涛/徐培雷","team_no":"54B"}
{"_id":{"$oid":"5558100beea2a606e8d7923b"},"company":"糖葫芦掼蛋俱乐部","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(119),"players":"高锦生/赵 岩","team_no":"27B"}
{"_id":{"$oid":"5558100beea2a606e8d7923c"},"company":"江苏苏铝铝业公司二队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(120),"players":"李海松/王 磊","team_no":"60B"}
{"_id":{"$oid":"5558100beea2a606e8d7923d"},"company":"徐州市城市管理局二队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(121),"players":"单古剑/张成明","team_no":"43B"}
{"_id":{"$oid":"5558100beea2a606e8d7923e"},"company":"红星女子掼蛋队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(122),"players":"殷雪颖(女)/步云云(女)","team_no":"12B"}
{"_id":{"$oid":"5558100beea2a606e8d7923f"},"company":"圣戈班(徐州)管道公司二队","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(123),"players":"王慎君/王银平","team_no":"61B"}
{"_id":{"$oid":"5558100beea2a606e8d79240"},"company":"宿迁市棋牌协会","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(124),"players":"武传智/程晓东","team_no":"56B"}
{"_id":{"$oid":"5558100beea2a606e8d79241"},"company":"徐州质量技术监督局","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(125),"players":"田 可/惠洪德","team_no":"29B"}
{"_id":{"$oid":"5558100beea2a606e8d79242"},"company":"徐州市档案局","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(126),"players":"赵德恩/牛庆峰","team_no":"17B"}
{"_id":{"$oid":"5558100beea2a606e8d79243"},"company":"徐州邮政局","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(127),"players":"王 刚/王厚诚","team_no":"59B"}
{"_id":{"$oid":"5558100beea2a606e8d79244"},"company":"徐州市第三十六中学","game":{"$oid":"55580ffeeea2a606d590bc99"},"no":NumberInt(128),"players":"代苏建/孙奇军","team_no":"06B"}

2
namelist/__init__.py Normal file
View File

@@ -0,0 +1,2 @@
import models
import views

16
namelist/models.py Normal file
View File

@@ -0,0 +1,16 @@
#encoding: utf8
import sys
sys.path.append('..')
from db import db
from game.models import Game
class NameList(db.Document):
game = db.ReferenceField(Game, verbose_name=u'赛事')
no = db.IntField(unique_with='game', verbose_name=u'赛号')
company = db.StringField(verbose_name=u'单位名称')
team_no = db.StringField(verbose_name=u'队伍编号')
players = db.StringField(verbose_name=u'选手')
def __unicode__(self):
return u'赛号:%d 选手:%s 单位:%s' % (self.no, self.players, self.company)

18
namelist/views.py Normal file
View File

@@ -0,0 +1,18 @@
#encoding: utf8
from flask.ext.admin.contrib.mongoengine import ModelView
import sys
sys.path.append('..')
from filters import FilterGame
class NameListAdmin(ModelView):
page_size = 15
column_searchable_list = ['team_no', 'players', 'company']
column_labels = {
'game': u'赛事',
'no': u'赛号',
'company': u'单位名称',
'team_no': u'队伍编号',
'players': u'选手',
}
column_filters = [FilterGame('game', u'赛事')]

7
requirements.txt Normal file
View File

@@ -0,0 +1,7 @@
Flask
Flask-Admin
Flask-BasicAuth
Flask-MongoEngine
Flask-Babel
xlutils
gevent

8
run_server.py Normal file
View File

@@ -0,0 +1,8 @@
activate_this = 'venv/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
from gevent.wsgi import WSGIServer
from main import app
http_server = WSGIServer(('0.0.0.0', 5000), app)
http_server.serve_forever()

19
settings.py Normal file
View File

@@ -0,0 +1,19 @@
# Create dummy secrey key so we can use sessions
SECRET_KEY = '1234567890'
BASIC_AUTH_USERNAME = 'yourname'
BASIC_AUTH_PASSWORD = 'yourpass'
BASIC_AUTH_FORCE = True
"""
DB in remote host
"""
MONGODB_SETTINGS = {'db': "yourdb",
'username': 'username',
'password': 'pass',
'host': 'host',
'port': 27017
}
BABEL_DEFAULT_LOCALE = 'zh_Hans_CN'

View File

@@ -0,0 +1,361 @@
/*
* File: TableTools.css
* Description: Styles for TableTools 2
* Author: Allan Jardine (www.sprymedia.co.uk)
* Language: Javascript
* License: GPL v2 / 3 point BSD
* Project: DataTables
*
* Copyright 2009-2012 Allan Jardine, all rights reserved.
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* CSS name space:
* DTTT DataTables TableTools
*
* Style sheet provides:
* CONTAINER TableTools container element and styles applying to all components
* BUTTON_STYLES Action specific button styles
* SELECTING Row selection styles
* COLLECTIONS Drop down list (collection) styles
* PRINTING Print display styles
*/
/*
* CONTAINER
* TableTools container element and styles applying to all components
*/
div.DTTT_container {
position: relative;
float: right;
margin-bottom: 1em;
}
@media screen and (max-width: 640px) {
div.DTTT_container {
float: none !important;
text-align: center;
}
div.DTTT_container:after {
visibility: hidden;
display: block;
content: "";
clear: both;
height: 0;
}
}
button.DTTT_button,
div.DTTT_button,
a.DTTT_button {
position: relative;
display: inline-block;
margin-right: 3px;
padding: 5px 8px;
border: 1px solid #999;
cursor: pointer;
*cursor: hand;
font-size: 0.88em;
color: black !important;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
-ms-border-radius: 2px;
-o-border-radius: 2px;
border-radius: 2px;
-webkit-box-shadow: 1px 1px 3px #ccc;
-moz-box-shadow: 1px 1px 3px #ccc;
-ms-box-shadow: 1px 1px 3px #ccc;
-o-box-shadow: 1px 1px 3px #ccc;
box-shadow: 1px 1px 3px #ccc;
/* Generated by http://www.colorzilla.com/gradient-editor/ */
background: #ffffff; /* Old browsers */
background: -webkit-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* FF3.6+ */
background: -ms-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* IE10+ */
background: -o-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Opera 11.10+ */
background: linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f9f9f9',GradientType=0 ); /* IE6-9 */
}
/* Buttons are cunning border-box sizing - we can't just use that for A and DIV due to IE6/7 */
button.DTTT_button {
height: 30px;
padding: 3px 8px;
}
.DTTT_button embed {
outline: none;
}
button.DTTT_button:hover:not(.DTTT_disabled),
div.DTTT_button:hover:not(.DTTT_disabled),
a.DTTT_button:hover:not(.DTTT_disabled) {
border: 1px solid #666;
text-decoration: none !important;
-webkit-box-shadow: 1px 1px 3px #999;
-moz-box-shadow: 1px 1px 3px #999;
-ms-box-shadow: 1px 1px 3px #999;
-o-box-shadow: 1px 1px 3px #999;
box-shadow: 1px 1px 3px #999;
background: #f3f3f3; /* Old browsers */
background: -webkit-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* FF3.6+ */
background: -ms-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* IE10+ */
background: -o-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* Opera 11.10+ */
background: linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f3f3f3', endColorstr='#f4f4f4',GradientType=0 ); /* IE6-9 */
}
button.DTTT_button:focus,
div.DTTT_button:focus,
a.DTTT_button:focus {
border: 1px solid #426c9e;
text-shadow: 0 1px 0 #c4def1;
outline: none;
background-color: #a3d0ef 100%;
background-image: -webkit-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);
background-image: -moz-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);
background-image: -ms-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);
background-image: -o-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);
background-image: linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#a3d0ef', EndColorStr='#a3d0ef');
}
button.DTTT_button:active:not(.DTTT_disabled),
div.DTTT_button:active:not(.DTTT_disabled),
a.DTTT_button:active:not(.DTTT_disabled) {
-webkit-box-shadow: inset 1px 1px 3px #999999;
-moz-box-shadow: inset 1px 1px 3px #999999;
box-shadow: inset 1px 1px 3px #999999;
}
button.DTTT_disabled,
div.DTTT_disabled,
a.DTTT_disabled {
color: #999 !important;
border: 1px solid #d0d0d0;
cursor: default;
background: #ffffff; /* Old browsers */
background: -webkit-linear-gradient(top, #ffffff 0%,#f9f9f9 89%,#fafafa 100%); /* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient(top, #ffffff 0%,#f9f9f9 89%,#fafafa 100%); /* FF3.6+ */
background: -ms-linear-gradient(top, #ffffff 0%,#f9f9f9 89%,#fafafa 100%); /* IE10+ */
background: -o-linear-gradient(top, #ffffff 0%,#f9f9f9 89%,#fafafa 100%); /* Opera 11.10+ */
background: linear-gradient(top, #ffffff 0%,#f9f9f9 89%,#fafafa 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#fafafa',GradientType=0 ); /* IE6-9 */
}
/*
* BUTTON_STYLES
* Action specific button styles
* If you want images - comment this back in
a.DTTT_button_csv,
a.DTTT_button_xls,
a.DTTT_button_copy,
a.DTTT_button_pdf,
a.DTTT_button_print {
padding-right: 0px;
}
a.DTTT_button_csv span,
a.DTTT_button_xls span,
a.DTTT_button_copy span,
a.DTTT_button_pdf span,
a.DTTT_button_print span {
display: inline-block;
height: 24px;
line-height: 24px;
padding-right: 30px;
}
a.DTTT_button_csv span { background: url(../images/csv.png) no-repeat bottom right; }
a.DTTT_button_csv:hover span { background: url(../images/csv_hover.png) no-repeat center right; }
a.DTTT_button_xls span { background: url(../images/xls.png) no-repeat center right; }
a.DTTT_button_xls:hover span { background: #f0f0f0 url(../images/xls_hover.png) no-repeat center right; }
a.DTTT_button_copy span { background: url(../images/copy.png) no-repeat center right; }
a.DTTT_button_copy:hover span { background: #f0f0f0 url(../images/copy_hover.png) no-repeat center right; }
a.DTTT_button_pdf span { background: url(../images/pdf.png) no-repeat center right; }
a.DTTT_button_pdf:hover span { background: #f0f0f0 url(../images/pdf_hover.png) no-repeat center right; }
a.DTTT_button_print span { background: url(../images/print.png) no-repeat center right; }
a.DTTT_button_print:hover span { background: #f0f0f0 url(../images/print_hover.png) no-repeat center right; }
*/
button.DTTT_button_collection span {
padding-right: 17px;
background: url(../images/collection.png) no-repeat center right;
}
button.DTTT_button_collection:hover span {
padding-right: 17px;
background: #f0f0f0 url(../images/collection_hover.png) no-repeat center right;
}
/*
* SELECTING
* Row selection styles
*/
table.DTTT_selectable tbody tr {
cursor: pointer;
*cursor: hand;
}
table.dataTable tr.DTTT_selected.odd {
background-color: #9FAFD1;
}
table.dataTable tr.DTTT_selected.odd td.sorting_1 {
background-color: #9FAFD1;
}
table.dataTable tr.DTTT_selected.odd td.sorting_2 {
background-color: #9FAFD1;
}
table.dataTable tr.DTTT_selected.odd td.sorting_3 {
background-color: #9FAFD1;
}
table.dataTable tr.DTTT_selected.even {
background-color: #B0BED9;
}
table.dataTable tr.DTTT_selected.even td.sorting_1 {
background-color: #B0BED9;
}
table.dataTable tr.DTTT_selected.even td.sorting_2 {
background-color: #B0BED9;
}
table.dataTable tr.DTTT_selected.even td.sorting_3 {
background-color: #B0BED9;
}
/*
* COLLECTIONS
* Drop down list (collection) styles
*/
div.DTTT_collection {
width: 150px;
padding: 8px 8px 4px 8px;
border: 1px solid #ccc;
border: 1px solid rgba( 0, 0, 0, 0.4 );
background-color: #f3f3f3;
background-color: rgba( 255, 255, 255, 0.3 );
overflow: hidden;
z-index: 2002;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
-ms-border-radius: 5px;
-o-border-radius: 5px;
border-radius: 5px;
-webkit-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
-moz-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
-ms-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
-o-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
}
div.DTTT_collection_background {
background: black;
z-index: 2001;
}
div.DTTT_collection button.DTTT_button,
div.DTTT_collection div.DTTT_button,
div.DTTT_collection a.DTTT_button {
position: relative;
left: 0;
right: 0;
display: block;
float: none;
margin-bottom: 4px;
-webkit-box-shadow: 1px 1px 3px #999;
-moz-box-shadow: 1px 1px 3px #999;
-ms-box-shadow: 1px 1px 3px #999;
-o-box-shadow: 1px 1px 3px #999;
box-shadow: 1px 1px 3px #999;
}
/*
* PRINTING
* Print display styles
*/
.DTTT_print_info {
position: fixed;
top: 50%;
left: 50%;
width: 400px;
height: 150px;
margin-left: -200px;
margin-top: -75px;
text-align: center;
color: #333;
padding: 10px 30px;
background: #ffffff; /* Old browsers */
background: -webkit-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* FF3.6+ */
background: -ms-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* IE10+ */
background: -o-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Opera 11.10+ */
background: linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f9f9f9',GradientType=0 ); /* IE6-9 */
opacity: 0.95;
border: 1px solid black;
border: 1px solid rgba(0, 0, 0, 0.5);
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
-ms-border-radius: 6px;
-o-border-radius: 6px;
border-radius: 6px;
-webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
-moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
-ms-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
-o-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
}
.DTTT_print_info h6 {
font-weight: normal;
font-size: 28px;
line-height: 28px;
margin: 1em;
}
.DTTT_print_info p {
font-size: 14px;
line-height: 20px;
}

View File

@@ -0,0 +1,455 @@
/*
* Table styles
*/
table.dataTable {
width: 100%;
margin: 0 auto;
clear: both;
border-collapse: separate;
border-spacing: 0;
/*
* Header and footer styles
*/
/*
* Body styles
*/
}
table.dataTable thead th,
table.dataTable tfoot th {
font-weight: bold;
}
table.dataTable thead th,
table.dataTable thead td {
padding: 10px 18px;
border-bottom: 1px solid #111;
}
table.dataTable thead th:active,
table.dataTable thead td:active {
outline: none;
}
table.dataTable tfoot th,
table.dataTable tfoot td {
padding: 10px 18px 6px 18px;
border-top: 1px solid #111;
}
table.dataTable thead .sorting,
table.dataTable thead .sorting_asc,
table.dataTable thead .sorting_desc {
cursor: pointer;
*cursor: hand;
}
table.dataTable thead .sorting,
table.dataTable thead .sorting_asc,
table.dataTable thead .sorting_desc,
table.dataTable thead .sorting_asc_disabled,
table.dataTable thead .sorting_desc_disabled {
background-repeat: no-repeat;
background-position: center right;
}
table.dataTable thead .sorting {
background-image: url("../images/sort_both.png");
}
table.dataTable thead .sorting_asc {
background-image: url("../images/sort_asc.png");
}
table.dataTable thead .sorting_desc {
background-image: url("../images/sort_desc.png");
}
table.dataTable thead .sorting_asc_disabled {
background-image: url("../images/sort_asc_disabled.png");
}
table.dataTable thead .sorting_desc_disabled {
background-image: url("../images/sort_desc_disabled.png");
}
table.dataTable tbody tr {
background-color: #ffffff;
}
table.dataTable tbody tr.selected {
background-color: #B0BED9;
}
table.dataTable tbody th,
table.dataTable tbody td {
padding: 8px 10px;
}
table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
border-top: 1px solid #ddd;
}
table.dataTable.row-border tbody tr:first-child th,
table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
table.dataTable.display tbody tr:first-child td {
border-top: none;
}
table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
border-top: 1px solid #ddd;
border-right: 1px solid #ddd;
}
table.dataTable.cell-border tbody tr th:first-child,
table.dataTable.cell-border tbody tr td:first-child {
border-left: 1px solid #ddd;
}
table.dataTable.cell-border tbody tr:first-child th,
table.dataTable.cell-border tbody tr:first-child td {
border-top: none;
}
table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
background-color: #f9f9f9;
}
table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
background-color: #abb9d3;
}
table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover {
background-color: whitesmoke;
}
table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected {
background-color: #a9b7d1;
}
table.dataTable.order-column tbody tr > .sorting_1,
table.dataTable.order-column tbody tr > .sorting_2,
table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
table.dataTable.display tbody tr > .sorting_2,
table.dataTable.display tbody tr > .sorting_3 {
background-color: #f9f9f9;
}
table.dataTable.order-column tbody tr.selected > .sorting_1,
table.dataTable.order-column tbody tr.selected > .sorting_2,
table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,
table.dataTable.display tbody tr.selected > .sorting_2,
table.dataTable.display tbody tr.selected > .sorting_3 {
background-color: #acbad4;
}
table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
background-color: #f1f1f1;
}
table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
background-color: #f3f3f3;
}
table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
background-color: whitesmoke;
}
table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
background-color: #a6b3cd;
}
table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
background-color: #a7b5ce;
}
table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
background-color: #a9b6d0;
}
table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
background-color: #f9f9f9;
}
table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
background-color: #fbfbfb;
}
table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
background-color: #fdfdfd;
}
table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
background-color: #acbad4;
}
table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
background-color: #adbbd6;
}
table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {
background-color: #afbdd8;
}
table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 {
background-color: #eaeaea;
}
table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 {
background-color: #ebebeb;
}
table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 {
background-color: #eeeeee;
}
table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 {
background-color: #a1aec7;
}
table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 {
background-color: #a2afc8;
}
table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 {
background-color: #a4b2cb;
}
table.dataTable.no-footer {
border-bottom: 1px solid #111;
}
table.dataTable.nowrap th, table.dataTable.nowrap td {
white-space: nowrap;
}
table.dataTable.compact thead th,
table.dataTable.compact thead td {
padding: 4px 17px 4px 4px;
}
table.dataTable.compact tfoot th,
table.dataTable.compact tfoot td {
padding: 4px;
}
table.dataTable.compact tbody th,
table.dataTable.compact tbody td {
padding: 4px;
}
table.dataTable th.dt-left,
table.dataTable td.dt-left {
text-align: left;
}
table.dataTable th.dt-center,
table.dataTable td.dt-center,
table.dataTable td.dataTables_empty {
text-align: center;
}
table.dataTable th.dt-right,
table.dataTable td.dt-right {
text-align: right;
}
table.dataTable th.dt-justify,
table.dataTable td.dt-justify {
text-align: justify;
}
table.dataTable th.dt-nowrap,
table.dataTable td.dt-nowrap {
white-space: nowrap;
}
table.dataTable thead th.dt-head-left,
table.dataTable thead td.dt-head-left,
table.dataTable tfoot th.dt-head-left,
table.dataTable tfoot td.dt-head-left {
text-align: left;
}
table.dataTable thead th.dt-head-center,
table.dataTable thead td.dt-head-center,
table.dataTable tfoot th.dt-head-center,
table.dataTable tfoot td.dt-head-center {
text-align: center;
}
table.dataTable thead th.dt-head-right,
table.dataTable thead td.dt-head-right,
table.dataTable tfoot th.dt-head-right,
table.dataTable tfoot td.dt-head-right {
text-align: right;
}
table.dataTable thead th.dt-head-justify,
table.dataTable thead td.dt-head-justify,
table.dataTable tfoot th.dt-head-justify,
table.dataTable tfoot td.dt-head-justify {
text-align: justify;
}
table.dataTable thead th.dt-head-nowrap,
table.dataTable thead td.dt-head-nowrap,
table.dataTable tfoot th.dt-head-nowrap,
table.dataTable tfoot td.dt-head-nowrap {
white-space: nowrap;
}
table.dataTable tbody th.dt-body-left,
table.dataTable tbody td.dt-body-left {
text-align: left;
}
table.dataTable tbody th.dt-body-center,
table.dataTable tbody td.dt-body-center {
text-align: center;
}
table.dataTable tbody th.dt-body-right,
table.dataTable tbody td.dt-body-right {
text-align: right;
}
table.dataTable tbody th.dt-body-justify,
table.dataTable tbody td.dt-body-justify {
text-align: justify;
}
table.dataTable tbody th.dt-body-nowrap,
table.dataTable tbody td.dt-body-nowrap {
white-space: nowrap;
}
table.dataTable,
table.dataTable th,
table.dataTable td {
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
}
/*
* Control feature layout
*/
.dataTables_wrapper {
position: relative;
clear: both;
*zoom: 1;
zoom: 1;
}
.dataTables_wrapper .dataTables_length {
float: left;
}
.dataTables_wrapper .dataTables_filter {
float: right;
text-align: right;
}
.dataTables_wrapper .dataTables_filter input {
margin-left: 0.5em;
}
.dataTables_wrapper .dataTables_info {
clear: both;
float: left;
padding-top: 0.755em;
}
.dataTables_wrapper .dataTables_paginate {
float: right;
text-align: right;
padding-top: 0.25em;
}
.dataTables_wrapper .dataTables_paginate .paginate_button {
box-sizing: border-box;
display: inline-block;
min-width: 1.5em;
padding: 0.5em 1em;
margin-left: 2px;
text-align: center;
text-decoration: none !important;
cursor: pointer;
*cursor: hand;
color: #333 !important;
border: 1px solid transparent;
}
.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
color: #333 !important;
border: 1px solid #cacaca;
background-color: white;
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc));
/* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, white 0%, #dcdcdc 100%);
/* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient(top, white 0%, #dcdcdc 100%);
/* FF3.6+ */
background: -ms-linear-gradient(top, white 0%, #dcdcdc 100%);
/* IE10+ */
background: -o-linear-gradient(top, white 0%, #dcdcdc 100%);
/* Opera 11.10+ */
background: linear-gradient(to bottom, white 0%, #dcdcdc 100%);
/* W3C */
}
.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active {
cursor: default;
color: #666 !important;
border: 1px solid transparent;
background: transparent;
box-shadow: none;
}
.dataTables_wrapper .dataTables_paginate .paginate_button:hover {
color: white !important;
border: 1px solid #111;
background-color: #585858;
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));
/* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, #585858 0%, #111 100%);
/* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient(top, #585858 0%, #111 100%);
/* FF3.6+ */
background: -ms-linear-gradient(top, #585858 0%, #111 100%);
/* IE10+ */
background: -o-linear-gradient(top, #585858 0%, #111 100%);
/* Opera 11.10+ */
background: linear-gradient(to bottom, #585858 0%, #111 100%);
/* W3C */
}
.dataTables_wrapper .dataTables_paginate .paginate_button:active {
outline: none;
background-color: #2b2b2b;
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));
/* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
/* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
/* FF3.6+ */
background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
/* IE10+ */
background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
/* Opera 11.10+ */
background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);
/* W3C */
box-shadow: inset 0 0 3px #111;
}
.dataTables_wrapper .dataTables_paginate .ellipsis {
padding: 0 1em;
}
.dataTables_wrapper .dataTables_processing {
position: absolute;
top: 50%;
left: 50%;
width: 100%;
height: 40px;
margin-left: -50%;
margin-top: -25px;
padding-top: 20px;
text-align: center;
font-size: 1.2em;
background-color: white;
background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
/* Chrome,Safari4+ */
background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
/* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
/* FF3.6+ */
background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
/* IE10+ */
background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
/* Opera 11.10+ */
background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
/* W3C */
}
.dataTables_wrapper .dataTables_length,
.dataTables_wrapper .dataTables_filter,
.dataTables_wrapper .dataTables_info,
.dataTables_wrapper .dataTables_processing,
.dataTables_wrapper .dataTables_paginate {
color: #333;
}
.dataTables_wrapper .dataTables_scroll {
clear: both;
}
.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody {
*margin-top: -1px;
-webkit-overflow-scrolling: touch;
}
.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th > div.dataTables_sizing,
.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td > div.dataTables_sizing {
height: 0;
overflow: hidden;
margin: 0 !important;
padding: 0 !important;
}
.dataTables_wrapper.no-footer .dataTables_scrollBody {
border-bottom: 1px solid #111;
}
.dataTables_wrapper.no-footer div.dataTables_scrollHead table,
.dataTables_wrapper.no-footer div.dataTables_scrollBody table {
border-bottom: none;
}
.dataTables_wrapper:after {
visibility: hidden;
display: block;
content: "";
clear: both;
height: 0;
}
@media screen and (max-width: 767px) {
.dataTables_wrapper .dataTables_info,
.dataTables_wrapper .dataTables_paginate {
float: none;
text-align: center;
}
.dataTables_wrapper .dataTables_paginate {
margin-top: 0.5em;
}
}
@media screen and (max-width: 640px) {
.dataTables_wrapper .dataTables_length,
.dataTables_wrapper .dataTables_filter {
float: none;
text-align: center;
}
.dataTables_wrapper .dataTables_filter {
margin-top: 0.5em;
}
}

File diff suppressed because it is too large Load Diff

14951
static/js/jquery.dataTables.js vendored Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

83
templates/admin/base.html Normal file
View File

@@ -0,0 +1,83 @@
{% import 'admin/layout.html' as layout with context -%}
{% import 'admin/static.html' as admin_static with context %}
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}{% if admin_view.category %}{{ admin_view.category }} - {% endif %}{{ admin_view.name }} - {{ admin_view.admin.name }}{% endblock %}</title>
{% block head_meta %}
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
{% endblock %}
{% block head_css %}
<link href="{{ admin_static.url(filename='bootstrap/bootstrap3/css/bootstrap.min.css') }}" rel="stylesheet">
<link href="{{ admin_static.url(filename='bootstrap/bootstrap3/css/bootstrap-theme.min.css') }}" rel="stylesheet">
<link href="{{ admin_static.url(filename='admin/css/bootstrap3/admin.css') }}" rel="stylesheet">
<style>
body {
padding-top: 4px;
}
</style>
{% endblock %}
{% block head %}
{% endblock %}
{% block head_tail %}
{% endblock %}
</head>
<body>
{% block page_body %}
<div class="container-fluid">
<nav class="navbar navbar-default" role="navigation">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#admin-navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
{% block brand %}
<a class="navbar-brand" href="#">{{ admin_view.admin.name }}</a>
{% endblock %}
</div>
<!-- navbar content -->
<div class="collapse navbar-collapse" id="admin-navbar-collapse">
{% block main_menu %}
<ul class="nav navbar-nav">
{{ layout.menu() }}
</ul>
{% endblock %}
{% block menu_links %}
<ul class="nav navbar-right">
{{ layout.menu_links() }}
</ul>
{% endblock %}
{% block access_control %}
{% endblock %}
</div>
</nav>
{% block messages %}
{{ layout.messages() }}
{% endblock %}
{% set render_ctx = h.resolve_ctx() %}
{% block body %}{% endblock %}
</div>
{% endblock %}
{% block tail_js %}
<script src="{{ admin_static.url(filename='vendor/jquery-2.1.1.min.js') }}" type="text/javascript"></script>
<script src="{{ admin_static.url(filename='bootstrap/bootstrap3/js/bootstrap.min.js') }}" type="text/javascript"></script>
<script src="{{ admin_static.url(filename='vendor/moment-2.8.4.min.js') }}" type="text/javascript"></script>
<script src="{{ admin_static.url(filename='vendor/select2/select2.min.js') }}" type="text/javascript"></script>
{% endblock %}
{% block tail %}
{% endblock %}
</body>
</html>

View File

@@ -0,0 +1,66 @@
{% extends 'admin/master.html' %}
{% block body %}
<!-- Main jumbotron for a primary marketing message or call to action -->
<div class="jumbotron">
<div class="container">
<h1>简介</h1>
<p>
掼蛋比赛的管理与组织软件是基于web平台设计的。对于徐州市牌协过去掼蛋比赛都要人工抽签评分参赛单位人员较多经常出现细节错误的问题提出用软件实现对阵抽签每轮得分录入以及每轮排名直至最后决出冠军。在此过程中可自动生成所需表单。软件的特点是界面操作简单易学易用实用性强应用范围针对性强提升工作效率。
</p>
<p>
<a class="btn btn-primary btn-lg" href="#" role="button">Learn more &raquo;</a>
</p>
</div>
</div>
<div class="container">
<!-- Example row of columns -->
<div class="row">
<div class="col-md-6">
<h2>抽签原则</h2>
<p>
抽签按照两种规则供用户选择,随机抽签或是顺序抽签。
<ol>
<li>首次即第一轮抽签根据基本信息抽签并生成桌号(比赛位置);</li>
<li>第二轮为方便操作,按相邻两桌,赢者对赢者,输者对输者对阵;</li>
<li>从第三轮开始,大分(见评分规则)相同者对阵,如大分相同者为奇数对时,级差最后一名和大分低一级中级差最高的对阵;</li>
<li>对阵过的选手不再对阵(最后一轮除外)。</li>
<li>抽签回避原则隶属于同一公司的队伍不能对阵除争前三名如队伍编号01A与01B不能在比赛中相遇 。</li>
</ol>
</p>
<p>
<a class="btn btn-default" href="#" role="button">View details &raquo;</a>
</p>
</div>
<div class="col-md-6">
<h2>评分规则</h2>
<p>
评分规则如下(此次均采用赛号说明):
<ol>
<li>
采用积分制。胜2分负0分弃权-1分。每轮比赛得分相加的和称为“大分”。例如赛号为02的队伍第一轮胜2分第二轮胜2分第三轮负0分则三轮比赛后02队大分为2+2+0=4分。
</li>
<li>
另用级差统计级差分数从2A共计13个级差。弃权级差为6。例如01号与02号对阵01号选手打到A02号选手打到10,则01号级差为13-10=302号则为-3。
</li>
<li>
将对阵过的所有对手的大分之和记为“小分”。例如01队三轮对手分别是02、03、04所得“大分”分别为2、2、002队在这三轮比赛中得“大分”分别为0、2、003队分别得0、2、204队分别得2、2、2则A的“大分”为2+2+0=4“小分”为0+2+0+0+2+2+2+2+2=12。
</li>
<li>弃权只计入大分,不计入小分。</li>
<li>评分标准先比较大分,再比较小分,最后比较级差。</li>
<li>团体分算法0X类算一个团体分。</li>
</ol>
</p>
<p>
<a class="btn btn-default" href="#" role="button">View details &raquo;</a>
</p>
</div>
</div>
<hr>
<footer>
<p>&copy; 中国矿业大学 2015</p>
</footer>
</div>
{%endblock%}

54
templates/ballot.html Normal file
View File

@@ -0,0 +1,54 @@
{% extends 'admin/master.html' %}
{% block body %}
<div class="row">
<div class="col-md-2">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">抽签方式</h3>
</div>
<div class="panel-body">
<form method="POST">
{% for field in form %}
<div class="form-group">
<label for="{{ field.id }}">{{ field.label.text }}</label>
{{field(class_="form-control")}}
</div>
{% endfor %}
<button type="submit" class="btn btn-success btn-block">抽签</button>
</form>
</div>
</div>
</div>
<div class="col-md-10">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">抽签结果</h3>
</div>
<div class="panel-body">
{%if round%}<h5>已赛轮次:{{round - 1}}</h5 >{%endif%}
<table class="table table-bordered">
<thead>
<tr>
<th>轮次</th>
<th>桌号</th>
<th>红方</th>
<th>蓝方</th>
</tr>
</thead>
<tbody>
{%for result in ballot_results%}
<tr>
<td>{{round}}</td>
<td>{{result['desk_no']}}</td>
<td>{{result['red']}}</td>
<td>{{result['blue']}}</td>
</tr>
{%endfor%}
</tbody>
</table>
</div>
</div>
</div>
</div>
{% endblock %}

94
templates/rank.html Normal file
View File

@@ -0,0 +1,94 @@
{% extends 'admin/master.html' %}
{% block head_css %}
{{ super() }}
<link rel="stylesheet" href="/static/css/jquery.dataTables.css">
<link rel="stylesheet" href="/static/css/dataTables.tableTools.css">
{% endblock %}
{% block body %}
<div class="row">
<div class="col-md-2">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">排名方式</h3>
</div>
<div class="panel-body">
<form method="POST">
{% for field in form %}
<div class="form-group">
<label for="{{ field.id }}">{{ field.label.text }}</label>
{{field(class_="form-control")}}
</div>
{% endfor %}
</form>
<button type="submit" class="btn btn-success btn-block" onclick="rank()">查看排名</button>
</div>
</div>
</div>
<div class="col-md-10">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">排名结果</h3>
</div>
<div class="panel-body">
<table id="example" class="display" cellspacing="0" width="100%">
<thead>
<tr>
<th>排名</th>
<th>队伍/单位</th>
<th>总大分</th>
<th>总小分</th>
<th>总级差</th>
</tr>
</thead>
</table>
</div>
</div>
</div>
</div>
{% endblock %}
{% block tail_js %}
{{ super() }}
<script src="/static/js/jquery.dataTables.js"></script>
<script src="/static/js/dataTables.tableTools.js"></script>
<script>
function createDataTable(url){
$('#example').dataTable({
"destroy": true,
"dom": 'T<"clear">lfrtip',
"tableTools": {
"sSwfPath": "/static/swf/copy_csv_xls_pdf.swf"
},
"ajax": {
"url": url,
"dataSrc": ""
},
"columns": [
{ "data": "rank" },
{ "data": "rank_type" },
{ "data": "total_score" },
{ "data": "total_sscore" },
{ "data": "total_diff" },
]
});
};
function rank()
{
var game = $('#game').val();
var rank_type = $('#rank_type').val();
var url;
if(rank_type == 'team')
{
url = "{{url_for('.team_rank_ajax')}}";
}
else
{
url = "{{url_for('.company_rank_ajax')}}";
}
url += "?game="+game;
createDataTable(url);
}
</script>
{% endblock %}

56
tools/exportall.py Normal file
View File

@@ -0,0 +1,56 @@
# -*- coding: utf-8 -*-
import tkFileDialog
import xlwt
from format import NLIST
ROW_HEIGHT = 500
def export_all_info(game):
filename = tkFileDialog.asksaveasfilename(initialdir = './', defaultextension='.xls', initialfile='比赛汇总' )
wbk = xlwt.Workbook(encoding='utf-8')
sheet = wbk.add_sheet('比赛汇总')
#设定字体和边框
style = xlwt.easyxf('font: height 250;'
'alignment: horz center, vert center;'
'borders: left thin, right thin, top thin, bottom thin;')
#设定列宽
sheet.col(0).width = 2000
sheet.col(1).width = 2000
sheet.col(2).width = 3333
sheet.col(3).width = 3333
sheet.col(4).width = 8888
sheet.col(5).width = 2222
sheet.row(0).height = ROW_HEIGHT
for index, item in enumerate(NLIST):
sheet.write(0, index, item , style)
stageno = game.get_stageno()
for i in range(stageno):
sheet.write(0, len(NLIST) + i*3, '%d轮对手' % (i+1) ,style)
sheet.write(0, len(NLIST) + i*3 + 1, '%d轮积分' % (i+1) ,style)
sheet.write(0, len(NLIST) + i*3 + 2, '%d轮级差' % (i+1) ,style)
sheet.write(0, len(NLIST) + stageno*3, '总大分' ,style)
sheet.write(0, len(NLIST) + stageno*3 + 1, '总小分',style)
sheet.write(0, len(NLIST) + stageno*3 + 2, '总级差',style)
for i, t in enumerate(game.get_teams_order_by_no()):
sheet.write(i + 1, 0, t.get_no() , style)
sheet.write(i + 1, 1, t.get_tid() , style)
sheet.write(i + 1, 2, t.get_p1() , style)
sheet.write(i + 1, 3, t.get_p2() , style)
sheet.write(i + 1, 4, t.get_cname() , style)
for j in range(stageno):
r = t.get_record(j)
a = t.get_against(j)
sheet.write(i + 1, j*3 + 5, a.get_no(),style)
sheet.write(i + 1, j*3 + 6, r.get_score(),style)
sheet.write(i + 1, j*3 + 7, r.get_diff() ,style)
sheet.write(i + 1, len(NLIST) + stageno*3, t.get_total_score() ,style)
sheet.write(i + 1, len(NLIST) + stageno*3 + 1, t.get_total_sscore() ,style)
sheet.write(i + 1, len(NLIST) + stageno*3 + 2, t.get_total_diff() ,style)
wbk.save(filename)
return filename

48
tools/exportbr.py Normal file
View File

@@ -0,0 +1,48 @@
# -*- coding: utf-8 -*-
import tkFileDialog
import xlwt
ROW_HEIGHT = 500
def export_ballot_result(game):
filename = tkFileDialog.asksaveasfilename(initialdir = './', defaultextension='.xls',
initialfile='%s轮抽签结果' % (game.get_stageno()+1))
wbk = xlwt.Workbook(encoding='utf-8')
sheet = wbk.add_sheet('sheet 1')
#设定字体和边框
style = xlwt.easyxf('font: height 250;'
'alignment: horz center, vert center;'
'borders: left thin, right thin, top thin, bottom thin;')
#设定列宽
sheet.col(0).width = 2000
sheet.col(1).width = 2000
sheet.col(2).width = 3333
sheet.col(3).width = 3333
sheet.col(4).width = 8888
sheet.col(5).width = 2222
sheet.row(0).height = ROW_HEIGHT
sheet.write(0,0,'桌号', style)
sheet.write(0,1,'赛号', style)
sheet.write(0,2,'选手一', style)
sheet.write(0,3,'选手二', style)
sheet.write(0,4,'单位', style)
sheet.write(0,5,'总得分', style)
for i, desk in enumerate(game.get_ballot_result()):
sheet.row(i*2+1).height = ROW_HEIGHT
sheet.row(i*2+2).height = ROW_HEIGHT
sheet.write_merge(i*2+1, i*2+2, 0, 0, str(desk.get_did()), style)
for j, team in enumerate(desk.get_teams()):
sheet.write(i*2+1+j, 1, team.get_no(), style)
sheet.write(i*2+1+j, 2, team.get_p1(), style)
sheet.write(i*2+1+j, 3, team.get_p2(), style)
sheet.write(i*2+1+j, 4, team.get_cname(), style)
sheet.write(i*2+1+j, 5, team.get_total_score(), style)
wbk.save(filename)
return filename

23
tools/exportgr.py Normal file
View File

@@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
from Tkinter import *
import tkFileDialog
import xlwt
def export_group_rank(game):
filename = tkFileDialog.asksaveasfilename(initialdir = './', defaultextension='.xls', initialfile='团体排名')
wbk = xlwt.Workbook(encoding='utf-8')
sheet = wbk.add_sheet('团体排名')
header = ['排名', '单位编号', '单位名称', '总大分', '总小分', '总级差']
for index, item in enumerate(header):
sheet.write(0, index, header[index])
companys = game.company_rank()
for index, item in enumerate(companys):
sheet.write(index+1, 0, index+1)
sheet.write(index+1, 1, item.get_scname())
sheet.write(index+1, 2, item.get_cname())
sheet.write(index+1, 3, item.get_total_score())
sheet.write(index+1, 4, item.get_total_sscore())
sheet.write(index+1, 5, item.get_total_diff())
wbk.save(filename)
return filename

78
tools/exportrr.py Normal file
View File

@@ -0,0 +1,78 @@
# -*- coding: utf-8 -*-
from Tkinter import *
import tkFileDialog
import xlwt
ROW_HEIGHT = 500
def export_round_record(game):
filename = tkFileDialog.asksaveasfilename(initialdir = './', defaultextension='.xls', initialfile='%d轮比赛记录表' % (game.get_stageno() + 1))
wbk = xlwt.Workbook(encoding='utf-8')
sheet = wbk.add_sheet('扑克牌掼蛋比赛记分表')
sheet.set_row_default_height(ROW_HEIGHT)
#设定列宽
sheet.col(0).width = 1111 #赛号
sheet.col(1).width = 3333 #姓名
sheet.col(2).width = 3333 #单位
sheet.col(19).width = 1111 #级差
for i in range(16):
sheet.col(i+3).width = 999
#设定字体
al = xlwt.Alignment()
al.horz = xlwt.Alignment.HORZ_CENTER
al.vert = xlwt.Alignment.VERT_CENTER
font = xlwt.Font()
font.bold = True
font.height = 300
borders = xlwt.Borders() # Create Borders
borders.left = xlwt.Borders.THIN# May be: NO_LINE, THIN, MEDIUM, DASHED, DOTTED, THICK, DOUBLE, HAIR, MEDIUM_DASHED, THIN_DASH_DOTTED, MEDIUM_DASH_DOTTED, THIN_DASH_DOT_DOTTED, MEDIUM_DASH_DOT_DOTTED, SLANTED_MEDIUM_DASH_DOTTED, or 0x00 through 0x0D.
borders.right = xlwt.Borders.THIN
borders.top = xlwt.Borders.THIN
borders.bottom = xlwt.Borders.THIN
title_style = xlwt.XFStyle()
title_style.font = font
title_style.alignment = al
border_style = xlwt.XFStyle()
border_style.borders = borders
#写入内容
rows_every_desk = 10
for i, desk in enumerate(game.get_ballot_result()):
for no in range(10):
sheet.row(i*10+no).height = ROW_HEIGHT
#第一行标题
sheet.write_merge(rows_every_desk*i, rows_every_desk*i, 0, 19, game.config.get_title(), title_style)
#第二行
sheet.write(rows_every_desk*i + 1, 1, '%d' % (game.get_stageno() + 1))
sheet.write_merge(rows_every_desk*i + 1, rows_every_desk*i + 1, 3, 5, '时间:')
sheet.write_merge(rows_every_desk*i + 1, rows_every_desk*i + 1, 6, 13, game.config.get_time())
sheet.write_merge(rows_every_desk*i + 1, rows_every_desk*i + 1, 14, 15, '桌号')
sheet.write_merge(rows_every_desk*i + 1, rows_every_desk*i + 1, 16, 18, '%d' % desk.get_did())
#第三行
sheet.write(rows_every_desk*i + 2, 0, '赛号', border_style)
sheet.write(rows_every_desk*i + 2, 1, '姓名', border_style)
sheet.write(rows_every_desk*i + 2, 2, '单位', border_style)
for num in range(16):
sheet.write(rows_every_desk*i + 2, num + 3, str(num +1), border_style)
sheet.write(rows_every_desk*i + 2, 19, '级差', border_style)
#第四-七行
for j, team in enumerate(desk.get_teams()):
sheet.write_merge(rows_every_desk*i + j*2 + 3, rows_every_desk*i + j*2 + 4, 0, 0, team.get_no(), border_style)
sheet.write_merge(rows_every_desk*i + j*2 + 3, rows_every_desk*i + j*2 + 4, 1, 1, team.get_p1()+'/'+team.get_p2(), border_style)
sheet.write_merge(rows_every_desk*i + j*2 + 3, rows_every_desk*i + j*2 + 4, 2, 2, team.get_cname(), border_style)
for x in range(3, 20):
sheet.write(rows_every_desk*i + j*2 + 3, x, '', border_style)
sheet.write(rows_every_desk*i + j*2 + 4, x, '', border_style)
#第八行
sheet.write_merge(rows_every_desk*i + 7, rows_every_desk*i + 7, 0, 1, '胜方签字:')
sheet.write_merge(rows_every_desk*i + 7, rows_every_desk*i + 7, 6, 8, '负方签字:')
sheet.write_merge(rows_every_desk*i + 7, rows_every_desk*i + 7, 9, 11, '')
sheet.write_merge(rows_every_desk*i + 7, rows_every_desk*i + 7, 12, 16, '裁判员:')
sheet.write_merge(rows_every_desk*i + 7, rows_every_desk*i + 7, 17, 18, '胜方画圈')
#第九行
sheet.write_merge(rows_every_desk*i + 8, rows_every_desk*i + 8, 0, 1, '违例警告说明:')
wbk.save(filename)
return filename

28
tools/exporttr.py Normal file
View File

@@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
from Tkinter import *
import tkFileDialog
import xlwt
def export_team_rank(game):
if game is None:
game.st.insert(END, '请先导入文件.\n')
return
filename = tkFileDialog.asksaveasfilename(initialdir = './', defaultextension='.xls', initialfile='队伍排名')
wbk = xlwt.Workbook(encoding='utf-8')
sheet = wbk.add_sheet('队伍排名')
header = ['排名', '赛号', '选手一', '选手二', '单位', '总大分', '总小分', '总级差']
for index, item in enumerate(header):
sheet.write(0, index, header[index])
teams = game.team_rank()
for i, t in enumerate(teams):
sheet.write(i+1, 0, i+1)
sheet.write(i+1, 1, t.get_no())
sheet.write(i+1, 2, t.get_p1())
sheet.write(i+1, 3, t.get_p2())
sheet.write(i+1, 4, t.get_cname())
sheet.write(i+1, 5, t.get_total_score())
sheet.write(i+1, 6, t.get_total_sscore())
sheet.write(i+1, 7, t.get_total_diff())
wbk.save(filename)
return filename

205
views.py Normal file
View File

@@ -0,0 +1,205 @@
#encoding: utf8
from flask import request, abort
from flask.ext.admin import BaseView, expose
from bson.objectid import ObjectId
import sys
import random
from operator import attrgetter
sys.path.append('..')
from game_record.models import GameRecord
from game.models import Game
from namelist.models import NameList
from forms import BallotForm, RankForm
import json
class Team:
def __init__(self, namelist):
self.namelist = namelist
self.total_score = 0
self.total_sscore = 0
self.total_diff = 0
self.againsts = []
def get_company(self):
return self.namelist.company.strip()
def has_competed_with(self, against):
if against in self.againsts:
return True
else:
return False
def add_score(self, score):
self.total_score += score
def add_diff(self, diff):
self.total_diff += diff
def add_against(self, against):
self.againsts.append(against)
def compute_sscore(self):
for a in self.againsts:
#计算小分时,弃权所得负分不影响对手小分
if a.total_score >= 0:
self.total_sscore += a.total_score
class Company:
def __init__(self, name):
self.name = name
self.teams = []
self.total_score = 0
self.total_sscore = 0
self.total_diff = 0
def add_team(self, team):
self.teams.append(team)
def compute_score(self):
for team in self.teams:
self.total_score += team.total_score
self.total_sscore += team.total_sscore
self.total_diff += team.total_diff
class BallotView(BaseView):
round = 0
@expose('/', methods=['GET', 'POST'])
def index(self):
form = BallotForm(request.form)
form.game.choices = [(str(Game.objects(name=x).first().id), x) for x in Game.objects.distinct('name')]
if request.method == 'POST' and form.validate():
game = form.game.data
ballot_type = form.ballot_type.data
results = self.ballot(game, ballot_type)
self._template_args['ballot_results'] = results
self._template_args['round'] = self.round
return self.render('ballot.html', form=form)
def first_stage(self, game, ballot_type):
"""首轮抽签"""
results = []
teams = list(NameList.objects(game=game).order_by('no').all())
team_count = len(teams) / 2 * 2
if ballot_type == 'sequence':
for i in range(0, team_count, 2):
result = dict(desk_no=i/2+1, red=teams[i], blue=teams[i+1])
results.append(result)
return results
else:
return self.ballot_by_score(game, ballot_type)
def ballot_by_score(self, game, ballot_type):
"""按照比分抽签"""
results = []
teams = RankView.get_ranked_teams(game)
while len(teams) > 1:
#处理后四名出现同一个单位的情况
if len(teams) == 4 and (teams[0].get_company() == teams[1].get_company() or teams[2].get_company() == teams[3].get_company()):
results.append(dict(desk_no=len(results)+1, red=teams[0].namelist, blue=teams[2].namelist))
results.append(dict(desk_no=len(results)+1, red=teams[1].namelist, blue=teams[3].namelist))
break
t1 = teams[0]
for t2 in teams[1:]:
#找到不同单位并且没有比赛过的对手
if t1.get_company() != t2.get_company() and not t1.has_competed_with(t2):
break
results.append(dict(desk_no=len(results)+1, red=t1.namelist, blue=t2.namelist))
teams.remove(t1)
teams.remove(t2)
return results
def ballot(self, game, ballot_type):
"""抽签算法"""
if GameRecord.objects(game=game).count() == 0:
self.round = 1
return self.first_stage(game, ballot_type)
else:
self.round = max(GameRecord.objects(game=game).distinct('round')) + 1
return self.ballot_by_score(game, ballot_type)
class RankView(BaseView):
@expose('/', methods=['GET', 'POST'])
def index(self):
form = RankForm(request.form)
form.game.choices = [(str(Game.objects(name=x).first().id), x) for x in Game.objects.distinct('name')]
return self.render('rank.html', form=form)
@expose('/team_rank_ajax')
def team_rank_ajax(self):
results = []
game = request.args.get('game', '')
ranked_teams = self.get_ranked_teams(game)
for index, team in enumerate(ranked_teams):
record = {}
record['rank'] = index + 1
record['rank_type'] = unicode(team.namelist)
record['total_score'] = team.total_score
record['total_sscore'] = team.total_sscore
record['total_diff'] = team.total_diff
results.append(record)
return json.dumps(results)
@expose('/company_rank_ajax')
def company_rank_ajax(self):
game = request.args.get('game', '')
ranked_companys = self.get_ranked_companys(game)
results = []
for index, c in enumerate(ranked_companys):
record = {}
record['rank'] = index + 1
record['rank_type'] = c.name
record['total_score'] = c.total_score
record['total_sscore'] = c.total_sscore
record['total_diff'] = c.total_diff
results.append(record)
return json.dumps(results)
@staticmethod
def get_ranked_teams(game):
teams = {x:Team(x) for x in NameList.objects(game=game)}
for record in GameRecord.objects(game=game):
if record.result == u'红方胜':
teams[record.red].add_score(2)
teams[record.red].add_diff(record.diff)
teams[record.blue].add_diff(0 - record.diff)
elif record.result == u'蓝方胜':
teams[record.blue].add_score(2)
teams[record.blue].add_diff(record.diff)
teams[record.red].add_diff(0 - record.diff)
elif record.result == u'平局':
teams[record.blue].add_score(1)
teams[record.red].add_score(1)
elif record.result == u'红方弃权':
teams[record.red].add_score(-1)
teams[record.red].add_diff(-6)
teams[record.blue].add_score(2)
teams[record.blue].add_diff(6)
elif record.result == u'蓝方弃权':
teams[record.blue].add_score(-1)
teams[record.blue].add_diff(-6)
teams[record.red].add_score(2)
teams[record.red].add_diff(6)
teams[record.red].add_against(teams[record.blue])
teams[record.blue].add_against(teams[record.red])
for team in teams.values():
team.compute_sscore()
team_list = teams.values()
random.shuffle(team_list)
return sorted(team_list, key=attrgetter('total_score', 'total_sscore', 'total_diff'), reverse=True)
@staticmethod
def get_ranked_companys(game):
companys = {}
for team in RankView.get_ranked_teams(game):
company_name = team.get_company()
if company_name not in companys:
companys[company_name] = Company(company_name)
companys[company_name].add_team(team)
[c.compute_score() for c in companys.values()]
return sorted(companys.values(), key=attrgetter('total_score', 'total_sscore', 'total_diff'), reverse=True)