Skip to content

Commit 2d52602

Browse files
authored
Feat/update dependencies (#204)
Update to SQLAlchemy 1.4. Part of PnX-SI/GeoNature#2751
1 parent 2adb037 commit 2d52602

File tree

13 files changed

+112
-112
lines changed

13 files changed

+112
-112
lines changed

.github/workflows/pytest.yml

Lines changed: 70 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,23 @@ on:
1616

1717
jobs:
1818
build:
19-
2019
runs-on: ubuntu-latest
2120

2221
strategy:
2322
fail-fast: false
2423
matrix:
24+
debian-version: ["11", "12"]
2525
include:
26-
- name: "Debian 10"
27-
python-version: "3.7"
28-
postgres-version: 11
29-
postgis-version: 2.5
30-
- name: "Debian 11"
26+
- debian-version: "11"
3127
python-version: "3.9"
3228
postgres-version: 13
3329
postgis-version: 3.2
30+
- debian-version: "12"
31+
python-version: "3.9"
32+
postgres-version: 15
33+
postgis-version: 3.3
3434

35-
name: ${{ matrix.name }}
35+
name: Debian ${{ matrix.debian-version }}
3636

3737
services:
3838
postgres:
@@ -59,68 +59,66 @@ jobs:
5959
--health-retries 5
6060
6161
steps:
62-
- name: Add postgis_raster database extension
63-
if: ${{ matrix.postgis-version >= 3 }}
64-
run: |
65-
psql -h localhost -U geonatadmin -d geonature2db -tc 'CREATE EXTENSION "postgis_raster";'
66-
env:
67-
PGPASSWORD: geonatpasswd
68-
- name: Add database extensions
69-
run: |
70-
psql -h localhost -U geonatadmin -d geonature2db -tc 'CREATE EXTENSION "hstore";'
71-
psql -h localhost -U geonatadmin -d geonature2db -tc 'CREATE EXTENSION "uuid-ossp";'
72-
psql -h localhost -U geonatadmin -d geonature2db -tc 'CREATE EXTENSION "pg_trgm";'
73-
psql -h localhost -U geonatadmin -d geonature2db -tc 'CREATE EXTENSION "unaccent";'
74-
env:
75-
PGPASSWORD: geonatpasswd
76-
- uses: actions/checkout@v2
77-
with:
78-
submodules: recursive
79-
- name: Set up Python ${{ matrix.python-version }}
80-
uses: actions/setup-python@v2
81-
with:
82-
python-version: ${{ matrix.python-version }}
83-
- name: Install GDAL
84-
run: |
85-
sudo apt update
86-
sudo apt install -y libgdal-dev
87-
- name: Install dependencies
88-
run: |
89-
python -m pip install --upgrade pip
90-
python -m pip install \
91-
-e ..[tests] \
92-
-r requirements-dev.txt
93-
working-directory: ./dependencies/GeoNature/backend
94-
- name: Install database
95-
run: |
96-
geonature db upgrade geonature@head -x local-srid=2154
97-
geonature db autoupgrade -x local-srid=2154
98-
geonature taxref import-v15 --skip-bdc-statuts
99-
geonature db upgrade geonature-samples@head
100-
geonature db upgrade nomenclatures_taxonomie_data@head
101-
geonature db upgrade ref_geo_fr_departments@head
102-
geonature db upgrade ref_geo_fr_municipalities@head
103-
geonature db upgrade ref_geo_inpn_grids_10@head
104-
env:
105-
GEONATURE_CONFIG_FILE: dependencies/GeoNature/config/test_config.toml
106-
- name: Install export module backend
107-
run: |
108-
pip install \
109-
--editable . \
110-
--editable file:dependencies/Utils-Flask-SQLAlchemy#egg=utils-flask-sqlalchemy \
111-
--editable file:dependencies/Utils-Flask-SQLAlchemy-Geo#egg=utils-flask-sqlalchemy-geo
112-
- name: Install import module database
113-
run: |
114-
geonature upgrade-modules-db EXPORTS
115-
env:
116-
GEONATURE_CONFIG_FILE: dependencies/GeoNature/config/test_config.toml
117-
- name: Test with pytest
118-
run: |
119-
pytest -v --cov --cov-report xml
120-
env:
121-
GEONATURE_CONFIG_FILE: dependencies/GeoNature/config/test_config.toml
122-
- name: Upload coverage to Codecov
123-
if: ${{ matrix.name == 'Debian 11' }}
124-
uses: codecov/codecov-action@v2
125-
with:
126-
flags: pytest
62+
- name: Add postgis_raster database extension
63+
if: ${{ matrix.postgis-version >= 3 }}
64+
run: |
65+
psql -h localhost -U geonatadmin -d geonature2db -tc 'CREATE EXTENSION "postgis_raster";'
66+
env:
67+
PGPASSWORD: geonatpasswd
68+
- name: Add database extensions
69+
run: |
70+
psql -h localhost -U geonatadmin -d geonature2db -tc 'CREATE EXTENSION "hstore";'
71+
psql -h localhost -U geonatadmin -d geonature2db -tc 'CREATE EXTENSION "uuid-ossp";'
72+
psql -h localhost -U geonatadmin -d geonature2db -tc 'CREATE EXTENSION "pg_trgm";'
73+
psql -h localhost -U geonatadmin -d geonature2db -tc 'CREATE EXTENSION "unaccent";'
74+
env:
75+
PGPASSWORD: geonatpasswd
76+
- uses: actions/checkout@v2
77+
with:
78+
submodules: recursive
79+
- name: Set up Python ${{ matrix.python-version }}
80+
uses: actions/setup-python@v2
81+
with:
82+
python-version: ${{ matrix.python-version }}
83+
- name: Install GDAL
84+
run: |
85+
sudo apt update
86+
sudo apt install -y libgdal-dev
87+
- name: Install dependencies
88+
run: |
89+
python -m pip install --upgrade pip
90+
python -m pip install \
91+
-e ..[tests] \
92+
-r requirements-dev.txt
93+
working-directory: ./dependencies/GeoNature/backend
94+
- name: Install database
95+
run: |
96+
geonature db upgrade geonature@head -x local-srid=2154
97+
geonature db autoupgrade -x local-srid=2154
98+
geonature taxref import-v15 --skip-bdc-statuts
99+
geonature db upgrade geonature-samples@head
100+
geonature db upgrade nomenclatures_taxonomie_data@head
101+
geonature db upgrade ref_geo_fr_departments@head
102+
geonature db upgrade ref_geo_fr_municipalities@head
103+
geonature db upgrade ref_geo_inpn_grids_10@head
104+
env:
105+
GEONATURE_CONFIG_FILE: dependencies/GeoNature/config/test_config.toml
106+
- name: Install export module backend
107+
run: |
108+
pip install -r requirements-dev.in
109+
pip install .
110+
- name: Install import module database
111+
run: |
112+
geonature upgrade-modules-db EXPORTS
113+
env:
114+
GEONATURE_CONFIG_FILE: dependencies/GeoNature/config/test_config.toml
115+
- name: Test with pytest
116+
run: |
117+
pytest -v --cov --cov-report xml
118+
env:
119+
GEONATURE_CONFIG_FILE: dependencies/GeoNature/config/test_config.toml
120+
- name: Upload coverage to Codecov
121+
if: ${{ matrix.name == 'Debian 11' }}
122+
uses: codecov/codecov-action@v2
123+
with:
124+
flags: pytest

backend/gn_module_export/admin.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
from flask import Markup, current_app, flash
1+
from flask import current_app, flash
2+
from markupsafe import Markup
23
from flask_admin.babel import gettext
34
from flask_admin.contrib.sqla import ModelView
45
from flask_admin.helpers import is_form_submitted

backend/gn_module_export/blueprint.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ def get_one_export_api(id_export):
217217
offset : numéro de page
218218
token : clé de l'API permettant de se passer de la connexion via un
219219
cookie. Peut aussi être transmis dans un entête HTTP
220-
`Authorization: Bearer <token>`.
220+
`AuthorizationExport: Bearer <token>`.
221221
222222
FILTRES :
223223
nom_col=val: Si nom_col fait partie des colonnes
@@ -265,15 +265,16 @@ def get_one_export_api(id_export):
265265
token = request.args.get("token", default=None, type=str)
266266

267267
# Try to extract token from Bearer Authorization HTTP Header
268-
bearer = request.headers.get("Authorization", default=None, type=str)
269-
if token is None and bearer is not None:
270-
token = bearer.lstrip("Bearer ")
268+
headerToken = request.headers.get("api-key", default=None, type=str)
269+
if not token and headerToken:
270+
token = headerToken
271271

272272
user = g.current_user
273273

274-
export = Export.query.get_or_404(id_export)
274+
export = DB.get_or_404(Export, id_export)
275+
275276
scope = None
276-
if user:
277+
if user.is_authenticated:
277278
scope = get_scopes_by_action(user.id_role, "EXPORTS")["R"]
278279
if not export.has_instance_permission(user=user, token=token, scope=scope):
279280
raise Forbidden

backend/gn_module_export/commands.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
ExportGenerationNotNeeded,
1717
ExportRequest,
1818
)
19+
from geonature.utils.env import db
1920

