Merge pull request #593 from taigaio/issue/3846/exclude_invisible_projects_in_discover_section
Fix #3846: Exclude private projects in discover callsremotes/origin/logger
commit
04591e8d42
|
@ -70,8 +70,9 @@ class ProjectViewSet(LikedResourceMixin, HistoryResourceMixin,
|
||||||
admin_serializer_class = serializers.ProjectDetailAdminSerializer
|
admin_serializer_class = serializers.ProjectDetailAdminSerializer
|
||||||
list_serializer_class = serializers.ProjectSerializer
|
list_serializer_class = serializers.ProjectSerializer
|
||||||
permission_classes = (permissions.ProjectPermission, )
|
permission_classes = (permissions.ProjectPermission, )
|
||||||
filter_backends = (project_filters.QFilter,
|
filter_backends = (project_filters.QFilterBackend,
|
||||||
project_filters.CanViewProjectObjFilterBackend)
|
project_filters.CanViewProjectObjFilterBackend,
|
||||||
|
project_filters.DiscoverModeFilterBackend)
|
||||||
|
|
||||||
filter_fields = (("member", "members"),
|
filter_fields = (("member", "members"),
|
||||||
"is_looking_for_people",
|
"is_looking_for_people",
|
||||||
|
|
|
@ -27,6 +27,21 @@ from taiga.base.utils.db import to_tsquery
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class DiscoverModeFilterBackend(FilterBackend):
|
||||||
|
def filter_queryset(self, request, queryset, view):
|
||||||
|
qs = queryset
|
||||||
|
|
||||||
|
if "discover_mode" in request.QUERY_PARAMS:
|
||||||
|
field_data = request.QUERY_PARAMS["discover_mode"]
|
||||||
|
discover_mode = self._special_values_dict.get(field_data, field_data)
|
||||||
|
|
||||||
|
if discover_mode:
|
||||||
|
# discover_mode enabled
|
||||||
|
qs = qs.filter(anon_permissions__contains=["view_project"])
|
||||||
|
|
||||||
|
return super().filter_queryset(request, qs.distinct(), view)
|
||||||
|
|
||||||
|
|
||||||
class CanViewProjectObjFilterBackend(FilterBackend):
|
class CanViewProjectObjFilterBackend(FilterBackend):
|
||||||
def filter_queryset(self, request, queryset, view):
|
def filter_queryset(self, request, queryset, view):
|
||||||
project_id = None
|
project_id = None
|
||||||
|
@ -49,7 +64,7 @@ class CanViewProjectObjFilterBackend(FilterBackend):
|
||||||
# superuser
|
# superuser
|
||||||
qs = qs
|
qs = qs
|
||||||
elif request.user.is_authenticated():
|
elif request.user.is_authenticated():
|
||||||
# projet members
|
# authenticated user & project member
|
||||||
membership_model = apps.get_model("projects", "Membership")
|
membership_model = apps.get_model("projects", "Membership")
|
||||||
memberships_qs = membership_model.objects.filter(user=request.user)
|
memberships_qs = membership_model.objects.filter(user=request.user)
|
||||||
if project_id:
|
if project_id:
|
||||||
|
@ -68,7 +83,7 @@ class CanViewProjectObjFilterBackend(FilterBackend):
|
||||||
return super().filter_queryset(request, qs.distinct(), view)
|
return super().filter_queryset(request, qs.distinct(), view)
|
||||||
|
|
||||||
|
|
||||||
class QFilter(FilterBackend):
|
class QFilterBackend(FilterBackend):
|
||||||
def filter_queryset(self, request, queryset, view):
|
def filter_queryset(self, request, queryset, view):
|
||||||
# NOTE: See migtration 0033_text_search_indexes
|
# NOTE: See migtration 0033_text_search_indexes
|
||||||
q = request.QUERY_PARAMS.get('q', None)
|
q = request.QUERY_PARAMS.get('q', None)
|
||||||
|
|
|
@ -575,3 +575,33 @@ def test_project_action_unwatch(client, data):
|
||||||
assert results == [404, 404, 200, 200]
|
assert results == [404, 404, 200, 200]
|
||||||
results = helper_test_http_method(client, 'post', blocked_url, None, users)
|
results = helper_test_http_method(client, 'post', blocked_url, None, users)
|
||||||
assert results == [404, 404, 451, 451]
|
assert results == [404, 404, 451, 451]
|
||||||
|
|
||||||
|
|
||||||
|
def test_project_list_with_discover_mode_enabled(client, data):
|
||||||
|
url = "{}?{}".format(reverse('projects-list'), "discover_mode=true")
|
||||||
|
|
||||||
|
response = client.get(url)
|
||||||
|
projects_data = json.loads(response.content.decode('utf-8'))
|
||||||
|
assert len(projects_data) == 2
|
||||||
|
assert response.status_code == 200
|
||||||
|
|
||||||
|
client.login(data.registered_user)
|
||||||
|
|
||||||
|
response = client.get(url)
|
||||||
|
projects_data = json.loads(response.content.decode('utf-8'))
|
||||||
|
assert len(projects_data) == 2
|
||||||
|
assert response.status_code == 200
|
||||||
|
|
||||||
|
client.login(data.project_member_with_perms)
|
||||||
|
|
||||||
|
response = client.get(url)
|
||||||
|
projects_data = json.loads(response.content.decode('utf-8'))
|
||||||
|
assert len(projects_data) == 2
|
||||||
|
assert response.status_code == 200
|
||||||
|
|
||||||
|
client.login(data.project_owner)
|
||||||
|
|
||||||
|
response = client.get(url)
|
||||||
|
projects_data = json.loads(response.content.decode('utf-8'))
|
||||||
|
assert len(projects_data) == 2
|
||||||
|
assert response.status_code == 200
|
||||||
|
|
Loading…
Reference in New Issue