From 1ccb3604a5b8ac9457cb9074d59af71a86b83634 Mon Sep 17 00:00:00 2001 From: Bibiana Cristofol Amat Date: Tue, 20 Jan 2026 09:25:38 +0000 Subject: [PATCH 1/4] cove_iati: templates: explore: update d-preview link https://github.com/OpenDataServices/cove/issues/1398 --- cove_iati/templates/cove_iati/explore.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cove_iati/templates/cove_iati/explore.html b/cove_iati/templates/cove_iati/explore.html index d387d1dc..60f49020 100644 --- a/cove_iati/templates/cove_iati/explore.html +++ b/cove_iati/templates/cove_iati/explore.html @@ -398,7 +398,7 @@

Share

Preview

Generate a private d-preview site with the IATI xml. For preview purposes only. Data will not be uploaded to the main live d-portal website.

-

Generate a d-preview

+

Generate a d-preview

{% comment %}Translators: Paragraph that describes the application{% endcomment %}

{% blocktrans %}After 7 days all uploaded data is deleted from our servers, and the results will no longer be available. Anyone using the link to this page after that will be shown a message that tells them the file has been removed.{% endblocktrans %}

@@ -423,7 +423,7 @@

Merge indicators by title

This function will merge together any indicators in the result block, that share the same title. No other data will be altered or changed. This function is designed for instances where multiple periods exist within the same result/indicator, but are not uniquely referenced in the IATI standard or CoVE spreadsheet.

{% if merge_indicator_output %}

Output (xml) {{ merge_indicator_output_file_size|filesizeformat }}

-

Generate a d-preview

+

Generate a d-preview

{% else %}

Run

