Skip to content

Commit

Permalink
refacto project list filters
Browse files Browse the repository at this point in the history
  • Loading branch information
etchegom committed Feb 25, 2025
1 parent 9231789 commit b131ce6
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 55 deletions.
4 changes: 4 additions & 0 deletions recoco/apps/projects/tests/test_rest.py
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,10 @@ def test_project_list_search_filter_departments(request, api_client):
assert response.status_code == 200
assert len(response.data) == 2

response = api_client.get(f"{url}?departments=10&departments=33")
assert response.status_code == 200
assert len(response.data) == 1

# No department filter
response = api_client.get(f"{url}?search=niceproject")
assert response.status_code == 200
Expand Down
109 changes: 54 additions & 55 deletions recoco/apps/projects/views/rest.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,18 @@
from django.utils import timezone
from notifications import models as notifications_models
from rest_framework import permissions, status, viewsets
from rest_framework.filters import BaseFilterBackend, SearchFilter
from rest_framework.filters import BaseFilterBackend
from rest_framework.generics import ListAPIView
from rest_framework.response import Response
from rest_framework.settings import api_settings
from rest_framework.views import APIView
from watson import search as watson

from recoco import verbs
from recoco.rest_api.filters import TagsFilterbackend, VectorSearchFilter
from recoco.apps.projects.models import Project
from recoco.rest_api.filters import (
TagsFilterbackend,
VectorSearchFilter,
WatsonSearchFilter,
)
from recoco.rest_api.pagination import LargeResultsSetPagination
from recoco.utils import (
get_group_for_site,
Expand All @@ -53,21 +56,44 @@
########################################################################


class ProjectSearchFilter(SearchFilter):
search_param = api_settings.SEARCH_PARAM
template = "rest_framework/filters/search.html"
class ProjectDetail(APIView):
"""Retrieve a project"""

def filter_queryset(self, request, queryset, view):
keywords = request.query_params.get(self.search_param)
departments = request.query_params.getlist("departments", None)
permission_classes = [permissions.IsAuthenticated]

if keywords:
queryset = watson.filter(queryset, keywords)
def get_object(self, pk):
try:
return models.Project.on_site.get(pk=pk)
except models.Project.DoesNotExist as exc:
raise Http404 from exc

if departments:
queryset = queryset.filter(commune__department__code__in=departments)
def get(self, request, pk, format=None):
p = self.get_object(pk)
has_perm(request.user, "list_projects", request.site) or has_perm_or_403(
request.user, "view_project", p
)
context = {"request": request}
serializer = UserProjectSerializer(p, context=context)
return Response(serializer.data)

return queryset
def patch(self, request, pk, format=None):
p = self.get_object(pk)
has_perm(request.user, "list_projects", request.site) or has_perm_or_403(
request.user, "projects.change_location", p
) # need at least one write perm
context = {"request": request, "view": self, "format": format}
serializer = UserProjectSerializer(
p, context=context, data=request.data, partial=True
)
if serializer.is_valid():
# old = copy(p)
serializer.save()
# if new:
# signals.project_project_updated.send(
# sender=self, old_one=old, new_one=new
# )
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class ProjectActivityFilter(BaseFilterBackend):
Expand All @@ -78,7 +104,7 @@ class ProjectActivityFilter(BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
last_activity_days = request.GET.get("last_activity", None)

project_ct = ContentType.objects.get_for_model(models.Project)
project_ct = ContentType.objects.get_for_model(Project)

if last_activity_days:
try:
Expand Down Expand Up @@ -111,52 +137,25 @@ def filter_queryset(self, request, queryset, view):
return queryset


class ProjectDetail(APIView):
"""Retrieve a project"""

permission_classes = [permissions.IsAuthenticated]

def get_object(self, pk):
try:
return models.Project.on_site.get(pk=pk)
except models.Project.DoesNotExist as exc:
raise Http404 from exc

def get(self, request, pk, format=None):
p = self.get_object(pk)
has_perm(request.user, "list_projects", request.site) or has_perm_or_403(
request.user, "view_project", p
)
context = {"request": request}
serializer = UserProjectSerializer(p, context=context)
return Response(serializer.data)

def patch(self, request, pk, format=None):
p = self.get_object(pk)
has_perm(request.user, "list_projects", request.site) or has_perm_or_403(
request.user, "projects.change_location", p
) # need at least one write perm
context = {"request": request, "view": self, "format": format}
serializer = UserProjectSerializer(
p, context=context, data=request.data, partial=True
)
if serializer.is_valid():
# old = copy(p)
serializer.save()
# if new:
# signals.project_project_updated.send(
# sender=self, old_one=old, new_one=new
# )
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class DepartmentsFilter(BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
departments = request.GET.getlist("departments", None)
if departments:
queryset = queryset.filter(commune__department__code__in=departments)
return queryset


class ProjectList(ListAPIView):
"""List all user projects"""

permission_classes = [permissions.IsAuthenticated]
serializer_class = ProjectForListSerializer
filter_backends = [TagsFilterbackend, ProjectSearchFilter, ProjectActivityFilter]
filter_backends = [
TagsFilterbackend,
WatsonSearchFilter,
DepartmentsFilter,
ProjectActivityFilter,
]

def get_queryset(self):
return (
Expand Down

0 comments on commit b131ce6

Please sign in to comment.