Skip to content

Commit c405cc7

Browse files
committed
Update player roles
As listed in https://api.worldoftanks.eu/wgn/clans/glossary/?application_id=demo Addresses issue #55
1 parent 47c0dc4 commit c405cc7

File tree

3 files changed

+120
-120
lines changed

3 files changed

+120
-120
lines changed

whyattend/config.py

+22-24
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
'Europe/Helsinki')
1919

2020
# Database URI (see http://docs.sqlalchemy.org/en/latest/core/engines.html#supported-databases)
21-
DATABASE_URI = 'mysql://user@host/database?charset=utf8&use_unicode=0' # forces UTF-8 encoding in DB
21+
DATABASE_URI = 'mysql://user@host/database?charset=utf8&use_unicode=0' # forces UTF-8 encoding in DB
2222

2323
# Path to temporary folder for OpenID authentication files
2424
OID_STORE_PATH = 'tmp/oid'
@@ -53,32 +53,30 @@
5353

5454
# Map WoT API clan roles to displayed name
5555
ROLE_LABELS = {
56-
'leader': 'Commander',
57-
'vice_leader': 'Deputy Commander',
58-
'commander': 'Field Commander',
59-
'junior_officer': 'Junior Officer',
60-
'executive_officer': 'Executive Officer',
61-
'personnel_officer': 'Personnel Officer',
62-
'reservist': 'Reservist',
63-
'recruiter': 'Recruiter',
64-
'private': 'Soldier',
65-
'recruit': 'Recruit',
66-
'treasurer': 'Treasurer',
67-
'diplomat': 'Diplomat',
56+
"personnel_officer": "Personnel Officer",
57+
"quartermaster": "Quartermaster",
58+
"executive_officer": "Executive Officer",
59+
"recruit": "Recruit",
60+
"private": "Private",
61+
"commander": "Commander",
62+
"reservist": "Reservist",
63+
"combat_officer": "Combat Officer",
64+
"recruitment_officer": "Recruitment Officer",
65+
"intelligence_officer": "Intelligence Officer"
6866
}
6967

7068
# List of player names that can do everything
71-
ADMINS = ['fantastico',]
72-
73-
# Permission configuration. E.g. let only leader, vice_leader and treasurer create battles.
74-
CREATE_BATTLE_ROLES = ('leader', 'vice_leader', 'treasurer')
75-
DELETE_BATTLE_ROLES = ('leader', 'vice_leader', 'treasurer')
76-
PAYOUT_ROLES = ('leader', 'vice_leader', 'treasurer')
77-
ADMIN_ROLES = ('leader', 'vice_leader', 'commander', 'treasurer')
78-
PLAYER_PERFORMANCE_ROLES = ('leader', 'vice_leader')
79-
COMMANDED_ROLES = ('leader', 'vice_leader', 'commander', 'treasurer')
80-
DOWNLOAD_REPLAY_ROLES = ('leader', 'vice_leader', 'commander', 'recruiter',
81-
'treasurer', 'diplomat', 'private')
69+
ADMINS = ['fantastico', ]
70+
71+
# Permission configuration. E.g. let only leader and treasurer create battles.
72+
CREATE_BATTLE_ROLES = ('commander', 'executive_officer', 'quartermaster')
73+
DELETE_BATTLE_ROLES = ('commander', 'executive_officer', 'quartermaster')
74+
PAYOUT_ROLES = ('commander', 'executive_officer', 'quartermaster')
75+
ADMIN_ROLES = ('commander', )
76+
PLAYER_PERFORMANCE_ROLES = ('commander', )
77+
COMMANDED_ROLES = ('commander', 'executive_officer')
78+
DOWNLOAD_REPLAY_ROLES = ('commander', 'personnel_officer', 'executive_officer', 'private',
79+
'combat_officer', 'recruitment_officer', 'intelligence_officer', 'quartermaster')
8280

8381
# How long after the battle date should reserves be able to sign in themselves
8482
RESERVE_SIGNUP_DURATION = datetime.timedelta(days=7)

