From e1c9eaf22a8d5909f8b71002271c92d06d935ecb Mon Sep 17 00:00:00 2001 From: Maciej Olko Date: Thu, 20 Feb 2025 11:28:37 +0100 Subject: [PATCH 1/4] Revert "Remove visitors tracking (#69)" This reverts commit db8166094b1c3cc4a633a8ba27fb730fbccb33aa. --- generate.py | 6 ++++++ style.css | 2 +- template.html.jinja | 11 +++++++++++ visitors.py | 29 +++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 visitors.py diff --git a/generate.py b/generate.py index d5fde7a4a..48b989194 100644 --- a/generate.py +++ b/generate.py @@ -4,6 +4,7 @@ # "gitpython", # "potodo", # "jinja2", +# "requests", # "docutils", # ] # /// @@ -24,6 +25,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 +70,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 +84,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 +100,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..60129a321 100644 --- a/template.html.jinja +++ b/template.html.jinja @@ -12,6 +12,7 @@ language switcher + visitors* translators completion @@ -29,6 +30,15 @@ {% endif %} + + {% if project.built %} + + {{ '{:,}'.format(project.visitors) }} + + {% else %} + {{ '{:,}'.format(project.visitors) }} + {% endif %} + {% if project.translators.link %}{% endif %} {{ project.translators.number }} @@ -42,6 +52,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..bae81f728 --- /dev/null +++ b/visitors.py @@ -0,0 +1,29 @@ +import csv +import io +import urllib.parse +import zipfile +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/docs.python.org/export?{params}', + retries=Retry(status_forcelist=(404, 500, 502)), + ) + info(f'visitors {response.status=} ({language=})') + with ( + zipfile.ZipFile(io.BytesIO(response.data), 'r') as z, + z.open('visitors.csv') as csv_file, + ): + csv_reader = csv.DictReader(io.TextIOWrapper(csv_file)) + return sum(int(row['visitors']) for row in csv_reader) + + +if __name__ == '__main__': + print(get_number_of_visitors('pl', PoolManager())) From d7e18ee1c473d3350cf095d1afcfa2be6f246e4b Mon Sep 17 00:00:00 2001 From: Maciej Olko Date: Thu, 20 Feb 2025 11:47:39 +0100 Subject: [PATCH 2/4] Use top-stats endpoint --- visitors.py | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/visitors.py b/visitors.py index bae81f728..b631e87b6 100644 --- a/visitors.py +++ b/visitors.py @@ -1,7 +1,4 @@ -import csv -import io import urllib.parse -import zipfile from logging import info from urllib3 import PoolManager, Retry @@ -13,16 +10,11 @@ def get_number_of_visitors(language: str, http: PoolManager) -> int: ) response = http.request( 'GET', - f'https://plausible.io/docs.python.org/export?{params}', - retries=Retry(status_forcelist=(404, 500, 502)), + 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=})') - with ( - zipfile.ZipFile(io.BytesIO(response.data), 'r') as z, - z.open('visitors.csv') as csv_file, - ): - csv_reader = csv.DictReader(io.TextIOWrapper(csv_file)) - return sum(int(row['visitors']) for row in csv_reader) + return response.json()['top_stats'][0]['value'] if __name__ == '__main__': From 3a6919bb9e329519edc90ac917f3e706e426fe02 Mon Sep 17 00:00:00 2001 From: Maciej Olko Date: Thu, 20 Feb 2025 11:49:33 +0100 Subject: [PATCH 3/4] Remove not used dependency --- generate.py | 1 - 1 file changed, 1 deletion(-) diff --git a/generate.py b/generate.py index 48b989194..999d0f2e2 100644 --- a/generate.py +++ b/generate.py @@ -4,7 +4,6 @@ # "gitpython", # "potodo", # "jinja2", -# "requests", # "docutils", # ] # /// From 96736feacfc502f55c7c20ee189b9b5d8077ccfe Mon Sep 17 00:00:00 2001 From: Maciej Olko Date: Thu, 20 Feb 2025 12:01:50 +0100 Subject: [PATCH 4/4] Skip zeros in visitors column --- template.html.jinja | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/template.html.jinja b/template.html.jinja index 60129a321..60e03569f 100644 --- a/template.html.jinja +++ b/template.html.jinja @@ -31,12 +31,10 @@ {% endif %} - {% if project.built %} + {% if project.visitors %} {{ '{:,}'.format(project.visitors) }} - {% else %} - {{ '{:,}'.format(project.visitors) }} {% endif %}