Made an algorithm for picking teams
This commit is contained in:
@@ -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
|
||||||
@@ -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")
|
|
||||||
|
|||||||
@@ -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
|
||||||
Reference in New Issue
Block a user