diff --git a/VERSION b/VERSION index 31e5c843..d0149fef 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.3 +1.3.4 diff --git a/backend/gn_modulator/imports/mixins/log.py b/backend/gn_modulator/imports/mixins/log.py index 9ead487b..b3bd536f 100644 --- a/backend/gn_modulator/imports/mixins/log.py +++ b/backend/gn_modulator/imports/mixins/log.py @@ -27,9 +27,7 @@ def pretty_errors_txt(self): key_txt = ( f"'{relation_key}.{key}' : " if key and relation_key - else f"'{key}' : " - if key - else "" + else f"'{key}' : " if key else "" ) txt = f"- {key_txt}{error['error_msg']}\n" for info in error.get("error_infos", []): diff --git a/backend/gn_modulator/imports/mixins/process.py b/backend/gn_modulator/imports/mixins/process.py index bca4ac03..9184a09c 100644 --- a/backend/gn_modulator/imports/mixins/process.py +++ b/backend/gn_modulator/imports/mixins/process.py @@ -64,25 +64,27 @@ def sql_process_import_view(self, from_table, dest_table, relation_key=None): columns = ( [relation_key] if relation_key and self.Model().is_relation_n_n(relation_key) - else list( - filter( - lambda x: ( - self.Model().is_column(x) - and x.startswith(f"{relation_key}.") - and not x == self.Model().pk_field_name() - ), - from_table_columns, + else ( + list( + filter( + lambda x: ( + self.Model().is_column(x) + and x.startswith(f"{relation_key}.") + and not x == self.Model().pk_field_name() + ), + from_table_columns, + ) ) - ) - if relation_key and self.Model().is_relation_1_n(relation_key) - else list( - filter( - lambda x: ( - self.Model().is_column(x) - and "." not in x - and not x == self.Model().pk_field_name() - ), - from_table_columns, + if relation_key and self.Model().is_relation_1_n(relation_key) + else list( + filter( + lambda x: ( + self.Model().is_column(x) + and "." not in x + and not x == self.Model().pk_field_name() + ), + from_table_columns, + ) ) ) ) @@ -271,9 +273,9 @@ def resolve_key( v_join += v_join_inter # clarifier link oin - link_joins[ - k_unique - ] = f"{alias_join}_{index_unique}.{SchemaMethods(rel_schema_code).Model().pk_field_name()}" + link_joins[k_unique] = ( + f"{alias_join}_{index_unique}.{SchemaMethods(rel_schema_code).Model().pk_field_name()}" + ) # conditions de jointures v_join_on = [] diff --git a/backend/gn_modulator/migrations/versions/3920371728d8_gn_modulator_import_init.py b/backend/gn_modulator/migrations/versions/3920371728d8_gn_modulator_import_init.py index bc5d6624..1d59133f 100644 --- a/backend/gn_modulator/migrations/versions/3920371728d8_gn_modulator_import_init.py +++ b/backend/gn_modulator/migrations/versions/3920371728d8_gn_modulator_import_init.py @@ -5,6 +5,7 @@ Create Date: 2023-03-03 14:31:35.339631 """ + from alembic import op import sqlalchemy as sa diff --git a/backend/gn_modulator/migrations/versions/5c1ec86a67ab_import_mapping.py b/backend/gn_modulator/migrations/versions/5c1ec86a67ab_import_mapping.py index 8a506ccd..5f67f7a7 100644 --- a/backend/gn_modulator/migrations/versions/5c1ec86a67ab_import_mapping.py +++ b/backend/gn_modulator/migrations/versions/5c1ec86a67ab_import_mapping.py @@ -5,6 +5,7 @@ Create Date: 2023-12-15 14:20:55.639520 """ + from alembic import op import sqlalchemy as sa diff --git a/backend/gn_modulator/migrations/versions/823729f24bac_import_relation_1_n.py b/backend/gn_modulator/migrations/versions/823729f24bac_import_relation_1_n.py index edcbda2e..0c40f33d 100644 --- a/backend/gn_modulator/migrations/versions/823729f24bac_import_relation_1_n.py +++ b/backend/gn_modulator/migrations/versions/823729f24bac_import_relation_1_n.py @@ -5,6 +5,7 @@ Create Date: 2023-10-09 15:55:41.769219 """ + from alembic import op import sqlalchemy as sa diff --git a/backend/gn_modulator/migrations/versions/b78eaab0a6e3_gn_modulator_permission_available.py b/backend/gn_modulator/migrations/versions/b78eaab0a6e3_gn_modulator_permission_available.py index 27272c7d..1509bd71 100644 --- a/backend/gn_modulator/migrations/versions/b78eaab0a6e3_gn_modulator_permission_available.py +++ b/backend/gn_modulator/migrations/versions/b78eaab0a6e3_gn_modulator_permission_available.py @@ -5,6 +5,7 @@ Create Date: 2023-06-20 15:19:21.097194 """ + from alembic import op import sqlalchemy as sa from gn_modulator import MODULE_CODE diff --git a/backend/gn_modulator/migrations/versions/d3f266c7b1b6_init_gn_modulator.py b/backend/gn_modulator/migrations/versions/d3f266c7b1b6_init_gn_modulator.py index 97e7948f..95a330b6 100644 --- a/backend/gn_modulator/migrations/versions/d3f266c7b1b6_init_gn_modulator.py +++ b/backend/gn_modulator/migrations/versions/d3f266c7b1b6_init_gn_modulator.py @@ -4,6 +4,7 @@ Revises: Create Date: 2021-09-15 11:49:24.512562 """ + from alembic import op from sqlalchemy.sql import text import pkg_resources diff --git a/backend/gn_modulator/module/breadcrumbs.py b/backend/gn_modulator/module/breadcrumbs.py index 2a98cd10..0bb4ec94 100644 --- a/backend/gn_modulator/module/breadcrumbs.py +++ b/backend/gn_modulator/module/breadcrumbs.py @@ -1,4 +1,4 @@ -from geonature.utils.env import db +from sqlalchemy.orm.exc import NoResultFound from gn_modulator.schema import SchemaMethods from gn_modulator.utils.commons import getAttr from gn_modulator import MODULE_CODE @@ -39,7 +39,12 @@ def breadcrumbs(cls, module_code, page_code, data): q = sm.get_row( data[sm.Model().pk_field_name()], module_code=module_code, params={} ) - m = q.one() + # patch apres delete... + try: + m = q.one() + except NoResultFound: + return parent_breadcrumbs + data_label = sm.serialize(m, fields=[sm.label_field_name()]) # label_page = f"{sm.label()} {data_label[sm.label_field_name()]}" label_page = f"{sm.label()} {getAttr(data_label, sm.label_field_name())}" diff --git a/backend/gn_modulator/query/filters.py b/backend/gn_modulator/query/filters.py index 9e766c75..8ffa72c5 100644 --- a/backend/gn_modulator/query/filters.py +++ b/backend/gn_modulator/query/filters.py @@ -1,6 +1,7 @@ """ repositories - filters """ + import unidecode import sqlalchemy as sa from geonature.utils.env import db diff --git a/backend/gn_modulator/query/getattr.py b/backend/gn_modulator/query/getattr.py index 33c26d15..69a120a8 100644 --- a/backend/gn_modulator/query/getattr.py +++ b/backend/gn_modulator/query/getattr.py @@ -54,9 +54,11 @@ def getModelAttr(Model, query, field_name, only_fields="", index=0, condition=No current_Model = ( get_query_cache(query, current_relation_cache_key)["relation_alias"] if query is not None and current_relation_cache_key - else Model.relation_Model(current_relation_cache_key) - if current_relation_cache_key - else Model + else ( + Model.relation_Model(current_relation_cache_key) + if current_relation_cache_key + else Model + ) ) res = {"val": getattr(current_Model, current_field)} diff --git a/backend/gn_modulator/routes/utils/repository.py b/backend/gn_modulator/routes/utils/repository.py index 416827ac..8270b01a 100644 --- a/backend/gn_modulator/routes/utils/repository.py +++ b/backend/gn_modulator/routes/utils/repository.py @@ -13,6 +13,8 @@ def get_list_rest(module_code, object_code, additional_params={}): schema_code = ModuleMethods.schema_code(module_code, object_code) sm = SchemaMethods(schema_code) + id_role = g.current_user.id_role + # on peut redéfinir le module_code pour le choix des droits permission_module_code = object_definition.get("module_code", module_code) params = {**parse_request_args(object_definition), **additional_params} @@ -22,7 +24,11 @@ def get_list_rest(module_code, object_code, additional_params={}): {} if params.get("no_info") else sm.get_query_infos( - module_code=permission_module_code, action=action, params=params, url=request.url + module_code=permission_module_code, + action=action, + params=params, + url=request.url, + id_role=id_role, ) ) @@ -32,11 +38,12 @@ def get_list_rest(module_code, object_code, additional_params={}): action=action, params=params, query_type="select", + id_role=id_role, ) if params.get("sql"): # test si droit admin - if not has_any_permissions("R", g.current_user.id_role, "MODULATOR", "ADMIN"): + if not has_any_permissions("R", id_role, "MODULATOR", "ADMIN"): return ( "Vous n'avez pas les droit pour effectuer des actions d'admin pour le module MODULATOR", 403, @@ -70,7 +77,7 @@ def get_one_rest(module_code, object_code, value): object_definition = ModuleMethods.object_config(module_code, object_code) schema_code = ModuleMethods.schema_code(module_code, object_code) sm = SchemaMethods(schema_code) - + id_role = g.current_user.id_role params = parse_request_args(object_definition) permission_module_code = object_definition.get("module_code", module_code) @@ -82,6 +89,7 @@ def get_one_rest(module_code, object_code, value): module_code=permission_module_code, action="R", params=params, + id_role=id_role, ) m = q.one() @@ -119,6 +127,7 @@ def patch_rest(module_code, object_code, value): object_definition = ModuleMethods.object_config(module_code, object_code) schema_code = ModuleMethods.schema_code(module_code, object_code) sm = SchemaMethods(schema_code) + id_role = g.current_user.id_role permission_module_code = object_definition.get("module_code", module_code) @@ -136,6 +145,7 @@ def patch_rest(module_code, object_code, value): params=params, authorized_write_fields=authorized_write_fields, commit=True, + id_role=id_role, ) except sm.errors.SchemaUnsufficientCruvedRigth as e: @@ -150,6 +160,8 @@ def delete_rest(module_code, object_code, value): object_definition = ModuleMethods.object_config(module_code, object_code) schema_code = ModuleMethods.schema_code(module_code, object_code) sm = SchemaMethods(schema_code) + id_role = g.current_user.id_role + permission_module_code = object_definition.get("module_code", module_code) params = parse_request_args(object_definition) @@ -164,7 +176,11 @@ def delete_rest(module_code, object_code, value): try: sm.delete_row( - value, module_code=module_code, field_name=params.get("field_name"), commit=True + value, + module_code=module_code, + field_name=params.get("field_name"), + commit=True, + id_role=id_role, ) except sm.errors.SchemaUnsufficientCruvedRigth as e: @@ -172,19 +188,21 @@ def delete_rest(module_code, object_code, value): return dict_out - pass - def get_page_number_and_list(module_code, object_code, value): object_definition = ModuleMethods.object_config(module_code, object_code) schema_code = ModuleMethods.schema_code(module_code, object_code) sm = SchemaMethods(schema_code) - + id_role = g.current_user.id_role permission_module_code = object_definition.get("module_code", module_code) params = parse_request_args(object_definition) page_number = sm.get_page_number( - value, permission_module_code, params.get("action") or "R", params + value, + permission_module_code, + params.get("action") or "R", + params, + id_role=id_role, ) return get_list_rest(module_code, object_code, additional_params={"page": page_number}) diff --git a/backend/gn_modulator/schema/auto.py b/backend/gn_modulator/schema/auto.py index 904948eb..7c16a3ca 100644 --- a/backend/gn_modulator/schema/auto.py +++ b/backend/gn_modulator/schema/auto.py @@ -1,6 +1,7 @@ """ AutoSchemas """ + from sqlalchemy.inspection import inspect from sqlalchemy.orm.properties import ColumnProperty from geonature.utils.env import db @@ -148,9 +149,7 @@ def process_relation_auto(self, relation_key, relation, Model, properties): "relation_type": ( "n-1" if relation.direction.name == "MANYTOONE" - else "1-n" - if relation.direction.name == "ONETOMANY" - else "n-n" + else "1-n" if relation.direction.name == "ONETOMANY" else "n-n" ), "schema_code": schema_code, # "title": relation_key, diff --git a/backend/gn_modulator/schema/base.py b/backend/gn_modulator/schema/base.py index 0b4ef0ff..68cb24ef 100644 --- a/backend/gn_modulator/schema/base.py +++ b/backend/gn_modulator/schema/base.py @@ -225,11 +225,15 @@ def relation_type(self, relation_def): relation_type = ( "n-1" if relation_def.get("local_key") and not relation_def.get("foreign_key") - else "1-n" - if relation_def.get("foreign_key") and not relation_def.get("local_key") - else "n-n" - if relation_def.get("foreign_key") and relation_def.get("local_key") - else None + else ( + "1-n" + if relation_def.get("foreign_key") and not relation_def.get("local_key") + else ( + "n-n" + if relation_def.get("foreign_key") and relation_def.get("local_key") + else None + ) + ) ) if relation_type is None: @@ -290,9 +294,11 @@ def remove_field(self, field_name, schema): def process_csv_keys(self, keys): return [ - self.property(key.split(".")[0]).get("title", key) - if self.has_property(key.split(".")[0]) - else key + ( + self.property(key.split(".")[0]).get("title", key) + if self.has_property(key.split(".")[0]) + else key + ) for key in keys ] diff --git a/backend/gn_modulator/schema/config/grammar.py b/backend/gn_modulator/schema/config/grammar.py index 0b8ab3ae..1ddc2811 100644 --- a/backend/gn_modulator/schema/config/grammar.py +++ b/backend/gn_modulator/schema/config/grammar.py @@ -48,9 +48,11 @@ def new(self, object_definition={}): return ( "nouvelle" if self.genre(object_definition) == "F" - else "nouvel" - if self.is_first_letter_vowel(self.label(object_definition)) - else "nouveau" + else ( + "nouvel" + if self.is_first_letter_vowel(self.label(object_definition)) + else "nouveau" + ) ) def news(self, object_definition={}): @@ -90,9 +92,7 @@ def article_def(self, object_definition={}): return ( "l'" if self.is_first_letter_vowel(self.label(object_definition)) - else "la " - if self.genre(object_definition) == "F" - else "le " + else "la " if self.genre(object_definition) == "F" else "le " ) def article_undef(self, object_definition={}): @@ -111,9 +111,7 @@ def preposition(self, object_definition={}, check_voyel=True): return ( "de l'" if self.is_first_letter_vowel(self.label(object_definition)) and check_voyel - else "de la " - if self.genre(object_definition) == "F" - else "du " + else "de la " if self.genre(object_definition) == "F" else "du " ) def le_label(self, object_definition={}): diff --git a/backend/gn_modulator/schema/doc.py b/backend/gn_modulator/schema/doc.py index 8e95c95e..14249420 100644 --- a/backend/gn_modulator/schema/doc.py +++ b/backend/gn_modulator/schema/doc.py @@ -36,9 +36,11 @@ def doc_import_key(self, key, unique=False, relation_key=None): type = ( "clé simple" if property_def.get("schema_code") - else "liste de clés séparées par une virgule" - if property_def.get("relation_type") == "n-n" - else property_def["type"] + else ( + "liste de clés séparées par une virgule" + if property_def.get("relation_type") == "n-n" + else property_def["type"] + ) ) column_default = self.property(key).get("default") or ( diff --git a/backend/gn_modulator/schema/features/base.py b/backend/gn_modulator/schema/features/base.py index d186ac2e..660bf384 100644 --- a/backend/gn_modulator/schema/features/base.py +++ b/backend/gn_modulator/schema/features/base.py @@ -128,9 +128,11 @@ def get_data_item(cls, data_item, file_path=None): items = ( data_item["items"] if "items" in data_item - else cls.get_data_items_from_file(Path(file_path).parent / data_item["file"]) - if "file" in data_item - else [] + else ( + cls.get_data_items_from_file(Path(file_path).parent / data_item["file"]) + if "file" in data_item + else [] + ) ) if data_item.get("keys"): diff --git a/backend/gn_modulator/schema/repositories.py b/backend/gn_modulator/schema/repositories.py index 6d065834..d95b5fbe 100644 --- a/backend/gn_modulator/schema/repositories.py +++ b/backend/gn_modulator/schema/repositories.py @@ -49,6 +49,7 @@ def get_row( action="R", params={}, query_type="all", + id_role=None, ): """ return query get one row (Model. == value) @@ -76,6 +77,7 @@ def get_row( action=action, params=params_query, query_type=query_type, + id_role=id_role, ) return query @@ -173,6 +175,7 @@ def update_row( params={}, authorized_write_fields=None, commit=True, + id_role=None, ): """ update row (Model. == value) with data @@ -188,6 +191,7 @@ def update_row( action="U", params=params, query_type="update", + id_role=id_role, ) m = q.one() @@ -210,6 +214,7 @@ def delete_row( params={}, commit=True, multiple=False, + id_role=None, ): """ delete row (Model. == value) @@ -221,25 +226,47 @@ def delete_row( action="D", params=params, query_type="delete", + id_role=id_role, ) # https://stackoverflow.com/questions/49794899/flask-sqlalchemy-delete-query-failing-with-could-not-evaluate-current-criteria?noredirect=1&lq=1 if not multiple: subquery_delete.one() - subquery_delete.delete(synchronize_session=False) + + res = subquery_delete.all() + + if not res: + return + + Model = self.Model() + + q_delete = Model.query + ors = [] + for r in res: + ands = [] + for pk_field_name in Model.pk_field_names(): + f = getattr(Model, pk_field_name) == getattr(r, pk_field_name) + ands.append(f) + ors.append(f) + + q_delete = q_delete.filter(sa.or_(*ors)) + q_delete.delete(synchronize_session=False) db.session.flush() if commit: db.session.commit() return None - def get_query_infos(self, module_code=MODULE_CODE, action="R", params={}, url=None): + def get_query_infos( + self, module_code=MODULE_CODE, action="R", params={}, url=None, id_role=None + ): subquery_count_total = query_list( self.Model(), module_code=module_code, action=action, params=params, query_type="total", + id_role=id_role, ) count_total = subquery_count_total.count() @@ -250,6 +277,7 @@ def get_query_infos(self, module_code=MODULE_CODE, action="R", params={}, url=No action=action, params=params, query_type="filtered", + id_role=id_role, ) count_filtered = subquery_count_filtered.count() @@ -301,11 +329,11 @@ def get_query_infos(self, module_code=MODULE_CODE, action="R", params={}, url=No return query_infos - def get_page_number(self, value, module_code, action, params): + def get_page_number(self, value, module_code, action, params, id_role): params["fields"] = ["row_number"] sub_query_list = query_list( - self.Model(), module_code, action, params, "page_number" + self.Model(), module_code, action, params, "page_number", id_role=id_role ).subquery() row_number = ( diff --git a/backend/gn_modulator/schema/serializers.py b/backend/gn_modulator/schema/serializers.py index 07dd8691..8ccdc67a 100644 --- a/backend/gn_modulator/schema/serializers.py +++ b/backend/gn_modulator/schema/serializers.py @@ -103,11 +103,11 @@ def opposite_relation_def(self, relation_def): "relation_type": ( "n-1" if relation_def["relation_type"] == "1-n" - else "1-n" - if relation_def["relation_type"] == "n-1" - else "1-1" - if relation_def["relation_type"] == "1-1" - else "n-n" + else ( + "1-n" + if relation_def["relation_type"] == "n-1" + else "1-1" if relation_def["relation_type"] == "1-1" else "n-n" + ) ), "schema_code": self.schema_code(), "title": self.attr("meta.label"), diff --git a/backend/gn_modulator/schema/validation.py b/backend/gn_modulator/schema/validation.py index d1fde428..aa9d0790 100644 --- a/backend/gn_modulator/schema/validation.py +++ b/backend/gn_modulator/schema/validation.py @@ -1,5 +1,6 @@ """ """ + import jsonschema import copy from gn_modulator.utils.cache import get_global_cache, set_global_cache diff --git a/backend/gn_modulator/tests/data/commons.py b/backend/gn_modulator/tests/data/commons.py index 869d8478..d6acb6b8 100644 --- a/backend/gn_modulator/tests/data/commons.py +++ b/backend/gn_modulator/tests/data/commons.py @@ -2,6 +2,8 @@ Données exemple pour les test """ +from gn_modulator import SchemaMethods + def module(): return { @@ -18,11 +20,26 @@ def module_update(): return {"module_label": "TEST_PYTEST_UPDATE"} -def pf(): +def pf(user): + + sm_nom = SchemaMethods("ref_nom.nomenclature") + id_nomenclature_type_actor = sm_nom.get_row_as_dict( + ["PF_TYPE_ACTOR", "CON"], + ["nomenclature_type.mnemonique", "cd_nomenclature"], + fields=["id_nomenclature"], + )["id_nomenclature"] + return { "uuid_passage_faune": "f5e5dd42-dcc1-4cfd-97ec-04699d78cb9b", "nom_usuel_passage_faune": "TEST_PF", "geom": {"type": "Point", "coordinates": [0, 45]}, + "id_digitiser": user.id_role, + "actors": [ + { + "id_organism": user.id_organisme, + "id_nomenclature_type_actor": id_nomenclature_type_actor, + } + ], } diff --git a/backend/gn_modulator/tests/test_repository.py b/backend/gn_modulator/tests/test_repository.py index d28324c3..ffaf7ce1 100644 --- a/backend/gn_modulator/tests/test_repository.py +++ b/backend/gn_modulator/tests/test_repository.py @@ -7,6 +7,7 @@ - list ?? """ +import os import pytest from .utils.repository import test_schema_repository from .data import commons as data_commons @@ -41,6 +42,7 @@ def test_repo_gn_meta_ca(self): def test_repo_gn_meta_jdd(self): test_schema_repository("meta.jdd", data_meta.jdd(), data_meta.jdd_update()) + # @pytest.mark.skip() def test_repo_diag(self, users, passages_faune_with_diagnostic): sm = SchemaMethods("m_sipaf.diag") fields = ["scope", "id_diagnostic"] @@ -61,6 +63,7 @@ def test_repo_diag(self, users, passages_faune_with_diagnostic): assert True + # @pytest.mark.skip() def test_repo_pf_update(self, passages_faune_with_diagnostic): sm = SchemaMethods("m_sipaf.pf") @@ -72,6 +75,7 @@ def test_repo_pf_update(self, passages_faune_with_diagnostic): assert sm.is_new_data(m, data) is False sm.update_row(uuid_pf, data, "uuid_passage_faune", "m_sipaf") + # @pytest.mark.skip() def test_repo_diag_cloture(self, passages_faune_with_diagnostic): sm = SchemaMethods("m_sipaf.diag") sm_org = SchemaMethods("user.organisme") @@ -130,6 +134,7 @@ def test_repo_diag_cloture(self, passages_faune_with_diagnostic): assert sm.is_new_data(m, data) sm.update_row(m.id_diagnostic, data) + # @pytest.mark.skip() def test_repo_pf_rel(self, passages_faune_with_diagnostic, users): sm = SchemaMethods("m_sipaf.pf") uuids_filter_value = ";".join( @@ -144,7 +149,7 @@ def test_repo_pf_rel(self, passages_faune_with_diagnostic, users): # "date_requalification_ouvrage", # "digitiser.nom_complet", "actors.organisme.nom_organisme", - "linears.additional_data.largeur" + "linears.additional_data.largeur", # "actors.nomenclature_type_actor.label_fr", # "label_infrastructures", # "linears.additional_data.largeur", @@ -261,6 +266,7 @@ def test_repo_pf_nomenclature_spe(self): res_nom = res["nomenclature_ouvrage_specificite"] assert res_nom is None + # @pytest.mark.skip() def test_repo_pf_cruved(self, passages_faune_with_diagnostic, users): sm = SchemaMethods("m_sipaf.pf") uuids_filter_value = ";".join( @@ -326,6 +332,7 @@ def test_repo_pf_filter_has_diagnostic(self, passages_faune_with_diagnostic, use res = sm.serialize_list(m_list, fields) assert len(res) == 2 + # @pytest.mark.skip() def test_repo_synthese_d_within( self, passages_faune_with_diagnostic, synthese_data, users, g_permissions ): @@ -377,6 +384,7 @@ def test_repo_synthese_scope(self, synthese_data, users, datasets): assert len(res[user]) == 9 assert all(r["scope"] == 2 for r in res[user]) + # @pytest.mark.skip() def test_repo_synthese_permission(self, synthese_sensitive_data, users, g_permissions): for key in synthese_sensitive_data: s = synthese_sensitive_data[key] diff --git a/backend/gn_modulator/tests/test_rest_api.py b/backend/gn_modulator/tests/test_rest_api.py index 74f2c337..e472393a 100644 --- a/backend/gn_modulator/tests/test_rest_api.py +++ b/backend/gn_modulator/tests/test_rest_api.py @@ -34,13 +34,26 @@ class TestRest: # data_commons.module_update(), # ) - def test_m_sipaf_pf(self, client, users): + def test_rest_m_sipaf_pf_admin(self, client, users): + user = users["admin_user"] test_schema_rest( client, - users["admin_user"], + user, "m_sipaf", "site", - data_commons.pf(), + data_commons.pf(user), + data_commons.pf_update(), + breadcrumbs_page_code="site_details", + ) + + def test_rest_m_sipaf_pf_user(self, client, users): + user = users["user"] + test_schema_rest( + client, + user, + "m_sipaf", + "site", + data_commons.pf(user), data_commons.pf_update(), breadcrumbs_page_code="site_details", ) diff --git a/backend/gn_modulator/tests/utils/rest.py b/backend/gn_modulator/tests/utils/rest.py index 3f443281..9dd93079 100644 --- a/backend/gn_modulator/tests/utils/rest.py +++ b/backend/gn_modulator/tests/utils/rest.py @@ -5,6 +5,21 @@ from pypnusershub.tests.utils import set_logged_user_cookie, unset_logged_user_cookie +def get_fields(data_post): + """TODO à ajouter aux SchemaMethods ?""" + fields = [] + for key, value in data_post.items(): + if not isinstance(value, list): + fields.append(key) + continue + for item in value: + for item_key in item.keys(): + whole_key = f"{key}.{item_key}" + if whole_key not in fields: + fields.append(whole_key) + return fields + + @pytest.mark.skip() def test_schema_rest( client, user, module_code, object_code, data_post, data_update, breadcrumbs_page_code=None @@ -43,7 +58,7 @@ def test_schema_rest( assert r.status_code == 404, "La donnée ne devrait pas exister" # POST - fields = list(data_post.keys()) + fields = get_fields(data_post) fields.append(sm.Model().pk_field_name()) r = client.post( @@ -56,7 +71,7 @@ def test_schema_rest( data=data_post, ) - assert r.status_code == 200, "Erreur avec POST" + assert r.status_code == 200, f"Erreur avec POST : {r.status_code} {r.response}" data_from_post = r.json assert all(data_post[k] == data_from_post[k] for k in list(data_post.keys())) @@ -110,7 +125,7 @@ def test_schema_rest( "modulator.api_breadcrumbs", module_code=module_code, page_code=breadcrumbs_page_code, - **data_from_post + **data_from_post, ), data=data_update, ) diff --git a/backend/gn_modulator/utils/commons.py b/backend/gn_modulator/utils/commons.py index 3c323b3f..f1a2f12f 100644 --- a/backend/gn_modulator/utils/commons.py +++ b/backend/gn_modulator/utils/commons.py @@ -2,7 +2,6 @@ utils, patch, etc... """ - import unicodedata import sys from importlib import import_module diff --git a/contrib/m_sipaf/backend/m_sipaf/migrations/versions/0f6b908cbe5e_concept_usage_objectif.py b/contrib/m_sipaf/backend/m_sipaf/migrations/versions/0f6b908cbe5e_concept_usage_objectif.py index 8ffadd3d..b9b844f0 100644 --- a/contrib/m_sipaf/backend/m_sipaf/migrations/versions/0f6b908cbe5e_concept_usage_objectif.py +++ b/contrib/m_sipaf/backend/m_sipaf/migrations/versions/0f6b908cbe5e_concept_usage_objectif.py @@ -5,6 +5,7 @@ Create Date: 2023-08-04 16:05:35.209204 """ + from alembic import op import sqlalchemy as sa import pkg_resources diff --git a/contrib/m_sipaf/backend/m_sipaf/migrations/versions/2c85080e9b8b_m_sipaf_actor_required_id_organism.py b/contrib/m_sipaf/backend/m_sipaf/migrations/versions/2c85080e9b8b_m_sipaf_actor_required_id_organism.py index bd3c419e..9fc2a519 100644 --- a/contrib/m_sipaf/backend/m_sipaf/migrations/versions/2c85080e9b8b_m_sipaf_actor_required_id_organism.py +++ b/contrib/m_sipaf/backend/m_sipaf/migrations/versions/2c85080e9b8b_m_sipaf_actor_required_id_organism.py @@ -5,6 +5,7 @@ Create Date: 2023-10-19 14:02:45.162974 """ + from alembic import op import sqlalchemy as sa diff --git a/contrib/m_sipaf/backend/m_sipaf/migrations/versions/7664e8f989f1_ajout_commentaire_passage_faune.py b/contrib/m_sipaf/backend/m_sipaf/migrations/versions/7664e8f989f1_ajout_commentaire_passage_faune.py index 0ddd93a7..2a83d5fe 100644 --- a/contrib/m_sipaf/backend/m_sipaf/migrations/versions/7664e8f989f1_ajout_commentaire_passage_faune.py +++ b/contrib/m_sipaf/backend/m_sipaf/migrations/versions/7664e8f989f1_ajout_commentaire_passage_faune.py @@ -5,6 +5,7 @@ Create Date: 2024-01-09 18:22:22.097781 """ + from alembic import op import sqlalchemy as sa diff --git a/contrib/m_sipaf/backend/m_sipaf/migrations/versions/90f6e5531f7c_diagnostic_m_sipaf.py b/contrib/m_sipaf/backend/m_sipaf/migrations/versions/90f6e5531f7c_diagnostic_m_sipaf.py index d356ebc5..c3d7fdfa 100644 --- a/contrib/m_sipaf/backend/m_sipaf/migrations/versions/90f6e5531f7c_diagnostic_m_sipaf.py +++ b/contrib/m_sipaf/backend/m_sipaf/migrations/versions/90f6e5531f7c_diagnostic_m_sipaf.py @@ -5,6 +5,7 @@ Create Date: 2023-03-21 22:36:24.415201 """ + from alembic import op import sqlalchemy as sa import pkg_resources diff --git a/contrib/m_sipaf/backend/m_sipaf/migrations/versions/b7eb2e900bf1_remove_objectifs_taxons.py b/contrib/m_sipaf/backend/m_sipaf/migrations/versions/b7eb2e900bf1_remove_objectifs_taxons.py index 33cf1695..923c5bf1 100644 --- a/contrib/m_sipaf/backend/m_sipaf/migrations/versions/b7eb2e900bf1_remove_objectifs_taxons.py +++ b/contrib/m_sipaf/backend/m_sipaf/migrations/versions/b7eb2e900bf1_remove_objectifs_taxons.py @@ -5,6 +5,7 @@ Create Date: 2023-11-14 16:50:11.560175 """ + from alembic import op import sqlalchemy as sa diff --git a/contrib/m_sipaf/backend/m_sipaf/migrations/versions/c11d028e1b42_typo_nomenclature.py b/contrib/m_sipaf/backend/m_sipaf/migrations/versions/c11d028e1b42_typo_nomenclature.py index 4eee8ce2..015e53b7 100644 --- a/contrib/m_sipaf/backend/m_sipaf/migrations/versions/c11d028e1b42_typo_nomenclature.py +++ b/contrib/m_sipaf/backend/m_sipaf/migrations/versions/c11d028e1b42_typo_nomenclature.py @@ -5,6 +5,7 @@ Create Date: 2024-01-09 20:29:26.613697 """ + from alembic import op import sqlalchemy as sa diff --git a/contrib/m_sipaf/backend/m_sipaf/migrations/versions/cc1cd6fbb28c_add_pf_unique_uuid_constraint.py b/contrib/m_sipaf/backend/m_sipaf/migrations/versions/cc1cd6fbb28c_add_pf_unique_uuid_constraint.py index e3342bfd..62a9a927 100644 --- a/contrib/m_sipaf/backend/m_sipaf/migrations/versions/cc1cd6fbb28c_add_pf_unique_uuid_constraint.py +++ b/contrib/m_sipaf/backend/m_sipaf/migrations/versions/cc1cd6fbb28c_add_pf_unique_uuid_constraint.py @@ -5,6 +5,7 @@ Create Date: 2023-10-12 11:38:15.137738 """ + from alembic import op import sqlalchemy as sa diff --git a/contrib/m_sipaf/backend/m_sipaf/migrations/versions/ea2da3785c06_unrequire_code_pf.py b/contrib/m_sipaf/backend/m_sipaf/migrations/versions/ea2da3785c06_unrequire_code_pf.py index 6db5e55a..e435e923 100644 --- a/contrib/m_sipaf/backend/m_sipaf/migrations/versions/ea2da3785c06_unrequire_code_pf.py +++ b/contrib/m_sipaf/backend/m_sipaf/migrations/versions/ea2da3785c06_unrequire_code_pf.py @@ -5,6 +5,7 @@ Create Date: 2023-06-27 16:18:12.462599 """ + from alembic import op import sqlalchemy as sa diff --git a/contrib/m_sipaf/backend/m_sipaf/migrations/versions/ec6ebeb214b1_log_history_t_passage_faune_m_sipaf.py.py b/contrib/m_sipaf/backend/m_sipaf/migrations/versions/ec6ebeb214b1_log_history_t_passage_faune_m_sipaf.py.py index 3cb6284b..136baf90 100644 --- a/contrib/m_sipaf/backend/m_sipaf/migrations/versions/ec6ebeb214b1_log_history_t_passage_faune_m_sipaf.py.py +++ b/contrib/m_sipaf/backend/m_sipaf/migrations/versions/ec6ebeb214b1_log_history_t_passage_faune_m_sipaf.py.py @@ -5,6 +5,7 @@ Create Date: 2023-03-08 18:21:26.724733 """ + from alembic import op import sqlalchemy as sa diff --git a/doc/changelog.md b/doc/changelog.md index 6fd67e71..bed3432c 100644 --- a/doc/changelog.md +++ b/doc/changelog.md @@ -1,5 +1,10 @@ # Changelog +## 1.3.4 (2024-02-29) + +**🐛 Corrections** + +- Correction des portées des permissions (#96) ## 1.3.3 (2024-01-15) @@ -12,6 +17,7 @@ - [BACKEND]: Correction de la fonction is_new_data - [FRONTEND]: Correction du validateur d'input UUID - [SIPAF]: Correction du layout d'édition des diagnostics + ## 1.3.2 (2024-01-12) **🚀 Nouveautés**