Skip to content

Commit ee6c7f4

Browse files
committed
Moved recommendations logic to helpers
1 parent 187411c commit ee6c7f4

2 files changed

Lines changed: 39 additions & 24 deletions

File tree

projects/helpers.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from random import sample
2+
3+
from django.contrib.auth import get_user_model
4+
5+
from projects.constants import RECOMMENDATIONS_COUNT
6+
from projects.models import Project
7+
8+
User = get_user_model()
9+
10+
11+
def get_recommended_users(project: Project) -> list[User]:
12+
"""
13+
Searches for users by matching their key_skills and vacancies required_skills
14+
"""
15+
16+
# fixme: store key_skills and required_skills more convenient, not just as a string
17+
all_needed_skills = set()
18+
for vacancy in project.vacancies.all():
19+
all_needed_skills.update(set(vacancy.required_skills.lower().split(",")))
20+
21+
recommended_users = []
22+
for user in User.objects.get_members():
23+
if user == project.leader or not user.key_skills:
24+
continue
25+
26+
skills = set(user.key_skills.lower().split(","))
27+
if skills.intersection(all_needed_skills):
28+
recommended_users.append(user)
29+
30+
# get some random users
31+
sampled_recommended_users = sample(
32+
recommended_users, min(RECOMMENDATIONS_COUNT, len(recommended_users))
33+
)
34+
35+
return sampled_recommended_users

projects/views.py

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from random import sample
2-
31
from django.contrib.auth import get_user_model
42
from django.db.models import Q
53
from django_filters import rest_framework as filters
@@ -10,7 +8,8 @@
108

119
from core.permissions import IsStaffOrReadOnly
1210
from projects.filters import ProjectFilter
13-
from projects.constants import VERBOSE_STEPS, RECOMMENDATIONS_COUNT
11+
from projects.constants import VERBOSE_STEPS
12+
from projects.helpers import get_recommended_users
1413
from projects.models import Project, Achievement
1514
from projects.permissions import (
1615
IsProjectLeaderOrReadOnlyForNonDrafts,
@@ -112,27 +111,8 @@ class ProjectRecommendedUsers(generics.RetrieveAPIView):
112111

113112
def get(self, request, pk, **kwargs):
114113
project = self.get_object()
115-
116-
# fixme: store key_skills and required_skills more convenient, not just as a string
117-
all_needed_skills = set()
118-
for vacancy in project.vacancies.all():
119-
all_needed_skills.update(set(vacancy.required_skills.lower().split(",")))
120-
121-
recommended_users = []
122-
for user in User.objects.get_members():
123-
if user == request.user or not user.key_skills:
124-
continue
125-
126-
skills = set(user.key_skills.lower().split(","))
127-
if skills.intersection(all_needed_skills):
128-
recommended_users.append(user)
129-
130-
# get some random users
131-
sampled_recommended_users = sample(
132-
recommended_users, min(RECOMMENDATIONS_COUNT, len(recommended_users))
133-
)
134-
135-
serializer = self.get_serializer(sampled_recommended_users, many=True)
114+
recommended_users = get_recommended_users(project)
115+
serializer = self.get_serializer(recommended_users, many=True)
136116
return Response(status=status.HTTP_200_OK, data=serializer.data)
137117

138118

0 commit comments

Comments
 (0)