Skip to content

Commit

Permalink
Merge pull request #133 from MahjongRepository/trueskill-try-swap-names
Browse files Browse the repository at this point in the history
Try swap first / last name and e / yo when finding player in db
  • Loading branch information
unStatiK authored Jan 9, 2025
2 parents 3337149 + 5ce06ad commit a7541d9
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 21 deletions.
44 changes: 44 additions & 0 deletions server/player/player_helper.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
from typing import List, Optional

from player.models import Player


class PlayerHelper:
@staticmethod
def find_player_smart(player_full_name: str) -> Optional[Player]:
arr = player_full_name.strip().split()
if len(arr) != 2:
return None
last_names = PlayerHelper.generate_name_variants(arr[0].strip())
first_names = PlayerHelper.generate_name_variants(arr[1].strip())

found_players = PlayerHelper.find_all_players(first_names=first_names, last_names=last_names)
if len(found_players) == 1:
return found_players[0]
else:
return None

@staticmethod
def generate_name_variants(name: str) -> List[str]:
res = [name]
if "ё" in name:
res.append(name.replace("ё", "е"))
return res
if "е" not in name:
return res
for i in range(len(name)):
if name[i] == "е":
res.append(name[:i] + "ё" + name[i + 1 :])
return res

@staticmethod
def find_all_players(first_names: List[str], last_names: List[str]) -> List[Player]:
players = []
all_names = first_names + last_names
players.extend(
Player.objects.filter(first_name_ru__in=all_names, last_name_ru__in=all_names, is_exclude_from_rating=False)
)
players.extend(
Player.objects.filter(first_name_en__in=all_names, last_name_en__in=all_names, is_exclude_from_rating=False)
)
return players
40 changes: 19 additions & 21 deletions server/rating/management/commands/update_trueskill.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
# -*- coding: utf-8 -*-

import ujson
from django.core.management.base import BaseCommand
from django.db import transaction
from django.utils import timezone

from player.models import Player
from player.player_helper import PlayerHelper
from rating.models import ExternalRating, ExternalRatingDate, ExternalRatingDelta, ExternalRatingTournament
from tournament.models import Tournament
from website.views import NEW_PANTHEON_TYPE, OLD_PANTHEON_TYPE
Expand Down Expand Up @@ -86,27 +87,24 @@ def handle(self, *args, **options):
sorted_rating = sorted(trueskill_map["trueskill"], key=lambda d: d["rating"], reverse=True)
place = 1
for ts_player in sorted_rating:
try:
full_name = ts_player["player"].split(" ")
if len(full_name) == 2:
player = Player.objects.get(
first_name_ru=full_name[1], last_name_ru=full_name[0], is_exclude_from_rating=False
)
deltas.append(
ExternalRatingDelta(
rating=rating,
player=player,
date=now,
base_rank=ts_player["rating"],
is_active=True,
place=place,
game_numbers=ts_player["game_count"],
last_game_date=ts_player["last_game_date"],
)
player_full_name = ts_player["player"]
player = PlayerHelper.find_player_smart(player_full_name=player_full_name)
if player:
deltas.append(
ExternalRatingDelta(
rating=rating,
player=player,
date=now,
base_rank=ts_player["rating"],
is_active=True,
place=place,
game_numbers=ts_player["game_count"],
last_game_date=ts_player["last_game_date"],
)
place = place + 1
except (Player.DoesNotExist, Player.MultipleObjectsReturned):
pass
)
place = place + 1
else:
print("find_player_smart(): found 0 players with name '{0}'".format(player_full_name))

if deltas:
ExternalRatingDelta.objects.bulk_create(deltas)
Expand Down

0 comments on commit a7541d9

Please sign in to comment.