whyattend/webapp.py

+96-94
Original file line numberDiff line numberDiff line change
@@ -210,78 +210,79 @@ def sync_players(clan_id=None):
210210
:param clan_id:
211211
:return:
212212
"""
213-
if config.API_KEY == request.args['API_KEY']:
214-
if clan_id:
215-
clan_ids = [clan_id]
216-
else:
217-
clan_ids = config.CLAN_IDS.values()
218-
for clan_id in clan_ids:
219-
logger.info("Clan member synchronization triggered for " + str(clan_id))
220-
webapp_data = WebappData.get()
221-
webapp_data.last_sync_attempt = datetime.datetime.now()
222-
db_session.add(webapp_data)
223-
db_session.commit()
224-
db_session.remove()
225-
226-
clan_info = wotapi.get_clan(str(clan_id))
227-
player_ids = clan_info['data'][str(clan_id)]['members'].keys()
228-
players_info = wotapi.get_players(player_ids)
229-
member_info_data = {}
230-
for i in xrange(0, len(player_ids), 20):
231-
member_info_data.update(wotapi.get_players_membership_info(player_ids[i:i+20])['data'])
232-
233-
processed = set()
234-
for player_id in player_ids:
235-
player = clan_info['data'][str(clan_id)]['members'][player_id]
236-
player_data = players_info['data'][player_id]
237-
member_data = member_info_data[player_id]
238-
p = Player.query.filter_by(wot_id=str(player['account_id'])).first()
239-
if not player_data:
240-
if p:
241-
processed.add(p.id) # skip this guy later when locking players
242-
logger.info("Missing player info of " + player['account_name'])
243-
continue # API Error?
244-
245-
since = datetime.datetime.fromtimestamp(
246-
float(member_data['joined_at']))
213+
if config.API_KEY != request.args['API_KEY']:
214+
abort(403)
247215

216+
if clan_id:
217+
clan_ids = [clan_id]
218+
else:
219+
clan_ids = config.CLAN_IDS.values()
220+
for clan_id in clan_ids:
221+
logger.info("Clan member synchronization triggered for " + str(clan_id))
222+
webapp_data = WebappData.get()
223+
webapp_data.last_sync_attempt = datetime.datetime.now()
224+
db_session.add(webapp_data)
225+
db_session.commit()
226+
db_session.remove()
227+
228+
clan_info = wotapi.get_clan(str(clan_id))
229+
player_ids = clan_info['data'][str(clan_id)]['members'].keys()
230+
players_info = wotapi.get_players(player_ids)
231+
member_info_data = {}
232+
for i in xrange(0, len(player_ids), 20):
233+
member_info_data.update(wotapi.get_players_membership_info(player_ids[i:i + 20])['data'])
234+
235+
processed = set()
236+
for player_id in player_ids:
237+
player = clan_info['data'][str(clan_id)]['members'][player_id]
238+
player_data = players_info['data'][player_id]
239+
member_data = member_info_data[player_id]
240+
p = Player.query.filter_by(wot_id=str(player['account_id'])).first()
241+
if not player_data:
248242
if p:
249-
# Player exists, update information
250-
processed.add(p.id)
251-
p.name = player['account_name']
252-
p.openid = 'https://'+config.WOT_SERVER_REGION_CODE+'.wargaming.net/id/' + str(player_id) + '-' + player['account_name'] + '/'
253-
p.locked = False
254-
p.clan = clan_info['data'][str(clan_id)]['tag']
255-
p.role = player['role'] # role might have changed
256-
p.member_since = since # might have rejoined
257-
else:
258-
# New player
259-
p = Player(str(player['account_id']),
260-
'https://'+config.WOT_SERVER_REGION_CODE+'.wargaming.net/id/' + str(player['account_id']) + '-' + player[
261-
'account_name'] + '/',
262-
since,
263-
player['account_name'],
264-
clan_info['data'][str(clan_id)]['tag'],
265-
player['role'])
266-
logger.info('Adding player ' + player['account_name'])
267-
db_session.add(p)
268-
269-
# All players of the clan in the DB, which are no longer in the clan
270-
for player in Player.query.filter_by(clan=clan_info['data'][str(clan_id)]['tag']):
271-
if player.id in processed or player.id is None or player.locked:
272-
continue
273-
logger.info("Locking player " + player.name)
274-
player.locked = True
275-
player.lock_date = datetime.datetime.now()
276-
db_session.add(player)
277-
278-
webapp_data.last_successful_sync = datetime.datetime.now()
279-
db_session.add(webapp_data)
280-
db_session.commit()
281-
logger.info("Clan member synchronization successful")
243+
processed.add(p.id) # skip this guy later when locking players
244+
logger.info("Missing player info of " + player['account_name'])
245+
continue # API Error?
246+
247+
since = datetime.datetime.fromtimestamp(
248+
float(member_data['since']))
249+
250+
if p:
251+
# Player exists, update information
252+
processed.add(p.id)
253+
p.name = player['account_name']
254+
p.openid = 'https://' + config.WOT_SERVER_REGION_CODE + '.wargaming.net/id/' + str(player_id) + '-' + \
255+
player['account_name'] + '/'
256+
p.locked = False
257+
p.clan = clan_info['data'][str(clan_id)]['abbreviation']
258+
p.role = player['role'] # role might have changed
259+
p.member_since = since # might have rejoined
260+
else:
261+
# New player
262+
p = Player(str(player['account_id']),
263+
'https://' + config.WOT_SERVER_REGION_CODE + '.wargaming.net/id/' + str(
264+
player['account_id']) + '-' + player[
265+
'account_name'] + '/',
266+
since,
267+
player['account_name'],
268+
clan_info['data'][str(clan_id)]['abbreviation'],
269+
player['role'])
270+
logger.info('Adding player ' + player['account_name'])
271+
db_session.add(p)
272+
273+
# All players of the clan in the DB, which are no longer in the clan
274+
for player in Player.query.filter_by(clan=clan_info['data'][str(clan_id)]['abbreviation']):
275+
if player.id in processed or player.id is None or player.locked:
276+
continue
277+
logger.info("Locking player " + player.name)
278+
player.locked = True
279+
player.lock_date = datetime.datetime.now()
280+
db_session.add(player)
282281

283-
else:
284-
abort(403)
282+
webapp_data.last_successful_sync = datetime.datetime.now()
283+
db_session.add(webapp_data)
284+
db_session.commit()
285+
logger.info("Clan member synchronization successful")
285286

286287
return redirect(url_for('index'))
287288

@@ -641,7 +642,8 @@ def edit_battle(battle_id):
641642
return redirect(url_for('battles_list', clan=g.player.clan))
642643

643644
return render_template('battles/edit.html', date=date, map_name=map_name, province=province, battle=battle,
644-
battle_groups=battle_groups, duration=duration, battle_group_description=battle_group_description,
645+
battle_groups=battle_groups, duration=duration,
646+
battle_group_description=battle_group_description,
645647
battle_commander=battle_commander, enemy_clan=enemy_clan, battle_result=battle_result,
646648
battle_group_final=battle_group_final, players=players, description=description,
647649
replay=replay, replays=replays, all_players=all_players, sorted_players=sorted_players)
@@ -798,7 +800,7 @@ def create_battle():
798800
server_tz = timezone(config.SERVER_TIMEZONE)
799801
user_tz = timezone(usertimezone)
800802
date = user_tz.localize(date).astimezone(server_tz)
801-
session['usertimezone'] = usertimezone # Remember selected timezone
803+
session['usertimezone'] = usertimezone # Remember selected timezone
802804

803805
battle = Battle(date, g.player.clan, enemy_clan, victory=(battle_result == 'victory'),
804806
map_name=map_name, map_province=province,
@@ -861,21 +863,21 @@ def battles_list(clan):
861863
if not clan in config.CLAN_NAMES:
862864
abort(404)
863865

864-
#enemy_clan = request.args.get('enemy', None)
866+
# enemy_clan = request.args.get('enemy', None)
865867

866-
#battles = Battle.query.options(joinedload_all('battle_group.battles')).options(
868+
# battles = Battle.query.options(joinedload_all('battle_group.battles')).options(
867869
# joinedload_all('attendances.player')).options(joinedload_all('battle_commander')).filter_by(clan=clan)
868-
#if enemy_clan:
870+
# if enemy_clan:
869871
# battles = battles.filter_by(enemy_clan=enemy_clan)
870-
#battles = battles.all()
872+
# battles = battles.all()
871873

872874
return render_template('battles/battles.html', clan=clan)
873875

874876

875877
@app.route('/battles/list/<clan>/json')
876878
@require_login
877879
def battles_list_json(clan):
878-
if not clan in config.CLAN_NAMES:
880+
if clan not in config.CLAN_NAMES:
879881
abort(404)
880882

881883
offset = int(request.args.get('iDisplayStart'))
@@ -924,7 +926,7 @@ def battles_list_json(clan):
924926
and_(Battle.clan == clan,
925927
(or_(Battle.date == select([func.max(battle_table.c.date)],
926928
Battle.battle_group_id == battle_table.c.battle_group_id
927-
),
929+
),
928930
Battle.battle_group_id == None)),
929931
search_term,
930932
(Battle.enemy_clan == enemy_clan if enemy_clan else True))) \
@@ -1171,9 +1173,9 @@ def clan_players(clan):
11711173
'%i' % (present[player] / possible[player] * 100.0 if possible[player] else 0),
11721174
'%i' % (present30[player] / possible30[player] * 100.0 if possible30[player] else 0),
11731175
last_battle_by_player[player].date.strftime('%d.%m.%Y %H:%M') if
1174-
last_battle_by_player[player] else '',
1176+
last_battle_by_player[player] else '',
11751177
player.gold_earned
1176-
])
1178+
])
11771179

11781180
headers = Headers()
11791181
headers.add('Content-Type', 'text/csv')
@@ -1318,7 +1320,7 @@ def download_replay(battle_id):
13181320
response.headers['Content-Disposition'] = 'attachment; filename=' + \
13191321
secure_filename(battle.date.strftime(
13201322
'%d.%m.%Y_%H_%M_%S') + '_' + battle.clan + '_' +
1321-
battle.enemy_clan + '.wotreplay')
1323+
battle.enemy_clan + '.wotreplay')
13221324
return response
13231325

13241326

@@ -1340,7 +1342,7 @@ def download_additional_replay(replay_id):
13401342
response.headers['Content-Disposition'] = 'attachment; filename=' + \
13411343
secure_filename(battle.date.strftime(
13421344
'%d.%m.%Y_%H_%M_%S') + '_' + battle.clan + '_' +
1343-
battle.enemy_clan + '.wotreplay')
1345+
battle.enemy_clan + '.wotreplay')
13441346
return response
13451347

13461348

@@ -1409,7 +1411,7 @@ def overlapping_battles(battle, ordered_battles, before_dt=timedelta(minutes=0),
14091411
[battle.date - before_dt, battle.date + battle.duration + after_dt].
14101412
Such battles overlap with the given battle. """
14111413
return [b for b in ordered_battles if battle.date - before_dt <= b.date <=
1412-
battle.date + timedelta(seconds=battle.duration or (15*60)) + after_dt]
1414+
battle.date + timedelta(seconds=battle.duration or (15 * 60)) + after_dt]
14131415

