From a7b584bdf20604f6cc4c8b9fd7e11a5b82e9cb5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Espino?= Date: Wed, 26 Mar 2014 13:28:57 +0100 Subject: [PATCH] Bug#226: Now owners can be visualized on the users list of a project --- taiga/base/users/api.py | 15 +++++++++++++-- taiga/domains/serializers.py | 2 +- taiga/projects/api.py | 6 ++++-- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/taiga/base/users/api.py b/taiga/base/users/api.py index 6c28dcd3..2474b012 100644 --- a/taiga/base/users/api.py +++ b/taiga/base/users/api.py @@ -4,11 +4,13 @@ import uuid from django.db.models.loading import get_model from django.db.models import Q +from django.shortcuts import get_object_or_404 from django.contrib.auth import logout, login, authenticate from django.contrib.auth.models import Permission from django.utils.translation import ugettext_lazy as _ from rest_framework.response import Response +from rest_framework.filters import BaseFilterBackend from rest_framework.permissions import IsAuthenticated, AllowAny from rest_framework import status, viewsets @@ -16,12 +18,21 @@ from djmail.template_mail import MagicMailBuilder from taiga.base.decorators import list_route, action from taiga.base import exceptions as exc -from taiga.base.filters import FilterBackend from taiga.base.api import ModelCrudViewSet, RetrieveModelMixin, ModelListViewSet from .models import User, Role from .serializers import UserSerializer, RecoverySerializer, PermissionSerializer +class MembersFilterBackend(BaseFilterBackend): + def filter_queryset(self, request, queryset, view): + project_id = request.QUERY_PARAMS.get('project', None) + if project_id: + Project = get_model('projects', 'Project') + project = get_object_or_404(Project, pk=project_id) + return queryset.filter(Q(memberships__project=project) | Q(id=project.owner.id)).distinct() + else: + return queryset + class PermissionsViewSet(ModelListViewSet): permission_classes = (IsAuthenticated,) serializer_class = PermissionSerializer @@ -51,7 +62,7 @@ class UsersViewSet(ModelCrudViewSet): permission_classes = (IsAuthenticated,) serializer_class = UserSerializer queryset = User.objects.all() - filter_fields = [("project", "memberships__project__pk")] + filter_backends = (MembersFilterBackend,) def pre_conditions_on_save(self, obj): if not self.request.user.is_superuser and obj.id != self.request.user.id: diff --git a/taiga/domains/serializers.py b/taiga/domains/serializers.py index 51ff718c..229cd292 100644 --- a/taiga/domains/serializers.py +++ b/taiga/domains/serializers.py @@ -26,7 +26,7 @@ class DomainSerializer(serializers.ModelSerializer): fields = ('public_register', 'default_language', "projects") def get_projects(self, obj): - return map(lambda x: {"id": x.id, "name": x.name, "slug": x.slug}, obj.projects.all().order_by('name')) + return map(lambda x: {"id": x.id, "name": x.name, "slug": x.slug, "owner": x.owner.id}, obj.projects.all().order_by('name')) class DomainMemberSerializer(serializers.ModelSerializer): diff --git a/taiga/projects/api.py b/taiga/projects/api.py index a38ab7bd..35428ab1 100644 --- a/taiga/projects/api.py +++ b/taiga/projects/api.py @@ -43,7 +43,8 @@ class ProjectAdminViewSet(ModelCrudViewSet): return domain.projects.all() def pre_save(self, obj): - obj.owner = self.request.user + if not obj.id: + obj.owner = self.request.user # TODO REFACTOR THIS if not obj.id: @@ -92,7 +93,8 @@ class ProjectViewSet(ModelCrudViewSet): return qs.distinct() def pre_save(self, obj): - obj.owner = self.request.user + if not obj.id: + obj.owner = self.request.user # FIXME