diff --git a/docs/user/translating.rst b/docs/user/translating.rst index b7a28d4fffd6..228e8c4b96f0 100644 --- a/docs/user/translating.rst +++ b/docs/user/translating.rst @@ -4,8 +4,10 @@ Translating using Weblate Thank you for your interest in translating with Weblate! Generally, there are two most used modes of translation: + * Project accepts direct translations * Project accepts the suggestions made by users. + Sometimes, anonymous suggestions are accepted as well. There are more translation workflows detailed in :ref:`workflows`. diff --git a/weblate/api/serializers.py b/weblate/api/serializers.py index 115cd09810f3..379cb1235de0 100644 --- a/weblate/api/serializers.py +++ b/weblate/api/serializers.py @@ -1491,3 +1491,22 @@ def save(self, **kwargs): result = super().save(**kwargs) self.instance.addon.post_configure() return result + + +class MetricsSerializer(ReadOnlySerializer): + units = serializers.IntegerField(source="all") + units_translated = serializers.IntegerField(source="translated") + users = serializers.IntegerField(source="get_users") + changes = serializers.IntegerField(source="total_changes") + projects = serializers.IntegerField(source="get_projects") + components = serializers.IntegerField(source="get_components") + translations = serializers.IntegerField(source="get_translations") + + languages = serializers.IntegerField(source="get_languages") + checks = serializers.IntegerField(source="get_checks") + configuration_errors = serializers.IntegerField(source="get_configuration_errors") + suggestions = serializers.IntegerField(source="get_suggestions") + celery_queues = serializers.DictField( + child=serializers.IntegerField(), source="get_celery_queues" + ) + name = serializers.CharField(source="get_name") diff --git a/weblate/api/views.py b/weblate/api/views.py index f64d8620ab90..5631197d4258 100644 --- a/weblate/api/views.py +++ b/weblate/api/views.py @@ -64,6 +64,7 @@ LockRequestSerializer, LockSerializer, MemorySerializer, + MetricsSerializer, MonolingualUnitSerializer, NewUnitSerializer, NotificationSerializer, @@ -82,7 +83,6 @@ get_reverse_kwargs, ) from weblate.auth.models import AuthenticatedHttpRequest, Group, Role, User -from weblate.checks.models import Check from weblate.formats.models import EXPORTERS from weblate.lang.models import Language from weblate.memory.models import Memory @@ -95,7 +95,6 @@ Component, ComponentList, Project, - Suggestion, Translation, Unit, ) @@ -107,7 +106,7 @@ ) from weblate.trans.views.files import download_multi from weblate.trans.views.reports import generate_credits -from weblate.utils.celery import get_queue_stats, get_task_progress +from weblate.utils.celery import get_task_progress from weblate.utils.docs import get_doc_url from weblate.utils.errors import report_error from weblate.utils.lock import WeblateLockTimeoutError @@ -120,7 +119,6 @@ ) from weblate.utils.stats import GlobalStats from weblate.utils.views import download_translation_file, zip_download -from weblate.wladmin.models import ConfigurationError from .renderers import OpenMetricsRenderer @@ -1893,28 +1891,12 @@ class Metrics(APIView): permission_classes = (IsAuthenticated,) renderer_classes = (JSONRenderer, BrowsableAPIRenderer, OpenMetricsRenderer) + serializer_class = MetricsSerializer def get(self, request: Request, format=None): # noqa: A002 stats = GlobalStats() - return Response( - { - "units": stats.all, - "units_translated": stats.translated, - "users": User.objects.count(), - "changes": stats.total_changes, - "projects": Project.objects.count(), - "components": Component.objects.count(), - "translations": Translation.objects.count(), - "languages": stats.languages, - "checks": Check.objects.count(), - "configuration_errors": ConfigurationError.objects.filter( - ignored=False - ).count(), - "suggestions": Suggestion.objects.count(), - "celery_queues": get_queue_stats(), - "name": settings.SITE_TITLE, - } - ) + serializer = self.serializer_class(stats) + return Response(serializer.data) class Search(APIView): diff --git a/weblate/utils/stats.py b/weblate/utils/stats.py index a050a6e16895..bcb6703c5ec3 100644 --- a/weblate/utils/stats.py +++ b/weblate/utils/stats.py @@ -1293,6 +1293,53 @@ def get_language_stats(self): for language in Language.objects.have_translation() ) + # The following fields are used in MetricsSerializer in API + def get_languages(self): + return Language.objects.count() + + def get_users(self): + from weblate.auth.models import User + + return User.objects.count() + + def get_projects(self): + from weblate.trans.models import Project + + return Project.objects.count() + + def get_components(self): + from weblate.trans.models import Component + + return Component.objects.count() + + def get_translations(self): + from weblate.trans.models import Translation + + return Translation.objects.count() + + def get_checks(self): + from weblate.checks.models import Check + + return Check.objects.count() + + def get_configuration_errors(self): + from weblate.wladmin.models import ConfigurationError + + return ConfigurationError.objects.filter(ignored=False).count() + + def get_suggestions(self): + from weblate.trans.models import Suggestion + + return Suggestion.objects.count() + + def get_celery_queues(self): + from weblate.utils.celery import get_queue_stats + + return get_queue_stats() + + def get_name(self): + return settings.SITE_TITLE + class GhostStats(BaseStats): basic_keys = SOURCE_KEYS