diff --git a/generate.py b/generate.py index d5fde7a4a..999d0f2e2 100644 --- a/generate.py +++ b/generate.py @@ -24,6 +24,7 @@ import contribute import build_status +from visitors import get_number_of_visitors from completion import branches_from_devguide, get_completion, TranslatorsData from repositories import get_languages_and_repos, Language @@ -68,10 +69,12 @@ def get_project_data( built = language.code in languages_built if repo: completion, translators_data, branch, change = get_completion(clones_dir, repo) + visitors_num = get_number_of_visitors(language.code, http) if built else 0 else: completion = 0.0 translators_data = TranslatorsData(0, False) change = 0.0 + visitors_num = 0 branch = None return LanguageProjectData( language, @@ -80,6 +83,7 @@ def get_project_data( completion, change, translators_data, + visitors_num, built, in_switcher=languages_built.get(language.code), uses_platform=language.code in contribute.pulling_from_transifex, @@ -95,6 +99,7 @@ class LanguageProjectData: completion: float change: float translators: TranslatorsData + visitors: int built: bool in_switcher: bool | None uses_platform: bool diff --git a/style.css b/style.css index c9c7991e3..3a67a64ad 100644 --- a/style.css +++ b/style.css @@ -39,7 +39,7 @@ th { .progress-bar.low + .progress-bar-outer-label { display: inline-block; } -td[data-label="translators"] { +td[data-label="visitors"], td[data-label="translators"] { text-align: right; } td[data-label="completion"] { diff --git a/template.html.jinja b/template.html.jinja index 1986b2853..60e03569f 100644 --- a/template.html.jinja +++ b/template.html.jinja @@ -12,6 +12,7 @@ language switcher + visitors* translators completion @@ -29,6 +30,13 @@ {% endif %} + + {% if project.visitors %} + + {{ '{:,}'.format(project.visitors) }} + + {% endif %} + {% if project.translators.link %}{% endif %} {{ project.translators.number }} @@ -42,6 +50,7 @@ {% endfor %} +

* sum of daily unique visitors since 8 June 2024

For more information about translations, see the Python Developer’s Guide.

Last updated at {{ generation_time.strftime('%A, %-d %B %Y, %-H:%M:%S %Z') }} (in {{ duration // 60 }}:{{ "{:02}".format(duration % 60) }} minutes).

diff --git a/visitors.py b/visitors.py new file mode 100644 index 000000000..b631e87b6 --- /dev/null +++ b/visitors.py @@ -0,0 +1,21 @@ +import urllib.parse +from logging import info + +from urllib3 import PoolManager, Retry + + +def get_number_of_visitors(language: str, http: PoolManager) -> int: + params = urllib.parse.urlencode( + {'filters': f'[["contains","event:page",["/{language}/"]]]', 'period': 'all'} + ) + response = http.request( + 'GET', + f'https://plausible.io/api/stats/docs.python.org/top-stats/?{params}', + retries=Retry(status_forcelist=(500, 502), backoff_factor=1, backoff_jitter=1), + ) + info(f'visitors {response.status=} ({language=})') + return response.json()['top_stats'][0]['value'] + + +if __name__ == '__main__': + print(get_number_of_visitors('pl', PoolManager()))