14141416
# noinspection PyShadowingNames
14151417
def get_reserve_conflicts(battles):
@@ -1545,7 +1547,8 @@ def payout_battles(clan):
15451547
return render_template('payout/payout_battles.html', battles=battles, clan=clan, fromDate=from_date, toDate=to_date,
15461548
player_played=player_played, player_reserve=player_reserve, players=players,
15471549
player_gold=player_gold, gold=gold, player_defeats=player_defeats,
1548-
player_fced_win=player_fced_win, victories_only=victories_only, recruit_factor=recruit_factor,
1550+
player_fced_win=player_fced_win, victories_only=victories_only,
1551+
recruit_factor=recruit_factor,
15491552
player_fced_defeat=player_fced_defeat, player_victories=player_victories,
15501553
player_fced_draws=player_fced_draws, player_draws=player_draws, player_points=player_points,
15511554
player_resources=player_resources, points_per_resource=points_per_resource)
@@ -1645,16 +1648,17 @@ def payout_battles_json():
16451648
battle.enemy_clan,
16461649
battle.creator.name,
16471650
battle.outcome_str()] for battle in battles
1648-
]
1651+
]
16491652
})
16501653

16511654

16521655
@app.route('/players/commanded/<clan>')
16531656
@require_login
16541657
@require_role(config.COMMANDED_ROLES)
16551658
def players_commanded(clan):
1656-
commanders = Player.query.filter_by(locked=False, clan=clan).filter(Player.id.in_(db_session.query(Battle.battle_commander_id) \
1657-
.distinct())).order_by(Player.name).all()
1659+
commanders = Player.query.filter_by(locked=False, clan=clan).filter(
1660+
Player.id.in_(db_session.query(Battle.battle_commander_id) \
1661+
.distinct())).order_by(Player.name).all()
16581662