{% endif %} From 9750c8f7257f5515613cbe8019afae852496e725 Mon Sep 17 00:00:00 2001 From: Bee Webb Date: Mon, 26 Jan 2026 12:05:44 +0000 Subject: [PATCH 2/4] requirements: Update all requirements --- requirements.txt | 112 ++++++++++++----------- requirements_dev.txt | 208 +++++++++++++++++++++++++------------------ 2 files changed, 177 insertions(+), 143 deletions(-) diff --git a/requirements.txt b/requirements.txt index db930ac3..ca16e218 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,35 +8,35 @@ # via -r requirements.in -e git+https://github.com/OpenDataServices/iati-utils.git@704fa589ad2d3743d3928dcbeeeb06a5e73f8437#egg=iatiutils # via -r requirements.in -asgiref==3.8.1 +asgiref==3.11.0 # via django -attrs==24.2.0 +attrs==25.4.0 # via # cattrs # jsonschema # referencing # requests-cache -backports-datetime-fromisoformat==2.0.1 +backports-datetime-fromisoformat==2.0.3 # via flattentool behave==1.2.5 # via bdd-tester -bleach==6.1.0 +bleach==6.3.0 # via -r requirements.in -btrees==6.0 +btrees==6.3 # via zodb -cached-property==1.5.2 +cached-property==2.0.1 # via -r requirements.in -cattrs==23.2.3 +cattrs==25.3.0 # via requests-cache -certifi==2024.7.4 +certifi==2026.1.4 # via # requests # sentry-sdk -cffi==1.17.0 +cffi==2.0.0 # via persistent -charset-normalizer==3.3.2 +charset-normalizer==3.4.4 # via requests -click==8.1.7 +click==8.3.1 # via iatiutils commonmark==0.9.1 # via -r requirements.in @@ -44,50 +44,52 @@ dealer==2.1.0 # via -r requirements.in defusedxml==0.7.1 # via odfpy -django==4.2.15 +django==4.2.27 # via # -r requirements.in # django-bootstrap3 # django-debug-toolbar # libcoveweb -django-bootstrap3==24.2 +django-bootstrap3==26.1 # via # -r requirements.in # libcoveweb -django-debug-toolbar==4.4.6 +django-debug-toolbar==6.2.0 # via -r requirements.in -django-environ==0.11.2 +django-environ==0.12.0 # via -r requirements.in -et-xmlfile==1.1.0 +et-xmlfile==2.0.0 # via openpyxl -flattentool==0.26.0 +flattentool==0.27.0 # via # -r requirements.in # libcove # libcoveweb -gunicorn==23.0.0 +gunicorn==24.1.1 # via -r requirements.in -idna==3.7 - # via requests -ijson==3.3.0 +idna==3.11 + # via + # requests + # url-normalize +ijson==3.4.0.post0 # via flattentool -json-merge-patch==0.2 +json-merge-patch==0.3.0 # via -r requirements.in jsonref==1.1.0 # via # flattentool # libcove -jsonschema==4.23.0 +jsonschema==4.26.0 # via # -r requirements.in # libcove -jsonschema-specifications==2023.12.1 +jsonschema-specifications==2025.9.1 # via jsonschema libcove==0.32.1 # via # -r requirements.in # libcoveweb -libcoveweb==0.30.4 +libcoveweb==0.31.1 # via -r requirements.in lxml==4.9.4 # via @@ -95,7 +97,7 @@ lxml==4.9.4 # bdd-tester # flattentool # iatiutils -markupsafe==2.1.5 +markupsafe==3.0.3 # via werkzeug odfpy==1.4.1 # via flattentool @@ -103,34 +105,34 @@ openpyxl==3.1.2 # via # -r requirements.in # flattentool -packaging==24.1 +packaging==26.0 # via gunicorn parse==1.20.2 # via # behave # parse-type -parse-type==0.6.2 +parse-type==0.6.6 # via behave -persistent==6.0 +persistent==6.5 # via # btrees # zodb -platformdirs==4.2.2 +platformdirs==4.5.1 # via requests-cache -pycparser==2.22 +pycparser==3.0 # via cffi python-dateutil==2.9.0.post0 # via -r requirements.in -pytz==2024.1 +pytz==2025.2 # via flattentool rangedict==0.1.7 # via -r requirements.in -referencing==0.35.1 +referencing==0.37.0 # via # jsonschema # jsonschema-specifications # libcove -requests==2.32.3 +requests==2.32.5 # via # -r requirements.in # bdd-tester @@ -146,63 +148,65 @@ rfc3987==1.3.8 # via # -r requirements.in # libcove -rpds-py==0.20.0 +rpds-py==0.30.0 # via # jsonschema # referencing -schema==0.7.7 +schema==0.7.8 # via flattentool -sentry-sdk==2.13.0 +sentry-sdk==2.50.0 # via -r requirements.in -six==1.16.0 +six==1.17.0 # via # bdd-tester # behave - # bleach # parse-type # python-dateutil # rfc3339-validator - # url-normalize -sqlparse==0.5.1 +sqlparse==0.5.5 # via # django # django-debug-toolbar strict-rfc3339==0.7 # via -r requirements.in -transaction==4.0 +transaction==5.0 # via zodb -url-normalize==1.4.3 +typing-extensions==4.15.0 + # via + # cattrs + # referencing +url-normalize==2.2.1 # via requests-cache -urllib3==2.2.2 +urllib3==2.6.3 # via # requests # requests-cache # sentry-sdk webencodings==0.5.1 # via bleach -werkzeug==3.0.4 +werkzeug==3.1.5 # via libcoveweb -xmltodict==0.13.0 +xmltodict==1.0.2 # via # -r requirements.in # flattentool -zc-lockfile==3.0.post1 +zc-lockfile==4.0 # via zodb zc-zlibstorage==1.2.0 # via flattentool -zconfig==4.1 +zconfig==4.3 # via zodb -zipp==3.20.0 +zipp==3.23.0 # via -r requirements.in -zodb==6.0 +zodb==6.2 # via # flattentool # zc-zlibstorage -zodbpickle==4.0 +zodbpickle==4.3 # via zodb -zope-deferredimport==5.0 +zope-deferredimport==6.0 # via persistent -zope-interface==7.0.1 +zope-interface==8.2 # via # btrees # persistent @@ -210,7 +214,7 @@ zope-interface==7.0.1 # zc-zlibstorage # zodb # zope-proxy -zope-proxy==5.3 +zope-proxy==7.1 # via zope-deferredimport # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements_dev.txt b/requirements_dev.txt index bb427b63..e4f34eea 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -8,61 +8,64 @@ # via -r requirements.txt -e git+https://github.com/OpenDataServices/iati-utils.git@704fa589ad2d3743d3928dcbeeeb06a5e73f8437#egg=iatiutils # via -r requirements.txt -alabaster==0.7.16 +accessible-pygments==0.0.5 + # via furo +alabaster==1.0.0 # via sphinx -asgiref==3.8.1 +asgiref==3.11.0 # via # -r requirements.txt # django -attrs==24.2.0 +async-generator==1.10 + # via trio-typing +attrs==25.4.0 # via # -r requirements.txt # cattrs - # hypothesis # jsonschema # outcome # referencing # requests-cache # trio -babel==2.16.0 +babel==2.17.0 # via sphinx -backports-datetime-fromisoformat==2.0.1 +backports-datetime-fromisoformat==2.0.3 # via # -r requirements.txt # flattentool -beautifulsoup4==4.12.3 +beautifulsoup4==4.14.3 # via furo behave==1.2.5 # via # -r requirements.txt # bdd-tester -bleach==6.1.0 +bleach==6.3.0 # via -r requirements.txt -btrees==6.0 +btrees==6.3 # via # -r requirements.txt # zodb -cached-property==1.5.2 +cached-property==2.0.1 # via -r requirements.txt -cattrs==23.2.3 +cattrs==25.3.0 # via # -r requirements.txt # requests-cache -certifi==2024.7.4 +certifi==2026.1.4 # via # -r requirements.txt # requests # selenium # sentry-sdk -cffi==1.17.0 +cffi==2.0.0 # via # -r requirements.txt # persistent -charset-normalizer==3.3.2 +charset-normalizer==3.4.4 # via # -r requirements.txt # requests -click==8.1.7 +click==8.3.1 # via # -r requirements.txt # iatiutils @@ -70,11 +73,11 @@ commonmark==0.9.1 # via # -r requirements.txt # recommonmark -coverage[toml]==7.6.1 +coverage[toml]==7.13.2 # via # coveralls # pytest-cov -coveralls==4.0.1 +coveralls==4.0.2 # via -r requirements_dev.in dealer==2.1.0 # via -r requirements.txt @@ -82,74 +85,77 @@ defusedxml==0.7.1 # via # -r requirements.txt # odfpy -django==4.2.15 +django==4.2.27 # via # -r requirements.txt # django-bootstrap3 # django-debug-toolbar # libcoveweb -django-bootstrap3==24.2 +django-bootstrap3==26.1 # via # -r requirements.txt # libcoveweb -django-debug-toolbar==4.4.6 +django-debug-toolbar==6.2.0 # via -r requirements.txt -django-environ==0.11.2 +django-environ==0.12.0 # via -r requirements.txt docopt==0.6.2 # via coveralls -docutils==0.20.1 +docutils==0.22.4 # via # recommonmark # sphinx -et-xmlfile==1.1.0 +et-xmlfile==2.0.0 # via # -r requirements.txt # openpyxl -execnet==2.1.1 +execnet==2.1.2 # via pytest-xdist -flake8==7.1.1 +flake8==7.3.0 # via -r requirements_dev.in -flattentool==0.26.0 +flattentool==0.27.0 # via # -r requirements.txt # libcove # libcoveweb -furo==2024.8.6 +furo==2025.12.19 # via odsc-default-sphinx-theme -gunicorn==23.0.0 +gunicorn==24.1.1 # via -r requirements.txt -h11==0.14.0 +h11==0.16.0 # via wsproto -hypothesis==6.111.1 +hypothesis==6.151.2 # via -r requirements_dev.in -idna==3.7 +idna==3.11 # via # -r requirements.txt # requests # trio -ijson==3.3.0 + # url-normalize +ijson==3.4.0.post0 # via # -r requirements.txt # flattentool imagesize==1.4.1 # via sphinx -iniconfig==2.0.0 +importlib-metadata==8.7.1 + # via trio-typing +iniconfig==2.3.0 # via pytest -jinja2==3.1.4 +jinja2==3.1.6 # via sphinx -json-merge-patch==0.2 +json-merge-patch==0.3.0 # via -r requirements.txt jsonref==1.1.0 # via # -r requirements.txt # flattentool # libcove -jsonschema==4.23.0 +jsonschema==4.26.0 # via # -r requirements.txt # libcove -jsonschema-specifications==2023.12.1 +jsonschema-specifications==2025.9.1 # via # -r requirements.txt # jsonschema @@ -157,7 +163,7 @@ libcove==0.32.1 # via # -r requirements.txt # libcoveweb -libcoveweb==0.30.4 +libcoveweb==0.31.1 # via -r requirements.txt libsass==0.23.0 # via -r requirements_dev.in @@ -167,82 +173,91 @@ lxml==4.9.4 # bdd-tester # flattentool # iatiutils -markupsafe==2.1.5 +markupsafe==3.0.3 # via # -r requirements.txt # jinja2 # werkzeug mccabe==0.7.0 # via flake8 +mypy-extensions==1.1.0 + # via trio-typing odfpy==1.4.1 # via # -r requirements.txt # flattentool -odsc-default-sphinx-theme==0.0.1 +odsc-default-sphinx-theme==0.1.1 # via -r requirements_dev.in openpyxl==3.1.2 # via # -r requirements.txt # flattentool outcome==1.3.0.post0 - # via trio -packaging==24.1 + # via + # trio + # trio-websocket +packaging==26.0 # via # -r requirements.txt # gunicorn # pytest # sphinx + # trio-typing parse==1.20.2 # via # -r requirements.txt # behave # parse-type -parse-type==0.6.2 +parse-type==0.6.6 # via # -r requirements.txt # behave -persistent==6.0 +persistent==6.5 # via # -r requirements.txt # btrees # zodb -platformdirs==4.2.2 +platformdirs==4.5.1 # via # -r requirements.txt # requests-cache -pluggy==1.5.0 - # via pytest -pycodestyle==2.12.1 +pluggy==1.6.0 + # via + # pytest + # pytest-cov +pycodestyle==2.14.0 # via flake8 -pycparser==2.22 +pycparser==3.0 # via # -r requirements.txt # cffi -pyflakes==3.2.0 +pyflakes==3.4.0 # via flake8 -pygments==2.18.0 +pygments==2.19.2 # via + # accessible-pygments # furo + # pytest # sphinx pysocks==1.7.1 # via urllib3 -pytest==8.3.2 +pytest==9.0.2 # via # -r requirements_dev.in # pytest-cov # pytest-django # pytest-xdist -pytest-cov==5.0.0 +pytest-cov==7.0.0 # via -r requirements_dev.in -pytest-django==4.8.0 +pytest-django==4.11.1 # via -r requirements_dev.in -pytest-localserver==0.9.0 +pytest-localserver==0.10.0 # via -r requirements_dev.in -pytest-xdist==3.6.1 +pytest-xdist==3.8.0 # via -r requirements_dev.in python-dateutil==2.9.0.post0 # via -r requirements.txt -pytz==2024.1 +pytz==2025.2 # via # -r requirements.txt # flattentool @@ -250,13 +265,13 @@ rangedict==0.1.7 # via -r requirements.txt recommonmark==0.7.1 # via -r requirements_dev.in -referencing==0.35.1 +referencing==0.37.0 # via # -r requirements.txt # jsonschema # jsonschema-specifications # libcove -requests==2.32.3 +requests==2.32.5 # via # -r requirements.txt # bdd-tester @@ -276,41 +291,41 @@ rfc3987==1.3.8 # via # -r requirements.txt # libcove -rpds-py==0.20.0 +roman-numerals==4.1.0 + # via sphinx +rpds-py==0.30.0 # via # -r requirements.txt # jsonschema # referencing -schema==0.7.7 +schema==0.7.8 # via # -r requirements.txt # flattentool -selenium==4.23.1 +selenium==4.40.0 # via -r requirements_dev.in -sentry-sdk==2.13.0 +sentry-sdk==2.50.0 # via -r requirements.txt -six==1.16.0 +six==1.17.0 # via # -r requirements.txt # bdd-tester # behave - # bleach # parse-type # python-dateutil # rfc3339-validator # transifex-client - # url-normalize sniffio==1.3.1 # via trio -snowballstemmer==2.2.0 +snowballstemmer==3.0.1 # via sphinx sortedcontainers==2.4.0 # via # hypothesis # trio -soupsieve==2.6 +soupsieve==2.8.3 # via beautifulsoup4 -sphinx==7.4.7 +sphinx==9.0.4 # via # -r requirements_dev.in # furo @@ -330,32 +345,45 @@ sphinxcontrib-qthelp==2.0.0 # via sphinx sphinxcontrib-serializinghtml==2.0.0 # via sphinx -sqlparse==0.5.1 +sqlparse==0.5.5 # via # -r requirements.txt # django # django-debug-toolbar strict-rfc3339==0.7 # via -r requirements.txt -transaction==4.0 +transaction==5.0 # via # -r requirements.txt # zodb transifex-client==0.12.5 # via -r requirements_dev.in -trio==0.26.2 +trio==0.32.0 # via # selenium + # trio-typing # trio-websocket -trio-websocket==0.11.1 +trio-typing==0.10.0 + # via selenium +trio-websocket==0.12.2 # via selenium -typing-extensions==4.12.2 +types-certifi==2021.10.8.3 # via selenium -url-normalize==1.4.3 +types-urllib3==1.26.25.14 + # via selenium +typing-extensions==4.15.0 + # via + # -r requirements.txt + # beautifulsoup4 + # cattrs + # referencing + # selenium + # trio-typing +url-normalize==2.2.1 # via # -r requirements.txt # requests-cache -urllib3[socks]==2.2.2 +urllib3[socks]==2.6.3 # via # -r requirements.txt # requests @@ -367,20 +395,20 @@ webencodings==0.5.1 # via # -r requirements.txt # bleach -websocket-client==1.8.0 +websocket-client==1.9.0 # via selenium -werkzeug==3.0.4 +werkzeug==3.1.5 # via # -r requirements.txt # libcoveweb # pytest-localserver -wsproto==1.2.0 +wsproto==1.3.2 # via trio-websocket -xmltodict==0.13.0 +xmltodict==1.0.2 # via # -r requirements.txt # flattentool -zc-lockfile==3.0.post1 +zc-lockfile==4.0 # via # -r requirements.txt # zodb @@ -388,26 +416,28 @@ zc-zlibstorage==1.2.0 # via # -r requirements.txt # flattentool -zconfig==4.1 +zconfig==4.3 # via # -r requirements.txt # zodb -zipp==3.20.0 - # via -r requirements.txt -zodb==6.0 +zipp==3.23.0 + # via + # -r requirements.txt + # importlib-metadata +zodb==6.2 # via # -r requirements.txt # flattentool # zc-zlibstorage -zodbpickle==4.0 +zodbpickle==4.3 # via # -r requirements.txt # zodb -zope-deferredimport==5.0 +zope-deferredimport==6.0 # via # -r requirements.txt # persistent -zope-interface==7.0.1 +zope-interface==8.2 # via # -r requirements.txt # btrees @@ -416,7 +446,7 @@ zope-interface==7.0.1 # zc-zlibstorage # zodb # zope-proxy -zope-proxy==5.3 +zope-proxy==7.1 # via # -r requirements.txt # zope-deferredimport From 18fac1224d6e315662d521b72be13abc49043144 Mon Sep 17 00:00:00 2001 From: Bee Webb Date: Mon, 26 Jan 2026 12:11:20 +0000 Subject: [PATCH 3/4] ci: Use headless firefox --- .github/workflows/test.yml | 2 ++ cove_iati/tests_functional.py | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 61efb887..bdee1d84 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,6 +19,8 @@ jobs: - name: Install Ubuntu Translation Libraries run: sudo apt install gettext - name: Test IATI + env: + BROWSER: FirefoxHeadless run: py.test -n 2 cove_iati --cov-append --cov - name: Migrate Database run: python manage.py migrate diff --git a/cove_iati/tests_functional.py b/cove_iati/tests_functional.py index 49751fc7..f5e41959 100644 --- a/cove_iati/tests_functional.py +++ b/cove_iati/tests_functional.py @@ -6,6 +6,7 @@ from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options +from selenium.webdriver.firefox.options import Options as FirefoxOptions BROWSER = os.environ.get('BROWSER', 'ChromeHeadless') CHROME_SNAP = bool(os.environ.get('CHROME_SNAP', False)) @@ -19,6 +20,10 @@ def browser(request): if CHROME_SNAP: options.add_argument("--remote-debugging-port=9222") browser = webdriver.Chrome(options=options) + elif BROWSER == 'FirefoxHeadless': + options = FirefoxOptions() + options.add_argument("-headless") + browser = webdriver.Firefox(options=options) else: browser = getattr(webdriver, BROWSER)() browser.implicitly_wait(3) From 9f442e65de8f2f975a63435b599b1a89478f31fd Mon Sep 17 00:00:00 2001 From: Bee Webb Date: Tue, 10 Mar 2026 14:58:56 +0000 Subject: [PATCH 4/4] Dockerfile: apt-get --assume-yes to prevent build from stalling --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 086fa62f..8af39a04 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,7 +19,7 @@ RUN git config --global --add safe.directory /app # Build our own copy of lxml using Ubuntu's libxml2/libxslt # (don't use the prebuilt wheel) # https://opendataservices.plan.io/issues/36790 -RUN apt install libxml2-dev libxslt-dev +RUN apt-get --assume-yes install libxml2-dev libxslt-dev RUN pip install --no-binary lxml -r requirements.txt RUN python manage.py collectstatic --noinput