Source code for akvo.rest.views.project_hierarchy

# -*- coding: utf-8 -*-

# Akvo RSR is covered by the GNU Affero General Public License.
# See more details in the license.txt file located at the root folder of the Akvo RSR module.
# For additional details on the GNU license please see < http://www.gnu.org/licenses/agpl.html >.

from akvo.rsr.models import ProjectHierarchy, Project
from ..serializers import ProjectHierarchySerializer, ProjectUpdateSerializer
from ..viewsets import PublicProjectViewSet
from ..pagination import StandardSizePageNumberPagination
from django.shortcuts import get_object_or_404
from rest_framework.decorators import api_view
from rest_framework.response import Response


[docs]class RawProjectHierarchyViewSet(PublicProjectViewSet): queryset = ProjectHierarchy.objects.all() serializer_class = ProjectHierarchySerializer project_relation = 'root_project__'
[docs]@api_view(['GET']) def program_countries(request, program_pk): program = get_object_or_404(ProjectHierarchy, root_project=program_pk) root = program.root_project descendant_ids = root.descendants().values_list('id', flat=True) queryset = Project.objects\ .prefetch_related('primary_location__country')\ .filter(id__in=descendant_ids)\ .exclude(primary_location__country__isnull=True)\ .values_list('primary_location__country__iso_code', flat=True)\ .distinct() country_codes = set(queryset) return Response(sorted({code.upper() for code in country_codes if code}))
[docs]@api_view(['GET']) def program_updates(request, program_pk): program = get_object_or_404(ProjectHierarchy, root_project=program_pk) queryset = program.descendants.published().all_updates() paginator = StandardSizePageNumberPagination() page = paginator.paginate_queryset(queryset, request) if page is not None: serializer = ProjectUpdateSerializer(page, many=True, context=dict(request=request)) return paginator.get_paginated_response(serializer.data) serializer = ProjectUpdateSerializer(queryset, many=True, context=dict(request=request)) return Response(serializer.data)