16591663
return render_template('players/commanding.html', commanders=commanders, clan=clan)
16601664

@@ -1675,7 +1679,7 @@ def players_commanded_json():
16751679

16761680
battles = Battle.query.options(joinedload_all('battle_group.battles')).options(
16771681
joinedload_all('attendances.player')).filter(Battle.date >= from_date).filter(Battle.date <= to_date) \
1678-
.filter_by(battle_commander=commander)
1682+
.filter_by(battle_commander=commander)
16791683
player_count = defaultdict(int)
16801684
for battle in battles:
16811685
if use_battle_groups:
@@ -1695,10 +1699,7 @@ def players_commanded_json():
16951699
"sEcho": 1,
16961700
"iTotalRecords": len(player_count),
16971701
"iTotalDisplayRecords": len(player_count),
1698-
"aaData": [
1699-
(k.name,
1700-
v) for k, v in player_count.iteritems()
1701-
]
1702+
"aaData": [(k.name, v) for k, v in player_count.iteritems()]
17021703
})
17031704

17041705

@@ -1754,7 +1755,7 @@ def clan_statistics(clan):
17541755
enemies_by_battle_count = defaultdict(int)
17551756
for bc in range(max(battles_by_enemy.values() or [0])):
17561757
enemies_by_battle_count[bc] = len([enemy_clan for enemy_clan in battles_by_enemy if
1757-
battles_by_enemy[enemy_clan] >= bc])
1758+
battles_by_enemy[enemy_clan] >= bc])
17581759

