|
| 1 | +from random import sample |
| 2 | + |
| 3 | +from django.contrib.auth import get_user_model |
1 | 4 | from django.db.models import Q |
2 | 5 | from django_filters import rest_framework as filters |
3 | 6 | from rest_framework import generics, permissions, status |
|
7 | 10 |
|
8 | 11 | from core.permissions import IsStaffOrReadOnly |
9 | 12 | from projects.filters import ProjectFilter |
10 | | -from projects.helpers import VERBOSE_STEPS |
| 13 | +from projects.constants import VERBOSE_STEPS, RECOMMENDATIONS_COUNT |
11 | 14 | from projects.models import Project, Achievement |
12 | 15 | from projects.permissions import ( |
13 | 16 | IsProjectLeaderOrReadOnlyForNonDrafts, |
14 | 17 | HasInvolvementInProjectOrReadOnly, |
| 18 | + IsProjectLeader, |
15 | 19 | ) |
16 | 20 | from projects.serializers import ( |
17 | 21 | ProjectDetailSerializer, |
|
20 | 24 | AchievementDetailSerializer, |
21 | 25 | ProjectCollaboratorSerializer, |
22 | 26 | ) |
| 27 | +from users.serializers import UserListSerializer |
23 | 28 | from vacancy.models import VacancyResponse |
24 | 29 | from vacancy.serializers import VacancyResponseListSerializer |
25 | 30 |
|
| 31 | +User = get_user_model() |
| 32 | + |
26 | 33 |
|
27 | 34 | class ProjectList(generics.ListCreateAPIView): |
28 | 35 | queryset = Project.objects.get_projects_for_list_view() |
@@ -98,6 +105,34 @@ def put(self, request, pk, **kwargs): |
98 | 105 | return super(ProjectDetail, self).put(request, pk) |
99 | 106 |
|
100 | 107 |
|
| 108 | +class ProjectRecommendedUsers(generics.RetrieveAPIView): |
| 109 | + queryset = Project.objects.all() |
| 110 | + permission_classes = [IsProjectLeader] |
| 111 | + serializer_class = UserListSerializer |
| 112 | + |
| 113 | + def get(self, request, pk, **kwargs): |
| 114 | + project = self.get_object() |
| 115 | + # fixme: store key_skills and required_skills more convenient, not just as a string' |
| 116 | + |
| 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 | + skills = set(user.key_skills.lower().split(",")) |
| 126 | + if skills.intersection(all_needed_skills): |
| 127 | + recommended_users.append(user) |
| 128 | + sampled_recommended_users = sample( |
| 129 | + recommended_users, min(RECOMMENDATIONS_COUNT, len(recommended_users)) |
| 130 | + ) |
| 131 | + |
| 132 | + serializer = self.get_serializer(sampled_recommended_users, many=True) |
| 133 | + return Response(status=status.HTTP_200_OK, data=serializer.data) |
| 134 | + |
| 135 | + |
101 | 136 | class ProjectCountView(generics.GenericAPIView): |
102 | 137 | queryset = Project.objects.get_projects_for_count_view() |
103 | 138 | serializer_class = ProjectListSerializer |
|
0 commit comments