From 537366b9d4bfa459fc5dfd4a24308ed0bb848fa0 Mon Sep 17 00:00:00 2001 From: Olivier Leger Date: Fri, 18 Nov 2022 11:59:09 -0500 Subject: [PATCH] Calculate all time submission count from counter model --- kpi/deployment_backends/base_backend.py | 5 +++++ kpi/deployment_backends/kobocat_backend.py | 20 +++++++++++++++++--- kpi/deployment_backends/mock_backend.py | 11 +++++++++++ kpi/serializers/v2/service_usage.py | 2 +- kpi/views/v2/service_usage.py | 3 --- 5 files changed, 34 insertions(+), 7 deletions(-) diff --git a/kpi/deployment_backends/base_backend.py b/kpi/deployment_backends/base_backend.py index 759aa43c8d..69cc339894 100644 --- a/kpi/deployment_backends/base_backend.py +++ b/kpi/deployment_backends/base_backend.py @@ -39,6 +39,11 @@ def __init__(self, asset): def active(self): return self.get_data('active', False) + @property + @abc.abstractmethod + def all_time_submission_count(self): + pass + @property @abc.abstractmethod def attachment_storage_bytes(self): diff --git a/kpi/deployment_backends/kobocat_backend.py b/kpi/deployment_backends/kobocat_backend.py index 62f407f1c1..1a370ce008 100644 --- a/kpi/deployment_backends/kobocat_backend.py +++ b/kpi/deployment_backends/kobocat_backend.py @@ -1,5 +1,4 @@ # coding: utf-8 - import copy import io import json @@ -11,7 +10,6 @@ from typing import Generator, Optional, Union from urllib.parse import urlparse from xml.etree import ElementTree as ET - try: from zoneinfo import ZoneInfo except ImportError: @@ -22,6 +20,7 @@ from django.core.exceptions import ImproperlyConfigured from lxml import etree from django.core.files import File +from django.db.models import Sum from django.db.models.query import QuerySet from django.utils import timezone from django.utils.translation import gettext_lazy as t @@ -75,7 +74,6 @@ from kobo.apps.subsequences.utils import stream_with_extras - class KobocatDeploymentBackend(BaseDeploymentBackend): """ Used to deploy a project into KoBoCAT. Stores the project identifiers in the @@ -97,6 +95,22 @@ class KobocatDeploymentBackend(BaseDeploymentBackend): r'[a-z\d]{8}-([a-z\d]{4}-){3}[a-z\d]{12}' ) + @property + def all_time_submission_count(self): + try: + xform_id = self.xform_id + except InvalidXFormException: + return 0 + + result = ReadOnlyKobocatMonthlyXFormSubmissionCounter.objects.filter( + xform_id=xform_id + ).aggregate(Sum('counter')) + + if count := result['counter__sum']: + return count + + return 0 + @property def attachment_storage_bytes(self): try: diff --git a/kpi/deployment_backends/mock_backend.py b/kpi/deployment_backends/mock_backend.py index c25df42cea..934ef66abf 100644 --- a/kpi/deployment_backends/mock_backend.py +++ b/kpi/deployment_backends/mock_backend.py @@ -54,6 +54,15 @@ class MockDeploymentBackend(BaseDeploymentBackend): 'meta', ] + @property + def all_time_submission_count(self): + # FIXME, does not reproduce KoBoCAT behaviour. + # Deleted submissions are not taken into account but they should be + monthly_counter = len( + self.get_submissions(self.asset.owner) + ) + return monthly_counter + @property def attachment_storage_bytes(self): submissions = self.get_submissions(self.asset.owner) @@ -146,6 +155,8 @@ def connect(self, active=False): @property def current_month_submission_count(self): + # FIXME, does not reproduce KoBoCAT behaviour. + # Deleted submissions are not taken into account but they should be monthly_counter = len( self.get_submissions(self.asset.owner) ) diff --git a/kpi/serializers/v2/service_usage.py b/kpi/serializers/v2/service_usage.py index aa42d9293e..a7f6254d91 100644 --- a/kpi/serializers/v2/service_usage.py +++ b/kpi/serializers/v2/service_usage.py @@ -37,7 +37,7 @@ def get_submission_count_all_time(self, asset): if not asset.has_deployment: return 0 - return asset.deployment.submission_count + return asset.deployment.all_time_submission_count def get_storage_bytes(self, asset): # Get value from asset deployment (if it has deployment) diff --git a/kpi/views/v2/service_usage.py b/kpi/views/v2/service_usage.py index 80beb68353..6d0dbd8dfe 100644 --- a/kpi/views/v2/service_usage.py +++ b/kpi/views/v2/service_usage.py @@ -1,14 +1,11 @@ # coding: utf-8 from rest_framework import ( - mixins, renderers, - serializers, viewsets, ) from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response -from kpi.models import Asset from kpi.serializers.v2.service_usage import ServiceUsageSerializer from kpi.utils.object_permission import get_database_user