17591760
battle_count_cutoff = 0
17601761
for battle_count in range(1, max(battles_by_enemy.values() or [0])):
@@ -1808,7 +1809,7 @@ def player_performance(clan):
18081809
to_date = request.form.get('toDate', None)
18091810

18101811
if from_date is None:
1811-
from_date = datetime.datetime.now() - datetime.timedelta(days=4*7)
1812+
from_date = datetime.datetime.now() - datetime.timedelta(days=4 * 7)
18121813
else:
18131814
from_date = datetime.datetime.strptime(from_date, '%d.%m.%Y')
18141815

@@ -1817,7 +1818,8 @@ def player_performance(clan):
18171818
else:
18181819
to_date = datetime.datetime.strptime(to_date, '%d.%m.%Y') + datetime.timedelta(days=1)
18191820

1820-
battles = Battle.query.options(joinedload('replay')).filter_by(clan=clan).filter(Battle.date>=from_date, Battle.date<=to_date).all()
1821+
battles = Battle.query.options(joinedload('replay')).filter_by(clan=clan).filter(Battle.date >= from_date,
1822+
Battle.date <= to_date).all()
18211823
players = Player.query.filter_by(clan=clan, locked=False).all()
18221824

18231825
result = analysis.player_performance(battles, players)

0 commit comments

Comments
 (0)