Skip to content

Commit

Permalink
Merge branch 'WeblateOrg:main' into add-search-preview-4106
Browse files Browse the repository at this point in the history
  • Loading branch information
meel-hd authored Oct 3, 2024
2 parents eea451f + 72904fa commit 772f9ff
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 23 deletions.
2 changes: 2 additions & 0 deletions docs/user/translating.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
Expand Down
19 changes: 19 additions & 0 deletions weblate/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
28 changes: 5 additions & 23 deletions weblate/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@
LockRequestSerializer,
LockSerializer,
MemorySerializer,
MetricsSerializer,
MonolingualUnitSerializer,
NewUnitSerializer,
NotificationSerializer,
Expand All @@ -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
Expand All @@ -95,7 +95,6 @@
Component,
ComponentList,
Project,
Suggestion,
Translation,
Unit,
)
Expand All @@ -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
Expand All @@ -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

Expand Down Expand Up @@ -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):

Check failure on line 1902 in weblate/api/views.py

View workflow job for this annotation

GitHub Actions / API Lint

[Search]: unable to guess serializer. This is graceful fallback handling for APIViews. Consider using GenericAPIView as view base class, if view is under your control. Either way you may want to add a serializer_class (or method). Ignoring view for now.
Expand Down
47 changes: 47 additions & 0 deletions weblate/utils/stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 772f9ff

Please sign in to comment.