Skip to content

Commit

Permalink
use player smart search
Browse files Browse the repository at this point in the history
  • Loading branch information
unStatiK committed Jan 9, 2025
1 parent a7541d9 commit aaf1e92
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 23 deletions.
50 changes: 38 additions & 12 deletions server/player/player_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,23 @@

class PlayerHelper:
@staticmethod
def find_player_smart(player_full_name: str) -> Optional[Player]:
def find_player_smart(player_full_name: str, city_object=None) -> 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())
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)
found_players = PlayerHelper.__find_all_players(
first_names=first_names, last_names=last_names, city_object=city_object
)
if len(found_players) == 1:
return found_players[0]
else:
return None

@staticmethod
def generate_name_variants(name: str) -> List[str]:
def __generate_name_variants(name: str) -> List[str]:
res = [name]
if "ё" in name:
res.append(name.replace("ё", "е"))
Expand All @@ -32,13 +34,37 @@ def generate_name_variants(name: str) -> List[str]:
return res

@staticmethod
def find_all_players(first_names: List[str], last_names: List[str]) -> List[Player]:
def __find_all_players(first_names: List[str], last_names: List[str], city_object=None) -> 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)
)
players.extend(PlayerHelper.__get_players_by_ru_full_name(all_full_names=all_names, city_object=city_object))
players.extend(PlayerHelper.__get_players_by_en_full_name(all_full_names=all_names, city_object=city_object))
return players

@staticmethod
def __get_players_by_ru_full_name(all_full_names: List[str], city_object=None) -> List[Player]:
if city_object:
return Player.objects.filter(
first_name_ru__in=all_full_names,
last_name_ru__in=all_full_names,
city=city_object,
is_exclude_from_rating=False,
)
else:
return Player.objects.filter(
first_name_ru__in=all_full_names, last_name_ru__in=all_full_names, is_exclude_from_rating=False
)

@staticmethod
def __get_players_by_en_full_name(all_full_names: List[str], city_object=None) -> List[Player]:
if city_object:
return Player.objects.filter(
first_name_en__in=all_full_names,
last_name_en__in=all_full_names,
city=city_object,
is_exclude_from_rating=False,
)
else:
return Player.objects.filter(
first_name_en__in=all_full_names, last_name_en__in=all_full_names, is_exclude_from_rating=False
)
21 changes: 10 additions & 11 deletions server/tournament/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from account.models import PantheonInfoUpdateLog
from pantheon_api.api_calls.user import get_pantheon_public_person_information
from player.models import Player
from player.player_helper import PlayerHelper
from settings.models import City
from tournament.forms import (
MajsoulOnlineTournamentPantheonRegistrationForm,
Expand Down Expand Up @@ -221,11 +222,10 @@ def pantheon_tournament_registration(request, tournament_id):
# todo get ms_data and store into PantheonInfoUpdateLog
data = get_pantheon_public_person_information(user.new_pantheon_id)
PantheonInfoUpdateLog.objects.create(user=user, pantheon_id=user.new_pantheon_id, updated_information=data)
first_name, last_name = split_name(data["title"])
full_name = data["title"]
first_name, last_name = split_name(full_name)

player = Player.objects.filter(first_name_ru=first_name, last_name_ru=last_name).first()
if not player:
player = Player.objects.filter(first_name_ru=last_name, last_name_ru=first_name).first()
player = PlayerHelper.find_player_smart(player_full_name=full_name)
city_object = City.objects.filter(name_ru=data["city"].title()).first()

if not tournament.is_majsoul_tournament and not data["tenhou_id"]:
Expand Down Expand Up @@ -302,16 +302,15 @@ def tournament_registration(request, tournament_id):
pass

try:
full_name = f"{instance.first_name.title()} {instance.last_name.title()}"
if instance.city_object:
instance.player = Player.objects.get(
first_name_ru=instance.first_name.title(),
last_name_ru=instance.last_name.title(),
city=instance.city_object,
instance.player = PlayerHelper.find_player_smart(
player_full_name=full_name, city_object=instance.city_object
)
else:
instance.player = Player.objects.get(
first_name_ru=instance.first_name.title(), last_name_ru=instance.last_name.title()
)
instance.player = PlayerHelper.find_player_smart(player_full_name=full_name)
if not instance.player:
raise Player.DoesNotExist
except (Player.DoesNotExist, Player.MultipleObjectsReturned):
# TODO if multiple players are here, let's try to filter by city
pass
Expand Down

0 comments on commit aaf1e92

Please sign in to comment.