1- from django .db .models import Count
1+ from django .db .models import Count , Q
22from 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
75from project_rates .models import ProjectScore
6+ from projects .models import Project
7+ from users .models import Expert
88
99
1010class 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 :
0 commit comments