Skip to content

Commit c701dd1

Browse files
authored
Merge pull request #532 from PROCOLLAB-github/feature/project-mospolytech-data
Расширен фильтр проектов по программам
2 parents 77d1883 + 44154f5 commit c701dd1

3 files changed

Lines changed: 37 additions & 28 deletions

File tree

projects/filters.py

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
from django.db.models import Count
1+
from django.db.models import Count, Q
22
from django_filters import rest_framework as filters
33

4-
from users.models import Expert
5-
from partner_programs.models import PartnerProgram, PartnerProgramUserProfile
6-
from projects.models import Project
4+
from partner_programs.models import PartnerProgram
75
from project_rates.models import ProjectScore
6+
from projects.models import Project
7+
from users.models import Expert
88

99

1010
class ProjectFilter(filters.FilterSet):
@@ -56,33 +56,30 @@ def vacancy_filter(cls, queryset, name, value):
5656
return queryset
5757

5858
def filter_by_partner_program(self, queryset, name, value):
59-
program_id = value
59+
if str(value) == "0":
60+
return queryset.filter(
61+
partner_program_profiles__isnull=True,
62+
program_links__isnull=True,
63+
).distinct()
6064

6165
user = self.request.user
62-
try:
63-
program = PartnerProgram.objects.get(pk=program_id)
64-
program_status = program.projects_availability
65-
# If available to all users or request.user is an expert of this program.
66-
if (
67-
program_status == "all_users"
68-
or Expert.objects.filter(user=user, programs=program).exists()
69-
):
70-
profiles_qs = (
71-
PartnerProgramUserProfile.objects.filter(
72-
partner_program=program, project__isnull=False
73-
)
74-
.select_related("project")
75-
.only("project")
76-
)
77-
return queryset.filter(
78-
pk__in=[profile.project.pk for profile in profiles_qs]
79-
)
80-
else:
81-
return Project.objects.none()
8266

67+
try:
68+
program = PartnerProgram.objects.get(pk=value)
8369
except PartnerProgram.DoesNotExist:
8470
return Project.objects.none()
8571

72+
program_status = program.projects_availability
73+
user_is_expert = Expert.objects.filter(user=user, programs=program).exists()
74+
75+
if program_status != "all_users" and not user_is_expert:
76+
return Project.objects.none()
77+
78+
return queryset.filter(
79+
Q(partner_program_profiles__partner_program=program)
80+
| Q(program_links__partner_program=program)
81+
).distinct()
82+
8683
def filter_by_have_expert_rates(self, queryset, name, value):
8784
rated_projects_ids = ProjectScore.objects.values_list(
8885
"project_id", flat=True
@@ -107,7 +104,9 @@ def filter_by_have_expert_rates(self, queryset, name, value):
107104
)
108105

109106
# filters by whether there are any vacancies in the project
110-
any_vacancies = filters.BooleanFilter(field_name="vacancies", method="vacancy_filter")
107+
any_vacancies = filters.BooleanFilter(
108+
field_name="vacancies", method="vacancy_filter"
109+
)
111110
collaborator__count__gte = filters.NumberFilter(
112111
field_name="collaborator", method="filter_collaborator_count_gte"
113112
)
@@ -120,7 +119,9 @@ def filter_by_have_expert_rates(self, queryset, name, value):
120119
)
121120
is_rated_by_expert = filters.BooleanFilter(
122121
method="filter_by_have_expert_rates",
123-
label=("is_rated_by_expert\n`1`/`true` rated projects\n`0`/`false` dosn't rated"),
122+
label=(
123+
"is_rated_by_expert\n`1`/`true` rated projects\n`0`/`false` dosn't rated"
124+
),
124125
)
125126

126127
class Meta:

projects/serializers.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ class ProjectDetailSerializer(serializers.ModelSerializer):
9393
problem = serializers.CharField(required=False, allow_null=True, allow_blank=True)
9494
partner_program_fields = serializers.SerializerMethodField()
9595
partner_program_field_values = serializers.SerializerMethodField()
96+
partner_program_id = serializers.SerializerMethodField()
9697

9798
def get_partner_program_fields(self, project):
9899
try:
@@ -118,6 +119,13 @@ def get_partner_program_field_values(self, project):
118119
serializer = PartnerProgramFieldValueSerializer(values_qs, many=True)
119120
return serializer.data
120121

122+
def get_partner_program_id(self, project):
123+
try:
124+
link = project.program_links.select_related("partner_program").get()
125+
return link.partner_program.id
126+
except PartnerProgramProject.DoesNotExist:
127+
return None
128+
121129
@classmethod
122130
def get_partner_programs_tags(cls, project):
123131
profiles_qs = project.partner_program_profiles.select_related(
@@ -171,6 +179,7 @@ class Meta:
171179
"cover",
172180
"cover_image_address",
173181
"partner_programs_tags",
182+
"partner_program_id",
174183
"partner_program_fields",
175184
"partner_program_field_values",
176185
"track",

projects/views.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -703,7 +703,6 @@ def post(self, request):
703703
goal=original_project.goal,
704704
problem=original_project.problem,
705705
industry=original_project.industry,
706-
presentation_address=original_project.presentation_address,
707706
image_address=original_project.image_address,
708707
leader=request.user,
709708
draft=True,

0 commit comments

Comments
 (0)