digitalfabrik/integreat-cms

View on GitHub
integreat_cms/cms/views/statistics/statistics_actions.py

Summary

Maintainability
A
0 mins
Test Coverage
F
35%
"""
This module contains view actions related to pages.
"""

from __future__ import annotations

import asyncio
import logging
from datetime import date, timedelta
from typing import TYPE_CHECKING

from django.http import JsonResponse
from django.views.decorators.http import require_POST

from ....matomo_api.matomo_api_client import MatomoException
from ...decorators import permission_required
from ...forms import StatisticsFilterForm

if TYPE_CHECKING:
    from django.http import HttpRequest

logger = logging.getLogger(__name__)


@permission_required("cms.view_statistics")
# pylint: disable=unused-argument
def get_total_visits_ajax(request: HttpRequest, region_slug: str) -> JsonResponse:
    """
    Aggregates the total API hits of the last 14 days and renders a Widget for the Dashboard.

    :param request: The current request
    :param region_slug: The slug of the current region
    :return: A JSON with all API-Hits of the last 2 weeks
    """

    region = request.region

    if not region.statistics_enabled:
        return JsonResponse(
            {"error": "Statistics are not enabled for this region."}, status=500
        )

    start_date = date.today() - timedelta(days=15)
    end_date = date.today() - timedelta(days=1)

    try:
        result = region.statistics.get_total_visits(
            start_date=start_date, end_date=end_date
        )
        return JsonResponse(result)
    except asyncio.TimeoutError:
        return JsonResponse(
            {"error": "Timeout during request to Matomo API"}, status=504
        )
    except MatomoException as e:
        logger.exception(e)
        return JsonResponse(
            {"error": "The request to the Matomo API failed."}, status=500
        )


@require_POST
# pylint: disable=unused-argument
def get_visits_per_language_ajax(
    request: HttpRequest, region_slug: str
) -> JsonResponse:
    """
    Ajax method to request the app hits for a certain timerange distinguished by languages.

    :param request: The current request
    :param region_slug: The slug of the current region
    :return: A JSON with all API-Hits of the requested time period
    """

    region = request.region

    if not region.statistics_enabled:
        return JsonResponse(
            {"error": "Statistics are not enabled for this region."}, status=500
        )

    statistics_form = StatisticsFilterForm(data=request.POST)

    if not statistics_form.is_valid():
        return JsonResponse(
            {"errors": statistics_form.errors},
            status=400,
        )

    try:
        result = region.statistics.get_visits_per_language(
            start_date=statistics_form.cleaned_data["start_date"],
            end_date=statistics_form.cleaned_data["end_date"],
            period=statistics_form.cleaned_data["period"],
        )
        return JsonResponse(result, safe=False)
    except asyncio.TimeoutError:
        return JsonResponse(
            {"error": "Timeout during request to Matomo API"}, status=504
        )
    except MatomoException as e:
        logger.exception(e)
        return JsonResponse(
            {"error": "The request to the Matomo API failed."}, status=500
        )