Made an algorithm for picking teams

This commit is contained in:
Data-Name-ID
2024-04-03 07:43:24 +03:00
parent 2e499f02a9
commit f075af9aa1
3 changed files with 85 additions and 4 deletions
+80
View File
@@ -0,0 +1,80 @@
from collections import deque
def get_teams(event): # noqa: C901, PLR0912
members_max = 3
min_front = 1
min_back = 2
def bfs(tree):
result = []
queue = deque([tree])
while queue:
node = queue.popleft()
if isinstance(node, dict):
for key, value in node.items():
result.append(key)
queue.append(value)
elif isinstance(node, list):
for item in node:
if isinstance(item, dict):
for key, value in item.items():
result.append(key)
queue.append(value)
elif isinstance(item, int) and item == 1:
return result
return result
def sort_and_divide_users(users):
sorted_users = dict(
sorted(users.items(), key=lambda x: (x[1][1], x[1][2]))
)
frontend_users = {
name: skills
for name, skills in sorted_users.items()
if skills[0] == "Frontend"
}
backend_users = {
name: skills
for name, skills in sorted_users.items()
if skills[0] == "Backend"
}
return frontend_users, backend_users
db_users = event.users.all().only("skills", "id")
users = {}
for user in db_users:
users[str(user.id)] = tuple(bfs(user.skills))
frontend_users, backend_users = sort_and_divide_users(users)
teams = []
while len(frontend_users) >= min_front and len(backend_users) >= min_back:
try:
team = []
for i in range(min_front): # noqa: B007
team.append(frontend_users.popitem()) # noqa: PERF401
for i in range(min_back): # noqa: B007
team.append(backend_users.popitem()) # noqa: PERF401
if len(team) < members_max:
for i in range(min_front): # noqa: B007
if len(team) >= members_max:
break
if frontend_users:
team.append(frontend_users.popitem())
for i in range(min_back): # noqa: B007
if len(team) >= members_max:
break
if backend_users:
team.append(backend_users.popitem())
teams.append(team)
except KeyError:
pass
return teams
+3 -3
View File
@@ -6,6 +6,7 @@ from rest_framework.viewsets import ModelViewSet
from api.events.models import Event from api.events.models import Event
from api.events.serializers import EventSerializer from api.events.serializers import EventSerializer
from api.users.serializers import UserSerializer from api.users.serializers import UserSerializer
from api.events.utils import get_teams
class EventViewSet(ModelViewSet): class EventViewSet(ModelViewSet):
@@ -38,7 +39,6 @@ class RunAlgorythmView(APIView):
{"error": "Event does not exist"}, {"error": "Event does not exist"},
status=status.HTTP_404_NOT_FOUND, status=status.HTTP_404_NOT_FOUND,
) )
teams = get_teams(event)
event.run_algorythm() return Response(teams)
return Response("ok")
+1
View File
@@ -27,3 +27,4 @@ sort-requirements==1.3.0
sqlparse==0.4.4 sqlparse==0.4.4
tzdata==2024.1 tzdata==2024.1
uritemplate==4.1.1 uritemplate==4.1.1
pandas==2.2.1