Source code for akvo.rest.views.default_period

# -*- 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 django.core.exceptions import PermissionDenied
from django.db import transaction
from django.http import Http404
from rest_framework.decorators import api_view
from rest_framework.response import Response

from akvo.rsr.models import DefaultPeriod, Project
from ..serializers import DefaultPeriodSerializer
from ..viewsets import PublicProjectViewSet


[docs]class DefaultPeriodViewSet(PublicProjectViewSet): queryset = DefaultPeriod.objects.all().select_related('parent') serializer_class = DefaultPeriodSerializer
[docs]@api_view(['GET', 'POST']) def project_default_periods(request, project_pk): user = request.user try: project = Project.objects.get(id=project_pk) except Project.DoesNotExist: raise Http404 if not user.has_perm('rsr.change_project', project): raise PermissionDenied fields = 'period_start', 'period_end' periods = project.default_periods.values_list(*fields) if request.method == 'POST': existing_periods = set(map(tuple, periods)) new_periods = { (period['period_start'], period['period_end']) for period in request.data.get('periods', []) } with transaction.atomic(): # Delete periods for period_start, period_end in (existing_periods - new_periods): DefaultPeriod.objects.filter( project=project, period_start=period_start, period_end=period_end).delete() # Create new periods created = [ DefaultPeriod(project=project, period_start=period_start, period_end=period_end) for (period_start, period_end) in (new_periods - existing_periods) ] DefaultPeriod.objects.bulk_create(created) periods = project.default_periods.values_list(*fields) response = { 'periods': [ {'period_start': start.strftime('%Y-%m-%d'), 'period_end': end.strftime('%Y-%m-%d')} for (start, end) in periods ], 'project': project_pk } return Response(response, status=201)