2021

2122
@click.command()
@@ -38,30 +39,33 @@ def generate(export_id, export_format, user_id, skip_newer_than):
3839
"""
3940
scheduled_export = None
4041
user = None
41-
4242
if user_id:
43-
user = User.query.get(user_id)
43+
user = db.session.get(User, user_id)
4444
if not user:
4545
raise ClickException(f"User {user_id} not found.")
4646
else:
4747
# If not user_id => scheduled
48+
print(1)
4849
scheduled_export = (
4950
ExportSchedules.query.filter(ExportSchedules.id_export == export_id)
5051
.filter(ExportSchedules.format == export_format)
5152
.first()
5253
)
54+
print(2)
5355
if not scheduled_export:
5456
raise ClickException(f"Schedule export {export_id} format {export_format} not found.")
5557
# Parameter skip_newer_than overide scheduled_export.skip_newer_than property
5658
if not skip_newer_than:
5759
skip_newer_than = scheduled_export.skip_newer_than
5860
try:
61+
print(3)
5962
export_request = ExportRequest(
6063
id_export=export_id,
6164
user=user,
6265
format=export_format,
6366
skip_newer_than=skip_newer_than,
6467
)
68+
print(4)
6569
except NotFound:
6670
raise ClickException(f"Export {export_id} not found.")
6771
except Forbidden:

backend/gn_module_export/models.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,13 +125,11 @@ def has_instance_permission(
125125
return True
126126
if token:
127127
return token in map(lambda cor: cor.token, self.cor_roles_exports)
128-
if user is None:
129-
user = g.current_user
130-
if user is None: # no user provided and no user connected
128+
if not user.is_authenticated: # no user provided and no user connected
131129
return False
132130
if scope == 3:
133131
return True
134-
if scope in (1, 2):
132+
if 0 < scope < 3:
135133
allowed_id_roles = list(map(lambda user: user.id_role, self.allowed_roles))
136134
ids_group_of_user = list(map(lambda group: group.id_role, user.groups))
137135
return user.id_role in allowed_id_roles or set(ids_group_of_user) & set(

backend/gn_module_export/tasks.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
from flask import current_app
1111
from geonature.utils.celery import celery_app
1212

13+
from geonature.utils.env import db
14+
1315
from .models import Export, ExportSchedules
1416
from .utils_export import (
1517
export_data_file,
@@ -56,7 +58,7 @@ def generate_scheduled_exports(self):
5658
@celery_app.task(bind=True, throws=ExportGenerationNotNeeded)
5759
def generate_export(self, export_id, file_name, export_url, format, id_role, filters):
5860
logger.info(f"Generate export {export_id}...")
59-
export = Export.query.get(export_id)
61+
export = db.session.get(Export, export_id)
6062
if export is None:
6163
logger.warning("Export {export_id} does not exist")
6264
export_data_file(export_id, file_name, export_url, format, id_role, filters)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
from geonature.tests.fixtures import *
22
from geonature.tests.fixtures import _session, app, users
3+
from geonature.tests.test_permissions import g_permissions

backend/gn_module_export/tests/test_blueprint.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from werkzeug.datastructures import Headers
77

88
from geonature.tests.fixtures import *
9-
from geonature.tests.utils import set_logged_user_cookie
109
from pypnusershub.tests.utils import set_logged_user_cookie
1110

1211
from .fixtures import *
@@ -56,7 +55,7 @@ def test_private_export_with_token_in_header_Authorization_Bearer(self, users, e
5655
headers = Headers()
5756
headers.extend(
5857
{
59-
"Authorization": f"Bearer {token}",
58+
"api-key": token,
6059
}
6160
)
6261

@@ -67,7 +66,7 @@ def test_private_export_with_token_in_header_Authorization_Bearer(self, users, e
6766
),
6867
headers=headers,
6968
)
70-
assert response.request.headers["Authorization"] == f"Bearer {token}"
69+
assert response.request.headers["api-key"] == token
7170
assert response.status_code == 200
7271

7372
def test_private_export_with_token_in_header_Authorization(self, users, exports):
@@ -76,7 +75,7 @@ def test_private_export_with_token_in_header_Authorization(self, users, exports)
7675
headers = Headers()
7776
headers.extend(
7877
{
79-
"Authorization": token,
78+
"api-key": token,
8079
}
8180
)
8281

@@ -87,7 +86,7 @@ def test_private_export_with_token_in_header_Authorization(self, users, exports)
8786
),
8887
headers=headers,
8988
)
90-
assert response.request.headers["Authorization"] == token
89+
assert response.request.headers["api-key"] == token
9190
assert response.status_code == 200
9291

9392
def test_private_export_with_allowed_id_role(self, users, exports):

backend/gn_module_export/tests/test_commands.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from .fixtures import *
99

1010

11-
@pytest.mark.usefixtures("client_class", "temporary_transaction")
11+
@pytest.mark.usefixtures("client_class", "temporary_transaction", "g_permissions")
1212
class TestExportsCommands:
1313
# deletes the files hand created files
1414
def test_generate_user(self, export_directories, exports, users):
@@ -23,6 +23,7 @@ def test_generate_user(self, export_directories, exports, users):
2323
users["admin_user"].id_role,
2424
],
2525
)
26+
# print(result.stdout)
2627
assert result.exit_code == 0
2728

2829
# Test skip-newer-than
@@ -67,4 +68,5 @@ def test_schedule_user(self, export_directories, exports_schedule):
6768
generate,
6869
[str(exports_schedule.export.id), "--format", "csv"],
6970
)
71+
print("-----", result.stdout)
7072
assert result.exit_code == 0

backend/gn_module_export/tests/test_tasks.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
import os
88

99
from geonature.tests.fixtures import *
10-
from geonature.tests.utils import set_logged_user_cookie
10+
11+
# from geonature.tests.utils import set_logged_user_cookie
1112
from pypnusershub.tests.utils import set_logged_user_cookie
1213

1314
from geonature.core.notifications.models import Notification
@@ -22,7 +23,7 @@
2223
from .fixtures import *
2324

2425

25-
@pytest.mark.usefixtures("client_class", "temporary_transaction")
26+
@pytest.mark.usefixtures("client_class", "temporary_transaction", "g_permissions")
2627
class TestExportsTasks:
2728
# deletes the files hand created files
2829
def test_export_clean(self, export_directories):

0 commit comments

Comments
 (0)