From f075af9aa1f2f5190b39de7bd8cf2ec5323fed91 Mon Sep 17 00:00:00 2001 From: Data-Name-ID Date: Wed, 3 Apr 2024 07:43:24 +0300 Subject: [PATCH] Made an algorithm for picking teams --- backend/project/api/events/utils.py | 80 +++++++++++++++++++++++++++++ backend/project/api/events/views.py | 6 +-- backend/requirements/prod.txt | 3 +- 3 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 backend/project/api/events/utils.py diff --git a/backend/project/api/events/utils.py b/backend/project/api/events/utils.py new file mode 100644 index 0000000..817cc55 --- /dev/null +++ b/backend/project/api/events/utils.py @@ -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 diff --git a/backend/project/api/events/views.py b/backend/project/api/events/views.py index 11120f0..92273c6 100644 --- a/backend/project/api/events/views.py +++ b/backend/project/api/events/views.py @@ -6,6 +6,7 @@ from rest_framework.viewsets import ModelViewSet from api.events.models import Event from api.events.serializers import EventSerializer from api.users.serializers import UserSerializer +from api.events.utils import get_teams class EventViewSet(ModelViewSet): @@ -38,7 +39,6 @@ class RunAlgorythmView(APIView): {"error": "Event does not exist"}, status=status.HTTP_404_NOT_FOUND, ) + teams = get_teams(event) - event.run_algorythm() - - return Response("ok") + return Response(teams) diff --git a/backend/requirements/prod.txt b/backend/requirements/prod.txt index 0714826..809d482 100644 --- a/backend/requirements/prod.txt +++ b/backend/requirements/prod.txt @@ -26,4 +26,5 @@ six==1.16.0 sort-requirements==1.3.0 sqlparse==0.4.4 tzdata==2024.1 -uritemplate==4.1.1 \ No newline at end of file +uritemplate==4.1.1 +pandas==2.2.1 \ No newline at end of file