From d5bfcb8faacc0fc72ac222468caa515b453e20e3 Mon Sep 17 00:00:00 2001 From: TheoLechemia Date: Fri, 7 May 2021 08:57:19 +0200 Subject: [PATCH 01/57] up flask cors version --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 58db17d2..b180de62 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ cffi==1.11.5 click==6.7 decorator==4.3.0 Flask-Bootstrap==3.3.7.1 -Flask-Cors==3.0.6 +Flask-Cors==3.0.10 Flask-SQLAlchemy==2.3.2 Flask-WTF==0.14.2 flask==1.1.1 From c94ef230be6ec9489e62e42cd671ce1369511aee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Mon, 9 Aug 2021 16:37:38 +0200 Subject: [PATCH 02/57] fix issue when id_organisme is None --- app/t_roles/route.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/t_roles/route.py b/app/t_roles/route.py index 51783823..8dc27dca 100644 --- a/app/t_roles/route.py +++ b/app/t_roles/route.py @@ -286,7 +286,7 @@ def deluser(id_role): @fnauth.check_auth(6, False, URL_REDIRECT) def info(id_role): user = TRoles.get_one(id_role) - organisme = Bib_Organismes.get_one(user["id_organisme"]) + organisme = Bib_Organismes.get_one(user["id_organisme"]) if user['id_organisme'] else None groups = TRoles.get_user_groups(id_role) lists = TRoles.get_user_lists(id_role) rights = TRoles.get_user_app_profils(id_role) From 776fa11db50f64bb65920e21f00207404cee8264 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Mon, 6 Sep 2021 11:45:08 +0200 Subject: [PATCH 03/57] add UsersHub-authentification-module as submodule --- .gitmodules | 3 +++ dependencies/UsersHub-authentification-module | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 dependencies/UsersHub-authentification-module diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..17d6870c --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "dependencies/UsersHub-authentification-module"] + path = dependencies/UsersHub-authentification-module + url = https://github.com/PnX-SI/UsersHub-authentification-module diff --git a/dependencies/UsersHub-authentification-module b/dependencies/UsersHub-authentification-module new file mode 160000 index 00000000..54facfc4 --- /dev/null +++ b/dependencies/UsersHub-authentification-module @@ -0,0 +1 @@ +Subproject commit 54facfc499ab31b62448522189f81ed6241ec058 From 9c0d232cc9938c48d27b67019f17034fd0e152bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Mon, 6 Sep 2021 11:55:48 +0200 Subject: [PATCH 04/57] split requirements.txt to install submodule in dev --- requirements-common.txt | 25 +++++++++++++++++++++++++ requirements-dev.txt | 2 ++ requirements.txt | 25 +------------------------ 3 files changed, 28 insertions(+), 24 deletions(-) create mode 100644 requirements-common.txt create mode 100644 requirements-dev.txt diff --git a/requirements-common.txt b/requirements-common.txt new file mode 100644 index 00000000..4b4d6516 --- /dev/null +++ b/requirements-common.txt @@ -0,0 +1,25 @@ +bcrypt==3.1.4 +click==6.7 +decorator==4.3.0 +Flask-Bootstrap==3.3.7.1 +Flask-Cors==3.0.10 +Flask-SQLAlchemy==2.3.2 +Flask-WTF==0.14.2 +flask==1.1.1 +gunicorn==19.9.0 +infinity==1.4 +intervals==0.8.1 +itsdangerous==0.24 +Jinja2==2.10.1 +MarkupSafe==1.1 +psycopg2==2.8.5 +pycparser==2.18 +python-dateutil==2.7.3 +python-dotenv==0.19.0 +six==1.11.0 +SQLAlchemy==1.3.19 +toml==0.10.0 +validators==0.12.6 +Werkzeug==0.15.5 +WTForms-Components==0.10.3 +WTForms==2.2.1 diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 00000000..aed8953c --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,2 @@ +-r requirements-common.txt +-e dependencies/UsersHub-authentification-module diff --git a/requirements.txt b/requirements.txt index 8efa31ce..23d62ddf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,25 +1,2 @@ +-r requirements-common.txt https://github.com/PnX-SI/UsersHub-authentification-module/archive/1.4.4.zip -bcrypt==3.1.4 -click==6.7 -decorator==4.3.0 -Flask-Bootstrap==3.3.7.1 -Flask-Cors==3.0.10 -Flask-SQLAlchemy==2.3.2 -Flask-WTF==0.14.2 -flask==1.1.1 -gunicorn==19.9.0 -infinity==1.4 -intervals==0.8.1 -itsdangerous==0.24 -Jinja2==2.10.1 -MarkupSafe==1.1 -psycopg2==2.8.5 -pycparser==2.18 -python-dateutil==2.7.3 -six==1.11.0 -SQLAlchemy==1.3.19 -toml==0.10.0 -validators==0.12.6 -Werkzeug==0.15.5 -WTForms-Components==0.10.3 -WTForms==2.2.1 \ No newline at end of file From e9a51f268c4558673c494b5e198398233caa6f40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Mon, 6 Sep 2021 11:57:09 +0200 Subject: [PATCH 05/57] package UsersHub add support for alembic add apache config file migrate from supervisor to systemd --- .flaskenv | 1 + MANIFEST.in | 4 + app/app.py | 132 ++++++++++++++++ app/env.py | 5 +- app/migrations/README | 1 + __init__.py => app/migrations/__init__.py | 0 app/migrations/alembic.ini | 47 ++++++ app/migrations/env.py | 96 ++++++++++++ app/migrations/script.py.mako | 24 +++ .../versions/9445a69f2bed_usershub.py | 59 ++++++++ app/models.py | 4 +- docs/installation.rst | 30 ++-- flask_run.sh => flask_dev.sh | 9 +- gunicorn_start.sh | 18 --- install_app.sh | 26 ++-- install_db.sh | 26 +--- requirements-common.txt | 5 + requirements.in | 10 ++ server.py | 142 ------------------ setup.py | 25 +++ usershub-service.conf | 6 - usershub.service | 27 ++++ usershub_apache.conf | 5 + 23 files changed, 481 insertions(+), 221 deletions(-) create mode 100644 .flaskenv create mode 100644 MANIFEST.in create mode 100644 app/app.py create mode 100644 app/migrations/README rename __init__.py => app/migrations/__init__.py (100%) create mode 100644 app/migrations/alembic.ini create mode 100644 app/migrations/env.py create mode 100644 app/migrations/script.py.mako create mode 100644 app/migrations/versions/9445a69f2bed_usershub.py rename flask_run.sh => flask_dev.sh (53%) delete mode 100755 gunicorn_start.sh create mode 100644 requirements.in delete mode 100644 server.py create mode 100644 setup.py delete mode 100644 usershub-service.conf create mode 100644 usershub.service create mode 100644 usershub_apache.conf diff --git a/.flaskenv b/.flaskenv new file mode 100644 index 00000000..1e6e8a5a --- /dev/null +++ b/.flaskenv @@ -0,0 +1 @@ +FLASK_APP=app.app:create_app diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 00000000..6fd750de --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,4 @@ +include VERSION +include LICENSE +include README.rst +include requirements.in diff --git a/app/app.py b/app/app.py new file mode 100644 index 00000000..720a761c --- /dev/null +++ b/app/app.py @@ -0,0 +1,132 @@ +""" + Serveur de l'application UsersHub +""" + +import os +import sys +import json +from pkg_resources import iter_entry_points +from urllib.parse import urlsplit + +from flask import ( + Flask, redirect, url_for, + request, session, render_template, + g +) +from werkzeug.middleware.proxy_fix import ProxyFix +from flask_migrate import Migrate + +from app.env import db + + +migrate = Migrate() + + +@migrate.configure +def configure_alembic(alembic_config): + """ + This function add to the 'version_locations' parameter of the alembic config the + 'migrations' entry point value of the 'gn_module' group for all modules having such entry point. + Thus, alembic will find migrations of all installed geonature modules. + """ + version_locations = alembic_config.get_main_option('version_locations', default='').split() + for entry_point in iter_entry_points('alembic', 'migrations'): + _, migrations = str(entry_point).split('=', 1) + version_locations += [ migrations.strip() ] + alembic_config.set_main_option('version_locations', ' '.join(version_locations)) + return alembic_config + + +def create_app(): + app = Flask(__name__) + app.config.from_pyfile("../config/config.py") + app.config['APPLICATION_ROOT'] = urlsplit(app.config['URL_APPLICATION']).path + if 'SCRIPT_NAME' not in os.environ: + os.environ['SCRIPT_NAME'] = app.config['APPLICATION_ROOT'] + app.config["URL_REDIRECT"] = "{}/{}".format(app.config["URL_APPLICATION"], "login") + app.secret_key = app.config["SECRET_KEY"] + app.wsgi_app = ProxyFix(app.wsgi_app, x_host=1) + + db.init_app(app) + app.config["DB"] = db + + migrate.init_app(app, db, directory='app/migrations') + + with app.app_context(): + app.jinja_env.globals["url_application"] = app.config["URL_APPLICATION"] + + if app.config["ACTIVATE_APP"]: + @app.route("/") + def index(): + """ Route par défaut de l'application """ + return redirect(url_for("user.users")) + + @app.route("/constants.js") + def constants_js(): + """ Route des constantes javascript """ + return render_template("constants.js") + + @app.after_request + def after_login_method(response): + """ + Fonction s'exécutant après chaque requete + permet de gérer l'authentification + """ + if not request.cookies.get("token"): + session["current_user"] = None + + if request.endpoint == "auth.login" and response.status_code == 200: # noqa + current_user = json.loads(response.get_data().decode("utf-8")) + session["current_user"] = current_user["user"] + return response + + @app.context_processor + def inject_user(): + return dict(user=getattr(g, "user", None)) + + from pypnusershub import routes + + app.register_blueprint(routes.routes, url_prefix="/pypn/auth") + + from app.t_roles import route + + app.register_blueprint(route.route, url_prefix="/") + + from app.bib_organismes import route + + app.register_blueprint(route.route, url_prefix="/") + + from app.groupe import route + + app.register_blueprint(route.route, url_prefix="/") + + from app.liste import route + + app.register_blueprint(route.route, url_prefix="/") + + from app.t_applications import route + + app.register_blueprint(route.route, url_prefix="/") + + from app.t_profils import route + + app.register_blueprint(route.route, url_prefix="/") + + from app.login import route + + app.register_blueprint(route.route, url_prefix="/") + + from app.temp_users import routes + + app.register_blueprint(routes.routes, url_prefix="/temp_users") + + from app.api import route + + app.register_blueprint(route.route, url_prefix="/api") + + if app.config['ACTIVATE_API']: + from app.api import route_register + + app.register_blueprint(route_register.route, url_prefix="/api_register") # noqa + + return app diff --git a/app/env.py b/app/env.py index db9ee41e..2fe448c8 100644 --- a/app/env.py +++ b/app/env.py @@ -1,4 +1,4 @@ - +import os from flask_sqlalchemy import SQLAlchemy @@ -6,4 +6,5 @@ Création de la base avec sqlalchemy """ -db = SQLAlchemy() \ No newline at end of file +os.environ['FLASK_SQLALCHEMY_DB'] = 'app.env.db' +db = SQLAlchemy() diff --git a/app/migrations/README b/app/migrations/README new file mode 100644 index 00000000..98e4f9c4 --- /dev/null +++ b/app/migrations/README @@ -0,0 +1 @@ +Generic single-database configuration. \ No newline at end of file diff --git a/__init__.py b/app/migrations/__init__.py similarity index 100% rename from __init__.py rename to app/migrations/__init__.py diff --git a/app/migrations/alembic.ini b/app/migrations/alembic.ini new file mode 100644 index 00000000..36ae056c --- /dev/null +++ b/app/migrations/alembic.ini @@ -0,0 +1,47 @@ +# A generic, single database configuration. + +[alembic] +# template used to generate migration files +# file_template = %%(rev)s_%%(slug)s + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +version_locations = %(here)s/versions + + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/app/migrations/env.py b/app/migrations/env.py new file mode 100644 index 00000000..94521792 --- /dev/null +++ b/app/migrations/env.py @@ -0,0 +1,96 @@ +from __future__ import with_statement + +import logging +from logging.config import fileConfig + +from sqlalchemy import engine_from_config +from sqlalchemy import pool + +from alembic import context + +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +fileConfig(config.config_file_name) +logger = logging.getLogger('alembic.env') + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata +from flask import current_app +config.set_main_option( + 'sqlalchemy.url', + str(current_app.extensions['migrate'].db.engine.url).replace('%', '%%')) +target_metadata = current_app.extensions['migrate'].db.metadata + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def run_migrations_offline(): + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option("sqlalchemy.url") + context.configure( + url=url, target_metadata=target_metadata, literal_binds=True + ) + + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online(): + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + + # this callback is used to prevent an auto-migration from being generated + # when there are no changes to the schema + # reference: http://alembic.zzzcomputing.com/en/latest/cookbook.html + def process_revision_directives(context, revision, directives): + if getattr(config.cmd_opts, 'autogenerate', False): + script = directives[0] + if script.upgrade_ops.is_empty(): + directives[:] = [] + logger.info('No changes in schema detected.') + + connectable = engine_from_config( + config.get_section(config.config_ini_section), + prefix='sqlalchemy.', + poolclass=pool.NullPool, + ) + + with connectable.connect() as connection: + context.configure( + connection=connection, + target_metadata=target_metadata, + process_revision_directives=process_revision_directives, + **current_app.extensions['migrate'].configure_args + ) + + with context.begin_transaction(): + context.run_migrations() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/app/migrations/script.py.mako b/app/migrations/script.py.mako new file mode 100644 index 00000000..2c015630 --- /dev/null +++ b/app/migrations/script.py.mako @@ -0,0 +1,24 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +down_revision = ${repr(down_revision)} +branch_labels = ${repr(branch_labels)} +depends_on = ${repr(depends_on)} + + +def upgrade(): + ${upgrades if upgrades else "pass"} + + +def downgrade(): + ${downgrades if downgrades else "pass"} diff --git a/app/migrations/versions/9445a69f2bed_usershub.py b/app/migrations/versions/9445a69f2bed_usershub.py new file mode 100644 index 00000000..b37c98e9 --- /dev/null +++ b/app/migrations/versions/9445a69f2bed_usershub.py @@ -0,0 +1,59 @@ +"""UsersHub + +Revision ID: 9445a69f2bed +Revises: fa35dfe5ff27 +Create Date: 2021-08-30 16:33:42.410504 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '9445a69f2bed' +down_revision = None +branch_labels = ('usershub',) +depends_on = ( + 'fa35dfe5ff27', # schema utilisateurs + '72f227e37bdf', # schema utilisateurs, données d’exemples +) + + +def upgrade(): + op.execute(""" + INSERT INTO utilisateurs.t_applications ( + code_application, + nom_application, + desc_application, + id_parent) + VALUES ( + 'UH', + 'UsersHub', + 'Application permettant d''administrer la présente base de données.', + NULL) + """) + op.execute(""" + INSERT INTO utilisateurs.cor_profil_for_app + (id_profil, id_application) + VALUES + (6, (SELECT id_application FROM utilisateurs.t_applications WHERE code_application = 'UH')), + (3, (SELECT id_application FROM utilisateurs.t_applications WHERE code_application = 'UH')) + """) + op.execute(""" + INSERT INTO cor_role_app_profil (id_role, id_application, id_profil) VALUES + ( + (SELECT id_role FROM t_roles WHERE nom_role = 'Grp_admin'), + (SELECT id_application FROM t_applications WHERE code_application = 'UH'), + (SELECT id_profil FROM t_profils WHERE code_profil = '6') + ) + """) + + +def downgrade(): + op.execute(""" + DELETE FROM utilisateurs.cor_profil_for_app cor + USING utilisateurs.t_applications app + WHERE cor.id_application = app.id_application + AND app.code_application = 'UH' + """) + op.execute("DELETE FROM utilisateurs.t_applications WHERE code_application = 'UH'") diff --git a/app/models.py b/app/models.py index ff9cd519..6c16af21 100644 --- a/app/models.py +++ b/app/models.py @@ -26,7 +26,7 @@ class Bib_Organismes(GenericRepository): """ __tablename__ = "bib_organismes" - __table_args__ = {"schema": "utilisateurs"} + __table_args__ = {"schema": "utilisateurs", "extend_existing": True} id_organisme = db.Column(db.Integer, primary_key=True) uuid_organisme = db.Column( UUID(as_uuid=True), default=select([func.uuid_generate_v4()]) @@ -364,7 +364,7 @@ class CorRoles(GenericRepository): """ __tablename__ = "cor_roles" - __table_args__ = {"schema": "utilisateurs"} + __table_args__ = {"schema": "utilisateurs", "extend_existing": True} id_role_groupe = db.Column(db.Integer, primary_key=True) id_role_utilisateur = db.Column( db.Integer, ForeignKey("utilisateurs.t_roles.id_role"), primary_key=True diff --git a/docs/installation.rst b/docs/installation.rst index ed481d51..0ed2f466 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -26,48 +26,48 @@ ATTENTION : Les valeurs renseignées dans ce fichier sont utilisées par le scri Si vous installez UsersHub dans le cadre de la gestion des utilisateurs de GeoNature, il est conseillé d'utiliser les mêmes utilisateurs PostgreSQL que pour GeoNature. -Création de la base de données +Configuration de l'application ============================== -* Création de la base de données et chargement des données initiales +* Installation et configuration de l'application :: cd /home/synthese/usershub - ./install_db.sh + ./install_app.sh -Configuration de l'application +Création de la base de données ============================== -* Installation et configuration de l'application +* Création de la base de données et chargement des données initiales :: cd /home/synthese/usershub - ./install_app.sh + ./install_db.sh Configuration Apache ==================== -Créer le fichier ``/etc/apache2/sites-avalaible/usershub.conf`` avec ce contenu : +Créer le fichier ``/etc/apache2/conf-available/usershub.conf`` avec ce contenu : :: - ProxyPass http://localhost:5001 - ProxyPassReverse http://localhost:5001 + ProxyPass http://localhost:5001/usershub + ProxyPassReverse http://localhost:5001/usershub Activer le site et recharger la configuration Apache : :: - sudo a2ensite usershub + sudo a2enconf usershub sudo service apache2 reload -* Pour tester, se connecter à l'application via http://mon-domaine.fr/usershub avec l'utilisateur ``admin`` et son mot de passe ``admin``. +* Pour tester, se connecter à l'application via http://mon-domaine.fr/usershub/ avec l'utilisateur ``admin`` et son mot de passe ``admin``. Mise à jour de l'application @@ -103,4 +103,12 @@ Mise à jour de l'application cd usershub ./install_app.sh +* Mettre à jour la base de données : + +:: + + cd usershub + source venv/bin/activate + flask db upgrade usershub@head + * Suivre les éventuelles notes de version spécifiques à chaque version diff --git a/flask_run.sh b/flask_dev.sh similarity index 53% rename from flask_run.sh rename to flask_dev.sh index 93b1d097..c610522b 100755 --- a/flask_run.sh +++ b/flask_dev.sh @@ -1,12 +1,7 @@ - -export FLASK_APP=server.py export FLASK_ENV=development export FLASK_DEBUG=1 ROOT_DIR=$(readlink -e "${0%/*}") - -export PYTHONPATH=$PYTHONPATH:$ROOT_DIR - - source $ROOT_DIR/venv/bin/activate -flask run --host=0.0.0.0 --port=5001 + +flask run --port=5001 diff --git a/gunicorn_start.sh b/gunicorn_start.sh deleted file mode 100755 index 22aaa8a9..00000000 --- a/gunicorn_start.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -FLASKDIR=$(readlink -e "${0%/*}") - - -. "$FLASKDIR"/config/settings.ini - -echo "Starting $app_name" -echo "$FLASKDIR" - -# activate the virtualenv -cd $FLASKDIR/$venv_dir -source bin/activate - -export PYTHONPATH=$FLASKDIR:$PYTHONPATH - -# Start your unicorn -exec gunicorn server:app --access-logfile $FLASKDIR/var/log/access_uhv2.log --pid="${app_name}.pid" -w "${gun_num_workers}" -b "${gun_host}:${gun_port}" -n "${app_name}" diff --git a/install_app.sh b/install_app.sh index 8fd07e4d..5b7a9120 100755 --- a/install_app.sh +++ b/install_app.sh @@ -28,7 +28,7 @@ cd .. # Installation de l'environement python echo "Installation du virtual env..." -python3 -m virtualenv -p /usr/bin/python3 venv +python3 -m venv venv source venv/bin/activate pip install -r requirements.txt deactivate @@ -46,22 +46,18 @@ cd ../.. #Lancement de l'application -DIR=$(readlink -e "${0%/*}") -currentdir=${PWD##*/} +export USERSHUB_DIR=$(readlink -e "${0%/*}") +# Configuration systemd +envsubst '${USER} ${USERSHUB_DIR}' < usershub.service | sudo tee /etc/systemd/system/usershub.service +sudo systemctl daemon-reload -sudo -s cp usershub-service.conf /etc/supervisor/conf.d/ -sudo -s sed -i "s%APP_PATH%${DIR}%" /etc/supervisor/conf.d/usershub-service.conf - -# activate proxy apache extension +# Configuration apache +sudo cp usershub_apache.conf /etc/apache2/conf-available/usershub.conf +sudo a2enconf usershub sudo a2enmod proxy sudo a2enmod proxy_http +sudo systemctl reload apache2 +# you may need a restart if proxy & proxy_http was not already enabled -# lancement des services qui créent les fichiers de logs -sudo -s supervisorctl reread -sudo -s supervisorctl reload - -#création d'un fichier rotation des logs une fois qu'ils sont créés -sudo cp $DIR/log_rotate /etc/logrotate.d/uhv2 -sudo -s sed -i "s%APP_PATH%${DIR}%" /etc/logrotate.d/uhv2 -sudo logrotate -f /etc/logrotate.conf +echo "Vous pouvez maintenant démarrer UsersHub avec la commande : sudo systemctl start usershub" diff --git a/install_db.sh b/install_db.sh index b0ad7bb0..687ff347 100755 --- a/install_db.sh +++ b/install_db.sh @@ -7,7 +7,6 @@ fi . config/settings.ini -sudo service postgresql restart function database_exists () { # /!\ Will return false if psql can't list database. Edit your pg_hba.conf # as appropriate. @@ -37,21 +36,12 @@ if ! database_exists $db_name then mkdir -p log echo "Création de la base..." - sudo -n -u postgres -s createdb -O $user_pg $db_name - echo "Ajout du language plpgsql et de l'extension pour les UUID..." - sudo -n -u postgres -s psql -d $db_name -c "CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';" - sudo -n -u postgres -s psql -d $db_name -c 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp";' - # Mise en place de la structure de la base et des données permettant son fonctionnement avec l'application - echo "Création de la structure de la base de données..." - export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f data/usershub.sql &>> log/install_db.log - if $insert_minimal_data - then - echo "Insertion des données minimales dans la base de données..." - export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f data/usershub-data.sql &>> log/install_db.log - fi - if $insert_sample_data - then - echo "Insertion des données exemple dans la base de données..." - export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f data/usershub-dataset.sql &>> log/install_db.log - fi + sudo -u postgres -s createdb -O $user_pg $db_name + echo "Ajout de l'extension pour les UUID..." + sudo -u postgres -s psql -d $db_name -c 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp";' fi + + +source venv/bin/activate +flask db upgrade usershub@head +deactivate diff --git a/requirements-common.txt b/requirements-common.txt index 4b4d6516..d6bb8c86 100644 --- a/requirements-common.txt +++ b/requirements-common.txt @@ -1,8 +1,10 @@ +alembic==1.7.1 bcrypt==3.1.4 click==6.7 decorator==4.3.0 Flask-Bootstrap==3.3.7.1 Flask-Cors==3.0.10 +Flask-Migrate==3.1.0 Flask-SQLAlchemy==2.3.2 Flask-WTF==0.14.2 flask==1.1.1 @@ -11,7 +13,10 @@ infinity==1.4 intervals==0.8.1 itsdangerous==0.24 Jinja2==2.10.1 +Mako==1.1.5 MarkupSafe==1.1 +marshmallow==3.13.0 +marshmallow-sqlalchemy==0.26.1 psycopg2==2.8.5 pycparser==2.18 python-dateutil==2.7.3 diff --git a/requirements.in b/requirements.in new file mode 100644 index 00000000..220e4957 --- /dev/null +++ b/requirements.in @@ -0,0 +1,10 @@ +Flask +Flask-SQLAlchemy +Flask-WTF +Flask-Migrate +psycopg2 +WTForms-Components +WTForms +python-dateutil +python-dotenv +marshmallow-sqlalchemy diff --git a/server.py b/server.py deleted file mode 100644 index 1db17a3c..00000000 --- a/server.py +++ /dev/null @@ -1,142 +0,0 @@ -""" - Serveur de l'application UsersHub -""" - -import os -import sys - -# # Test si dossier vendor exists alors on l'ajoute au sys path -# if os.path.isdir('app/vendor'): -# abs_p = os.path.abspath('app/vendor') -# sys.path.append(abs_p) -# # Sinon activation du virtual env - - -import json - -from flask import ( - Flask, redirect, url_for, - request, session, render_template, - g -) - -from app.env import db -from config import config - -class ReverseProxied(object): - def __init__(self, app, script_name=None, scheme=None, server=None): - self.app = app - self.script_name = script_name - self.scheme = scheme - self.server = server - - def __call__(self, environ, start_response): - script_name = environ.get("HTTP_X_SCRIPT_NAME", "") or self.script_name - if script_name: - environ["SCRIPT_NAME"] = script_name - path_info = environ["PATH_INFO"] - if path_info.startswith(script_name): - environ["PATH_INFO"] = path_info[len(script_name) :] - scheme = environ.get("HTTP_X_SCHEME", "") or self.scheme - if scheme: - environ["wsgi.url_scheme"] = scheme - server = environ.get("HTTP_X_FORWARDED_SERVER", "") or self.server - if server: - environ["HTTP_HOST"] = server - return self.app(environ, start_response) - - -app = Flask(__name__, template_folder="app/templates", static_folder="app/static") - -# Chargement de la config -app.config.from_pyfile("config/config.py") -app.config["URL_REDIRECT"] = "{}/{}".format(app.config["URL_APPLICATION"], "login") -app.wsgi_app = ReverseProxied(app.wsgi_app, script_name=app.config["URL_APPLICATION"]) -app.secret_key = app.config["SECRET_KEY"] - -db.init_app(app) - -# pass parameters to the usershub authenfication sub-module, DONT CHANGE THIS -app.config["DB"] = db - -with app.app_context(): - app.jinja_env.globals["url_application"] = app.config["URL_APPLICATION"] - - if app.config["ACTIVATE_APP"]: - @app.route("/") - def index(): - """ Route par défaut de l'application """ - return redirect(url_for("user.users")) - - @app.route("/constants.js") - def constants_js(): - """ Route des constantes javascript """ - return render_template("constants.js") - - @app.after_request - def after_login_method(response): - """ - Fonction s'exécutant après chaque requete - permet de gérer l'authentification - """ - if not request.cookies.get("token"): - session["current_user"] = None - - if request.endpoint == "auth.login" and response.status_code == 200: # noqa - current_user = json.loads(response.get_data().decode("utf-8")) - session["current_user"] = current_user["user"] - return response - - @app.context_processor - def inject_user(): - return dict(user=getattr(g, "user", None)) - - from pypnusershub import routes - - app.register_blueprint(routes.routes, url_prefix="/pypn/auth") - - from app.t_roles import route - - app.register_blueprint(route.route, url_prefix="/") - - from app.bib_organismes import route - - app.register_blueprint(route.route, url_prefix="/") - - from app.groupe import route - - app.register_blueprint(route.route, url_prefix="/") - - from app.liste import route - - app.register_blueprint(route.route, url_prefix="/") - - from app.t_applications import route - - app.register_blueprint(route.route, url_prefix="/") - - from app.t_profils import route - - app.register_blueprint(route.route, url_prefix="/") - - from app.login import route - - app.register_blueprint(route.route, url_prefix="/") - - from app.temp_users import routes - - app.register_blueprint(routes.routes, url_prefix="/temp_users") - - from app.api import route - - app.register_blueprint(route.route, url_prefix="/api") - - if app.config['ACTIVATE_API']: - from app.api import route_register - - app.register_blueprint(route_register.route, url_prefix="/api_register") # noqa - - -if __name__ == "__main__": - app.config["TEMPLATES_AUTO_RELOAD"] = True - app.run(debug=app.config['DEBUG'], port=app.config['PORT']) diff --git a/setup.py b/setup.py new file mode 100644 index 00000000..01faa5f5 --- /dev/null +++ b/setup.py @@ -0,0 +1,25 @@ +import setuptools +from pathlib import Path + + +root_dir = Path(__file__).absolute().parent +with (root_dir / 'VERSION').open() as f: + version = f.read() +with (root_dir / 'README.rst').open() as f: + long_description = f.read() +with (root_dir / 'requirements.in').open() as f: + requirements = f.read().splitlines() + + +setuptools.setup( + name='usershub', + description='Application web de gestion centralisée des utilisateurs', + long_description=long_description, + long_description_content_type='text/x-rst', + maintainer='Parcs nationaux des Écrins et des Cévennes', + maintainer_email='geonature@ecrins-parcnational.fr', + url='https://github.com/PnX-SI/UsersHub', + version=version, + packages=setuptools.find_packages(where='.', include=['app*']), + install_requires=requirements, +) diff --git a/usershub-service.conf b/usershub-service.conf deleted file mode 100644 index 3e7b1dab..00000000 --- a/usershub-service.conf +++ /dev/null @@ -1,6 +0,0 @@ -[program:usershub2] -command = APP_PATH/gunicorn_start.sh -autostart=true -autorestart=true -stdout_logfile = APP_PATH/var/log/errors_uhv2.log -redirect_stderr = true diff --git a/usershub.service b/usershub.service new file mode 100644 index 00000000..2d574e34 --- /dev/null +++ b/usershub.service @@ -0,0 +1,27 @@ +[Unit] +Description=UsersHub +After=network.target + +[Service] +Type=simple +User=${USER} +Group=${USER} +WorkingDirectory=${USERSHUB_DIR}/ +Environment=GUNICORN_PROC_NAME=usershub +Environment=GUNICORN_NUM_WORKERS=4 +Environment=GUNICORN_HOST=127.0.0.1 +Environment=GUNICORN_PORT=5001 +Environment=GUNICORN_TIMEOUT=30 +EnvironmentFile=-${USERSHUB_DIR}/environ +ExecStart=${USERSHUB_DIR}/venv/bin/gunicorn app.app:create_app \ + --name "${GUNICORN_PROC_NAME}" --workers "${GUNICORN_NUM_WORKERS}" \ + --bind "${GUNICORN_HOST}:${GUNICORN_PORT}" --timeout="${GUNICORN_TIMEOUT}" +ExecReload=/bin/kill -s HUP $MAINPID +TimeoutStartSec=10 +TimeoutStopSec=5 +PrivateTmp=true +StandardOutput=append:/var/log/usershub.log +StandardError=inherit + +[Install] +WantedBy=multi-user.target diff --git a/usershub_apache.conf b/usershub_apache.conf new file mode 100644 index 00000000..a47c5632 --- /dev/null +++ b/usershub_apache.conf @@ -0,0 +1,5 @@ +# Configuration UsersHub + + ProxyPass http://127.0.0.1:5001/usershub + ProxyPassReverse http://127.0.0.1:5001/usershub + From e5a1466e0ebfb11c0049edac93f0375925b95aac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Mon, 6 Sep 2021 17:42:00 +0200 Subject: [PATCH 06/57] abort install on error --- install_app.sh | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/install_app.sh b/install_app.sh index 5b7a9120..b5cdf069 100755 --- a/install_app.sh +++ b/install_app.sh @@ -1,6 +1,6 @@ #!/bin/bash -. config/settings.ini +. config/settings.ini || exit 1 # Création des fichiers de configuration cd config @@ -8,12 +8,12 @@ cd config echo "Création du fichier de configuration ..." if [ ! -f config.py ]; then - cp config.py.sample config.py + cp config.py.sample config.py || exit 1 fi echo "préparation du fichier config.py..." -sed -i "s/SQLALCHEMY_DATABASE_URI = .*$/SQLALCHEMY_DATABASE_URI = \"postgresql:\/\/$user_pg:$user_pg_pass@$db_host:$pg_port\/$db_name\"/" config.py +sed -i "s/SQLALCHEMY_DATABASE_URI = .*$/SQLALCHEMY_DATABASE_URI = \"postgresql:\/\/$user_pg:$user_pg_pass@$db_host:$pg_port\/$db_name\"/" config.py || exit 1 url_application="${url_application//\//\\/}" # on enleve le / final @@ -21,16 +21,16 @@ if [ "${url_application: -1}" = '/' ] then url_application="${url_application::-1}" fi -sed -i "s/URL_APPLICATION =.*$/URL_APPLICATION ='$url_application'/g" config.py +sed -i "s/URL_APPLICATION =.*$/URL_APPLICATION ='$url_application'/g" config.py || exit 1 cd .. # Installation de l'environement python echo "Installation du virtual env..." -python3 -m venv venv +python3 -m venv venv || exit 1 source venv/bin/activate -pip install -r requirements.txt +pip install -r requirements.txt || exit 1 deactivate # rendre la commande nvm disponible @@ -39,9 +39,9 @@ export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion # Installation de l'environement javascript cd app/static -nvm install -nvm use -npm ci +nvm install || exit 1 +nvm use || exit 1 +npm ci || exit 1 cd ../.. @@ -49,15 +49,15 @@ cd ../.. export USERSHUB_DIR=$(readlink -e "${0%/*}") # Configuration systemd -envsubst '${USER} ${USERSHUB_DIR}' < usershub.service | sudo tee /etc/systemd/system/usershub.service -sudo systemctl daemon-reload +envsubst '${USER} ${USERSHUB_DIR}' < usershub.service | sudo tee /etc/systemd/system/usershub.service || exit 1 +sudo systemctl daemon-reload || exit 1 # Configuration apache -sudo cp usershub_apache.conf /etc/apache2/conf-available/usershub.conf -sudo a2enconf usershub -sudo a2enmod proxy -sudo a2enmod proxy_http -sudo systemctl reload apache2 +sudo cp usershub_apache.conf /etc/apache2/conf-available/usershub.conf || exit 1 +sudo a2enconf usershub || exit 1 +sudo a2enmod proxy || exit 1 +sudo a2enmod proxy_http || exit 1 +sudo systemctl reload apache2 || exit 1 # you may need a restart if proxy & proxy_http was not already enabled echo "Vous pouvez maintenant démarrer UsersHub avec la commande : sudo systemctl start usershub" From 236144a68dc64f8076e53354081a828b8e5a5cfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Mon, 6 Sep 2021 17:42:18 +0200 Subject: [PATCH 07/57] fix systemd service file --- usershub.service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/usershub.service b/usershub.service index 2d574e34..6b34e0ab 100644 --- a/usershub.service +++ b/usershub.service @@ -13,7 +13,7 @@ Environment=GUNICORN_HOST=127.0.0.1 Environment=GUNICORN_PORT=5001 Environment=GUNICORN_TIMEOUT=30 EnvironmentFile=-${USERSHUB_DIR}/environ -ExecStart=${USERSHUB_DIR}/venv/bin/gunicorn app.app:create_app \ +ExecStart=${USERSHUB_DIR}/venv/bin/gunicorn app.app:create_app() \ --name "${GUNICORN_PROC_NAME}" --workers "${GUNICORN_NUM_WORKERS}" \ --bind "${GUNICORN_HOST}:${GUNICORN_PORT}" --timeout="${GUNICORN_TIMEOUT}" ExecReload=/bin/kill -s HUP $MAINPID From cdef7b3f936c1106788e13c5576a67bff32e1fed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Mon, 6 Sep 2021 17:47:33 +0200 Subject: [PATCH 08/57] update documentation --- docs/installation.rst | 23 ++++++++++------------- docs/server.rst | 43 +++++++++++++------------------------------ 2 files changed, 23 insertions(+), 43 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 0ed2f466..dcbc451a 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -13,9 +13,9 @@ Configuration de la base de données PostgreSQL :: - cd /home/synthese/usershub - cp config/settings.ini.sample config/settings.ini - nano config/settings.ini + $ cd ~/usershub + $ cp config/settings.ini.sample config/settings.ini + $ nano config/settings.ini Renseigner le nom de la base de données, l'utilisateur PostgreSQL et son mot de passe. Il est possible mais non conseillé de laisser les valeurs proposées par défaut. @@ -33,7 +33,7 @@ Configuration de l'application :: - cd /home/synthese/usershub + cd ~/usershub ./install_app.sh @@ -44,21 +44,18 @@ Création de la base de données :: - cd /home/synthese/usershub + cd ~/usershub ./install_db.sh Configuration Apache ==================== -Créer le fichier ``/etc/apache2/conf-available/usershub.conf`` avec ce contenu : - -:: - - - ProxyPass http://localhost:5001/usershub - ProxyPassReverse http://localhost:5001/usershub - +Copier le fichier de configuration apache d’exemple : + +:: + + sudo cp ~/usershub/usershub_apache.conf /etc/apache2/conf-available/usershub.conf Activer le site et recharger la configuration Apache : diff --git a/docs/server.rst b/docs/server.rst index 1054aaa1..af762dda 100644 --- a/docs/server.rst +++ b/docs/server.rst @@ -18,8 +18,8 @@ Un serveur disposant d'au moins de 1 Go RAM et de 5 Go d'espace disque. :: - adduser --home /home/synthese synthese - adduser synthese sudo + # adduser --home /home/synthese synthese + # adduser synthese sudo :Note: @@ -29,43 +29,30 @@ Un serveur disposant d'au moins de 1 Go RAM et de 5 Go d'espace disque. :: - cd /home/synthese - wget https://github.com/PnX-SI/UsersHub/archive/X.Y.Z.zip - unzip X.Y.Z.zip - mv UsersHub-X.Y.Z usershub + $ cd /home/synthese + $ wget https://github.com/PnX-SI/UsersHub/archive/X.Y.Z.zip + $ unzip X.Y.Z.zip + $ mv UsersHub-X.Y.Z usershub Installation et configuration du serveur ======================================== -Installation pour Debian 9. +Installation pour Debian 10 et Debian 11. :: - sudo apt-get install -y python3 python3-dev python3-setuptools python-pip python-virtualenv libpq-dev - sudo apt-get install -y supervisor - sudo apt-get install -y apache2 - sudo apt-get install -y curl - curl -sL https://deb.nodesource.com/setup_10.x | bash - - sudo apt-get install -y nodejs - pip install virtualenv==20.0.1 + $ sudo apt install -y python3-venv libpq-dev postgresql apache2 * Installer NVM (Node version manager), node et npm - :: +:: - wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash - - export NVM_DIR="$HOME/.nvm" - [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm - [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion + $ wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash -Fermer la console et la réouvrir pour que les modifications soient prises en compte. - -:Note: +Fermer la console et la réouvrir pour que l’environnement npm soit pris en compte. - Cette documentation concerne une installation sur Debian. Pour tout autre environemment les commandes sont à adapter. Installation et configuration de PostgreSQL =========================================== @@ -74,14 +61,10 @@ Installation et configuration de PostgreSQL :: - sudo apt-get install postgresql-9.6 postgresql-server-dev-9.6 + $ sudo apt-get install postgresql * Création d'un utilisateur PostgreSQL :: - sudo su postgres - psql - CREATE ROLE geonatuser WITH LOGIN PASSWORD 'monpassachanger'; - \q - exit + $ sudo -u postgres psql -c "CREATE ROLE geonatuser WITH LOGIN PASSWORD 'monpassachanger';" From 0201d4dec6366ff935f10655c3ad61fe1a08bdfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Mon, 6 Sep 2021 18:15:50 +0200 Subject: [PATCH 09/57] bump UsersHub-authentification-module --- dependencies/UsersHub-authentification-module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies/UsersHub-authentification-module b/dependencies/UsersHub-authentification-module index 54facfc4..8b776654 160000 --- a/dependencies/UsersHub-authentification-module +++ b/dependencies/UsersHub-authentification-module @@ -1 +1 @@ -Subproject commit 54facfc499ab31b62448522189f81ed6241ec058 +Subproject commit 8b776654223a29a2d3341ac09f4f3c10f7a5c6f8 From 7bc98c4b0a6e6be0d758f067a89cab6a12400465 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Mon, 6 Sep 2021 18:27:04 +0200 Subject: [PATCH 10/57] allow to install usershub without samples data --- .../versions/9445a69f2bed_usershub.py | 9 ---- .../versions/f63a8f44c969_usershub_samples.py | 47 +++++++++++++++++++ 2 files changed, 47 insertions(+), 9 deletions(-) create mode 100644 app/migrations/versions/f63a8f44c969_usershub_samples.py diff --git a/app/migrations/versions/9445a69f2bed_usershub.py b/app/migrations/versions/9445a69f2bed_usershub.py index b37c98e9..34b27964 100644 --- a/app/migrations/versions/9445a69f2bed_usershub.py +++ b/app/migrations/versions/9445a69f2bed_usershub.py @@ -15,7 +15,6 @@ branch_labels = ('usershub',) depends_on = ( 'fa35dfe5ff27', # schema utilisateurs - '72f227e37bdf', # schema utilisateurs, données d’exemples ) @@ -39,14 +38,6 @@ def upgrade(): (6, (SELECT id_application FROM utilisateurs.t_applications WHERE code_application = 'UH')), (3, (SELECT id_application FROM utilisateurs.t_applications WHERE code_application = 'UH')) """) - op.execute(""" - INSERT INTO cor_role_app_profil (id_role, id_application, id_profil) VALUES - ( - (SELECT id_role FROM t_roles WHERE nom_role = 'Grp_admin'), - (SELECT id_application FROM t_applications WHERE code_application = 'UH'), - (SELECT id_profil FROM t_profils WHERE code_profil = '6') - ) - """) def downgrade(): diff --git a/app/migrations/versions/f63a8f44c969_usershub_samples.py b/app/migrations/versions/f63a8f44c969_usershub_samples.py new file mode 100644 index 00000000..14ec094a --- /dev/null +++ b/app/migrations/versions/f63a8f44c969_usershub_samples.py @@ -0,0 +1,47 @@ +"""UsersHub samples data + +Revision ID: f63a8f44c969 +Revises: +Create Date: 2021-09-06 18:17:06.392398 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'f63a8f44c969' +down_revision = None +branch_labels = ('usershub-samples',) +depends_on = ( + '9445a69f2bed', # usershub + '72f227e37bdf', # utilisateurs schema samples data +) + + +def upgrade(): + op.execute(""" + INSERT INTO utilisateurs.cor_role_app_profil (id_role, id_application, id_profil) VALUES + ( + (SELECT id_role FROM utilisateurs.t_roles WHERE nom_role = 'Grp_admin'), + (SELECT id_application FROM utilisateurs.t_applications WHERE code_application = 'UH'), + (SELECT id_profil FROM utilisateurs.t_profils WHERE code_profil = '6') + ) + """) + + +def downgrade(): + op.execute(""" + DELETE FROM utilisateurs.cor_role_app_profil cor + USING + utilisateurs.t_roles r, + utilisateurs.t_applications a, + utilisateurs.t_profils p + WHERE + cor.id_role = r.id_role + AND cor.id_application = a.id_application + AND cor.id_profil = p.id_profil + AND r.nom_role = 'Grp_admin' + AND a.code_application = 'UH' + AND p.code_profil = '6' + """) From 2a13a0af676552e8ab6964fc0a8820aac3e49571 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Tue, 7 Sep 2021 15:25:48 +0200 Subject: [PATCH 11/57] set default flask port to 5001 --- .flaskenv | 1 + 1 file changed, 1 insertion(+) diff --git a/.flaskenv b/.flaskenv index 1e6e8a5a..74831b60 100644 --- a/.flaskenv +++ b/.flaskenv @@ -1 +1,2 @@ FLASK_APP=app.app:create_app +FLASK_RUN_PORT=5001 From 50cf5b039d8e4542719d014852d75ce7e3cae55c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Thu, 9 Sep 2021 10:24:33 +0200 Subject: [PATCH 12/57] bump UsersHub-authentification-module --- dependencies/UsersHub-authentification-module | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies/UsersHub-authentification-module b/dependencies/UsersHub-authentification-module index 8b776654..1f2685c3 160000 --- a/dependencies/UsersHub-authentification-module +++ b/dependencies/UsersHub-authentification-module @@ -1 +1 @@ -Subproject commit 8b776654223a29a2d3341ac09f4f3c10f7a5c6f8 +Subproject commit 1f2685c3624af6c75c249a7e7329366b7ddad295 diff --git a/requirements.txt b/requirements.txt index 23d62ddf..067d4d93 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,2 @@ -r requirements-common.txt -https://github.com/PnX-SI/UsersHub-authentification-module/archive/1.4.4.zip +https://github.com/PnX-SI/UsersHub-authentification-module/archive/1.5.1.zip From 9dfba5b48d2ecaa700f3ba2abeca04e75a506d41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Mon, 13 Sep 2021 17:37:21 +0200 Subject: [PATCH 13/57] remove ID_APP from config, auto-detect from db that was partially done in only one route --- app/app.py | 10 ++++++++++ app/login/route.py | 8 +------- config/config.py.sample | 3 --- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/app/app.py b/app/app.py index 720a761c..6f938869 100644 --- a/app/app.py +++ b/app/app.py @@ -14,10 +14,13 @@ g ) from werkzeug.middleware.proxy_fix import ProxyFix +from sqlalchemy.exc import ProgrammingError from flask_migrate import Migrate from app.env import db +from pypnusershub.db.models import Application + migrate = Migrate() @@ -55,6 +58,13 @@ def create_app(): with app.app_context(): app.jinja_env.globals["url_application"] = app.config["URL_APPLICATION"] + try: + uh_app = Application.query.filter_by(code_application='UH').one() + except ProgrammingError: + logging.warning("Warning: unable to find UsersHub application, database not yet initialized?") + else: + app.config["ID_APP"] = uh_app.id_application + if app.config["ACTIVATE_APP"]: @app.route("/") def index(): diff --git a/app/login/route.py b/app/login/route.py index be7758cc..3b3b74d0 100644 --- a/app/login/route.py +++ b/app/login/route.py @@ -10,10 +10,4 @@ @route.route('login', methods=['GET']) def login(): - t_app = TApplications.get_all( - columns=["id_application"], - params=[{'col': 'code_application', 'filter': 'UH'}], - recursif=False - ) - ID_APP = t_app[0]['id_application'] - return render_template('login.html', id_app=ID_APP) + return render_template('login.html', id_app=current_app.config['ID_APP']) diff --git a/config/config.py.sample b/config/config.py.sample index 73f2681f..566840bb 100644 --- a/config/config.py.sample +++ b/config/config.py.sample @@ -8,9 +8,6 @@ URLS_COR = ['http://localhost:5000'] SECRET_KEY = 'super secret key' -# ID of UsersHub application -ID_APP = 1 - # Authentification crypting method (hash or md5) PASS_METHOD = 'hash' From 718285a29128f163d5c780b6519f62ebfd204058 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Mon, 13 Sep 2021 17:39:21 +0200 Subject: [PATCH 14/57] use code_profil instead of hard-coded id_profil --- app/migrations/versions/9445a69f2bed_usershub.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/migrations/versions/9445a69f2bed_usershub.py b/app/migrations/versions/9445a69f2bed_usershub.py index 34b27964..3ff14c84 100644 --- a/app/migrations/versions/9445a69f2bed_usershub.py +++ b/app/migrations/versions/9445a69f2bed_usershub.py @@ -35,8 +35,13 @@ def upgrade(): INSERT INTO utilisateurs.cor_profil_for_app (id_profil, id_application) VALUES - (6, (SELECT id_application FROM utilisateurs.t_applications WHERE code_application = 'UH')), - (3, (SELECT id_application FROM utilisateurs.t_applications WHERE code_application = 'UH')) + ( + (SELECT id_profil FROM utilisateurs.t_profils WHERE code_profil = '6'), + (SELECT id_application FROM utilisateurs.t_applications WHERE code_application = 'UH') + ), ( + (SELECT id_profil FROM utilisateurs.t_profils WHERE code_profil = '3'), + (SELECT id_application FROM utilisateurs.t_applications WHERE code_application = 'UH') + ) """) From ae01a637e04c04966f3bdfedc213ff04f7f1b4da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Tue, 21 Sep 2021 11:36:29 +0200 Subject: [PATCH 15/57] update changelog --- docs/changelog.rst | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 9b93491c..393cd43e 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -2,12 +2,44 @@ CHANGELOG ========= -2.1.4 (unreleased) +2.2 (unreleased) ------------------ -**Corrections** +**Nouveautés** + +* Packaging de l’application UsersHub +* Passage de ``supervisor`` à ``systemd`` + + * Les logs de l’application se trouve désormais dans le répertoire système ``/var/log/usershub.log`` + +* Ajout d’un template de configuration ``apache`` +* Gestion des évolutions de la base de données avec `alembic `_ +* Suppression de ``ID_APP`` du fichier de configuration (auto-détection depuis la base de données) +* Mise-à-jour de `UsersHub-authentification-module` +* Ajout d’un champs JSONB ``additional_data`` à ``bib_organismes`` + +**Développement** + +* Ajout de `UsersHub-authentification-module` en temps que sous-module git + +**Note de version** + +Si vous mettez à jour UsersHub : + +* Passage à ``systemd`` : + + * Stopper UsersHub : ``sudo supervisorctl stop usershub2`` + * Supprimer le fichier de configuration de supervisor ``/etc/supervisor/conf.d/usershub-service.conf`` + * Si supervisor n’est plus utilisé par aucun service (répertoire ``conf.d`` vide), il peut être désinstallé : ``sudo apt remove supervisor``) + * Copier ``usershub.service`` dans ``/etc/systemd/system`` + * Éditer ``/etc/systemd/system/usershub.service`` et remplacer les variables ``${USER}`` et ``${USERSHUB_DIR}`` par les valeurs appropriées (`e.g.` ``geonatureadmin`` et ``/home/geonatureadmin/usershub``) + * Lancer la commande ``sudo systemctl daemon-reload`` + * Pour démarrer UsersHub : ``sudo systemctl start usershub`` + * Pour activer UsersHub au démarrage : ``sudo systemctl enable usershub`` + +* Correction de la configuration apache : si vous servez UsersHub sur un prefix (typiquement ``/usershub``), assurez vous que celui-ci figure bien également à la fin des directives ``ProxyPass`` et ``ProxyPassReverse`` comme c’est le cas dans le fichier d’exemple ``install/assets/geonature_apache.conf``. + -* 2.1.3 (2020-09-29) ------------------ @@ -24,6 +56,7 @@ Si vous mettez à jour UsersHub : * Pour passer le champs ``bib_organismes.nom_organisme`` à 500 caractères, exécuter en ligne de commande : :: + # Se connecter avec le superuser de la BDD (postgres) sudo su postgres # Se connecter à la BDD geonature2db (à adapter si votre BDD est nommée autrement) @@ -66,11 +99,13 @@ Si vous mettez à jour UsersHub : **Note de version** * Installez ``pip3`` et ``virtualenv`` + :: sudo apt-get update sudo apt-get install python3-pip sudo pip3 install virtualenv==20.0.1 + * Exécuter le script de mise à jour de la BDD suivant: https://github.com/PnX-SI/UsersHub/blob/master/data/update_2.1.0to2.1.1.sql * Suivez la procédure classique de mise à jour (https://usershub.readthedocs.io/fr/latest/installation.html#mise-a-jour-de-l-application) From 03a35c99d905e995b1aa9c7d4884953de7fd95c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Tue, 21 Sep 2021 11:44:30 +0200 Subject: [PATCH 16/57] fix changelog --- docs/changelog.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 393cd43e..d7edbbba 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -2,7 +2,7 @@ CHANGELOG ========= -2.2 (unreleased) +2.2.0 (unreleased) ------------------ **Nouveautés** @@ -37,7 +37,7 @@ Si vous mettez à jour UsersHub : * Pour démarrer UsersHub : ``sudo systemctl start usershub`` * Pour activer UsersHub au démarrage : ``sudo systemctl enable usershub`` -* Correction de la configuration apache : si vous servez UsersHub sur un prefix (typiquement ``/usershub``), assurez vous que celui-ci figure bien également à la fin des directives ``ProxyPass`` et ``ProxyPassReverse`` comme c’est le cas dans le fichier d’exemple ``install/assets/geonature_apache.conf``. +* Correction de la configuration apache : si vous servez UsersHub sur un prefix (typiquement ``/usershub``), assurez vous que celui-ci figure bien également à la fin des directives ``ProxyPass`` et ``ProxyPassReverse`` comme c’est le cas dans le fichier d’exemple ``usershub_apache.conf``. From f19dfe062424fc58eea535d0882240056ddd5096 Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Tue, 21 Sep 2021 13:14:01 +0200 Subject: [PATCH 17/57] =?UTF-8?q?Changelog=202.2.0=20-=20Compl=C3=A9ments?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/changelog.rst | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index d7edbbba..4fc6f33f 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -10,17 +10,17 @@ CHANGELOG * Packaging de l’application UsersHub * Passage de ``supervisor`` à ``systemd`` - * Les logs de l’application se trouve désormais dans le répertoire système ``/var/log/usershub.log`` + * Les logs de l’application se trouvent désormais dans le répertoire système ``/var/log/usershub.log`` -* Ajout d’un template de configuration ``apache`` -* Gestion des évolutions de la base de données avec `alembic `_ +* Ajout d'un template de configuration ``apache`` +* Gestion de la base de données et de ses évolutions avec `Alembic `_, déplacée dans le sous-module UsersHub-authentification-module (https://github.com/PnX-SI/UsersHub-authentification-module/tree/master/src/pypnusershub/migrations/data) * Suppression de ``ID_APP`` du fichier de configuration (auto-détection depuis la base de données) -* Mise-à-jour de `UsersHub-authentification-module` +* Mise à jour de ``UsersHub-authentification-module`` * Ajout d’un champs JSONB ``additional_data`` à ``bib_organismes`` **Développement** -* Ajout de `UsersHub-authentification-module` en temps que sous-module git +* Ajout de ``UsersHub-authentification-module`` en temps que sous-module git **Note de version** @@ -30,16 +30,16 @@ Si vous mettez à jour UsersHub : * Stopper UsersHub : ``sudo supervisorctl stop usershub2`` * Supprimer le fichier de configuration de supervisor ``/etc/supervisor/conf.d/usershub-service.conf`` - * Si supervisor n’est plus utilisé par aucun service (répertoire ``conf.d`` vide), il peut être désinstallé : ``sudo apt remove supervisor``) - * Copier ``usershub.service`` dans ``/etc/systemd/system`` - * Éditer ``/etc/systemd/system/usershub.service`` et remplacer les variables ``${USER}`` et ``${USERSHUB_DIR}`` par les valeurs appropriées (`e.g.` ``geonatureadmin`` et ``/home/geonatureadmin/usershub``) + * Si supervisor n’est plus utilisé par aucun service (répertoire ``conf.d`` vide), il peut être désinstallé : ``sudo apt remove supervisor`` + * Copier le fichier ``usershub.service`` dans ``/etc/systemd/system`` + * Éditer ``/etc/systemd/system/usershub.service`` et remplacer les variables ``${USER}`` (votre utilisateur linux courant) et ``${USERSHUB_DIR}`` (chemin absolu du répertoire de UsersHub) par les valeurs appropriées (`e.g.` ``geonatureadmin`` et ``/home/geonatureadmin/usershub``) * Lancer la commande ``sudo systemctl daemon-reload`` * Pour démarrer UsersHub : ``sudo systemctl start usershub`` - * Pour activer UsersHub au démarrage : ``sudo systemctl enable usershub`` - -* Correction de la configuration apache : si vous servez UsersHub sur un prefix (typiquement ``/usershub``), assurez vous que celui-ci figure bien également à la fin des directives ``ProxyPass`` et ``ProxyPassReverse`` comme c’est le cas dans le fichier d’exemple ``usershub_apache.conf``. + * Pour activer UsersHub automatiquement au démarrage : ``sudo systemctl enable usershub`` +* Correction de la configuration Apache : si vous servez UsersHub sur un prefix (typiquement ``/usershub``), assurez vous que celui-ci figure bien également à la fin des directives ``ProxyPass`` et ``ProxyPassReverse`` comme c’est le cas dans le fichier d’exemple ``usershub_apache.conf``. +* Si vous n'utilisez pas n'utilisez pas GeoNature, appliquez le passage à Alembic 2.1.3 (2020-09-29) ------------------ From 7a990677459e382bfdda03566e05c4f47a9d9ba3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Tue, 21 Sep 2021 13:42:01 +0200 Subject: [PATCH 18/57] remove all sql files utilisateurs schema is fully managed from UsersHub-authentication-module --- data/synchro_interbase_fille.sql | 17 - data/synchro_interbase_mere.sql | 285 ------------ data/test.sql | 64 --- data/update1.2.0to1.2.1.sql | 2 - data/update1.2.1to1.2.2.sql | 68 --- data/update1.3.0to1.3.1.sql | 598 ------------------------- data/update_1.3.3to2.0.0.sql | 653 ---------------------------- data/update_2.0.0to2.0.1.sql | 29 -- data/update_2.0.3to2.1.0.sql | 79 ---- data/update_2.1.0to2.1.1.sql | 30 -- data/update_2.1.2to2.1.3.sql | 7 - data/update_2.1.3to2.1.4.sql | 75 ---- data/update_filles_1.2.1to1.3.0.sql | 29 -- data/update_mere_1.2.1to1.3.0.sql | 36 -- data/usershub-data.sql | 26 -- data/usershub-dataset.sql | 42 -- data/usershub.sql | 438 ------------------- 17 files changed, 2478 deletions(-) delete mode 100644 data/synchro_interbase_fille.sql delete mode 100644 data/synchro_interbase_mere.sql delete mode 100644 data/test.sql delete mode 100644 data/update1.2.0to1.2.1.sql delete mode 100644 data/update1.2.1to1.2.2.sql delete mode 100644 data/update1.3.0to1.3.1.sql delete mode 100644 data/update_1.3.3to2.0.0.sql delete mode 100644 data/update_2.0.0to2.0.1.sql delete mode 100644 data/update_2.0.3to2.1.0.sql delete mode 100644 data/update_2.1.0to2.1.1.sql delete mode 100644 data/update_2.1.2to2.1.3.sql delete mode 100644 data/update_2.1.3to2.1.4.sql delete mode 100644 data/update_filles_1.2.1to1.3.0.sql delete mode 100644 data/update_mere_1.2.1to1.3.0.sql delete mode 100644 data/usershub-data.sql delete mode 100644 data/usershub-dataset.sql delete mode 100644 data/usershub.sql diff --git a/data/synchro_interbase_fille.sql b/data/synchro_interbase_fille.sql deleted file mode 100644 index 81f6f5d8..00000000 --- a/data/synchro_interbase_fille.sql +++ /dev/null @@ -1,17 +0,0 @@ --- SUR LA BASE FILLE -CREATE EXTENSION IF NOT EXISTS postgres_fdw; - -CREATE SERVER my_db_server - FOREIGN DATA WRAPPER postgres_fdw - OPTIONS (host 'localhost', dbname 'my_db', port '5432'); - -CREATE USER MAPPING - FOR test - SERVER my_db_server - OPTIONS (password 'test', user 'test'); - -DROP SCHEMA IF EXISTS fdw_utilisateurs CASCADE; -CREATE SCHEMA IF NOT EXISTS fdw_utilisateurs; - -IMPORT FOREIGN SCHEMA utilisateurs - FROM SERVER my_db_server INTO fdw_utilisateurs; diff --git a/data/synchro_interbase_mere.sql b/data/synchro_interbase_mere.sql deleted file mode 100644 index 22749f8a..00000000 --- a/data/synchro_interbase_mere.sql +++ /dev/null @@ -1,285 +0,0 @@ --- SUR LA BASE MERE -CREATE EXTENSION IF NOT EXISTS dblink; - --- DROP TABLE utilisateurs.t_synchro_logs CASCADE; -CREATE TABLE utilisateurs.t_synchro_logs ( - id serial PRIMARY KEY, - date_op timestamp DEFAULT (now()), - operation varchar(250), - table_name varchar(250) NOT NULL, - table_cor boolean NOT NULL, - id_name varchar(250), - id_object int, - archive boolean DEFAULT (FALSE) -); - --- DROP TABLE utilisateurs.t_synchro_databases CASCADE; -CREATE TABLE utilisateurs.t_synchro_databases ( - id serial PRIMARY KEY, - host varchar(250), - port int, - dbname varchar(250), - "user" varchar(250), - "password" varchar(250) -); - - -CREATE TABLE utilisateurs.t_synchro_databases_logs_done -( - id_database integer, - id_log integer, - success boolean DEFAULT false, - CONSTRAINT t_synchro_databases_logs_done_id_database_fkey FOREIGN KEY (id_database) - REFERENCES utilisateurs.t_synchro_databases (id) MATCH SIMPLE - ON UPDATE NO ACTION ON DELETE CASCADE, - CONSTRAINT t_synchro_databases_logs_done_id_log_fkey FOREIGN KEY (id_log) - REFERENCES utilisateurs.t_synchro_logs (id) MATCH SIMPLE - ON UPDATE NO ACTION ON DELETE CASCADE, - CONSTRAINT t_synchro_databases_logs_done_pkey PRIMARY KEY (id_database, id_log) -); - - -CREATE OR REPLACE FUNCTION utilisateurs.fct_trg_log_actions_per_db() - RETURNS trigger AS -$BODY$ -DECLARE -BEGIN - - INSERT INTO utilisateurs.t_synchro_databases_logs_done (id_database, id_log, success) - SELECT id, NEW.id, FALSE - FROM utilisateurs.t_synchro_databases; - - RETURN NULL; -END; -$BODY$ - LANGUAGE plpgsql VOLATILE - COST 100; - - -CREATE TRIGGER trg_utilisateurs_log_actions_per_db - AFTER INSERT - ON utilisateurs.t_synchro_logs - FOR EACH ROW - EXECUTE PROCEDURE utilisateurs.fct_trg_log_actions_per_db(); - - -CREATE OR REPLACE FUNCTION utilisateurs.synchro_child_db() - RETURNS boolean AS -$BODY$ - DECLARE - actions RECORD; - db RECORD; - e_sql TEXT; - _db_conn text; - BEGIN - - -- Suppression des doublons de logs - DELETE - FROM utilisateurs.t_synchro_logs a - USING utilisateurs.t_synchro_logs b - WHERE - a.id > b.id - AND ((a.operation = b.operation AND a.id_name = b.id_name AND a.id_object = b.id_object) OR a.table_cor = true) - AND a.table_name = b.table_name - AND a.archive = false and b.archive = false; - - - -- Construction de la requete en fonction des actions à réaliser pour chaque base - FOR db IN (SELECT * FROM utilisateurs.t_synchro_databases) LOOP - BEGIN - - -- Test de connexion à la base - _db_conn := 'dbname='|| db.dbname ||' port='|| db.port ||' host='|| db.host ||' user='|| db.user ||' password='|| db.password; - RAISE NOTICE '%', _db_conn; - IF (SELECT * FROM dblink(_db_conn, 'SELECT 1 as id' ) AS t (id int)) = 1 THEN - - - FOR actions IN ( - SELECT l.* - FROM utilisateurs.t_synchro_logs l - JOIN utilisateurs.t_synchro_databases_logs_done d ON d.id_log = l.id - WHERE d.id_database = db.id AND success = False ORDER BY date_op - ) LOOP - RAISE NOTICE '%', actions.operation; - IF actions.table_cor = TRUE THEN - e_sql := 'TRUNCATE TABLE utilisateurs.'||actions.table_name||'; INSERT INTO utilisateurs.'||actions.table_name||' SELECT * FROM fdw_utilisateurs.'||actions.table_name; - ELSIF actions.operation = 'UPDATE' THEN - SELECT INTO e_sql 'UPDATE utilisateurs.'||actions.table_name||' u SET '|| string_agg(column_name || ' = a.' || column_name , ',' )|| - ' FROM fdw_utilisateurs.'||actions.table_name||' as a WHERE a.' || actions.id_name || ' = u.' || actions.id_name || ' AND a.'|| actions.id_name || ' = ' || actions.id_object - FROM information_schema.columns WHERE table_schema = 'utilisateurs' AND table_name = actions.table_name - GROUP BY table_schema, table_name; - ELSIF actions.operation = 'INSERT' THEN - e_sql := 'INSERT INTO utilisateurs.'||actions.table_name||' SELECT * FROM fdw_utilisateurs.'||actions.table_name||' as a WHERE a.' || actions.id_name || ' = ' || actions.id_object; - ELSIF actions.operation = 'DELETE' THEN - e_sql := 'DELETE FROM utilisateurs.'||actions.table_name||' WHERE ' || actions.id_name || ' = ' || actions.id_object; - END IF; - -- Lancement des actions sur les bases filles - RAISE NOTICE '%', e_sql; - BEGIN - PERFORM dblink_exec(_db_conn , e_sql); - - UPDATE utilisateurs.t_synchro_databases_logs_done SET success = true - WHERE id_database = db.id AND id_log = actions.id; - - exception WHEN others THEN - RAISE notice 'ERROR % %', SQLERRM, SQLSTATE; - END; - END LOOP; - END IF; - exception WHEN others THEN - RAISE notice 'ERROR % %', SQLERRM, SQLSTATE; - END; - END LOOP; - - -- Mise en archives des opérations réalisées sur l'ensemble des bases déclarées - UPDATE utilisateurs.t_synchro_logs SET archive = TRUE - FROM ( - SELECT count(DISTINCT id_database) - count(DISTINCT id_database) FILTER (WHERE success = TRUE) as nb, id_log - FROM utilisateurs.t_synchro_databases_logs_done - GROUP BY id_log - ) a - WHERE nb = 0 AND id = id_log; - - RETURN TRUE; - END; -$BODY$ - LANGUAGE plpgsql VOLATILE - COST 100; - - ---Trigger permettant le log des actions -CREATE OR REPLACE FUNCTION utilisateurs.fct_trg_log_actions() - RETURNS trigger AS -$BODY$ -DECLARE - _id_object int; -BEGIN - IF TG_ARGV[0]::boolean = TRUE THEN - _id_object := NULL; - ELSIF TG_OP = 'DELETE' THEN - EXECUTE format('SELECT ($1).%s::text', TG_ARGV[1]) - USING OLD - INTO _id_object; - ELSE - EXECUTE format('SELECT ($1).%s::text', TG_ARGV[1]) - USING NEW - INTO _id_object; - END IF; - - INSERT INTO utilisateurs.t_synchro_logs (operation, table_name, table_cor, id_name, id_object) - SELECT TG_OP, TG_TABLE_NAME, TG_ARGV[0]::boolean, TG_ARGV[1], _id_object; - - return NULL; -END; -$BODY$ - LANGUAGE plpgsql VOLATILE; - - --- Triggers sur l'ensemble des tables du schéma utilisateurs -do $$ -begin -CREATE TRIGGER trg_utilisateurs_bib_droits_log_a - AFTER INSERT OR UPDATE OR DELETE on utilisateurs.bib_droits - for each row - execute procedure utilisateurs.fct_trg_log_actions(False, 'id_droit'); -exception when others then - raise notice '% %', SQLERRM, SQLSTATE; -end; -$$ language 'plpgsql'; - -CREATE TRIGGER trg_utilisateurs_bib_organismes_log_a - AFTER INSERT OR UPDATE OR DELETE on utilisateurs.bib_organismes - for each row - execute procedure utilisateurs.fct_trg_log_actions(False, 'id_organisme'); - -CREATE TRIGGER trg_utilisateurs_bib_tag_types_log_a - AFTER INSERT OR UPDATE OR DELETE on utilisateurs.bib_tag_types - for each row - execute procedure utilisateurs.fct_trg_log_actions(False, 'id_tag_type'); - -CREATE TRIGGER trg_utilisateurs_bib_unites_types_log_a - AFTER INSERT OR UPDATE OR DELETE on utilisateurs.bib_unites - for each row - execute procedure utilisateurs.fct_trg_log_actions(False, 'id_unite'); - -CREATE TRIGGER trg_utilisateurs_cor_tags_relations_log_a - AFTER INSERT OR UPDATE OR DELETE on utilisateurs.cor_tags_relations - FOR EACH ROW - EXECUTE PROCEDURE utilisateurs.fct_trg_log_actions(TRUE, 'none'); - -CREATE TRIGGER trg_utilisateurs_cor_organism_tag_log_a - AFTER INSERT OR UPDATE OR DELETE on utilisateurs.cor_organism_tag - FOR EACH ROW - EXECUTE PROCEDURE utilisateurs.fct_trg_log_actions(TRUE, 'none'); - -CREATE TRIGGER trg_utilisateurs_cor_role_tag_log_a - AFTER INSERT OR UPDATE OR DELETE on utilisateurs.cor_role_tag - FOR EACH ROW - EXECUTE PROCEDURE utilisateurs.fct_trg_log_actions(TRUE, 'none'); - -do $$ -begin -CREATE TRIGGER trg_utilisateurs_cor_role_droit_application_log_a - AFTER INSERT OR UPDATE OR DELETE on utilisateurs.cor_role_droit_application - FOR EACH ROW - EXECUTE PROCEDURE utilisateurs.fct_trg_log_actions(TRUE, 'none'); - -exception when others then - raise notice '% %', SQLERRM, SQLSTATE; -end; -$$ language 'plpgsql'; - -do $$ -begin -CREATE TRIGGER trg_utilisateurs_cor_role_menu_log_a - AFTER INSERT OR UPDATE OR DELETE on utilisateurs.cor_role_menu - FOR EACH ROW - EXECUTE PROCEDURE utilisateurs.fct_trg_log_actions(TRUE, 'none'); - -exception when others then - raise notice '% %', SQLERRM, SQLSTATE; -end; -$$ language 'plpgsql'; - -CREATE TRIGGER trg_utilisateurs_cor_roles_log_a - AFTER INSERT OR UPDATE OR DELETE on utilisateurs.cor_roles - FOR EACH ROW - EXECUTE PROCEDURE utilisateurs.fct_trg_log_actions(TRUE, 'none'); - -CREATE TRIGGER trg_utilisateurs_cor_application_tag_log_a - AFTER INSERT OR UPDATE OR DELETE on utilisateurs.cor_application_tag - FOR EACH ROW - EXECUTE PROCEDURE utilisateurs.fct_trg_log_actions(TRUE, 'none'); - -CREATE TRIGGER trg_utilisateurs_cor_app_privileges_log_a - AFTER INSERT OR UPDATE OR DELETE on utilisateurs.cor_app_privileges - FOR EACH ROW - EXECUTE PROCEDURE utilisateurs.fct_trg_log_actions(TRUE, 'none'); - -do $$ -begin -CREATE TRIGGER trg_utilisateurs_t_menus_log_a - AFTER INSERT OR UPDATE OR DELETE on utilisateurs.t_menus - FOR EACH ROW - EXECUTE PROCEDURE utilisateurs.fct_trg_log_actions(FALSE, 'id_menu'); - -exception when others then - raise notice '% %', SQLERRM, SQLSTATE; -end; -$$ language 'plpgsql'; - -CREATE TRIGGER trg_utilisateurs_t_applications_log_a - AFTER INSERT OR UPDATE OR DELETE on utilisateurs.t_applications - FOR EACH ROW - EXECUTE PROCEDURE utilisateurs.fct_trg_log_actions(FALSE, 'id_application'); - -CREATE TRIGGER trg_utilisateurs_t_tags_log_a - AFTER INSERT OR UPDATE OR DELETE on utilisateurs.t_tags - FOR EACH ROW - EXECUTE PROCEDURE utilisateurs.fct_trg_log_actions(FALSE, 'id_tag'); - -CREATE TRIGGER trg_utilisateurs_t_roles_log_a - AFTER INSERT OR UPDATE OR DELETE on utilisateurs.t_roles - FOR EACH ROW - EXECUTE PROCEDURE utilisateurs.fct_trg_log_actions(FALSE, 'id_role'); - diff --git a/data/test.sql b/data/test.sql deleted file mode 100644 index f5b384d8..00000000 --- a/data/test.sql +++ /dev/null @@ -1,64 +0,0 @@ --- test v1 à v2 - -DROP TABLE utilisateurs.t_menus CASCADE; - -CREATE OR REPLACE VIEW utilisateurs.t_menus AS -SELECT - t.id_tag AS id_menu, - t.tag_name AS nom_menu, - t.tag_desc AS desc_menu, - c.id_application -FROM utilisateurs.bib_tag_types b -LEFT JOIN utilisateurs.t_tags t ON b.id_tag_type = t.id_tag_type -LEFT JOIN utilisateurs.cor_application_tag c ON c.id_tag = t.id_tag -WHERE b.id_tag_type = 4 - -select * from utilisateurs.t_menus - -DROP TABLE utilisateurs.cor_role_menu CASCADE; - -CREATE OR REPLACE VIEW utilisateurs.cor_role_menu AS -SELECT - DISTINCT - c.id_role, - c.id_tag AS id_menu -FROM utilisateurs.cor_role_tag c -JOIN utilisateurs.t_menus v ON v.id_menu = c.id_tag - -select * from utilisateurs.cor_role_menu - -DROP TABLE utilisateurs.bib_droits CASCADE; - -CREATE OR REPLACE VIEW utilisateurs.bib_droits AS -SELECT - t.id_tag AS id_droit, - t.tag_name AS nom_droit, - t.tag_desc AS desc_droit -FROM utilisateurs.bib_tag_types b -JOIN utilisateurs.t_tags t ON b.id_tag_type = t.id_tag_type -WHERE b.id_tag_type = 3 - -Select * from utilisateurs.bib_droits - -CREATE TABLE IF NOT EXISTS utilisateurs.cor_role_tag_application ( - id_role integer NOT NULL, - id_tag integer NOT NULL, - id_application integer NOT NULL -); - -ALTER TABLE ONLY utilisateurs.cor_role_tag_application ADD CONSTRAINT cor_role_tag_application_pkey PRIMARY KEY (id_role, id_tag, id_application); -ALTER TABLE ONLY utilisateurs.cor_role_tag_application ADD CONSTRAINT cor_role_tag_application_id_application_fkey FOREIGN KEY (id_application) REFERENCES utilisateurs.t_applications(id_application) ON UPDATE CASCADE ON DELETE CASCADE; -ALTER TABLE ONLY utilisateurs.cor_role_tag_application ADD CONSTRAINT cor_role_tag_application_id_tag_fkey FOREIGN KEY (id_tag) REFERENCES utilisateurs.t_tags(id_tag) ON UPDATE CASCADE ON DELETE CASCADE; -ALTER TABLE ONLY utilisateurs.cor_role_tag_application ADD CONSTRAINT cor_role_tag_application_id_role_fkey FOREIGN KEY (id_role) REFERENCES utilisateurs.t_roles(id_role) ON UPDATE CASCADE ON DELETE CASCADE; - -select * from utilisateurs.cor_role_tag_application - -CREATE OR REPLACE VIEW utilisateurs.cor_role_droit_application AS -SELECT - c.id_role, - c.id_tag as id_droit, - c.id_application -FROM utilisateurs.cor_role_tag_application c - - -select * from utilisateurs.cor_role_droit_application diff --git a/data/update1.2.0to1.2.1.sql b/data/update1.2.0to1.2.1.sql deleted file mode 100644 index bd27d1d6..00000000 --- a/data/update1.2.0to1.2.1.sql +++ /dev/null @@ -1,2 +0,0 @@ ---Nettoyage -DROP TABLE IF EXISTS utilisateurs.bib_observateurs; \ No newline at end of file diff --git a/data/update1.2.1to1.2.2.sql b/data/update1.2.1to1.2.2.sql deleted file mode 100644 index 5fed9794..00000000 --- a/data/update1.2.1to1.2.2.sql +++ /dev/null @@ -1,68 +0,0 @@ -DO -$$ -BEGIN -CREATE OR REPLACE VIEW utilisateurs.v_userslist_forall_menu AS - SELECT a.groupe, - a.id_role, - a.identifiant, - a.nom_role, - a.prenom_role, - (upper(a.nom_role::text) || ' '::text) || a.prenom_role::text AS nom_complet, - a.desc_role, - a.pass, - a.email, - a.id_organisme, - a.organisme, - a.id_unite, - a.remarques, - a.pn, - a.session_appli, - a.date_insert, - a.date_update, - a.id_menu - FROM ( SELECT u.groupe, - u.id_role, - u.identifiant, - u.nom_role, - u.prenom_role, - u.desc_role, - u.pass, - u.email, - u.id_organisme, - u.organisme, - u.id_unite, - u.remarques, - u.pn, - u.session_appli, - u.date_insert, - u.date_update, - c.id_menu - FROM utilisateurs.t_roles u - JOIN utilisateurs.cor_role_menu c ON c.id_role = u.id_role - WHERE u.groupe = false - UNION - SELECT u.groupe, - u.id_role, - u.identifiant, - u.nom_role, - u.prenom_role, - u.desc_role, - u.pass, - u.email, - u.id_organisme, - u.organisme, - u.id_unite, - u.remarques, - u.pn, - u.session_appli, - u.date_insert, - u.date_update, - c.id_menu - FROM utilisateurs.t_roles u - JOIN utilisateurs.cor_roles g ON g.id_role_utilisateur = u.id_role - JOIN utilisateurs.cor_role_menu c ON c.id_role = g.id_role_groupe - WHERE u.groupe = false) a; - EXCEPTION WHEN duplicate_object THEN - -- do nothing, it's already there -END -$$; \ No newline at end of file diff --git a/data/update1.3.0to1.3.1.sql b/data/update1.3.0to1.3.1.sql deleted file mode 100644 index a862d0de..00000000 --- a/data/update1.3.0to1.3.1.sql +++ /dev/null @@ -1,598 +0,0 @@ -SET search_path = utilisateurs, pg_catalog; - - ----------- ---TABLES-- ----------- -CREATE TABLE IF NOT EXISTS t_tags ( - id_tag integer NOT NULL, - id_tag_type integer NOT NULL, - tag_code character varying(25), - tag_name character varying(255), - tag_label character varying(255), - tag_desc text, - date_insert timestamp without time zone, - date_update timestamp without time zone -); -COMMENT ON TABLE t_tags IS 'Permet de créer des étiquettes ou tags ou labels, qu''il est possible d''attacher à différents objects de la base. Cela peut permettre par exemple de créer des groupes ou des listes d''utilisateurs'; - -DO -$$ -BEGIN -CREATE SEQUENCE t_tags_id_tag_seq - START WITH 1000000 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; -EXCEPTION WHEN duplicate_table THEN - -- do nothing, it's already there -END -$$; -ALTER SEQUENCE t_tags_id_tag_seq OWNED BY t_tags.id_tag; -ALTER TABLE ONLY t_tags ALTER COLUMN id_tag SET DEFAULT nextval('t_tags_id_tag_seq'::regclass); - - -CREATE TABLE IF NOT EXISTS bib_tag_types ( - id_tag_type integer NOT NULL, - tag_type_name character varying(100) NOT NULL, - tag_type_desc character varying(255) NOT NULL -); -COMMENT ON TABLE bib_tag_types IS 'Permet de définir le type du tag'; - - -CREATE TABLE IF NOT EXISTS cor_tags_relations ( - id_tag_l integer NOT NULL, - id_tag_r integer NOT NULL, - relation_type character varying(255) NOT NULL -); -COMMENT ON TABLE cor_tags_relations IS 'Permet de définir des relations nn entre tags en affectant des étiquettes à des tags'; - -CREATE TABLE IF NOT EXISTS cor_role_tag ( - id_role integer NOT NULL, - id_tag integer NOT NULL -); -COMMENT ON TABLE cor_role_tag IS 'Permet d''attacher des étiquettes à des roles. Par exemple pour créer des listes d''observateurs'; - -CREATE TABLE IF NOT EXISTS cor_organism_tag ( - id_organism integer NOT NULL, - id_tag integer NOT NULL -); -COMMENT ON TABLE cor_organism_tag IS 'Permet d''attacher des étiquettes à des organismes'; - - -CREATE TABLE IF NOT EXISTS cor_application_tag ( - id_application integer NOT NULL, - id_tag integer NOT NULL -); -COMMENT ON TABLE cor_organism_tag IS 'Permet d''attacher des étiquettes à des applications'; - - -CREATE TABLE IF NOT EXISTS cor_app_privileges ( - id_tag_action integer NOT NULL, - id_tag_object integer NOT NULL, - id_application integer NOT NULL, - id_role integer NOT NULL -); -COMMENT ON TABLE cor_app_privileges IS 'Cette table centrale, permet de gérer les droits d''usage des données en fonction du profil de l''utilisateur. Elle établi une correspondance entre l''affectation de tags génériques du schéma utilisateurs à un role pour une application avec les droits d''usage (CREATE, READ, UPDATE, VALID, EXPORT, DELETE) et le type des données GeoNature (MY DATA, MY ORGANISM DATA, ALL DATA)'; - - -DO -$$ -BEGIN -ALTER TABLE bib_organismes ADD COLUMN id_parent integer; -ALTER TABLE t_applications ADD COLUMN id_parent integer; -EXCEPTION WHEN duplicate_column THEN - RAISE NOTICE 'Tentative d''insertion de valeur existante'; -END -$$; - - -DO $$ - BEGIN - ALTER TABLE utilisateurs.t_roles ADD COLUMN pass_plus text; - EXCEPTION - WHEN duplicate_column THEN RAISE NOTICE 'column "pass_plus" already exists in "utilisateurs.t_roles".'; - END -$$; ----------------- ---PRIMARY KEYS-- ----------------- -ALTER TABLE ONLY t_tags ADD CONSTRAINT pk_t_tags PRIMARY KEY (id_tag); - -ALTER TABLE ONLY bib_tag_types ADD CONSTRAINT pk_bib_tag_types PRIMARY KEY (id_tag_type); - -ALTER TABLE ONLY cor_tags_relations ADD CONSTRAINT pk_cor_tags_relations PRIMARY KEY (id_tag_l, id_tag_r); - -ALTER TABLE ONLY cor_organism_tag ADD CONSTRAINT pk_cor_organism_tag PRIMARY KEY (id_organism, id_tag); - -ALTER TABLE ONLY cor_role_tag ADD CONSTRAINT pk_cor_role_tag PRIMARY KEY (id_role, id_tag); - -ALTER TABLE ONLY cor_application_tag ADD CONSTRAINT pk_cor_application_tag PRIMARY KEY (id_application, id_tag); - -ALTER TABLE ONLY cor_app_privileges ADD CONSTRAINT pk_cor_app_privileges PRIMARY KEY (id_tag_object, id_tag_action, id_application, id_role); - - ------------- ---TRIGGERS-- ------------- - -DO -$$ -BEGIN -CREATE TRIGGER tri_modify_date_insert_t_tags BEFORE INSERT ON t_tags FOR EACH ROW EXECUTE PROCEDURE modify_date_insert(); -EXCEPTION WHEN duplicate_object THEN - -- do nothing, it's already there -END -$$; - -DO -$$ -BEGIN -CREATE TRIGGER tri_modify_date_update_t_tags BEFORE UPDATE ON t_tags FOR EACH ROW EXECUTE PROCEDURE modify_date_update(); -EXCEPTION WHEN duplicate_object THEN - -- do nothing, it's already there -END -$$; - ----------------- ---FOREIGN KEYS-- ----------------- -DO -$$ -BEGIN -ALTER TABLE ONLY bib_organismes ADD CONSTRAINT fk_bib_organismes_id_parent FOREIGN KEY (id_parent) REFERENCES bib_organismes(id_organisme) ON UPDATE CASCADE; -ALTER TABLE ONLY t_applications ADD CONSTRAINT fk_t_applications_id_parent FOREIGN KEY (id_parent) REFERENCES t_applications(id_application) ON UPDATE CASCADE; -EXCEPTION WHEN duplicate_object THEN - RAISE NOTICE 'Tentative d''insertion de valeur existante'; -END -$$; -ALTER TABLE ONLY t_tags ADD CONSTRAINT fk_t_tags_id_tag_type FOREIGN KEY (id_tag_type) REFERENCES bib_tag_types(id_tag_type) ON UPDATE CASCADE; - -ALTER TABLE ONLY cor_tags_relations ADD CONSTRAINT fk_cor_tags_relations_id_tag_l FOREIGN KEY (id_tag_l) REFERENCES t_tags(id_tag) ON UPDATE CASCADE; -ALTER TABLE ONLY cor_tags_relations ADD CONSTRAINT fk_cor_tags_relations_id_tag_r FOREIGN KEY (id_tag_r) REFERENCES t_tags(id_tag) ON UPDATE CASCADE; - -ALTER TABLE ONLY cor_organism_tag ADD CONSTRAINT fk_cor_organism_tag_id_organism FOREIGN KEY (id_organism) REFERENCES bib_organismes(id_organisme) ON UPDATE CASCADE; -ALTER TABLE ONLY cor_organism_tag ADD CONSTRAINT fk_cor_organism_tag_id_tag FOREIGN KEY (id_tag) REFERENCES t_tags(id_tag) ON UPDATE CASCADE; - -ALTER TABLE ONLY cor_role_tag ADD CONSTRAINT fk_cor_role_tag_id_role FOREIGN KEY (id_role) REFERENCES t_roles(id_role) ON UPDATE CASCADE; -ALTER TABLE ONLY cor_role_tag ADD CONSTRAINT fk_cor_role_tag_id_tag FOREIGN KEY (id_tag) REFERENCES t_tags(id_tag) ON UPDATE CASCADE; - -ALTER TABLE ONLY cor_application_tag ADD CONSTRAINT fk_cor_application_tag_t_applications_id_application FOREIGN KEY (id_application) REFERENCES t_applications(id_application) ON UPDATE CASCADE; -ALTER TABLE ONLY cor_application_tag ADD CONSTRAINT fk_cor_application_tag_t_tags_id_tag FOREIGN KEY (id_tag) REFERENCES t_tags(id_tag) ON UPDATE CASCADE; - -ALTER TABLE ONLY cor_app_privileges ADD CONSTRAINT fk_cor_app_privileges_id_tag_object FOREIGN KEY (id_tag_object) REFERENCES t_tags(id_tag) ON UPDATE CASCADE; -ALTER TABLE ONLY cor_app_privileges ADD CONSTRAINT fk_cor_app_privileges_id_tag_action FOREIGN KEY (id_tag_action) REFERENCES t_tags(id_tag) ON UPDATE CASCADE; -ALTER TABLE ONLY cor_app_privileges ADD CONSTRAINT fk_cor_app_privileges_id_application FOREIGN KEY (id_application) REFERENCES t_applications(id_application) ON UPDATE CASCADE; -ALTER TABLE ONLY cor_app_privileges ADD CONSTRAINT fk_cor_app_privileges_id_role FOREIGN KEY (id_role) REFERENCES t_roles(id_role) ON UPDATE CASCADE; - - ---------- ---VIEWS-- ---------- -DROP VIEW IF EXISTS v_userslist_forall_menu; -CREATE OR REPLACE VIEW v_userslist_forall_menu AS - SELECT a.groupe, - a.id_role, - a.identifiant, - a.nom_role, - a.prenom_role, - (upper(a.nom_role::text) || ' '::text) || a.prenom_role::text AS nom_complet, - a.desc_role, - a.pass, - a.pass_plus, - a.email, - a.id_organisme, - a.organisme, - a.id_unite, - a.remarques, - a.pn, - a.session_appli, - a.date_insert, - a.date_update, - a.id_menu - FROM ( SELECT u.groupe, - u.id_role, - u.identifiant, - u.nom_role, - u.prenom_role, - u.desc_role, - u.pass, - u.pass_plus, - u.email, - u.id_organisme, - u.organisme, - u.id_unite, - u.remarques, - u.pn, - u.session_appli, - u.date_insert, - u.date_update, - c.id_menu - FROM utilisateurs.t_roles u - JOIN utilisateurs.cor_role_menu c ON c.id_role = u.id_role - WHERE u.groupe = false - UNION - SELECT u.groupe, - u.id_role, - u.identifiant, - u.nom_role, - u.prenom_role, - u.desc_role, - u.pass, - u.pass_plus, - u.email, - u.id_organisme, - u.organisme, - u.id_unite, - u.remarques, - u.pn, - u.session_appli, - u.date_insert, - u.date_update, - c.id_menu - FROM utilisateurs.t_roles u - JOIN utilisateurs.cor_roles g ON g.id_role_utilisateur = u.id_role - JOIN utilisateurs.cor_role_menu c ON c.id_role = g.id_role_groupe - WHERE u.groupe = false) a; - -DROP VIEW IF EXISTS v_userslist_forall_applications; -CREATE OR REPLACE VIEW v_userslist_forall_applications AS - SELECT a.groupe, - a.id_role, - a.identifiant, - a.nom_role, - a.prenom_role, - a.desc_role, - a.pass, - a.pass_plus, - a.email, - a.id_organisme, - a.organisme, - a.id_unite, - a.remarques, - a.pn, - a.session_appli, - a.date_insert, - a.date_update, - max(a.id_droit) AS id_droit_max, - a.id_application - FROM ( SELECT u.groupe, - u.id_role, - u.identifiant, - u.nom_role, - u.prenom_role, - u.desc_role, - u.pass, - u.pass_plus, - u.email, - u.id_organisme, - u.organisme, - u.id_unite, - u.remarques, - u.pn, - u.session_appli, - u.date_insert, - u.date_update, - c.id_droit, - c.id_application - FROM utilisateurs.t_roles u - JOIN utilisateurs.cor_role_droit_application c ON c.id_role = u.id_role - WHERE u.groupe = false - UNION - SELECT u.groupe, - u.id_role, - u.identifiant, - u.nom_role, - u.prenom_role, - u.desc_role, - u.pass, - u.pass_plus, - u.email, - u.id_organisme, - u.organisme, - u.id_unite, - u.remarques, - u.pn, - u.session_appli, - u.date_insert, - u.date_update, - c.id_droit, - c.id_application - FROM utilisateurs.t_roles u - JOIN utilisateurs.cor_roles g ON g.id_role_utilisateur = u.id_role - JOIN utilisateurs.cor_role_droit_application c ON c.id_role = g.id_role_groupe - WHERE u.groupe = false) a - GROUP BY a.groupe, a.id_role, a.identifiant, a.nom_role, a.prenom_role, a.desc_role, a.pass, a.pass_plus, a.email, a.id_organisme, a.organisme, a.id_unite, a.remarques, a.pn, a.session_appli, a.date_insert, a.date_update, a.id_application; - -DROP VIEW IF EXISTS v_usersaction_forall_gn_modules; -CREATE OR REPLACE VIEW utilisateurs.v_usersaction_forall_gn_modules AS - WITH p_user_tag AS ( - SELECT u.id_role, - u.identifiant, - u.nom_role, - u.prenom_role, - u.desc_role, - u.pass, - u.pass_plus, - u.email, - u.id_organisme, - c_1.id_tag_action, - c_1.id_tag_object, - c_1.id_application - FROM utilisateurs.t_roles u - JOIN utilisateurs.cor_app_privileges c_1 ON c_1.id_role = u.id_role - WHERE u.groupe = false - ), p_groupe_tag AS ( - SELECT u.id_role, - u.identifiant, - u.nom_role, - u.prenom_role, - u.desc_role, - u.pass, - u.pass_plus, - u.email, - u.id_organisme, - c_1.id_tag_action, - c_1.id_tag_object, - c_1.id_application - FROM utilisateurs.t_roles u - JOIN utilisateurs.cor_roles g ON g.id_role_utilisateur = u.id_role - JOIN utilisateurs.cor_app_privileges c_1 ON c_1.id_role = g.id_role_groupe - WHERE (g.id_role_groupe IN ( SELECT DISTINCT cor_roles.id_role_groupe - FROM utilisateurs.cor_roles)) - ), all_users_tags AS ( - SELECT v_1.id_role, - v_1.identifiant, - v_1.nom_role, - v_1.prenom_role, - v_1.desc_role, - v_1.pass, - v_1.pass_plus, - v_1.email, - v_1.id_organisme, - v_1.id_application, - v_1.id_tag_action, - v_1.id_tag_object, - t1.tag_code AS tag_action_code, - t2.tag_code AS tag_object_code, - max(t2.tag_code::text) OVER (PARTITION BY v_1.id_role, v_1.id_application, t1.tag_code) AS max_tag_object_code - FROM ( SELECT a1.id_role, - a1.identifiant, - a1.nom_role, - a1.prenom_role, - a1.desc_role, - a1.pass, - a1.pass_plus, - a1.email, - a1.id_organisme, - a1.id_tag_action, - a1.id_tag_object, - a1.id_application - FROM p_user_tag a1 - UNION - SELECT a2.id_role, - a2.identifiant, - a2.nom_role, - a2.prenom_role, - a2.desc_role, - a2.pass, - a2.pass_plus, - a2.email, - a2.id_organisme, - a2.id_tag_action, - a2.id_tag_object, - a2.id_application - FROM p_groupe_tag a2) v_1 - JOIN utilisateurs.t_tags t1 ON t1.id_tag = v_1.id_tag_action - JOIN utilisateurs.t_tags t2 ON t2.id_tag = v_1.id_tag_object - ) - SELECT v.id_role, - v.identifiant, - v.nom_role, - v.prenom_role, - v.desc_role, - v.pass, - v.pass_plus, - v.email, - v.id_organisme, - v.id_application, - v.id_tag_action, - v.id_tag_object, - v.tag_action_code, - v.max_tag_object_code::character varying(25) AS tag_object_code - FROM all_users_tags v - WHERE v.max_tag_object_code = v.tag_object_code::text; - - --- ------------- --- --FUNCTIONS-- --- ------------- ---With action id -CREATE OR REPLACE FUNCTION can_user_do_in_module( - myuser integer, - mymodule integer, - myaction integer, - mydataextend integer) - RETURNS boolean AS -$BODY$ --- the function say if the given user can do the requested action in the requested module on the resquested data --- USAGE : SELECT utilisateurs.can_user_do_in_module(requested_userid,requested_actionid,requested_moduleid,requested_dataextendid); --- SAMPLE :SELECT utilisateurs.can_user_do_in_module(2,15,14,22); - BEGIN - IF myaction IN (SELECT id_tag_action FROM utilisateurs.v_usersaction_forall_gn_modules WHERE id_role = myuser AND id_application = mymodule AND id_tag_object >= mydataextend) THEN - RETURN true; - END IF; - RETURN false; - END; -$BODY$ - LANGUAGE plpgsql IMMUTABLE - COST 100; - - ---With action code -CREATE OR REPLACE FUNCTION can_user_do_in_module( - myuser integer, - mymodule integer, - myaction character varying, - mydataextend integer) - RETURNS boolean AS -$BODY$ --- the function say if the given user can do the requested action in the requested module on the resquested data --- USAGE : SELECT utilisateurs.can_user_do_in_module(requested_userid,requested_actioncode,requested_moduleid,requested_dataextendid); --- SAMPLE :SELECT utilisateurs.can_user_do_in_module(2,15,14,22); - BEGIN - IF myaction IN (SELECT tag_action_code FROM utilisateurs.v_usersaction_forall_gn_modules WHERE id_role = myuser AND id_application = mymodule AND id_tag_object >= mydataextend) THEN - RETURN true; - END IF; - RETURN false; - END; -$BODY$ - LANGUAGE plpgsql IMMUTABLE - COST 100; - ---With action id -CREATE OR REPLACE FUNCTION user_max_accessible_data_level_in_module( - myuser integer, - myaction integer, - mymodule integer) - RETURNS integer AS -$BODY$ -DECLARE - themaxleveldatatype integer; --- the function return the max accessible extend of data the given user can access in the requested module --- USAGE : SELECT utilisateurs.user_max_accessible_data_level_in_module(requested_userid,requested_actionid,requested_moduleid); --- SAMPLE :SELECT utilisateurs.user_max_accessible_data_level_in_module(2,14,14); - BEGIN - SELECT max(tag_object_code::int) INTO themaxleveldatatype FROM utilisateurs.v_usersaction_forall_gn_modules WHERE id_role = myuser AND id_application = mymodule AND id_tag_action = myaction; - RETURN themaxleveldatatype; - END; -$BODY$ - LANGUAGE plpgsql IMMUTABLE - COST 100; - ---With action code -CREATE OR REPLACE FUNCTION user_max_accessible_data_level_in_module( - myuser integer, - myaction character varying, - mymodule integer) - RETURNS integer AS -$BODY$ -DECLARE - themaxleveldatatype integer; --- the function return the max accessible extend of data the given user can access in the requested module --- USAGE : SELECT utilisateurs.user_max_accessible_data_level_in_module(requested_userid,requested_actioncode,requested_moduleid); --- SAMPLE :SELECT utilisateurs.user_max_accessible_data_level_in_module(2,14,14); - BEGIN - SELECT max(tag_object_code::int) INTO themaxleveldatatype FROM utilisateurs.v_usersaction_forall_gn_modules WHERE id_role = myuser AND id_application = mymodule AND tag_action_code = myaction; - RETURN themaxleveldatatype; - END; -$BODY$ - LANGUAGE plpgsql IMMUTABLE - COST 100; - -CREATE OR REPLACE FUNCTION find_all_modules_childs(myidapplication integer) - RETURNS SETOF integer AS -$BODY$ - --Param : id_application d'un module ou d'une application quelque soit son rang - --Retourne le id_application de tous les modules enfants + le module lui-même sous forme d'un jeu de données utilisable comme une table - --Usage SELECT utilisateurs.find_all_modules_childs(14); - --ou SELECT * FROM utilisateurs.t_applications WHERE id_application IN(SELECT * FROM utilisateurs.find_all_modules_childs(14)) - DECLARE - inf RECORD; - c integer; - BEGIN - SELECT INTO c count(*) FROM utilisateurs.t_applications WHERE id_parent = myidapplication; - IF c > 0 THEN - FOR inf IN - WITH RECURSIVE modules AS ( - SELECT a1.id_application FROM utilisateurs.t_applications a1 WHERE a1.id_application = myidapplication - UNION ALL - SELECT a2.id_application FROM modules m JOIN utilisateurs.t_applications a2 ON a2.id_parent = m.id_application - ) - SELECT id_application FROM modules - LOOP - RETURN NEXT inf.id_application; - END LOOP; - END IF; - END; -$BODY$ - LANGUAGE plpgsql IMMUTABLE - COST 100 - ROWS 1000; - ---ATTENTION cette fonction ne fonctionne pas sur une base postgres 8.x qui ne connait pas le type "json" ---Vous pouvez l'ignorer si la base n'utilise pas l'extention concernant les tags -CREATE OR REPLACE FUNCTION cruved_for_user_in_module( - myuser integer, - mymodule integer - ) - RETURNS json AS -$BODY$ --- the function return user's CRUVED in the requested module --- USAGE : SELECT utilisateurs.cruved_for_user_in_module(requested_userid,requested_moduleid); --- SAMPLE :SELECT utilisateurs.cruved_for_user_in_module(2,14); -DECLARE - thecruved json; - BEGIN - SELECT array_to_json(array_agg(row)) INTO thecruved - FROM ( - SELECT tag_action_code AS action, max(tag_object_code) AS level - FROM utilisateurs.v_usersaction_forall_gn_modules - WHERE id_role = myuser AND id_application = mymodule - GROUP BY tag_action_code) row; - RETURN thecruved; - END; -$BODY$ - LANGUAGE plpgsql IMMUTABLE - COST 100; - - ----------- --- DATA -- ----------- - -DO -$$ -BEGIN -INSERT INTO bib_tag_types(id_tag_type, tag_type_name, tag_type_desc) VALUES -(1, 'Object', 'Define a type object. Usually to define privileges on an object.') -,(2, 'Action', 'Define a type action. Usually to define privileges for an action.') -,(3, 'Privilege', 'Define a privilege level.') -,(4, 'Liste', 'Define a type liste for grouping anything.') -; -EXCEPTION WHEN unique_violation THEN - RAISE NOTICE 'Tentative d''insertion de valeur existante'; -END -$$; - -DO -$$ -BEGIN -INSERT INTO t_tags (id_tag, id_tag_type, tag_code, tag_name, tag_label, tag_desc) VALUES -(1, 3,'1','utilisateur', 'Utilisateur','Ne peut que consulter') -,(2, 3, '2', 'rédacteur', 'Rédacteur','Il possède des droit d''écriture pour créer des enregistrements') -,(3, 3, '3', 'référent', 'Référent','Utilisateur ayant des droits complémentaires au rédacteur (par exemple exporter des données ou autre)') -,(4, 3, '4', 'modérateur', 'Modérateur', 'Peu utilisé') -,(5, 3, '5', 'validateur', 'Validateur', 'Il valide bien sur') -,(6, 3, '6', 'administrateur', 'Administrateur', 'Il a tous les droits') -,(11, 2, 'C', 'create', 'Create', 'Can create/add new data') -,(12, 2, 'R', 'read', 'Read', 'Can read data') -,(13, 2, 'U', 'update', 'Update', 'Can update data') -,(14, 2, 'V', 'validate', 'Validate', 'Can validate data') -,(15, 2, 'E', 'export', 'Export', 'Can export data') -,(16, 2, 'D', 'delete', 'Delete', 'Can delete data') -,(20, 3, '0', 'nothing', 'Nothing', 'Cannot do anything') -,(21, 3, '1', 'my data', 'My data', 'Can do action only on my data') -,(22, 3, '2', 'my organism data', 'My organism data', 'Can do action only on my data and on my organism data') -,(23, 3, '3', 'all data', 'All data', 'Can do action on all data') - -,(100, 4, NULL, 'observateurs flore', 'Observateurs flore','Liste des observateurs pour les protocoles flore') -,(101, 4, NULL, 'observateurs faune', 'Observateurs faune','Liste des observateurs pour les protocoles faune') -,(102, 4, NULL, 'observateurs aigle', 'Observateurs aigle', 'Liste des observateurs pour le protocole suivi de la reproduction de l''aigle royal') -; -PERFORM pg_catalog.setval('t_tags_id_tag_seq', 104, true); -EXCEPTION WHEN unique_violation THEN - RAISE NOTICE 'Tentative d''insertion de valeur existante'; -END -$$; \ No newline at end of file diff --git a/data/update_1.3.3to2.0.0.sql b/data/update_1.3.3to2.0.0.sql deleted file mode 100644 index 95659b79..00000000 --- a/data/update_1.3.3to2.0.0.sql +++ /dev/null @@ -1,653 +0,0 @@ --- Ce script permet de mettre à jour la structure et le contenu du schéma "utilisateurs" de UsersHub --- et de recréer des vues qui simulent les tables de UsersHub V1 --- pour que les anciennes applications continuent à fonctionner - -CREATE SCHEMA save; - ------------------------ ---Compléter le schéma-- ------------------------ - --- Creation des nouvelles tables - -CREATE TABLE IF NOT EXISTS utilisateurs.t_listes -( - id_liste serial NOT NULL, - code_liste character varying(20) NOT NULL, - nom_liste character varying(50) NOT NULL, - desc_liste text -); -COMMENT ON TABLE utilisateurs.t_listes IS 'Table des listes déroulantes des applications. Les roles de niveau groupes ou utilisateurs devant figurer dans une liste sont gérés dans la table cor_role_liste.'; - -CREATE TABLE IF NOT EXISTS utilisateurs.t_profils ( - id_profil serial NOT NULL, - code_profil character varying(20), - nom_profil character varying(255), - desc_profil text -); -COMMENT ON TABLE utilisateurs.t_profils IS 'Table des profils d''utilisateurs génériques ou applicatifs, qui seront ensuite attachés à des roles et des applications.'; - -CREATE TABLE IF NOT EXISTS utilisateurs.cor_role_liste ( - id_role integer NOT NULL, - id_liste integer NOT NULL -); -COMMENT ON TABLE utilisateurs.cor_role_liste IS 'Equivalent de l''ancienne cor_role_menu. Permet de créer des listes de roles (observateurs par ex.), sans notion de permission.'; - -CREATE TABLE IF NOT EXISTS utilisateurs.cor_profil_for_app ( - id_profil integer NOT NULL, - id_application integer NOT NULL -); -COMMENT ON TABLE utilisateurs.cor_profil_for_app IS 'Permet d''attribuer et limiter les profils disponibles pour chacune des applications'; - -CREATE TABLE IF NOT EXISTS utilisateurs.cor_role_app_profil ( - id_role integer NOT NULL, - id_application integer NOT NULL, - id_profil integer NOT NULL -); -COMMENT ON TABLE utilisateurs.cor_role_app_profil IS 'Cette table centrale, permet d''associer des roles à des profils par application.'; - --- Ajout des contraintes - -ALTER TABLE ONLY utilisateurs.t_listes ADD CONSTRAINT pk_t_listes PRIMARY KEY (id_liste); -ALTER TABLE ONLY utilisateurs.t_profils ADD CONSTRAINT pk_t_profils PRIMARY KEY (id_profil); -ALTER TABLE ONLY utilisateurs.cor_role_liste ADD CONSTRAINT pk_cor_role_liste PRIMARY KEY (id_liste, id_role); -ALTER TABLE ONLY utilisateurs.cor_profil_for_app ADD CONSTRAINT pk_cor_profil_for_app PRIMARY KEY (id_application, id_profil); -ALTER TABLE ONLY utilisateurs.cor_role_app_profil ADD CONSTRAINT pk_cor_role_app_profil PRIMARY KEY (id_role, id_application, id_profil); - -ALTER TABLE ONLY utilisateurs.cor_role_liste ADD CONSTRAINT fk_cor_role_liste_id_liste FOREIGN KEY (id_liste) REFERENCES utilisateurs.t_listes(id_liste) ON UPDATE CASCADE; -ALTER TABLE ONLY utilisateurs.cor_role_liste ADD CONSTRAINT fk_cor_role_liste_id_role FOREIGN KEY (id_role) REFERENCES utilisateurs.t_roles(id_role) ON UPDATE CASCADE; -ALTER TABLE ONLY utilisateurs.cor_profil_for_app ADD CONSTRAINT fk_cor_profil_for_app_id_application FOREIGN KEY (id_application) REFERENCES utilisateurs.t_applications(id_application) ON UPDATE CASCADE; -ALTER TABLE ONLY utilisateurs.cor_profil_for_app ADD CONSTRAINT fk_cor_profil_for_app_id_profil FOREIGN KEY (id_profil) REFERENCES utilisateurs.t_profils(id_profil) ON UPDATE CASCADE; -ALTER TABLE ONLY utilisateurs.cor_role_app_profil ADD CONSTRAINT fk_cor_role_app_profil_id_role FOREIGN KEY (id_role) REFERENCES utilisateurs.t_roles(id_role) ON UPDATE CASCADE ON DELETE CASCADE; -ALTER TABLE ONLY utilisateurs.cor_role_app_profil ADD CONSTRAINT fk_cor_role_app_profil_id_application FOREIGN KEY (id_application) REFERENCES utilisateurs.t_applications(id_application) ON UPDATE CASCADE ON DELETE CASCADE; -ALTER TABLE ONLY utilisateurs.cor_role_app_profil ADD CONSTRAINT fk_cor_role_app_profil_id_profil FOREIGN KEY (id_profil) REFERENCES utilisateurs.t_profils(id_profil) ON UPDATE CASCADE ON DELETE CASCADE; - - ---------- ---USERS-- ---------- -ALTER TABLE utilisateurs.t_roles ADD COLUMN active boolean; -ALTER TABLE utilisateurs.t_roles ALTER COLUMN active SET DEFAULT true; -UPDATE utilisateurs.t_roles SET active = true; - - --------------- ---ORGANISMES-- --------------- --- Creation d'un organisme générique s'il n'est pas deja dans la BDD -DO -$$ -BEGIN -INSERT INTO utilisateurs.bib_organismes(uuid_organisme, nom_organisme, adresse_organisme, id_organisme) VALUES -('fd3c2619-0505-4a75-97e7-8cc37d096247', 'ALL', 'Représente tous les organismes', 0); -EXCEPTION WHEN unique_violation THEN - RAISE NOTICE 'Tentative d''insertion de valeur existante'; -END -$$; --- Ajout de 2 champs url pour l'organisme et son logo -ALTER TABLE utilisateurs.bib_organismes ADD COLUMN url_organisme character varying(255); -ALTER TABLE utilisateurs.bib_organismes ADD COLUMN url_logo character varying(255); - ----------------- ---APPLICATIONS-- ----------------- - -ALTER TABLE utilisateurs.t_applications ADD COLUMN code_application character varying(20); - -UPDATE utilisateurs.t_applications SET code_application = id_application::character varying; -UPDATE utilisateurs.t_applications SET code_application = 'UH' WHERE nom_application ilike 'usershub' OR nom_application ilike 'application utilisateurs'; -UPDATE utilisateurs.t_applications SET code_application = 'TH' WHERE nom_application ilike 'taxhub'; -UPDATE utilisateurs.t_applications SET code_application = 'GN' WHERE nom_application ilike 'geonature' OR nom_application ilike 'application geonature'; - -ALTER TABLE utilisateurs.t_applications ALTER COLUMN code_application SET NOT NULL; - ---------- ---MENUS-- ---------- - --- Basculer les anciennes tables dans le schema "save" -ALTER TABLE utilisateurs.cor_role_menu SET SCHEMA save; -ALTER TABLE utilisateurs.t_menus SET SCHEMA save; -ALTER TABLE utilisateurs.cor_role_tag SET SCHEMA save; - ---Récupérer les informations concernant les menus pour les mettre dans t_listes -DO -$$ -BEGIN -INSERT INTO utilisateurs.t_listes (id_liste, code_liste, nom_liste, desc_liste) -SELECT id_menu, id_menu::character varying, nom_menu, desc_menu -FROM save.t_menus; -EXCEPTION WHEN unique_violation THEN - RAISE NOTICE 'Tentative d''insertion de valeur existante'; -END -$$; - -DO -$$ -BEGIN -INSERT INTO utilisateurs.t_listes (code_liste, nom_liste, desc_liste) -VALUES('obsocctax','Observateurs Occtax','Liste des observateurs du module Occtax'); -EXCEPTION WHEN unique_violation THEN - RAISE NOTICE 'Tentative d''insertion de valeur existante'; -END -$$; -SELECT setval('utilisateurs.t_listes_id_liste_seq', (SELECT max(id_liste)+1 FROM utilisateurs.t_listes), false); ---TODO : récupérer la liste des observateurs occtax - ---Récupérer les informations associant menu et utilisateurs -DO -$$ -BEGIN -INSERT INTO utilisateurs.cor_role_liste (id_role, id_liste) -SELECT id_role, id_menu -FROM save.cor_role_menu; -EXCEPTION WHEN unique_violation THEN - RAISE NOTICE 'Tentative d''insertion de valeur existante'; -END -$$; - - --- Vue recréant l'equivalent de t_menus -CREATE OR REPLACE VIEW utilisateurs.t_menus AS -SELECT - id_liste AS id_menu, - nom_liste AS nom_menu, - desc_liste AS desc_menu, - null::integer AS id_application -FROM utilisateurs.t_listes -; - --- Vue recréant l'equivalent de cor_role_menu -CREATE OR REPLACE VIEW cor_role_menu AS -SELECT -DISTINCT -crl.id_role, -crl.id_liste AS id_menu -FROM utilisateurs.cor_role_liste crl; - - ----------- ---DROITS-- ----------- - --- Basculer les anciennes tables dans le schema "save" -ALTER TABLE utilisateurs.bib_droits SET SCHEMA save; -ALTER TABLE utilisateurs.cor_role_droit_application SET SCHEMA save; - -DO -$$ -BEGIN -INSERT INTO utilisateurs.t_profils (id_profil, code_profil, nom_profil, desc_profil) -SELECT id_droit, id_droit::character varying, nom_droit, desc_droit -FROM save.bib_droits; -EXCEPTION WHEN unique_violation THEN - RAISE NOTICE 'Tentative d''insertion de valeur existante'; -END -$$; -SELECT setval('utilisateurs.t_profils_id_profil_seq', (SELECT max(id_profil)+1 FROM utilisateurs.t_profils), false); - -UPDATE utilisateurs.t_profils -SET nom_profil = 'Lecteur' -,desc_profil = 'Ne peut que consulter/ou acceder' -WHERE code_profil = '1'; - -DO -$$ -BEGIN -INSERT INTO utilisateurs.cor_role_app_profil (id_role, id_application, id_profil) -SELECT id_role, id_application, id_droit -FROM save.cor_role_droit_application; -EXCEPTION WHEN unique_violation THEN - RAISE NOTICE 'Tentative d''insertion de valeur existante'; -END -$$; - - - - --- Association des profils aux applications -INSERT INTO utilisateurs.cor_profil_for_app (id_profil, id_application) VALUES -(6, (SELECT id_application FROM utilisateurs.t_applications WHERE code_application = 'UH')) -,(2, (SELECT id_application FROM utilisateurs.t_applications WHERE code_application = 'TH')) -,(3, (SELECT id_application FROM utilisateurs.t_applications WHERE code_application = 'TH')) -,(4, (SELECT id_application FROM utilisateurs.t_applications WHERE code_application = 'TH')) -,(6, (SELECT id_application FROM utilisateurs.t_applications WHERE code_application = 'TH')) -,(1, (SELECT id_application FROM utilisateurs.t_applications WHERE code_application = 'GN')) -; ---Cette table doit être complétée pour les applications spécifiques de votre structure - ---------- ---VIEWS-- ---------- - --- Vue permettant de simuler le contenu de la table "t_menus" de la V1 -CREATE OR REPLACE VIEW utilisateurs.t_menus AS -SELECT - id_liste AS id_menu, - nom_liste AS nom_menu, - desc_liste AS desc_menu, - null::integer AS id_application -FROM utilisateurs.t_listes -; - --- Vue permettant de simuler le contenu de la table "cor_role_menu" de la V1 -CREATE OR REPLACE VIEW utilisateurs.cor_role_menu AS -SELECT DISTINCT -crl.id_role, -crl.id_liste AS id_menu -FROM utilisateurs.cor_role_liste crl -JOIN utilisateurs.t_roles r ON r.id_role = crl.id_role AND r.active = true; - --- Vue permettant de simuler le contenu de la table "bib_droits" de la V1 -CREATE OR REPLACE VIEW utilisateurs.bib_droits AS -SELECT - id_profil AS id_droit, - nom_profil AS nom_droit, - desc_profil AS desc_droit -FROM utilisateurs.t_profils -WHERE id_profil <= 6; - --- Vue permettant de simuler le contenu de la table "cor_role_droit_application" de la V1 -CREATE OR REPLACE VIEW utilisateurs.cor_role_droit_application AS -SELECT - crap.id_role, - crap.id_profil as id_droit, - crap.id_application -FROM utilisateurs.cor_role_app_profil crap -JOIN utilisateurs.t_roles r ON r.id_role = crap.id_role AND r.active = true; - --- Vue permettant de retourner les utilisateurs des listes (menus) -DROP VIEW utilisateurs.v_userslist_forall_menu; -CREATE OR REPLACE VIEW utilisateurs.v_userslist_forall_menu AS - SELECT a.groupe, - a.id_role, - a.uuid_role, - a.identifiant, - a.nom_role, - a.prenom_role, - (upper(a.nom_role::text) || ' '::text) || a.prenom_role::text AS nom_complet, - a.desc_role, - a.pass, - a.pass_plus, - a.email, - a.id_organisme, - a.organisme, - a.id_unite, - a.remarques, - a.pn, - a.session_appli, - a.date_insert, - a.date_update, - a.id_menu - FROM ( SELECT u.groupe, - u.id_role, - u.uuid_role, - u.identifiant, - u.nom_role, - u.prenom_role, - u.desc_role, - u.pass, - u.pass_plus, - u.email, - u.id_organisme, - o.nom_organisme AS organisme, - 0 AS id_unite, - u.remarques, - u.pn, - u.session_appli, - u.date_insert, - u.date_update, - c.id_liste AS id_menu - FROM utilisateurs.t_roles u - JOIN utilisateurs.cor_role_liste c ON c.id_role = u.id_role - LEFT JOIN utilisateurs.bib_organismes o ON o.id_organisme = u.id_organisme - WHERE u.groupe = false AND u.active = true - UNION - SELECT u.groupe, - u.id_role, - u.uuid_role, - u.identifiant, - u.nom_role, - u.prenom_role, - u.desc_role, - u.pass, - u.pass_plus, - u.email, - u.id_organisme, - o.nom_organisme AS organisme, - 0 AS id_unite, - u.remarques, - u.pn, - u.session_appli, - u.date_insert, - u.date_update, - c.id_liste AS id_menu - FROM utilisateurs.t_roles u - JOIN utilisateurs.cor_roles g ON g.id_role_utilisateur = u.id_role - JOIN utilisateurs.cor_role_liste c ON c.id_role = g.id_role_groupe - LEFT JOIN utilisateurs.bib_organismes o ON o.id_organisme = u.id_organisme - WHERE u.groupe = false AND u.active = true) a; - --- Vue permettant de retourner les roles et leurs droits maximum pour chaque application -CREATE OR REPLACE VIEW utilisateurs.v_roleslist_forall_applications AS -SELECT a.groupe, - a.active, - a.id_role, - a.identifiant, - a.nom_role, - a.prenom_role, - a.desc_role, - a.pass, - a.pass_plus, - a.email, - a.id_organisme, - a.organisme, - a.id_unite, - a.remarques, - a.pn, - a.session_appli, - a.date_insert, - a.date_update, - max(a.id_droit) AS id_droit_max, - a.id_application - FROM ( SELECT u.groupe, - u.id_role, - u.identifiant, - u.nom_role, - u.prenom_role, - u.desc_role, - u.pass, - u.pass_plus, - u.email, - u.id_organisme, - u.active, - o.nom_organisme AS organisme, - 0 AS id_unite, - u.remarques, - u.pn, - u.session_appli, - u.date_insert, - u.date_update, - c.id_profil AS id_droit, - c.id_application - FROM utilisateurs.t_roles u - JOIN utilisateurs.cor_role_app_profil c ON c.id_role = u.id_role - JOIN utilisateurs.bib_organismes o ON o.id_organisme = u.id_organisme - UNION - SELECT u.groupe, - u.id_role, - u.identifiant, - u.nom_role, - u.prenom_role, - u.desc_role, - u.pass, - u.pass_plus, - u.email, - u.id_organisme, - u.active, - o.nom_organisme AS organisme, - 0 AS id_unite, - u.remarques, - u.pn, - u.session_appli, - u.date_insert, - u.date_update, - c.id_profil AS id_droit, - c.id_application - FROM utilisateurs.t_roles u - JOIN utilisateurs.cor_roles g ON g.id_role_utilisateur = u.id_role OR g.id_role_groupe = u.id_role - JOIN utilisateurs.cor_role_app_profil c ON c.id_role = g.id_role_groupe - LEFT JOIN utilisateurs.bib_organismes o ON o.id_organisme = u.id_organisme - ) a - WHERE a.active = true - GROUP BY a.groupe, a.active, a.id_role, a.identifiant, a.nom_role, a.prenom_role, a.desc_role, a.pass, a.pass_plus, a.email, a.id_organisme, a.organisme, a.id_unite, a.remarques, a.pn, a.session_appli, a.date_insert, a.date_update, a.id_application; - --- Vue permettant de retourner les utilisateurs (pas les roles) et leurs droits maximum pour chaque application -DROP VIEW utilisateurs.v_userslist_forall_applications; -CREATE OR REPLACE VIEW utilisateurs.v_userslist_forall_applications AS -SELECT * FROM utilisateurs.v_roleslist_forall_applications -WHERE groupe = false; - - - ---On essaie de recréer une vue qui n'existe pas dans toutes les bases ---Si elle n'existe pas une erreur est levée et la création ne se fait pas. -DO -$$ -BEGIN -DROP VIEW utilisateurs.v_nomade_obs; -CREATE OR REPLACE VIEW utilisateurs.v_nomade_obs AS -SELECT DISTINCT r.id_role AS codeobs, (r.nom_role::text || ' '::text) || r.prenom_role::text AS nomprenom -FROM utilisateurs.t_roles r -WHERE (r.id_role IN ( - SELECT DISTINCT cr.id_role_utilisateur - FROM utilisateurs.cor_roles cr - WHERE (cr.id_role_groupe IN ( - SELECT id_role - FROM utilisateurs.cor_role_menu - WHERE id_menu = 5) - ) - AND cr.id_role_utilisateur <> 999 - ORDER BY cr.id_role_utilisateur) -) -OR (r.id_role IN ( - SELECT crm.id_role - FROM utilisateurs.cor_role_menu crm - JOIN utilisateurs.t_roles r ON r.id_role = crm.id_role AND crm.id_menu = 5 AND r.groupe = false) - ) -ORDER BY (r.nom_role::text || ' '::text) || r.prenom_role::text, r.id_role; -EXCEPTION WHEN undefined_table THEN - RAISE NOTICE 'Cette vue n''existe pas'; -END -$$; - ---Vues mobile. -DO -$$ -BEGIN -DROP VIEW utilisateurs.v_nomade_observateurs_all; -CREATE OR REPLACE VIEW utilisateurs.v_nomade_observateurs_all AS - ( ( SELECT DISTINCT r.id_role, r.nom_role, r.prenom_role, 'fauna'::text AS mode - FROM utilisateurs.t_roles r - WHERE (r.id_role IN ( SELECT DISTINCT cr.id_role_utilisateur - FROM utilisateurs.cor_roles cr - WHERE (cr.id_role_groupe IN ( SELECT crm.id_role - FROM utilisateurs.cor_role_menu crm - WHERE crm.id_menu = 11)) - ORDER BY cr.id_role_utilisateur)) OR (r.id_role IN ( SELECT crm.id_role - FROM utilisateurs.cor_role_menu crm - JOIN utilisateurs.t_roles r ON r.id_role = crm.id_role AND crm.id_menu = 11 AND r.groupe = false AND r.active = true)) - ORDER BY r.nom_role, r.prenom_role, r.id_role) - UNION - ( SELECT DISTINCT r.id_role, r.nom_role, r.prenom_role, 'flora'::text AS mode - FROM utilisateurs.t_roles r - WHERE (r.id_role IN ( SELECT DISTINCT cr.id_role_utilisateur - FROM utilisateurs.cor_roles cr - WHERE (cr.id_role_groupe IN ( SELECT crm.id_role - FROM utilisateurs.cor_role_menu crm - WHERE crm.id_menu = 5)) - ORDER BY cr.id_role_utilisateur)) OR (r.id_role IN ( SELECT crm.id_role - FROM utilisateurs.cor_role_menu crm - JOIN utilisateurs.t_roles r ON r.id_role = crm.id_role AND crm.id_menu = 5 AND r.groupe = false AND r.active = true)) - ORDER BY r.nom_role, r.prenom_role, r.id_role)) -UNION - ( SELECT DISTINCT r.id_role, r.nom_role, r.prenom_role, 'inv'::text AS mode - FROM utilisateurs.t_roles r - WHERE (r.id_role IN ( SELECT DISTINCT cr.id_role_utilisateur - FROM utilisateurs.cor_roles cr - WHERE (cr.id_role_groupe IN ( SELECT crm.id_role - FROM utilisateurs.cor_role_menu crm - WHERE crm.id_menu = 11)) - ORDER BY cr.id_role_utilisateur)) OR (r.id_role IN ( SELECT crm.id_role - FROM utilisateurs.cor_role_menu crm - JOIN utilisateurs.t_roles r ON r.id_role = crm.id_role AND crm.id_menu = 11 AND r.groupe = false AND r.active = true)) - ORDER BY r.nom_role, r.prenom_role, r.id_role); -EXCEPTION WHEN undefined_table THEN - RAISE NOTICE 'Cette vue n''existe pas'; -END -$$; - - -------------- ---NETTOYAGE-- -------------- - -DROP VIEW utilisateurs.v_usersaction_forall_gn_modules; - -ALTER TABLE utilisateurs.cor_application_tag SET SCHEMA save; -ALTER TABLE utilisateurs.cor_organism_tag SET SCHEMA save; -ALTER TABLE utilisateurs.cor_tags_relations SET SCHEMA save; -ALTER TABLE utilisateurs.cor_app_privileges SET SCHEMA save; -ALTER TABLE utilisateurs.t_tags SET SCHEMA save; -ALTER TABLE utilisateurs.bib_tag_types SET SCHEMA save; - --- Supprimer la table bib_unites inutilisée --- Supprimer la FK vers bib_unites dans t_roles -ALTER TABLE utilisateurs.t_roles DROP COLUMN id_unite RESTRICT; --- Supprimer le champs organisme de t_roles (https://github.com/PnEcrins/UsersHub/issues/38) -ALTER TABLE utilisateurs.t_roles DROP COLUMN organisme RESTRICT; - -ALTER TABLE utilisateurs.bib_unites SET SCHEMA save; - ---Rupture des liens entre le schéma save et utilisateurs -ALTER TABLE save.cor_app_privileges DROP CONSTRAINT fk_cor_app_privileges_id_application; -ALTER TABLE save.cor_app_privileges DROP CONSTRAINT fk_cor_app_privileges_id_role; -ALTER TABLE save.cor_app_privileges DROP CONSTRAINT fk_cor_app_privileges_id_tag_action; -ALTER TABLE save.cor_app_privileges DROP CONSTRAINT fk_cor_app_privileges_id_tag_object; -ALTER TABLE save.cor_organism_tag DROP CONSTRAINT fk_cor_organism_tag_id_organism; -ALTER TABLE save.cor_organism_tag DROP CONSTRAINT fk_cor_organism_tag_id_tag; -ALTER TABLE save.cor_role_droit_application DROP CONSTRAINT cor_role_droit_application_id_application_fkey; -ALTER TABLE save.cor_role_droit_application DROP CONSTRAINT cor_role_droit_application_id_droit_fkey; -ALTER TABLE save.cor_role_droit_application DROP CONSTRAINT cor_role_droit_application_id_role_fkey; -ALTER TABLE save.cor_role_menu DROP CONSTRAINT cor_role_menu_application_id_menu_fkey; -ALTER TABLE save.cor_role_menu DROP CONSTRAINT cor_role_menu_application_id_role_fkey; -ALTER TABLE save.cor_role_tag DROP CONSTRAINT fk_cor_role_tag_id_role; -ALTER TABLE save.cor_role_tag DROP CONSTRAINT fk_cor_role_tag_id_tag; -ALTER TABLE save.cor_tags_relations DROP CONSTRAINT fk_cor_tags_relations_id_tag_l; -ALTER TABLE save.cor_tags_relations DROP CONSTRAINT fk_cor_tags_relations_id_tag_r; -ALTER TABLE save.t_menus DROP CONSTRAINT t_menus_id_application_fkey; -ALTER TABLE save.t_tags DROP CONSTRAINT fk_t_tags_id_tag_type; - - -DROP FUNCTION utilisateurs.can_user_do_in_module(integer, integer, integer, integer); -DROP FUNCTION utilisateurs.can_user_do_in_module(integer, integer, character varying, integer); -DROP FUNCTION utilisateurs.user_max_accessible_data_level_in_module(integer, integer, integer); -DROP FUNCTION utilisateurs.user_max_accessible_data_level_in_module(integer, character varying, integer); -DROP FUNCTION utilisateurs.find_all_modules_childs(integer); - --------- ---SAVE-- --------- -------- ---GN1-- -------- ---TODO AVANT SUPPRESSION : ---recréer les vues de GN1 --- contactfaune.v_nomade_observateurs_faune --- contactflore.v_nomade_observateurs_flore --- contactinv.v_nomade_observateurs_inv --- à compléter - --- DO --- $$ --- BEGIN --- DROP VIEW utilisateurs.v_observateurs; --- CREATE OR REPLACE VIEW utilisateurs.v_observateurs AS --- SELECT DISTINCT r.id_role AS codeobs, (r.nom_role::text || ' '::text) || r.prenom_role::text AS nomprenom --- FROM utilisateurs.t_roles r --- WHERE (r.id_role IN ( SELECT DISTINCT cr.id_role_utilisateur --- FROM utilisateurs.cor_roles cr --- WHERE (cr.id_role_groupe IN ( SELECT crm.id_role --- FROM utilisateurs.cor_role_menu crm --- WHERE crm.id_menu = 5)) --- ORDER BY cr.id_role_utilisateur)) OR (r.id_role IN ( SELECT crm.id_role --- FROM utilisateurs.cor_role_menu crm --- JOIN utilisateurs.t_roles r ON r.id_role = crm.id_role AND crm.id_menu = 5 AND r.groupe = false AND r.active = true)) --- ORDER BY (r.nom_role::text || ' '::text) || r.prenom_role::text, r.id_role; --- EXCEPTION WHEN undefined_table THEN --- RAISE NOTICE 'Cet vue n''existe pas'; --- END --- $$; - --- DO --- $$ --- BEGIN --- DROP VIEW contactfaune.v_nomade_observateurs_faune; --- CREATE OR REPLACE VIEW contactfaune.v_nomade_observateurs_faune AS --- SELECT DISTINCT r.id_role, r.nom_role, r.prenom_role --- FROM utilisateurs.t_roles r --- WHERE (r.id_role IN ( SELECT DISTINCT cr.id_role_utilisateur --- FROM utilisateurs.cor_roles cr --- WHERE (cr.id_role_groupe IN ( SELECT crm.id_role --- FROM utilisateurs.cor_role_menu crm --- WHERE crm.id_menu = 11)) --- ORDER BY cr.id_role_utilisateur)) OR (r.id_role IN ( SELECT crm.id_role --- FROM utilisateurs.cor_role_menu crm --- JOIN utilisateurs.t_roles r ON r.id_role = crm.id_role AND crm.id_menu = 11 AND r.groupe = false AND r.active = true)) --- ORDER BY r.nom_role, r.prenom_role, r.id_role; --- EXCEPTION WHEN undefined_table THEN --- RAISE NOTICE 'Cet vue n''existe pas'; --- END --- $$; - --- DO --- $$ --- BEGIN --- DROP VIEW contactinv.v_nomade_observateurs_inv; --- CREATE OR REPLACE VIEW contactinv.v_nomade_observateurs_inv AS --- SELECT DISTINCT r.id_role, r.nom_role, r.prenom_role --- FROM utilisateurs.t_roles r --- WHERE (r.id_role IN ( SELECT DISTINCT cr.id_role_utilisateur --- FROM utilisateurs.cor_roles cr --- WHERE (cr.id_role_groupe IN ( SELECT crm.id_role --- FROM utilisateurs.cor_role_menu crm --- WHERE crm.id_menu = 11)) --- ORDER BY cr.id_role_utilisateur)) OR (r.id_role IN ( SELECT crm.id_role --- FROM utilisateurs.cor_role_menu crm --- JOIN utilisateurs.t_roles r ON r.id_role = crm.id_role AND crm.id_menu = 11 AND r.groupe = false AND r.active = true)) --- ORDER BY r.nom_role, r.prenom_role, r.id_role; --- EXCEPTION WHEN undefined_table THEN --- RAISE NOTICE 'Cet vue n''existe pas'; --- END --- $$; - - - ---Rechercher les vues qui doivent être réécrites car pointant sur les tables déplacées dans le schéma save --- SELECT dependent_ns.nspname as dependent_schema --- , dependent_view.relname as dependent_view --- , source_ns.nspname as source_schema --- , source_table.relname as source_table --- , pg_attribute.attname as column_name --- FROM pg_depend --- JOIN pg_rewrite ON pg_depend.objid = pg_rewrite.oid --- JOIN pg_class as dependent_view ON pg_rewrite.ev_class = dependent_view.oid --- JOIN pg_class as source_table ON pg_depend.refobjid = source_table.oid --- JOIN pg_attribute ON pg_depend.refobjid = pg_attribute.attrelid --- AND pg_depend.refobjsubid = pg_attribute.attnum --- JOIN pg_namespace dependent_ns ON dependent_ns.oid = dependent_view.relnamespace --- JOIN pg_namespace source_ns ON source_ns.oid = source_table.relnamespace --- WHERE --- source_ns.nspname = 'save' --- AND source_table.relname IN('cor_role_menu', 't_menus', 'bib_droits', 'cor_role_droit_application') --- AND pg_attribute.attnum > 0 --- --AND pg_attribute.attname = 'my_column' --- ORDER BY 1,2; - - ---TABLES SUPPRIMABLES (dans cet ordre). A la discretion de chacun - ---DROP TABLE save.cor_application_tag; ---DROP TABLE save.cor_organism_tag; ---DROP TABLE save.cor_tags_relations; ---DROP TABLE save.cor_role_menu; ---DROP TABLE save.t_menus; ---DROP TABLE save.cor_role_droit_application; ---DROP TABLE save.bib_droits; ---DROP TABLE save.bib_unites; - ---Ces 3 tables sont utilisées depuis le script de migration de la base de données GéoNature ---Vous ne devez pas les supprimer avant d'avoir exécuté cette migration GéoNature. ---DROP TABLE save.cor_app_privileges; ---DROP TABLE save.t_tags; ---DROP TABLE save.bib_tag_types; diff --git a/data/update_2.0.0to2.0.1.sql b/data/update_2.0.0to2.0.1.sql deleted file mode 100644 index f035a432..00000000 --- a/data/update_2.0.0to2.0.1.sql +++ /dev/null @@ -1,29 +0,0 @@ - -ALTER TABLE utilisateurs.cor_role_app_profil ADD is_default_group_for_app boolean NOT NULL DEFAULT (FALSE); - -CREATE OR REPLACE FUNCTION utilisateurs.check_is_default_group_for_app_is_grp_and_unique(id_app integer, id_grp integer, is_default boolean) -RETURNS boolean AS -$BODY$ -BEGIN - IF is_default IS TRUE THEN - IF ( - SELECT DISTINCT TRUE - FROM utilisateurs.cor_role_app_profil - WHERE id_application = id_app AND is_default_group_for_app IS TRUE - ) IS TRUE THEN - RETURN FALSE; - ELSIF (SELECT TRUE FROM utilisateurs.t_roles WHERE id_role = id_grp AND groupe IS TRUE) IS NULL THEN - RETURN FALSE; - ELSE - RETURN TRUE; - END IF; - END IF; - RETURN TRUE; - END -$BODY$ - LANGUAGE plpgsql IMMUTABLE - COST 100; - - -ALTER TABLE utilisateurs.cor_role_app_profil ADD CONSTRAINT check_is_default_group_for_app_is_grp_and_unique - CHECK (utilisateurs.check_is_default_group_for_app_is_grp_and_unique(id_application, id_role, is_default_group_for_app)) NOT VALID; diff --git a/data/update_2.0.3to2.1.0.sql b/data/update_2.0.3to2.1.0.sql deleted file mode 100644 index 482a44e2..00000000 --- a/data/update_2.0.3to2.1.0.sql +++ /dev/null @@ -1,79 +0,0 @@ -CREATE INDEX i_utilisateurs_groupe - ON utilisateurs.t_roles - USING btree - (groupe); - -CREATE INDEX i_utilisateurs_nom_prenom - ON utilisateurs.t_roles - USING btree - (nom_role, prenom_role); - -CREATE INDEX i_utilisateurs_active - ON utilisateurs.t_roles - USING btree - (active); - - - -DROP TRIGGER IF EXISTS tri_modify_date_insert_temp_roles ON utilisateurs.temp_users; - -CREATE TRIGGER tri_modify_date_insert_temp_roles - BEFORE INSERT - ON utilisateurs.temp_users - FOR EACH ROW - EXECUTE PROCEDURE utilisateurs.modify_date_insert(); - - -ALTER TABLE utilisateurs.cor_role_app_profil ADD COLUMN is_default_group_for_app boolean NOT NULL DEFAULT (FALSE); - - -DROP TABLE IF EXISTS utilisateurs.temp_users; - -CREATE TABLE IF NOT EXISTS utilisateurs.temp_users -( - - id_temp_user SERIAL NOT NULL, - - groupe boolean NOT NULL DEFAULT false, - token_role text, - identifiant character varying(100), - nom_role character varying(50), - prenom_role character varying(50), - desc_role text, - password text, - pass_md5 text, - email character varying(250), - organisme character(32), - id_organisme integer, - id_application integer, - remarques text, - champs_addi jsonb, - session_appli character varying(50), - date_insert timestamp without time zone, - date_update timestamp without time zone, - - CONSTRAINT pk_temp_users PRIMARY KEY (id_temp_user), - - CONSTRAINT temp_user_id_organisme_fkey FOREIGN KEY (id_application) - REFERENCES utilisateurs.t_applications (id_application) MATCH SIMPLE - ON UPDATE CASCADE ON DELETE CASCADE, - - CONSTRAINT temp_user_id_application_fkey FOREIGN KEY (id_organisme) - REFERENCES utilisateurs.bib_organismes (id_organisme) MATCH SIMPLE - ON UPDATE CASCADE ON DELETE CASCADE -); - -CREATE TABLE IF NOT EXISTS utilisateurs.cor_role_token -( - id_role INTEGER, - token text -); - -ALTER TABLE ONLY utilisateurs.cor_role_token ADD CONSTRAINT cor_role_token_pk_id_role PRIMARY KEY (id_role); - -ALTER TABLE ONLY utilisateurs.cor_role_token ADD CONSTRAINT cor_role_token_fk_id_role FOREIGN KEY (id_role) - REFERENCES utilisateurs.t_roles (id_role) MATCH SIMPLE - ON UPDATE CASCADE ON DELETE CASCADE; - -ALTER TABLE utilisateurs.t_roles -ADD COLUMN champs_addi jsonb; diff --git a/data/update_2.1.0to2.1.1.sql b/data/update_2.1.0to2.1.1.sql deleted file mode 100644 index 839a8444..00000000 --- a/data/update_2.1.0to2.1.1.sql +++ /dev/null @@ -1,30 +0,0 @@ -ALTER TABLE utilisateurs.cor_role_app_profil DROP constraint IF EXISTS check_is_default_group_for_app_is_grp_and_unique; - -CREATE OR REPLACE FUNCTION utilisateurs.check_is_default_group_for_app_is_grp_and_unique(id_app integer, id_grp integer, is_default boolean) -RETURNS boolean AS -$BODY$ -BEGIN - -- Fonction de vérification - -- Test : si le role est un groupe et qu'il n'y a qu'un seul groupe par défaut définit par application - IF is_default IS TRUE THEN - IF ( - SELECT DISTINCT TRUE - FROM utilisateurs.cor_role_app_profil - WHERE id_application = id_app AND is_default_group_for_app IS TRUE - ) IS TRUE THEN - RETURN FALSE; - ELSIF (SELECT TRUE FROM utilisateurs.t_roles WHERE id_role = id_grp AND groupe IS TRUE) IS NULL THEN - RETURN FALSE; - ELSE - RETURN TRUE; - END IF; - END IF; - RETURN TRUE; - END -$BODY$ - LANGUAGE plpgsql IMMUTABLE - COST 100; - - -ALTER TABLE utilisateurs.cor_role_app_profil ADD CONSTRAINT check_is_default_group_for_app_is_grp_and_unique - CHECK (utilisateurs.check_is_default_group_for_app_is_grp_and_unique(id_application, id_role, is_default_group_for_app)) NOT VALID; diff --git a/data/update_2.1.2to2.1.3.sql b/data/update_2.1.2to2.1.3.sql deleted file mode 100644 index 3509da95..00000000 --- a/data/update_2.1.2to2.1.3.sql +++ /dev/null @@ -1,7 +0,0 @@ --- Update UsersHub DB schema to v2.1.3 -BEGIN; - --- Add confirmation_url field to temp_users table -ALTER TABLE utilisateurs.temp_users ADD confirmation_url varchar(250) NULL; - -COMMIT; \ No newline at end of file diff --git a/data/update_2.1.3to2.1.4.sql b/data/update_2.1.3to2.1.4.sql deleted file mode 100644 index 95dd5d10..00000000 --- a/data/update_2.1.3to2.1.4.sql +++ /dev/null @@ -1,75 +0,0 @@ --- Update UsersHub DB schema from v2.1.3 to v2.1.4 -BEGIN; - -ALTER TABLE utilisateurs.bib_organismes - ADD COLUMN IF NOT EXISTS additional_data JSONB; - --- Fix LEFT JOIN on bib_organismes -CREATE OR REPLACE VIEW utilisateurs.v_roleslist_forall_applications AS -SELECT a.groupe, - a.active, - a.id_role, - a.identifiant, - a.nom_role, - a.prenom_role, - a.desc_role, - a.pass, - a.pass_plus, - a.email, - a.id_organisme, - a.organisme, - a.id_unite, - a.remarques, - a.date_insert, - a.date_update, - max(a.id_droit) AS id_droit_max, - a.id_application - FROM ( SELECT u.groupe, - u.id_role, - u.identifiant, - u.nom_role, - u.prenom_role, - u.desc_role, - u.pass, - u.pass_plus, - u.email, - u.id_organisme, - u.active, - o.nom_organisme AS organisme, - 0 AS id_unite, - u.remarques, - u.date_insert, - u.date_update, - c.id_profil AS id_droit, - c.id_application - FROM utilisateurs.t_roles u - JOIN utilisateurs.cor_role_app_profil c ON c.id_role = u.id_role - LEFT JOIN utilisateurs.bib_organismes o ON o.id_organisme = u.id_organisme - UNION - SELECT u.groupe, - u.id_role, - u.identifiant, - u.nom_role, - u.prenom_role, - u.desc_role, - u.pass, - u.pass_plus, - u.email, - u.id_organisme, - u.active, - o.nom_organisme AS organisme, - 0 AS id_unite, - u.remarques, - u.date_insert, - u.date_update, - c.id_profil AS id_droit, - c.id_application - FROM utilisateurs.t_roles u - JOIN utilisateurs.cor_roles g ON g.id_role_utilisateur = u.id_role OR g.id_role_groupe = u.id_role - JOIN utilisateurs.cor_role_app_profil c ON c.id_role = g.id_role_groupe - LEFT JOIN utilisateurs.bib_organismes o ON o.id_organisme = u.id_organisme - ) a - WHERE a.active = true - GROUP BY a.groupe, a.active, a.id_role, a.identifiant, a.nom_role, a.prenom_role, a.desc_role, a.pass, a.pass_plus, a.email, a.id_organisme, a.organisme, a.id_unite, a.remarques, a.date_insert, a.date_update, a.id_application; - -COMMIT; diff --git a/data/update_filles_1.2.1to1.3.0.sql b/data/update_filles_1.2.1to1.3.0.sql deleted file mode 100644 index f8857d7a..00000000 --- a/data/update_filles_1.2.1to1.3.0.sql +++ /dev/null @@ -1,29 +0,0 @@ -CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; - ---Update t_roles TABLE -DO $$ - BEGIN - ALTER TABLE utilisateurs.t_roles ADD COLUMN uuid_role uuid; - EXCEPTION - WHEN duplicate_column THEN RAISE NOTICE 'column "uuid_role" already exists in "utilisateurs.t_roles".'; - END -$$; - -ALTER TABLE utilisateurs.t_roles DROP COLUMN IF EXISTS pass_sha; - -DO $$ - BEGIN - ALTER TABLE utilisateurs.t_roles ADD COLUMN pass_plus text; - EXCEPTION - WHEN duplicate_column THEN RAISE NOTICE 'column "pass_plus" already exists in "utilisateurs.t_roles".'; - END -$$; - ---Update bib_organismes TABLE -DO $$ - BEGIN - ALTER TABLE utilisateurs.bib_organismes ADD COLUMN uuid_organisme uuid; - EXCEPTION - WHEN duplicate_column THEN RAISE NOTICE 'column "uuid_organisme" already exists in "utilisateurs.bib_organismes".'; - END -$$; diff --git a/data/update_mere_1.2.1to1.3.0.sql b/data/update_mere_1.2.1to1.3.0.sql deleted file mode 100644 index 7e270eb2..00000000 --- a/data/update_mere_1.2.1to1.3.0.sql +++ /dev/null @@ -1,36 +0,0 @@ -CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; - ---Update t_roles TABLE -DO $$ - BEGIN - ALTER TABLE utilisateurs.t_roles ADD COLUMN uuid_role uuid; - EXCEPTION - WHEN duplicate_column THEN RAISE NOTICE 'column "uuid_role" already exists in "utilisateurs.t_roles".'; - END -$$; -ALTER TABLE utilisateurs.t_roles ALTER COLUMN uuid_role SET DEFAULT public.uuid_generate_v4(); -UPDATE utilisateurs.t_roles SET uuid_role = public.uuid_generate_v4() WHERE uuid_role IS NULL; -ALTER TABLE utilisateurs.t_roles ALTER COLUMN uuid_role SET NOT NULL; - -ALTER TABLE utilisateurs.t_roles DROP COLUMN IF EXISTS pass_sha; - -DO $$ - BEGIN - ALTER TABLE utilisateurs.t_roles ADD COLUMN pass_plus text; - EXCEPTION - WHEN duplicate_column THEN RAISE NOTICE 'column "pass_plus" already exists in "utilisateurs.t_roles".'; - END -$$; - - ---Update bib_organismes TABLE -DO $$ - BEGIN - ALTER TABLE utilisateurs.bib_organismes ADD COLUMN uuid_organisme uuid; - EXCEPTION - WHEN duplicate_column THEN RAISE NOTICE 'column "uuid_organisme" already exists in "utilisateurs.bib_organismes".'; - END -$$; -ALTER TABLE utilisateurs.bib_organismes ALTER COLUMN uuid_organisme SET DEFAULT public.uuid_generate_v4(); -UPDATE utilisateurs.bib_organismes SET uuid_organisme = public.uuid_generate_v4() WHERE uuid_organisme IS NULL; -ALTER TABLE utilisateurs.bib_organismes ALTER COLUMN uuid_organisme SET NOT NULL; \ No newline at end of file diff --git a/data/usershub-data.sql b/data/usershub-data.sql deleted file mode 100644 index 42f24fb7..00000000 --- a/data/usershub-data.sql +++ /dev/null @@ -1,26 +0,0 @@ ----------------- ---MINIMAL DATA-- ----------------- - -SET search_path = utilisateurs, pg_catalog; - --- Insérer les applications de base liées à GeoNature -INSERT INTO t_applications (id_application, code_application, nom_application, desc_application, id_parent) VALUES -(1, 'UH', 'UsersHub', 'Application permettant d''administrer la présente base de données.', NULL) -; -SELECT pg_catalog.setval('t_applications_id_application_seq', (SELECT max(id_application)+1 FROM utilisateurs.t_applications), false); - -INSERT INTO t_profils (id_profil, code_profil, nom_profil, desc_profil) VALUES -(0, '0', 'Aucun', 'Aucun droit') -,(1, '1', 'Lecteur', 'Ne peut que consulter/ou acceder') -,(2, '2', 'Rédacteur', 'Il possède des droit d''écriture pour créer des enregistrements') -,(3, '3', 'Référent', 'Utilisateur ayant des droits complémentaires au rédacteur (par exemple exporter des données ou autre)') -,(4, '4', 'Modérateur', 'Peu utilisé') -,(5, '5', 'Validateur', 'Il valide bien sur') -,(6, '6', 'Administrateur', 'Il a tous les droits'); -SELECT pg_catalog.setval('t_profils_id_profil_seq', (SELECT max(id_profil)+1 FROM utilisateurs.t_profils), false); - -INSERT INTO utilisateurs.cor_profil_for_app (id_profil, id_application) VALUES -(6, 1) -,(3, 1) -; diff --git a/data/usershub-dataset.sql b/data/usershub-dataset.sql deleted file mode 100644 index e196d571..00000000 --- a/data/usershub-dataset.sql +++ /dev/null @@ -1,42 +0,0 @@ ---------------- ---SAMPLE DATA-- ---------------- - -SET search_path = utilisateurs, pg_catalog; - --- Insertion de 2 organismes -INSERT INTO bib_organismes (nom_organisme, adresse_organisme, cp_organisme, ville_organisme, tel_organisme, fax_organisme, email_organisme, id_organisme) VALUES -('Autre', '', '', '', '', '', '', -1) -; -INSERT INTO bib_organismes (nom_organisme, adresse_organisme, cp_organisme, ville_organisme, tel_organisme) VALUES -('ma structure test', 'Rue des bois', '00000', 'VILLE', '00-00-99-00-99'); - --- Insertion de roles de type GROUPE de base pour GeoNature ---TODO revoir l'insertion des organisme et des identifiants -INSERT INTO t_roles (groupe, id_role, identifiant, nom_role, prenom_role, desc_role, pass, email, date_insert, date_update, id_organisme, remarques) VALUES -(true, 7, NULL, 'Grp_en_poste', NULL, 'Tous les agents en poste dans la structure', NULL, NULL, NULL, NULL, NULL, 'Groupe des agents de la structure avec droits d''écriture limité') -,(true, 9, NULL, 'Grp_admin', NULL, 'Tous les administrateurs', NULL, NULL, NULL, NULL, NULL, 'Groupe à droit total') -; --- Insertion de roles de type UTILISATEUR pour GeoNature -INSERT INTO t_roles (groupe, id_role, identifiant, nom_role, prenom_role, desc_role, pass, email, date_insert, date_update, id_organisme, remarques, pass_plus) VALUES -(false, 1, 'admin', 'Administrateur', 'test', NULL, '21232f297a57a5a743894a0e4a801fc3', NULL, NULL, NULL, -1, 'utilisateur test à modifier', '$2y$13$TMuRXgvIg6/aAez0lXLLFu0lyPk4m8N55NDhvLoUHh/Ar3rFzjFT.') -,(false, 2, 'agent', 'Agent', 'test', NULL, 'b33aed8f3134996703dc39f9a7c95783', NULL, NULL, NULL, -1, 'utilisateur test à modifier ou supprimer', NULL) -,(false, 3, 'partenaire', 'Partenaire', 'test', NULL, '5bd40a8524882d75f3083903f2c912fc', NULL, NULL, NULL, -1, 'utilisateur test à modifier ou supprimer', NULL) -,(false, 4, 'pierre.paul', 'Paul', 'Pierre', NULL, '21232f297a57a5a743894a0e4a801fc3', NULL, NULL, NULL, -1, 'utilisateur test à modifier ou supprimer', NULL) -,(false, 5, 'validateur', 'Validateur', 'test', NULL, '21232f297a57a5a743894a0e4a801fc3', NULL, NULL, NULL, -1, 'utilisateur test à modifier ou supprimer', NULL) -; --- Ajuster la séquence de t_roles après insertion des données -SELECT pg_catalog.setval('t_roles_id_role_seq', (SELECT max(id_role)+1 FROM utilisateurs.t_roles), false); - --- Affectation des utilisateurs exemple dans des groupes -INSERT INTO cor_roles (id_role_groupe, id_role_utilisateur) VALUES -(7, 1) -,(9, 1) -,(7, 2) -,(7, 4) -,(7, 5) -; - -INSERT INTO cor_role_app_profil (id_role, id_application, id_profil) VALUES -(9, 1, 6) --admin UsersHub -; diff --git a/data/usershub.sql b/data/usershub.sql deleted file mode 100644 index 5acaa73a..00000000 --- a/data/usershub.sql +++ /dev/null @@ -1,438 +0,0 @@ ---Run this script with the database owner -SET statement_timeout = 0; -SET lock_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; - ---Ensure to have uuid-ossp extension installed before running this script ---You must be superuser to add an extension in your database ---CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; - -CREATE SCHEMA IF NOT EXISTS utilisateurs; - -SET search_path = utilisateurs, pg_catalog; - -------------- ---FUNCTIONS-- -------------- - -CREATE OR REPLACE FUNCTION modify_date_insert() RETURNS trigger - LANGUAGE plpgsql - AS $$ -BEGIN - NEW.date_insert := now(); - NEW.date_update := now(); - RETURN NEW; -END; -$$; - -CREATE OR REPLACE FUNCTION modify_date_update() RETURNS trigger - LANGUAGE plpgsql - AS $$ -BEGIN - NEW.date_update := now(); - RETURN NEW; -END; -$$; - -SET default_tablespace = ''; -SET default_with_oids = false; - ----------------------- ---TABLES & SEQUENCES-- ----------------------- - -CREATE TABLE IF NOT EXISTS t_roles ( - groupe boolean DEFAULT false NOT NULL, - id_role serial NOT NULL, - uuid_role uuid NOT NULL DEFAULT public.uuid_generate_v4(), - identifiant character varying(100), - nom_role character varying(50), - prenom_role character varying(50), - desc_role text, - pass character varying(100), - pass_plus text, - email character varying(250), - id_organisme integer, - remarques text, - active boolean DEFAULT true, - champs_addi jsonb, - date_insert timestamp without time zone, - date_update timestamp without time zone -); - -CREATE TABLE IF NOT EXISTS bib_organismes ( - id_organisme serial NOT NULL, - uuid_organisme uuid NOT NULL DEFAULT public.uuid_generate_v4(), - nom_organisme character varying(500) NOT NULL, - adresse_organisme character varying(128), - cp_organisme character varying(5), - ville_organisme character varying(100), - tel_organisme character varying(14), - fax_organisme character varying(14), - email_organisme character varying(100), - url_organisme character varying(255), - url_logo character varying(255), - additional_data jsonb, - id_parent integer -); - -CREATE TABLE IF NOT EXISTS t_listes -( - id_liste serial NOT NULL, - code_liste character varying(20) NOT NULL, - nom_liste character varying(50) NOT NULL, - desc_liste text -); -COMMENT ON TABLE t_listes IS 'Table des listes déroulantes des applications. Les roles (groupes ou utilisateurs) devant figurer dans une liste sont gérés dans la table cor_role_liste'; - -CREATE TABLE IF NOT EXISTS t_applications ( - id_application integer NOT NULL, - code_application character varying(20) NOT NULL, - nom_application character varying(50) NOT NULL, - desc_application text, - id_parent integer -); - -CREATE SEQUENCE t_applications_id_application_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; -ALTER SEQUENCE t_applications_id_application_seq OWNED BY t_applications.id_application; -ALTER TABLE ONLY t_applications ALTER COLUMN id_application SET DEFAULT nextval('t_applications_id_application_seq'::regclass); - -CREATE TABLE IF NOT EXISTS t_profils ( - id_profil serial NOT NULL, - code_profil character varying(20), - nom_profil character varying(255), - desc_profil text -); -COMMENT ON TABLE t_profils IS 'Table des profils d''utilisateurs génériques ou applicatifs, qui seront ensuite attachés à des roles et des applications'; - -CREATE TABLE IF NOT EXISTS cor_role_liste ( - id_role integer NOT NULL, - id_liste integer NOT NULL -); -COMMENT ON TABLE cor_role_liste IS 'Equivalent de l''ancienne cor_role_menu. Permet de créer des listes de roles (observateurs par ex.), sans notion de permission'; - -CREATE TABLE IF NOT EXISTS cor_roles ( - id_role_groupe integer NOT NULL, - id_role_utilisateur integer NOT NULL -); - -CREATE TABLE IF NOT EXISTS cor_profil_for_app ( - id_profil integer NOT NULL, - id_application integer NOT NULL -); -COMMENT ON TABLE cor_profil_for_app IS 'Permet d''attribuer et limiter les profils disponibles pour chacune des applications'; - -CREATE TABLE IF NOT EXISTS cor_role_app_profil ( - id_role integer NOT NULL, - id_application integer NOT NULL, - id_profil integer NOT NULL, - is_default_group_for_app boolean NOT NULL DEFAULT (FALSE) -); -COMMENT ON TABLE cor_role_app_profil IS 'Cette table centrale, permet d''associer des roles à des profils par application'; - - -CREATE TABLE IF NOT EXISTS cor_role_token -( - id_role INTEGER, - token text -); - -CREATE TABLE IF NOT EXISTS utilisateurs.temp_users -( - id_temp_user SERIAL NOT NULL, - token_role text, - organisme character(32), - id_application integer NOT NULL, - confirmation_url character varying(250), - groupe boolean NOT NULL DEFAULT false, - identifiant character varying(100), - nom_role character varying(50), - prenom_role character varying(50), - desc_role text, - pass_md5 text, - password text, - email character varying(250), - id_organisme integer, - remarques text, - champs_addi jsonb, - date_insert timestamp without time zone, - date_update timestamp without time zone -); - ----------------- ---PRIMARY KEYS-- ----------------- - -ALTER TABLE ONLY bib_organismes ADD CONSTRAINT pk_bib_organismes PRIMARY KEY (id_organisme); - -ALTER TABLE ONLY t_roles ADD CONSTRAINT pk_t_roles PRIMARY KEY (id_role); - -ALTER TABLE ONLY t_listes ADD CONSTRAINT pk_t_listes PRIMARY KEY (id_liste); - -ALTER TABLE ONLY t_applications ADD CONSTRAINT pk_t_applications PRIMARY KEY (id_application); - -ALTER TABLE ONLY t_profils ADD CONSTRAINT pk_t_profils PRIMARY KEY (id_profil); - -ALTER TABLE ONLY cor_roles ADD CONSTRAINT cor_roles_pkey PRIMARY KEY (id_role_groupe, id_role_utilisateur); - -ALTER TABLE ONLY cor_role_liste ADD CONSTRAINT pk_cor_role_liste PRIMARY KEY (id_liste, id_role); - -ALTER TABLE ONLY cor_profil_for_app ADD CONSTRAINT pk_cor_profil_for_app PRIMARY KEY (id_application, id_profil); - -ALTER TABLE ONLY cor_role_app_profil ADD CONSTRAINT pk_cor_role_app_profil PRIMARY KEY (id_role, id_application, id_profil); - -ALTER TABLE ONLY cor_role_token ADD CONSTRAINT cor_role_token_pk_id_role PRIMARY KEY (id_role); - -ALTER TABLE ONLY temp_users ADD CONSTRAINT pk_temp_users PRIMARY KEY (id_temp_user); - - ------------- ---TRIGGERS-- ------------- - -CREATE TRIGGER tri_modify_date_insert_t_roles BEFORE INSERT ON t_roles FOR EACH ROW EXECUTE PROCEDURE modify_date_insert(); - -CREATE TRIGGER tri_modify_date_update_t_roles BEFORE UPDATE ON t_roles FOR EACH ROW EXECUTE PROCEDURE modify_date_update(); - -CREATE TRIGGER tri_modify_date_insert_temp_roles - BEFORE INSERT - ON temp_users - FOR EACH ROW - EXECUTE PROCEDURE utilisateurs.modify_date_insert(); - - ----------------- ---FOREIGN KEYS-- ----------------- - -ALTER TABLE ONLY t_roles ADD CONSTRAINT t_roles_id_organisme_fkey FOREIGN KEY (id_organisme) REFERENCES bib_organismes(id_organisme) ON UPDATE CASCADE; - -ALTER TABLE ONLY cor_roles ADD CONSTRAINT cor_roles_id_role_groupe_fkey FOREIGN KEY (id_role_groupe) REFERENCES t_roles(id_role) ON UPDATE CASCADE ON DELETE CASCADE; -ALTER TABLE ONLY cor_roles ADD CONSTRAINT cor_roles_id_role_utilisateur_fkey FOREIGN KEY (id_role_utilisateur) REFERENCES t_roles(id_role) ON UPDATE CASCADE ON DELETE CASCADE; - -ALTER TABLE ONLY bib_organismes ADD CONSTRAINT fk_bib_organismes_id_parent FOREIGN KEY (id_parent) REFERENCES bib_organismes(id_organisme) ON UPDATE CASCADE; - -ALTER TABLE ONLY t_applications ADD CONSTRAINT fk_t_applications_id_parent FOREIGN KEY (id_parent) REFERENCES t_applications(id_application) ON UPDATE CASCADE; - -ALTER TABLE ONLY cor_role_liste ADD CONSTRAINT fk_cor_role_liste_id_liste FOREIGN KEY (id_liste) REFERENCES t_listes(id_liste) ON UPDATE CASCADE; -ALTER TABLE ONLY cor_role_liste ADD CONSTRAINT fk_cor_role_liste_id_role FOREIGN KEY (id_role) REFERENCES t_roles(id_role) ON UPDATE CASCADE; - -ALTER TABLE ONLY cor_profil_for_app ADD CONSTRAINT fk_cor_profil_for_app_id_application FOREIGN KEY (id_application) REFERENCES t_applications(id_application) ON UPDATE CASCADE; -ALTER TABLE ONLY cor_profil_for_app ADD CONSTRAINT fk_cor_profil_for_app_id_profil FOREIGN KEY (id_profil) REFERENCES t_profils(id_profil) ON UPDATE CASCADE; - -ALTER TABLE ONLY cor_role_app_profil ADD CONSTRAINT fk_cor_role_app_profil_id_role FOREIGN KEY (id_role) REFERENCES t_roles(id_role) ON UPDATE CASCADE ON DELETE CASCADE; -ALTER TABLE ONLY cor_role_app_profil ADD CONSTRAINT fk_cor_role_app_profil_id_application FOREIGN KEY (id_application) REFERENCES t_applications(id_application) ON UPDATE CASCADE ON DELETE CASCADE; -ALTER TABLE ONLY cor_role_app_profil ADD CONSTRAINT fk_cor_role_app_profil_id_profil FOREIGN KEY (id_profil) REFERENCES t_profils(id_profil) ON UPDATE CASCADE ON DELETE CASCADE; - - -ALTER TABLE ONLY cor_role_token ADD CONSTRAINT cor_role_token_fk_id_role FOREIGN KEY (id_role) - REFERENCES t_roles (id_role) MATCH SIMPLE - ON UPDATE CASCADE ON DELETE CASCADE; - - -ALTER TABLE ONLY temp_users ADD CONSTRAINT temp_user_id_organisme_fkey FOREIGN KEY (id_application) - REFERENCES t_applications (id_application) MATCH SIMPLE - ON UPDATE CASCADE ON DELETE CASCADE; -ALTER TABLE ONLY temp_users ADD CONSTRAINT temp_user_id_application_fkey FOREIGN KEY (id_organisme) - REFERENCES bib_organismes (id_organisme) MATCH SIMPLE - ON UPDATE CASCADE ON DELETE CASCADE; - ----------------- -------INDEX----- ----------------- -CREATE INDEX i_utilisateurs_groupe - ON utilisateurs.t_roles - USING btree - (groupe); - -CREATE INDEX i_utilisateurs_nom_prenom - ON utilisateurs.t_roles - USING btree - (nom_role, prenom_role); - -CREATE INDEX i_utilisateurs_active - ON utilisateurs.t_roles - USING btree - (active); - ---------------- ---CONSTRAINTS-- ---------------- -CREATE OR REPLACE FUNCTION utilisateurs.check_is_default_group_for_app_is_grp_and_unique(id_app integer, id_grp integer, is_default boolean) -RETURNS boolean AS -$BODY$ -BEGIN - -- Fonction de vérification - -- Test : si le role est un groupe et qu'il n'y a qu'un seul groupe par défaut définit par application - IF is_default IS TRUE THEN - IF ( - SELECT DISTINCT TRUE - FROM utilisateurs.cor_role_app_profil - WHERE id_application = id_app AND is_default_group_for_app IS TRUE - ) IS TRUE THEN - RETURN FALSE; - ELSIF (SELECT TRUE FROM utilisateurs.t_roles WHERE id_role = id_grp AND groupe IS TRUE) IS NULL THEN - RETURN FALSE; - ELSE - RETURN TRUE; - END IF; - END IF; - RETURN TRUE; - END -$BODY$ - LANGUAGE plpgsql IMMUTABLE - COST 100; - - -ALTER TABLE utilisateurs.cor_role_app_profil ADD CONSTRAINT check_is_default_group_for_app_is_grp_and_unique - CHECK (utilisateurs.check_is_default_group_for_app_is_grp_and_unique(id_application, id_role, is_default_group_for_app)) NOT VALID; - - ---------- ---VIEWS-- ---------- --- Vue permettant de retourner les utilisateurs des listes -CREATE OR REPLACE VIEW v_userslist_forall_menu AS - SELECT a.groupe, - a.id_role, - a.uuid_role, - a.identifiant, - a.nom_role, - a.prenom_role, - (upper(a.nom_role::text) || ' '::text) || a.prenom_role::text AS nom_complet, - a.desc_role, - a.pass, - a.pass_plus, - a.email, - a.id_organisme, - a.organisme, - a.id_unite, - a.remarques, - a.date_insert, - a.date_update, - a.id_menu - FROM ( SELECT u.groupe, - u.id_role, - u.uuid_role, - u.identifiant, - u.nom_role, - u.prenom_role, - u.desc_role, - u.pass, - u.pass_plus, - u.email, - u.id_organisme, - o.nom_organisme AS organisme, - 0 AS id_unite, - u.remarques, - u.date_insert, - u.date_update, - c.id_liste AS id_menu - FROM utilisateurs.t_roles u - JOIN utilisateurs.cor_role_liste c ON c.id_role = u.id_role - LEFT JOIN utilisateurs.bib_organismes o ON o.id_organisme = u.id_organisme - WHERE u.groupe = false AND u.active = true - UNION - SELECT u.groupe, - u.id_role, - u.uuid_role, - u.identifiant, - u.nom_role, - u.prenom_role, - u.desc_role, - u.pass, - u.pass_plus, - u.email, - u.id_organisme, - o.nom_organisme AS organisme, - 0 AS id_unite, - u.remarques, - u.date_insert, - u.date_update, - c.id_liste AS id_menu - FROM utilisateurs.t_roles u - JOIN utilisateurs.cor_roles g ON g.id_role_utilisateur = u.id_role - JOIN utilisateurs.cor_role_liste c ON c.id_role = g.id_role_groupe - LEFT JOIN utilisateurs.bib_organismes o ON o.id_organisme = u.id_organisme - WHERE u.groupe = false AND u.active = true) a; - --- Vue permettant de retourner les roles et leurs droits maximum pour chaque application -CREATE OR REPLACE VIEW utilisateurs.v_roleslist_forall_applications AS -SELECT a.groupe, - a.active, - a.id_role, - a.identifiant, - a.nom_role, - a.prenom_role, - a.desc_role, - a.pass, - a.pass_plus, - a.email, - a.id_organisme, - a.organisme, - a.id_unite, - a.remarques, - a.date_insert, - a.date_update, - max(a.id_droit) AS id_droit_max, - a.id_application - FROM ( SELECT u.groupe, - u.id_role, - u.identifiant, - u.nom_role, - u.prenom_role, - u.desc_role, - u.pass, - u.pass_plus, - u.email, - u.id_organisme, - u.active, - o.nom_organisme AS organisme, - 0 AS id_unite, - u.remarques, - u.date_insert, - u.date_update, - c.id_profil AS id_droit, - c.id_application - FROM utilisateurs.t_roles u - JOIN utilisateurs.cor_role_app_profil c ON c.id_role = u.id_role - LEFT JOIN utilisateurs.bib_organismes o ON o.id_organisme = u.id_organisme - UNION - SELECT u.groupe, - u.id_role, - u.identifiant, - u.nom_role, - u.prenom_role, - u.desc_role, - u.pass, - u.pass_plus, - u.email, - u.id_organisme, - u.active, - o.nom_organisme AS organisme, - 0 AS id_unite, - u.remarques, - u.date_insert, - u.date_update, - c.id_profil AS id_droit, - c.id_application - FROM utilisateurs.t_roles u - JOIN utilisateurs.cor_roles g ON g.id_role_utilisateur = u.id_role OR g.id_role_groupe = u.id_role - JOIN utilisateurs.cor_role_app_profil c ON c.id_role = g.id_role_groupe - LEFT JOIN utilisateurs.bib_organismes o ON o.id_organisme = u.id_organisme - ) a - WHERE a.active = true - GROUP BY a.groupe, a.active, a.id_role, a.identifiant, a.nom_role, a.prenom_role, a.desc_role, a.pass, a.pass_plus, a.email, a.id_organisme, a.organisme, a.id_unite, a.remarques, a.date_insert, a.date_update, a.id_application; - --- Vue permettant de retourner les utilisateurs (pas les roles) et leurs droits maximum pour chaque application -CREATE OR REPLACE VIEW utilisateurs.v_userslist_forall_applications AS -SELECT * FROM utilisateurs.v_roleslist_forall_applications -WHERE groupe = false; From 92a0cf3f69c80de3b70710cb7557e64bba028d98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Tue, 21 Sep 2021 13:52:56 +0200 Subject: [PATCH 19/57] update changelog --- docs/changelog.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 4fc6f33f..9b0580ee 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -13,10 +13,9 @@ CHANGELOG * Les logs de l’application se trouvent désormais dans le répertoire système ``/var/log/usershub.log`` * Ajout d'un template de configuration ``apache`` -* Gestion de la base de données et de ses évolutions avec `Alembic `_, déplacée dans le sous-module UsersHub-authentification-module (https://github.com/PnX-SI/UsersHub-authentification-module/tree/master/src/pypnusershub/migrations/data) +* Gestion de la base de données et de ses évolutions avec `Alembic `_ déplacée dans le sous-module UsersHub-authentification-module (https://github.com/PnX-SI/UsersHub-authentification-module/tree/master/src/pypnusershub/migrations/data) * Suppression de ``ID_APP`` du fichier de configuration (auto-détection depuis la base de données) -* Mise à jour de ``UsersHub-authentification-module`` -* Ajout d’un champs JSONB ``additional_data`` à ``bib_organismes`` +* Mise à jour de la version de ``UsersHub-authentification-module`` **Développement** From ee38c79b46d7f94376195ef100c6b8c7be70c132 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Tue, 21 Sep 2021 14:35:54 +0200 Subject: [PATCH 20/57] update changelog --- docs/changelog.rst | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 9b0580ee..161bd69d 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -25,20 +25,31 @@ CHANGELOG Si vous mettez à jour UsersHub : -* Passage à ``systemd`` : +* Suppression de ``supervisor`` : - * Stopper UsersHub : ``sudo supervisorctl stop usershub2`` + * Vérifier que UsersHub n’est pas lancé par supervisor : ``sudo supervisorctl stop usershub2`` * Supprimer le fichier de configuration de supervisor ``/etc/supervisor/conf.d/usershub-service.conf`` - * Si supervisor n’est plus utilisé par aucun service (répertoire ``conf.d`` vide), il peut être désinstallé : ``sudo apt remove supervisor`` - * Copier le fichier ``usershub.service`` dans ``/etc/systemd/system`` - * Éditer ``/etc/systemd/system/usershub.service`` et remplacer les variables ``${USER}`` (votre utilisateur linux courant) et ``${USERSHUB_DIR}`` (chemin absolu du répertoire de UsersHub) par les valeurs appropriées (`e.g.` ``geonatureadmin`` et ``/home/geonatureadmin/usershub``) - * Lancer la commande ``sudo systemctl daemon-reload`` + * Si supervisor n’est plus utilisé par aucun service (répertoire ``/etc/supervisor/conf.d/`` vide), il peut être désinstallé : ``sudo apt remove supervisor`` + +* Suivez la procédure classique de mise à jour (https://usershub.readthedocs.io/fr/latest/installation.html#mise-a-jour-de-l-application) + +* Passage à ``systemd`` : + + * Le fichier ``/etc/systemd/system/usershub.service`` doit avoir été installé par le script ``install_app.sh`` * Pour démarrer UsersHub : ``sudo systemctl start usershub`` * Pour activer UsersHub automatiquement au démarrage : ``sudo systemctl enable usershub`` -* Correction de la configuration Apache : si vous servez UsersHub sur un prefix (typiquement ``/usershub``), assurez vous que celui-ci figure bien également à la fin des directives ``ProxyPass`` et ``ProxyPassReverse`` comme c’est le cas dans le fichier d’exemple ``usershub_apache.conf``. +* Correction de la configuration Apache : + + * Le fichier ``/etc/apache2/conf-available/usershub.conf`` doit avoir été installé par le script ``install_app.sh`` + * Si vous servez UsersHub sur un prefix (typiquement ``/usershub``), assurez vous que celui-ci figure bien également à la fin des directives ``ProxyPass`` et ``ProxyPassReverse`` comme c’est le cas dans le fichier ``/etc/apache2/conf-available/usershub.conf``. + * Vous pouvez également utiliser le fichier fournis soit en l’activant (``sudo a2enconf usershub``), soit en l’incluant dans votre configuration de vhost (``IncludeOptional /etc/apache2/conf-enabled/usershub.conf``). + +* **Si vous n’utilisez pas GeoNature**, vous devez appliquer les évolutions du schéma ``utilisateurs`` depuis UsersHub : -* Si vous n'utilisez pas n'utilisez pas GeoNature, appliquez le passage à Alembic + * Sourcer le virtualenv de UsersHub : ``source venv/bin/activate`` + * Indiquer à alembic que vous possédez déjà la version 1.4.7 du schéma ``utilisateurs`` (UsersHub 2.1.3) : ``flask db stamp fa35dfe5ff27`` + * Appliquer les révisions du schéma ``utilisateurs`` : ``flask db upgrade utilisateurs@head`` 2.1.3 (2020-09-29) ------------------ From 313ff4d14625096778490b223edc4ab27568521b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Tue, 21 Sep 2021 14:55:59 +0200 Subject: [PATCH 21/57] bump UsersHub-authentification-module --- dependencies/UsersHub-authentification-module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies/UsersHub-authentification-module b/dependencies/UsersHub-authentification-module index 1f2685c3..6425999c 160000 --- a/dependencies/UsersHub-authentification-module +++ b/dependencies/UsersHub-authentification-module @@ -1 +1 @@ -Subproject commit 1f2685c3624af6c75c249a7e7329366b7ddad295 +Subproject commit 6425999ce582416d5d61132e682d1a1d82a83239 From a5cf9a9cd7130de9a84bf5d2a066885cd44720a6 Mon Sep 17 00:00:00 2001 From: Jean-Pascal MILCENT Date: Thu, 17 Jun 2021 11:55:04 +0200 Subject: [PATCH 22/57] Feat tpl/info_group: add email to members list --- app/templates/info_group.html | 50 ++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/app/templates/info_group.html b/app/templates/info_group.html index d4367584..0be971c3 100644 --- a/app/templates/info_group.html +++ b/app/templates/info_group.html @@ -24,21 +24,41 @@
Liste des utilisateurs membres du groupe
{% if is_members %} - + + + + + + + + + {% for user in members %} + + + + + {% endfor %} + +
NomEmail
+ {% set is_group = user.groupe %} + {% if is_group %} + + {{user.nom_role}} + {% else %} + + {%if user.prenom_role %} + {{user.prenom_role}} + {% endif %} + {{user.nom_role}} + + {% endif %} + + {% if user.email %} + {{user.email}} + {% else %} +   + {% endif %} +
{% else %}

Le groupe ne comporte aucun membre.

{% endif %} From 851193ab37f7bdcf14b826713d8b0056e01d9b23 Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Wed, 22 Sep 2021 23:08:36 +0200 Subject: [PATCH 23/57] Changelog 2.2.0 --- docs/changelog.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 161bd69d..df0828e7 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -7,12 +7,13 @@ CHANGELOG **Nouveautés** +* Affichage des emails des utilisateurs dans les fiches des groupes (#133) * Packaging de l’application UsersHub * Passage de ``supervisor`` à ``systemd`` * Les logs de l’application se trouvent désormais dans le répertoire système ``/var/log/usershub.log`` -* Ajout d'un template de configuration ``apache`` +* Ajout d'un template de configuration ``Apache`` * Gestion de la base de données et de ses évolutions avec `Alembic `_ déplacée dans le sous-module UsersHub-authentification-module (https://github.com/PnX-SI/UsersHub-authentification-module/tree/master/src/pypnusershub/migrations/data) * Suppression de ``ID_APP`` du fichier de configuration (auto-détection depuis la base de données) * Mise à jour de la version de ``UsersHub-authentification-module`` @@ -39,7 +40,7 @@ Si vous mettez à jour UsersHub : * Pour démarrer UsersHub : ``sudo systemctl start usershub`` * Pour activer UsersHub automatiquement au démarrage : ``sudo systemctl enable usershub`` -* Correction de la configuration Apache : +* Révision de la configuration Apache : * Le fichier ``/etc/apache2/conf-available/usershub.conf`` doit avoir été installé par le script ``install_app.sh`` * Si vous servez UsersHub sur un prefix (typiquement ``/usershub``), assurez vous que celui-ci figure bien également à la fin des directives ``ProxyPass`` et ``ProxyPassReverse`` comme c’est le cas dans le fichier ``/etc/apache2/conf-available/usershub.conf``. @@ -48,7 +49,7 @@ Si vous mettez à jour UsersHub : * **Si vous n’utilisez pas GeoNature**, vous devez appliquer les évolutions du schéma ``utilisateurs`` depuis UsersHub : * Sourcer le virtualenv de UsersHub : ``source venv/bin/activate`` - * Indiquer à alembic que vous possédez déjà la version 1.4.7 du schéma ``utilisateurs`` (UsersHub 2.1.3) : ``flask db stamp fa35dfe5ff27`` + * Indiquer à Alembic que vous possédez déjà la version 1.4.7 du schéma ``utilisateurs`` (UsersHub 2.1.3) : ``flask db stamp fa35dfe5ff27`` * Appliquer les révisions du schéma ``utilisateurs`` : ``flask db upgrade utilisateurs@head`` 2.1.3 (2020-09-29) From cd4ad9560a415d894e0b98182dca28fed69ce09c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Wed, 22 Sep 2021 15:44:55 +0200 Subject: [PATCH 24/57] remove flask_dev.sh and put dev vars in .flaskenv --- .flaskenv | 2 ++ flask_dev.sh | 7 ------- 2 files changed, 2 insertions(+), 7 deletions(-) delete mode 100755 flask_dev.sh diff --git a/.flaskenv b/.flaskenv index 74831b60..52807a10 100644 --- a/.flaskenv +++ b/.flaskenv @@ -1,2 +1,4 @@ FLASK_APP=app.app:create_app FLASK_RUN_PORT=5001 +FLASK_ENV=development +FLASK_DEBUG=1 diff --git a/flask_dev.sh b/flask_dev.sh deleted file mode 100755 index c610522b..00000000 --- a/flask_dev.sh +++ /dev/null @@ -1,7 +0,0 @@ -export FLASK_ENV=development -export FLASK_DEBUG=1 - -ROOT_DIR=$(readlink -e "${0%/*}") -source $ROOT_DIR/venv/bin/activate - -flask run --port=5001 From 96fb7a57568de68992beaed4b041b2c1b1ab11a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Thu, 23 Sep 2021 12:10:48 +0200 Subject: [PATCH 25/57] fix franglais --- docs/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index df0828e7..74d81be0 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -43,7 +43,7 @@ Si vous mettez à jour UsersHub : * Révision de la configuration Apache : * Le fichier ``/etc/apache2/conf-available/usershub.conf`` doit avoir été installé par le script ``install_app.sh`` - * Si vous servez UsersHub sur un prefix (typiquement ``/usershub``), assurez vous que celui-ci figure bien également à la fin des directives ``ProxyPass`` et ``ProxyPassReverse`` comme c’est le cas dans le fichier ``/etc/apache2/conf-available/usershub.conf``. + * Si vous servez UsersHub sur un préfixe (typiquement ``/usershub``), assurez vous que celui-ci figure bien également à la fin des directives ``ProxyPass`` et ``ProxyPassReverse`` comme c’est le cas dans le fichier ``/etc/apache2/conf-available/usershub.conf``. * Vous pouvez également utiliser le fichier fournis soit en l’activant (``sudo a2enconf usershub``), soit en l’incluant dans votre configuration de vhost (``IncludeOptional /etc/apache2/conf-enabled/usershub.conf``). * **Si vous n’utilisez pas GeoNature**, vous devez appliquer les évolutions du schéma ``utilisateurs`` depuis UsersHub : From 75a92715b405302fc8ee0b8439634f97dca8494c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Thu, 23 Sep 2021 12:13:10 +0200 Subject: [PATCH 26/57] support installation in dev mode --- config/settings.ini.sample | 3 +++ install_app.sh | 8 +++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/config/settings.ini.sample b/config/settings.ini.sample index 96617f8e..a4f12d43 100644 --- a/config/settings.ini.sample +++ b/config/settings.ini.sample @@ -2,6 +2,9 @@ ### PostgreSQL settings ### ########################### +# set to dev to install usershub in development mode +mode=prod + # Effacer la base de donnée existante lors de la réinstallation drop_apps_db=false # Host de la base de données de l'application diff --git a/install_app.sh b/install_app.sh index b5cdf069..08b1bf68 100755 --- a/install_app.sh +++ b/install_app.sh @@ -30,7 +30,13 @@ cd .. echo "Installation du virtual env..." python3 -m venv venv || exit 1 source venv/bin/activate -pip install -r requirements.txt || exit 1 +pip install --upgrade pip || exit 1 +if [ "${mode}" = "dev" ]; then + pip install -r requirements-dev.txt || exit 1 +else + pip install -r requirements.txt || exit 1 +fi + deactivate # rendre la commande nvm disponible From 433067e3714064d6c145f2b89feb1500304082cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Thu, 23 Sep 2021 12:14:22 +0200 Subject: [PATCH 27/57] bump UsersHub-authentification-module --- dependencies/UsersHub-authentification-module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies/UsersHub-authentification-module b/dependencies/UsersHub-authentification-module index 6425999c..8d3bff26 160000 --- a/dependencies/UsersHub-authentification-module +++ b/dependencies/UsersHub-authentification-module @@ -1 +1 @@ -Subproject commit 6425999ce582416d5d61132e682d1a1d82a83239 +Subproject commit 8d3bff26cb23b3ef75c5aba6799e133cf3acc98b From e6e3f96cde9f067a85b674f7707638d1fc3a78b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Thu, 23 Sep 2021 12:15:17 +0200 Subject: [PATCH 28/57] gitignore: ignore changelog.html --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index bf454611..3a57fcab 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,6 @@ fontawesome* *.php -app/templates/mails/sign_up_confirmation.html \ No newline at end of file +app/templates/mails/sign_up_confirmation.html + +/docs/changelog.html From 6faffcad007904b1d6cbf37f269a15bf049510f0 Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Tue, 28 Sep 2021 08:27:46 +0200 Subject: [PATCH 29/57] =?UTF-8?q?Changelog=202.2.0=20-=20Compl=C3=A9ment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/changelog.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 74d81be0..2660dd2f 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -14,13 +14,13 @@ CHANGELOG * Les logs de l’application se trouvent désormais dans le répertoire système ``/var/log/usershub.log`` * Ajout d'un template de configuration ``Apache`` -* Gestion de la base de données et de ses évolutions avec `Alembic `_ déplacée dans le sous-module UsersHub-authentification-module (https://github.com/PnX-SI/UsersHub-authentification-module/tree/master/src/pypnusershub/migrations/data) +* Gestion de la base de données et de ses évolutions avec `Alembic `_ déplacée dans le sous-module `UsersHub-authentification-module `_ * Suppression de ``ID_APP`` du fichier de configuration (auto-détection depuis la base de données) -* Mise à jour de la version de ``UsersHub-authentification-module`` +* Mise à jour de `UsersHub-authentification-module `_ en version 1.5.1 **Développement** -* Ajout de ``UsersHub-authentification-module`` en temps que sous-module git +* Ajout de UsersHub-authentification-module en temps que sous-module git **Note de version** @@ -44,7 +44,7 @@ Si vous mettez à jour UsersHub : * Le fichier ``/etc/apache2/conf-available/usershub.conf`` doit avoir été installé par le script ``install_app.sh`` * Si vous servez UsersHub sur un préfixe (typiquement ``/usershub``), assurez vous que celui-ci figure bien également à la fin des directives ``ProxyPass`` et ``ProxyPassReverse`` comme c’est le cas dans le fichier ``/etc/apache2/conf-available/usershub.conf``. - * Vous pouvez également utiliser le fichier fournis soit en l’activant (``sudo a2enconf usershub``), soit en l’incluant dans votre configuration de vhost (``IncludeOptional /etc/apache2/conf-enabled/usershub.conf``). + * Vous pouvez également utiliser le fichier fourni soit en l’activant (``sudo a2enconf usershub``), soit en l’incluant dans votre configuration de vhost (``IncludeOptional /etc/apache2/conf-enabled/usershub.conf``). * **Si vous n’utilisez pas GeoNature**, vous devez appliquer les évolutions du schéma ``utilisateurs`` depuis UsersHub : From 4885faa4c4703ca0286bb45a0755c71879337d68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Wed, 29 Sep 2021 14:27:25 +0200 Subject: [PATCH 30/57] bump UsersHub-authentification-module to v1.5.3 --- dependencies/UsersHub-authentification-module | 2 +- docs/changelog.rst | 2 +- requirements.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dependencies/UsersHub-authentification-module b/dependencies/UsersHub-authentification-module index 8d3bff26..3f26405e 160000 --- a/dependencies/UsersHub-authentification-module +++ b/dependencies/UsersHub-authentification-module @@ -1 +1 @@ -Subproject commit 8d3bff26cb23b3ef75c5aba6799e133cf3acc98b +Subproject commit 3f26405e8130dba4bbef13d0001538675726db71 diff --git a/docs/changelog.rst b/docs/changelog.rst index 2660dd2f..06880a8e 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -16,7 +16,7 @@ CHANGELOG * Ajout d'un template de configuration ``Apache`` * Gestion de la base de données et de ses évolutions avec `Alembic `_ déplacée dans le sous-module `UsersHub-authentification-module `_ * Suppression de ``ID_APP`` du fichier de configuration (auto-détection depuis la base de données) -* Mise à jour de `UsersHub-authentification-module `_ en version 1.5.1 +* Mise à jour de `UsersHub-authentification-module `_ en version 1.5.3 **Développement** diff --git a/requirements.txt b/requirements.txt index 067d4d93..c5de5bb4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,2 @@ -r requirements-common.txt -https://github.com/PnX-SI/UsersHub-authentification-module/archive/1.5.1.zip +https://github.com/PnX-SI/UsersHub-authentification-module/archive/1.5.3.zip From e39a527e0d53b66bc15d802d052e9686b8f1e23c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Wed, 29 Sep 2021 16:14:36 +0200 Subject: [PATCH 31/57] update .gitignore --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index 3a57fcab..15533056 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,8 @@ fontawesome* app/templates/mails/sign_up_confirmation.html /docs/changelog.html + +*.swp +*.swo + +*.egg-info/ From 8b79c2c9974ae775fbb2c6ec47799531215fa690 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Wed, 29 Sep 2021 16:23:38 +0200 Subject: [PATCH 32/57] update changelog --- .../versions/9445a69f2bed_usershub.py | 1 - docs/changelog.rst | 18 ++++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/app/migrations/versions/9445a69f2bed_usershub.py b/app/migrations/versions/9445a69f2bed_usershub.py index 3ff14c84..278c62c8 100644 --- a/app/migrations/versions/9445a69f2bed_usershub.py +++ b/app/migrations/versions/9445a69f2bed_usershub.py @@ -1,7 +1,6 @@ """UsersHub Revision ID: 9445a69f2bed -Revises: fa35dfe5ff27 Create Date: 2021-08-30 16:33:42.410504 """ diff --git a/docs/changelog.rst b/docs/changelog.rst index 06880a8e..1286712c 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -14,9 +14,9 @@ CHANGELOG * Les logs de l’application se trouvent désormais dans le répertoire système ``/var/log/usershub.log`` * Ajout d'un template de configuration ``Apache`` -* Gestion de la base de données et de ses évolutions avec `Alembic `_ déplacée dans le sous-module `UsersHub-authentification-module `_ +* Gestion de la base de données et de ses évolutions avec `Alembic `_ déplacée dans le sous-module `UsersHub-authentification-module `__ * Suppression de ``ID_APP`` du fichier de configuration (auto-détection depuis la base de données) -* Mise à jour de `UsersHub-authentification-module `_ en version 1.5.3 +* Mise à jour de `UsersHub-authentification-module `__ en version 1.5.3 **Développement** @@ -29,10 +29,11 @@ Si vous mettez à jour UsersHub : * Suppression de ``supervisor`` : * Vérifier que UsersHub n’est pas lancé par supervisor : ``sudo supervisorctl stop usershub2`` - * Supprimer le fichier de configuration de supervisor ``/etc/supervisor/conf.d/usershub-service.conf`` + * Supprimer le fichier de configuration de supervisor ``sudo rm /etc/supervisor/conf.d/usershub-service.conf`` * Si supervisor n’est plus utilisé par aucun service (répertoire ``/etc/supervisor/conf.d/`` vide), il peut être désinstallé : ``sudo apt remove supervisor`` -* Suivez la procédure classique de mise à jour (https://usershub.readthedocs.io/fr/latest/installation.html#mise-a-jour-de-l-application) +* Installer le paquet ``python3-venv`` nouvellement nécessaire : ``sudo apt install python3-venv`` +* Suivre la procédure classique de mise à jour (https://usershub.readthedocs.io/fr/latest/installation.html#mise-a-jour-de-l-application) * Passage à ``systemd`` : @@ -42,14 +43,15 @@ Si vous mettez à jour UsersHub : * Révision de la configuration Apache : - * Le fichier ``/etc/apache2/conf-available/usershub.conf`` doit avoir été installé par le script ``install_app.sh`` - * Si vous servez UsersHub sur un préfixe (typiquement ``/usershub``), assurez vous que celui-ci figure bien également à la fin des directives ``ProxyPass`` et ``ProxyPassReverse`` comme c’est le cas dans le fichier ``/etc/apache2/conf-available/usershub.conf``. - * Vous pouvez également utiliser le fichier fourni soit en l’activant (``sudo a2enconf usershub``), soit en l’incluant dans votre configuration de vhost (``IncludeOptional /etc/apache2/conf-enabled/usershub.conf``). + * Le script d’installation ``install_app.sh`` aura installé le fichier ``/etc/apache2/conf-available/usershub.conf`` permettant de servir UsersHub sur le préfixe ``/usershub``. + * Vous pouvez utiliser ce fichier de configuration soit en l’activant (``sudo a2enconf usershub``), soit en l’incluant dans la configuration de votre vhost (``IncludeOptional /etc/apache2/conf-enabled/usershub.conf``). + * Si vous gardez votre propre fichier de configuration et que vous servez UsersHub sur un préfixe (typiquement ``/usershub``), assurez vous que ce préfixe figure bien également à la fin des directives ``ProxyPass`` et ``ProxyPassReverse`` comme c’est le cas dans le fichier ``/etc/apache2/conf-available/usershub.conf``. * **Si vous n’utilisez pas GeoNature**, vous devez appliquer les évolutions du schéma ``utilisateurs`` depuis UsersHub : + * Se placer dans le dossier de UsersHub : ``cd ~/usershub`` * Sourcer le virtualenv de UsersHub : ``source venv/bin/activate`` - * Indiquer à Alembic que vous possédez déjà la version 1.4.7 du schéma ``utilisateurs`` (UsersHub 2.1.3) : ``flask db stamp fa35dfe5ff27`` + * Indiquer à Alembic que vous possédez déjà la version 1.4.7 du schéma ``utilisateurs``, UsersHub 2.1.3 et les données d’exemples : ``flask db stamp f63a8f44c969`` * Appliquer les révisions du schéma ``utilisateurs`` : ``flask db upgrade utilisateurs@head`` 2.1.3 (2020-09-29) From 309a4fad77474b2b135d46847652cf077a8c9bdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Wed, 29 Sep 2021 16:28:02 +0200 Subject: [PATCH 33/57] release 2.2.0 --- VERSION | 2 +- docs/changelog.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 91185fcc..ccbccc3d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.1.4.dev0 +2.2.0 diff --git a/docs/changelog.rst b/docs/changelog.rst index 1286712c..9615578a 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -2,7 +2,7 @@ CHANGELOG ========= -2.2.0 (unreleased) +2.2.0 (2021-09-29) ------------------ **Nouveautés** From 7b900e297ff45aabddd19ecdc9c376b6cab3db1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Thu, 30 Sep 2021 11:53:57 +0200 Subject: [PATCH 34/57] set version to 2.2.1-dev --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index ccbccc3d..84e6d845 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.2.0 +2.2.1-dev From e37d9db3e3015b0ce4f1ff9f2792415fe8f6c562 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Thu, 30 Sep 2021 11:54:09 +0200 Subject: [PATCH 35/57] docs: fix release archive url --- docs/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.rst b/docs/installation.rst index dcbc451a..05fb974a 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -75,7 +75,7 @@ Mise à jour de l'application :: cd - wget https://github.com/PnEcrins/UsersHub/archive/X.Y.Z.zip + wget https://github.com/PnX-SI/UsersHub/archive/X.Y.Z.zip unzip X.Y.Z.zip rm X.Y.Z.zip From c4409373abf46971983528c1e207f6e417893e2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Thu, 30 Sep 2021 13:55:57 +0200 Subject: [PATCH 36/57] dont enable usershub apache config during install --- install_app.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/install_app.sh b/install_app.sh index 08b1bf68..53b633af 100755 --- a/install_app.sh +++ b/install_app.sh @@ -60,10 +60,8 @@ sudo systemctl daemon-reload || exit 1 # Configuration apache sudo cp usershub_apache.conf /etc/apache2/conf-available/usershub.conf || exit 1 -sudo a2enconf usershub || exit 1 sudo a2enmod proxy || exit 1 sudo a2enmod proxy_http || exit 1 -sudo systemctl reload apache2 || exit 1 # you may need a restart if proxy & proxy_http was not already enabled echo "Vous pouvez maintenant démarrer UsersHub avec la commande : sudo systemctl start usershub" From 8e41da560ddb2ce86c119fe3d2209538066e29c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Thu, 30 Sep 2021 13:56:33 +0200 Subject: [PATCH 37/57] update changelog --- docs/changelog.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 9615578a..3295b041 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -44,8 +44,9 @@ Si vous mettez à jour UsersHub : * Révision de la configuration Apache : * Le script d’installation ``install_app.sh`` aura installé le fichier ``/etc/apache2/conf-available/usershub.conf`` permettant de servir UsersHub sur le préfixe ``/usershub``. - * Vous pouvez utiliser ce fichier de configuration soit en l’activant (``sudo a2enconf usershub``), soit en l’incluant dans la configuration de votre vhost (``IncludeOptional /etc/apache2/conf-enabled/usershub.conf``). + * Vous pouvez utiliser ce fichier de configuration soit en l’activant (``sudo a2enconf usershub``), soit en l’incluant dans la configuration de votre vhost (``Include /etc/apache2/conf-available/usershub.conf``). * Si vous gardez votre propre fichier de configuration et que vous servez UsersHub sur un préfixe (typiquement ``/usershub``), assurez vous que ce préfixe figure bien également à la fin des directives ``ProxyPass`` et ``ProxyPassReverse`` comme c’est le cas dans le fichier ``/etc/apache2/conf-available/usershub.conf``. + * Si vous décidez d’utiliser le fichier fourni, pensez à supprimer votre ancienne configuration apache (``sudo a2dissite usershub && sudo rm /etc/apache2/sites-available/usershub.conf``). * **Si vous n’utilisez pas GeoNature**, vous devez appliquer les évolutions du schéma ``utilisateurs`` depuis UsersHub : From 7713e9d76e767dfaa0bc4977e806c629f3594d57 Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Thu, 30 Sep 2021 14:00:11 +0200 Subject: [PATCH 38/57] Changelog - Update old SQL migration folders --- docs/changelog.rst | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 3295b041..b2638a4f 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -83,7 +83,7 @@ Si vous mettez à jour UsersHub : \q # Se déconnecter de l'utilisateur postgres exit -* Exécuter le script de mise à jour de la BDD (https://github.com/PnX-SI/UsersHub/blob/master/data/update_2.1.2to2.1.3.sql) +* Exécuter le script de mise à jour de la BDD (https://github.com/PnX-SI/UsersHub/blob/2.1.3/data/update_2.1.2to2.1.3.sql) * Suivez la procédure classique de mise à jour (https://usershub.readthedocs.io/fr/latest/installation.html#mise-a-jour-de-l-application) 2.1.2 (2020-06-17) @@ -120,7 +120,7 @@ Si vous mettez à jour UsersHub : sudo apt-get install python3-pip sudo pip3 install virtualenv==20.0.1 -* Exécuter le script de mise à jour de la BDD suivant: https://github.com/PnX-SI/UsersHub/blob/master/data/update_2.1.0to2.1.1.sql +* Exécuter le script de mise à jour de la BDD suivant: https://github.com/PnX-SI/UsersHub/blob/2.1.3/data/update_2.1.0to2.1.1.sql * Suivez la procédure classique de mise à jour (https://usershub.readthedocs.io/fr/latest/installation.html#mise-a-jour-de-l-application) @@ -146,7 +146,7 @@ Si vous mettez à jour UsersHub : **Notes de version** * Vous pouvez passer directement de la version 2.0.0 à la version 2.1.0, mais en suivant les notes de version intermédiaires. -* Exécuter le script de mise à jour de la BDD suivant: https://github.com/PnX-SI/UsersHub/blob/master/data/update_2.0.3to2.1.0.sql +* Exécuter le script de mise à jour de la BDD suivant: https://github.com/PnX-SI/UsersHub/blob/2.1.3/data/update_2.0.3to2.1.0.sql * Si vous mettez à jour depuis la version 2.0.0, suivez la procédure classique de mise à jour (https://usershub.readthedocs.io/fr/latest/installation.html#mise-a-jour-de-l-application) 2.0.3 (2019-02-27) @@ -201,7 +201,7 @@ Si vous mettez à jour UsersHub : **Corrections** * Corrections mineures de l'authentification et de la gestion des sessions -* Mise à jour des scripts de synchronisation du schéma ``utilisateurs`` entre BDD mère et BDD filles (``data/synchro_interbase_fille.sql`` et ``data/synchro_interbase_mere.sql``). A tester et finaliser. +* Mise à jour des scripts de synchronisation du schéma ``utilisateurs`` entre BDD mère et BDD filles (https://github.com/PnX-SI/UsersHub/blob/2.1.3/data/synchro_interbase_fille.sql et https://github.com/PnX-SI/UsersHub/blob/2.1.3/data/synchro_interbase_mere.sql). A tester et finaliser. **Notes de version** @@ -277,7 +277,7 @@ Refonte totale de l'application en Python, Flask, Jinja, Bootstrap, Jquery. Par * Version beta à ne pas utiliser en production * Installation : https://github.com/PnEcrins/UsersHub/issues/35 -* Exécuter le script de mise à jour de la BDD ``data/update_1.3.1to2.sql`` (attention il ne migre pas encore les données UsersHub V1) +* Exécuter le script de mise à jour de la BDD https://github.com/PnX-SI/UsersHub/blob/2.1.3/data/update_1.3.1to2.sql (attention il ne migre pas encore les données UsersHub V1) * Renseigner les fichiers ``settings.ini`` et ``config.py`` à partir des samples 1.3.1 (2018-05-17) @@ -303,11 +303,10 @@ Refonte totale de l'application en Python, Flask, Jinja, Bootstrap, Jquery. Par **Notes de version** * Ajouter le paramètre ``$pass_cost`` dans le ``config/config.php`` et lui donner une valeur éventuellement différente. Plus la valeur est importante, plus le temps de calcul de hashage du mot de passe est important. -* Exécuter le script ``data/update1.3.0to1.3.1.sql`` +* Exécuter le script https://github.com/PnX-SI/UsersHub/blob/2.1.3/data/update1.3.0to1.3.1.sql * Reporter les modifications dans les bases filles. * Facultatif : revoir la configuration apache qui est maintenant dans un fichier usershub.conf (voir la doc). Ne pas oublier de supprimer le lien symbolique dans ``/var/www/html`` - 1.3.0 (2017-12-11) ------------------ @@ -320,7 +319,7 @@ Refonte totale de l'application en Python, Flask, Jinja, Bootstrap, Jquery. Par **Notes de version** -* Les modifications de la BDD (ajout champ ``pass_plus`` notamment) doivent concerner la BDD principale de UsersHub (BDD mère) mais aussi toutes les BDD filles inscrites dans le fichier ``dbconnexions.json``. Pour cela 2 scripts sont proposés : ``data/update_mère_1.2.1to1.3.0.sql`` et ``data/update_filles_1.2.1to1.3.0.sql``. +* Les modifications de la BDD (ajout champ ``pass_plus`` notamment) doivent concerner la BDD principale de UsersHub (BDD mère) mais aussi toutes les BDD filles inscrites dans le fichier ``dbconnexions.json``. Pour cela 2 scripts sont proposés : https://github.com/PnX-SI/UsersHub/blob/2.1.3/data/update_mère_1.2.1to1.3.0.sql et https://github.com/PnX-SI/UsersHub/blob/2.1.3/data/update_filles_1.2.1to1.3.0.sql. * Synchroniser les UUID vers les BDD filles. Le script SQL appliqué sur la BDD mère va générer des UUID pour chaque utilisateur et organisme. S'il était appliqué sur les BDD filles, les UUID générés seraient différents de ceux de la BDD mère. Il faut donc les générer une seule fois dans la BDD mère, puis les copier dans les BDD filles. Pour cela, après s'être authentifié dans UsersHub il suffit de lancer le script ``web/sync_uuid.php`` : http://mondomaine.fr/usershub/sync_uuid.php. ATTENTION, ce script utilise le fichier ``dbconnexions.json`` pour boucler sur les BDD filles, il ne fonctionnera que si vous avez préalablement mis à jour toutes les BDD filles inscrites dans ``dbconnexions.json``. * Créer le fichier ``config/config.php`` à partir du fichier ``config/config.php.sample`` et choisissez le mécanisme d'authentification à UsersHub que vous souhaitez mettre en place, ainsi que la taille minimale des mots de passe du nouveau champs ``pass_plus``. Il est conseillé de conserver le mot de passe ``pass`` (encodé en md5) le temps de mettre à jour les mots de passe des utilisateurs de UsersHub. * Générer le hash des mots de passe, au moins pour les utilisateurs de UsersHub. Il existe trois manières de le faire : @@ -359,7 +358,7 @@ Refonte totale de l'application en Python, Flask, Jinja, Bootstrap, Jquery. Par **Notes de version** -* Si vous mettez à jour l'application depuis la version 1.2.0, éxécutez le script ``data/update1.2.0to1.2.1.sql`` qui supprime la table inutile ``bib_observateurs``. +* Si vous mettez à jour l'application depuis la version 1.2.0, éxécutez le script https://github.com/PnX-SI/UsersHub/blob/2.1.3/data/update1.2.0to1.2.1.sql qui supprime la table inutile ``bib_observateurs``. 1.2.0 (2016-11-16) ------------------ From 9567b436c61111145d94cf78e4b45db022d1aedb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Thu, 30 Sep 2021 16:30:09 +0200 Subject: [PATCH 39/57] upgrade utilisateurs schema when upgrading usershub --- ...ec215fe023e_upgrade_utilisateurs_schema.py | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 app/migrations/versions/6ec215fe023e_upgrade_utilisateurs_schema.py diff --git a/app/migrations/versions/6ec215fe023e_upgrade_utilisateurs_schema.py b/app/migrations/versions/6ec215fe023e_upgrade_utilisateurs_schema.py new file mode 100644 index 00000000..9ceb8895 --- /dev/null +++ b/app/migrations/versions/6ec215fe023e_upgrade_utilisateurs_schema.py @@ -0,0 +1,26 @@ +"""upgrade utilisateurs schema + +Revision ID: 6ec215fe023e +Revises: 9445a69f2bed +Create Date: 2021-09-30 16:29:25.531376 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '6ec215fe023e' +down_revision = '9445a69f2bed' +branch_labels = None +depends_on = ( + '951b8270a1cf', # utilisateurs +) + + +def upgrade(): + pass + + +def downgrade(): + pass From e4152ac976993d0505f63060b77b71ea72cc4826 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Thu, 30 Sep 2021 16:36:06 +0200 Subject: [PATCH 40/57] doc install: add infos to install samples data --- docs/installation.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/installation.rst b/docs/installation.rst index 05fb974a..08f815d7 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -48,6 +48,15 @@ Création de la base de données ./install_db.sh +* Si vous souhaitez les données utilisateurs d’exemple, en particulier l’utilisateur ``admin`` (mot de passe : ``admin``), executez : + + :: + + cd ~/usershub + source venv/bin/activate + flask db upgrade usershub-samples@head + + Configuration Apache ==================== From f0d7d55029d1448b06908fa695405cc8d12770cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Thu, 30 Sep 2021 16:33:23 +0200 Subject: [PATCH 41/57] release 2.2.1 --- VERSION | 2 +- docs/changelog.rst | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 84e6d845..c043eea7 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.2.1-dev +2.2.1 diff --git a/docs/changelog.rst b/docs/changelog.rst index b2638a4f..b4ee4a23 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -2,6 +2,14 @@ CHANGELOG ========= +2.2.1 (2021-09-29) +------------------ + +**Nouveautés** + +* Le fichier de configuration Apache fourni par UsersHub n’est plus automatiquement activé ; il peut l’être manuellement avec la commande ``a2enconf usershub``. +* Une dépendance Alembic de la branche ``usershub`` vers la dernière révision de la branche ``utilisateurs`` permet d’obtenir automatiquement la dernière version du schéma ``utilisateurs`` avec la commande ``flask db upgrade usershub@head`` (tel que fait dans le script ``install_db.sh``). + 2.2.0 (2021-09-29) ------------------ From be24c57e59cb4d336fc55a75812968ae999e0c1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Wed, 8 Dec 2021 09:54:02 +0100 Subject: [PATCH 42/57] fix config for serving usershub on subdomain --- app/app.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/app.py b/app/app.py index 6f938869..4d517882 100644 --- a/app/app.py +++ b/app/app.py @@ -43,8 +43,8 @@ def configure_alembic(alembic_config): def create_app(): app = Flask(__name__) app.config.from_pyfile("../config/config.py") - app.config['APPLICATION_ROOT'] = urlsplit(app.config['URL_APPLICATION']).path - if 'SCRIPT_NAME' not in os.environ: + app.config['APPLICATION_ROOT'] = urlsplit(app.config['URL_APPLICATION']).path or '/' + if 'SCRIPT_NAME' not in os.environ and app.config['APPLICATION_ROOT'] != '/': os.environ['SCRIPT_NAME'] = app.config['APPLICATION_ROOT'] app.config["URL_REDIRECT"] = "{}/{}".format(app.config["URL_APPLICATION"], "login") app.secret_key = app.config["SECRET_KEY"] From 3c6110cda69a78d32f562465c8ad2c13a14a450f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Wed, 8 Dec 2021 12:19:21 +0100 Subject: [PATCH 43/57] update documentation --- docs/index.rst | 5 ++- docs/installation.rst | 99 ++++++++++++++++++++++++++++++++++--------- docs/server.rst | 70 ------------------------------ 3 files changed, 84 insertions(+), 90 deletions(-) delete mode 100644 docs/server.rst diff --git a/docs/index.rst b/docs/index.rst index 2f85fa30..30beee99 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,10 +1,13 @@ +.. image:: http://geonature.fr/img/logo-pne.jpg + :target: http://www.ecrins-parcnational.fr + +================================= Bienvenue dans la doc de UsersHub ================================= .. toctree:: :maxdepth: 2 - server installation migration-v1v2 FAQ diff --git a/docs/installation.rst b/docs/installation.rst index 08f815d7..422fd253 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -1,17 +1,66 @@ -=========== -APPLICATION -=========== +============ +INSTALLATION +============ + +Cette documentation décrit l'installation indépendante de UsersHub. Il est aussi possible de réaliser l'installation avec le script automatisé d'installation globale de GeoNature (http://docs.geonature.fr/installation.html#installation-globale). + +Prérequis +========= + +Pour installer UsersHub, il vous faut un serveur avec : + +* Debian 10 ou 11 +* 1 Go de RAM +* 5 Go d’espace disque + +Création d’un utilisateur +========================= + +Vous devez disposer d'un utilisateur Linux pour faire tourner UsersHub (nommé ``synthese`` dans notre exemple). Le répertoire de cet utilisateur ``synthese`` doit être dans ``/home/synthese``. Si vous souhaitez utiliser un autre utilisateur linux, vous devrez adapter les lignes de commande proposées dans cette documentation. + +:: + + # adduser --home /home/synthese synthese + # adduser synthese sudo :Note: Pour la suite de l'installation, veuillez utiliser l'utilisateur Linux créé précedemment (``synthese`` dans l'exemple), et non l'utilisateur ``root``. +Installation des dépendances requises +===================================== + +Installez les dépendances suivantes : + +:: + + $ sudo apt install -y python3-venv libpq-dev postgresql apache2 + + +Installer NVM (Node version manager), node et npm + +:: + + $ wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash + + +Fermer la console et la réouvrir pour que l’environnement npm soit pris en compte. + +Configuration de PostgresQL +=========================== + +Créer un utilisateur PostgreSQL : + +:: + + $ sudo -u postgres psql -c "CREATE ROLE geonatuser WITH LOGIN PASSWORD 'monpassachanger';" + Configuration de la base de données PostgreSQL ============================================== -* Créer et mettre à jour le fichier ``config/settings.ini`` +Créer et mettre à jour le fichier ``config/settings.ini`` : - :: +:: $ cd ~/usershub $ cp config/settings.ini.sample config/settings.ini @@ -29,20 +78,20 @@ ATTENTION : Les valeurs renseignées dans ce fichier sont utilisées par le scri Configuration de l'application ============================== -* Installation et configuration de l'application - - :: +* Installation de l'application : + +:: cd ~/usershub ./install_app.sh -Création de la base de données -============================== +Création et installation de la base de données +============================================== -* Création de la base de données et chargement des données initiales +* Création de la base de données et chargement des données initiales : - :: +:: cd ~/usershub ./install_db.sh @@ -50,7 +99,7 @@ Création de la base de données * Si vous souhaitez les données utilisateurs d’exemple, en particulier l’utilisateur ``admin`` (mot de passe : ``admin``), executez : - :: +:: cd ~/usershub source venv/bin/activate @@ -60,20 +109,32 @@ Création de la base de données Configuration Apache ==================== -Copier le fichier de configuration apache d’exemple : +UsersHub peut être classiquement déployé sur 2 types d’URL distincts : -:: +* Sur un préfixe : https://mon-domaine.fr/usershub/ +* Sur un sous-domaine : https://usershub.mon-domaine.fr - sudo cp ~/usershub/usershub_apache.conf /etc/apache2/conf-available/usershub.conf +Installation de UsersHub sur un préfixe +--------------------------------------- -Activer le site et recharger la configuration Apache : +Le processus d’installation de l’application créer le fichier de configuration Apache ``/etc/apache2/conf-available/usershub.conf`` permettant de servir UsersHub sur le préfixe ``/usershub/``. Pour activer ce fichier de configuration, exécutez les commandes suivantes : :: sudo a2enconf usershub sudo service apache2 reload -* Pour tester, se connecter à l'application via http://mon-domaine.fr/usershub/ avec l'utilisateur ``admin`` et son mot de passe ``admin``. +Installation de UsersHub sur un sous-domaine +-------------------------------------------- + +Dans le cas où UsersHub est installé sur un sous-domaine et non sur un préfexe (c’est-à-dire ``https://usershub.mon-domaine.fr``), veuillez ajouter dans le fichier de configuration de votre virtualhost (*e.g.* ``/etc/apache2/sites-enabled/usershub.conf``) la section suivante : + +:: + + + ProxyPass http://127.0.0.1:5001/ + ProxyPassReverse http://127.0.0.1:5001/ + Mise à jour de l'application @@ -102,7 +163,7 @@ Mise à jour de l'application cp /home/`whoami`/usershub_old/config/config.py /home/`whoami`/usershub/config/config.py cp /home/`whoami`/usershub_old/config/settings.ini /home/`whoami`/usershub/config/settings.ini -* Lancer le script d'installation de l'application : +* Lancer le script d'installation de l'application (attention si vous avez modifiez certains paramètres dans le fichier ``config.py`` tels que les paramètres de connexion à la base de données, ils seront écrasés par les paramètres présent dans le fichier ``settings.ini``) : :: diff --git a/docs/server.rst b/docs/server.rst deleted file mode 100644 index af762dda..00000000 --- a/docs/server.rst +++ /dev/null @@ -1,70 +0,0 @@ -.. image:: http://geonature.fr/img/logo-pne.jpg - :target: http://www.ecrins-parcnational.fr - -======= -SERVEUR -======= - -Cette documentation décrit l'installation indépendante de UsersHub. Il est aussi possible de réaliser l'installation avec le script automatisé d'installation globale de GeoNature (https://github.com/PnEcrins/GeoNature/tree/master/docs/install_all). - -Prérequis -========= - -* Ressources minimum du serveur : - -Un serveur disposant d'au moins de 1 Go RAM et de 5 Go d'espace disque. - -* Disposer d'un utilisateur linux (nommé ``synthese`` dans notre exemple). Le répertoire de cet utilisateur ``synthese`` doit être dans ``/home/synthese``. Si vous souhaitez utiliser un autre utilisateur linux, vous devrez adapter les lignes de commande proposées dans cette documentation. - - :: - - # adduser --home /home/synthese synthese - # adduser synthese sudo - -:Note: - - Pour la suite de l'installation, veuillez utiliser l'utilisateur Linux créé précedemment (``synthese`` dans l'exemple), et non l'utilisateur ``root``. - -* Récupérer le zip de l'application sur le Github du projet (X.Y.Z à remplacer par la version souhaitée de UsersHub) - - :: - - $ cd /home/synthese - $ wget https://github.com/PnX-SI/UsersHub/archive/X.Y.Z.zip - $ unzip X.Y.Z.zip - $ mv UsersHub-X.Y.Z usershub - - -Installation et configuration du serveur -======================================== - -Installation pour Debian 10 et Debian 11. - -:: - - $ sudo apt install -y python3-venv libpq-dev postgresql apache2 - -* Installer NVM (Node version manager), node et npm - -:: - - $ wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash - - -Fermer la console et la réouvrir pour que l’environnement npm soit pris en compte. - - -Installation et configuration de PostgreSQL -=========================================== - -* Installation de PostgreSQL - - :: - - $ sudo apt-get install postgresql - -* Création d'un utilisateur PostgreSQL - - :: - - $ sudo -u postgres psql -c "CREATE ROLE geonatuser WITH LOGIN PASSWORD 'monpassachanger';" From 542f29df835839c44951c3bdc64dfbe1ca98a55b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Wed, 8 Dec 2021 12:49:07 +0100 Subject: [PATCH 44/57] install_app.sh: set URLS_COR config parameter --- install_app.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/install_app.sh b/install_app.sh index 53b633af..a8255ef7 100755 --- a/install_app.sh +++ b/install_app.sh @@ -22,6 +22,7 @@ then url_application="${url_application::-1}" fi sed -i "s/URL_APPLICATION =.*$/URL_APPLICATION ='$url_application'/g" config.py || exit 1 +sed -i "s/URLS_COR =.*$/URLS_COR = ['$url_application']/g" config.py || exit 1 cd .. From eb6a44bc225a6219d9be761101006aabdb1fb7c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Wed, 8 Dec 2021 14:18:55 +0100 Subject: [PATCH 45/57] doc: add wrongly removed download section --- docs/installation.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/installation.rst b/docs/installation.rst index 422fd253..392ff6ef 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -46,6 +46,18 @@ Installer NVM (Node version manager), node et npm Fermer la console et la réouvrir pour que l’environnement npm soit pris en compte. +Téléchargement de UsersHub +========================== + +Récupérer le zip de l'application sur le Github du projet (X.Y.Z à remplacer par la version souhaitée de UsersHub) + +:: + + $ cd /home/synthese + $ wget https://github.com/PnX-SI/UsersHub/archive/X.Y.Z.zip + $ unzip X.Y.Z.zip + $ mv UsersHub-X.Y.Z usershub + Configuration de PostgresQL =========================== From 48f4d400c68cfdaa368973895782f1f24171797d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Thu, 9 Dec 2021 22:24:01 +0100 Subject: [PATCH 46/57] update doc --- docs/installation.rst | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 392ff6ef..1ec94343 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -16,12 +16,12 @@ Pour installer UsersHub, il vous faut un serveur avec : Création d’un utilisateur ========================= -Vous devez disposer d'un utilisateur Linux pour faire tourner UsersHub (nommé ``synthese`` dans notre exemple). Le répertoire de cet utilisateur ``synthese`` doit être dans ``/home/synthese``. Si vous souhaitez utiliser un autre utilisateur linux, vous devrez adapter les lignes de commande proposées dans cette documentation. +Vous devez disposer d'un utilisateur Linux pour faire tourner UsersHub (nommé ``synthese`` dans notre exemple). L’utilisateur doit appartenir au groupe ``sudo``. Le répertoire de cet utilisateur ``synthese`` doit être dans ``/home/synthese``. Si vous souhaitez utiliser un autre utilisateur Linux, vous devrez adapter les lignes de commande proposées dans cette documentation. :: - # adduser --home /home/synthese synthese - # adduser synthese sudo + $ adduser --home /home/synthese synthese + $ adduser synthese sudo :Note: @@ -37,7 +37,7 @@ Installez les dépendances suivantes : $ sudo apt install -y python3-venv libpq-dev postgresql apache2 -Installer NVM (Node version manager), node et npm +Installer NVM (Node version manager), node et npm : :: @@ -46,6 +46,15 @@ Installer NVM (Node version manager), node et npm Fermer la console et la réouvrir pour que l’environnement npm soit pris en compte. +Configuration de PostgresQL +=========================== + +Créer un utilisateur PostgreSQL : + +:: + + $ sudo -u postgres psql -c "CREATE ROLE geonatuser WITH LOGIN PASSWORD 'monpassachanger';" + Téléchargement de UsersHub ========================== @@ -58,17 +67,8 @@ Récupérer le zip de l'application sur le Github du projet (X.Y.Z à remplacer $ unzip X.Y.Z.zip $ mv UsersHub-X.Y.Z usershub -Configuration de PostgresQL -=========================== - -Créer un utilisateur PostgreSQL : - -:: - - $ sudo -u postgres psql -c "CREATE ROLE geonatuser WITH LOGIN PASSWORD 'monpassachanger';" - -Configuration de la base de données PostgreSQL -============================================== +Configuration de UsersHub +========================= Créer et mettre à jour le fichier ``config/settings.ini`` : @@ -121,6 +121,13 @@ Création et installation de la base de données Configuration Apache ==================== +Activez les modules ``mod_proxy`` et ``mod_proxy_http``, et redémarrez Apache : + +:: + + $ sudo a2enmod proxy proxy_http + $ sudo systemctl restart apache + UsersHub peut être classiquement déployé sur 2 types d’URL distincts : * Sur un préfixe : https://mon-domaine.fr/usershub/ From 3af9f0f7cb05e94abe9d458baa9a27edd25f449b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Thu, 9 Dec 2021 22:24:41 +0100 Subject: [PATCH 47/57] remove unused Flask-Cors --- config/config.py.sample | 3 --- install_app.sh | 1 - requirements-common.txt | 1 - 3 files changed, 5 deletions(-) diff --git a/config/config.py.sample b/config/config.py.sample index 566840bb..eb04ea37 100644 --- a/config/config.py.sample +++ b/config/config.py.sample @@ -3,9 +3,6 @@ SQLALCHEMY_DATABASE_URI = "postgresql://monuser:monpassachanger@localhost/usersh SQLALCHEMY_TRACK_MODIFICATIONS = False URL_APPLICATION = 'http://localhost:5001' -# Liste d'URL depuis lesquels on accepte des requetes croisées -URLS_COR = ['http://localhost:5000'] - SECRET_KEY = 'super secret key' # Authentification crypting method (hash or md5) diff --git a/install_app.sh b/install_app.sh index a8255ef7..53b633af 100755 --- a/install_app.sh +++ b/install_app.sh @@ -22,7 +22,6 @@ then url_application="${url_application::-1}" fi sed -i "s/URL_APPLICATION =.*$/URL_APPLICATION ='$url_application'/g" config.py || exit 1 -sed -i "s/URLS_COR =.*$/URLS_COR = ['$url_application']/g" config.py || exit 1 cd .. diff --git a/requirements-common.txt b/requirements-common.txt index d6bb8c86..a85a4415 100644 --- a/requirements-common.txt +++ b/requirements-common.txt @@ -3,7 +3,6 @@ bcrypt==3.1.4 click==6.7 decorator==4.3.0 Flask-Bootstrap==3.3.7.1 -Flask-Cors==3.0.10 Flask-Migrate==3.1.0 Flask-SQLAlchemy==2.3.2 Flask-WTF==0.14.2 From e9f8d2d491587740dc52f4fa0038a71e76b09add Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Fri, 10 Dec 2021 12:09:12 +0100 Subject: [PATCH 48/57] DOC install - Typo --- docs/installation.rst | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 1ec94343..680cc316 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -36,14 +36,12 @@ Installez les dépendances suivantes : $ sudo apt install -y python3-venv libpq-dev postgresql apache2 - -Installer NVM (Node version manager), node et npm : +Installer NVM (Node version manager), Node.js et npm : :: $ wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash - Fermer la console et la réouvrir pour que l’environnement npm soit pris en compte. Configuration de PostgresQL @@ -146,7 +144,7 @@ Le processus d’installation de l’application créer le fichier de configurat Installation de UsersHub sur un sous-domaine -------------------------------------------- -Dans le cas où UsersHub est installé sur un sous-domaine et non sur un préfexe (c’est-à-dire ``https://usershub.mon-domaine.fr``), veuillez ajouter dans le fichier de configuration de votre virtualhost (*e.g.* ``/etc/apache2/sites-enabled/usershub.conf``) la section suivante : +Dans le cas où UsersHub est installé sur un sous-domaine et non sur un préfixe (c’est-à-dire ``https://usershub.mon-domaine.fr``), veuillez ajouter dans le fichier de configuration de votre virtualhost (*e.g.* ``/etc/apache2/sites-enabled/usershub.conf``) la section suivante : :: From 6ebe24d8e75880c35c31267f26bacd9c13f2fddd Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Fri, 10 Dec 2021 12:21:22 +0100 Subject: [PATCH 49/57] Changelog 2.2.2 --- docs/changelog.rst | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index b4ee4a23..648c3be9 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -2,12 +2,27 @@ CHANGELOG ========= +2.2.2 (unreleased) +------------------ + +**Corrections** + +* Complément de la documentation Apache pour préciser quand UsersHub est sur un sous-domaine (https://usershub.readthedocs.io/fr/develop/installation.html#installation-de-usershub-sur-un-sous-domaine) +* Correction de la génération automatique de la documentation sur Read the Docs (https://usershub.readthedocs.io) +* Suppression de l'extension ``Flask-Cors`` et du paramètre associé (``URLS_COR``) + +**Note de version** + +Si vous mettez à jour UsersHub : + +* Vous pouvez supprimer le paramètre ``URLS_COR`` de votre fichier ``config/config.py`` car celui-ci n'est plus utilisé + 2.2.1 (2021-09-29) ------------------ **Nouveautés** -* Le fichier de configuration Apache fourni par UsersHub n’est plus automatiquement activé ; il peut l’être manuellement avec la commande ``a2enconf usershub``. +* Le fichier de configuration Apache fourni par UsersHub n’est plus automatiquement activé; il peut l’être manuellement avec la commande ``a2enconf usershub``. * Une dépendance Alembic de la branche ``usershub`` vers la dernière révision de la branche ``utilisateurs`` permet d’obtenir automatiquement la dernière version du schéma ``utilisateurs`` avec la commande ``flask db upgrade usershub@head`` (tel que fait dans le script ``install_db.sh``). 2.2.0 (2021-09-29) @@ -54,7 +69,7 @@ Si vous mettez à jour UsersHub : * Le script d’installation ``install_app.sh`` aura installé le fichier ``/etc/apache2/conf-available/usershub.conf`` permettant de servir UsersHub sur le préfixe ``/usershub``. * Vous pouvez utiliser ce fichier de configuration soit en l’activant (``sudo a2enconf usershub``), soit en l’incluant dans la configuration de votre vhost (``Include /etc/apache2/conf-available/usershub.conf``). * Si vous gardez votre propre fichier de configuration et que vous servez UsersHub sur un préfixe (typiquement ``/usershub``), assurez vous que ce préfixe figure bien également à la fin des directives ``ProxyPass`` et ``ProxyPassReverse`` comme c’est le cas dans le fichier ``/etc/apache2/conf-available/usershub.conf``. - * Si vous décidez d’utiliser le fichier fourni, pensez à supprimer votre ancienne configuration apache (``sudo a2dissite usershub && sudo rm /etc/apache2/sites-available/usershub.conf``). + * Si vous décidez d’utiliser le fichier fourni, pensez à supprimer votre ancienne configuration Apache (``sudo a2dissite usershub && sudo rm /etc/apache2/sites-available/usershub.conf``). * **Si vous n’utilisez pas GeoNature**, vous devez appliquer les évolutions du schéma ``utilisateurs`` depuis UsersHub : From 460b83c35a59533c24da640fa7703175cb39549e Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Fri, 10 Dec 2021 12:23:10 +0100 Subject: [PATCH 50/57] =?UTF-8?q?Changelog=202.2.2=20/=20Compl=C3=A9ment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/changelog.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 648c3be9..821bd396 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -7,9 +7,9 @@ CHANGELOG **Corrections** -* Complément de la documentation Apache pour préciser quand UsersHub est sur un sous-domaine (https://usershub.readthedocs.io/fr/develop/installation.html#installation-de-usershub-sur-un-sous-domaine) +* Complément de la documentation Apache pour préciser quand UsersHub est sur un sous-domaine (https://usershub.readthedocs.io/fr/develop/installation.html#installation-de-usershub-sur-un-sous-domaine) (#148) * Correction de la génération automatique de la documentation sur Read the Docs (https://usershub.readthedocs.io) -* Suppression de l'extension ``Flask-Cors`` et du paramètre associé (``URLS_COR``) +* Suppression de l'extension ``Flask-Cors`` et du paramètre associé (``URLS_COR``) (#148) **Note de version** From 0752a94128723da07baa19f246db578b0e98ec9d Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Mon, 13 Dec 2021 13:49:42 +0100 Subject: [PATCH 51/57] Changelog 2.2.2 --- docs/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog.rst b/docs/changelog.rst index 821bd396..876e34fa 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -8,6 +8,7 @@ CHANGELOG **Corrections** * Complément de la documentation Apache pour préciser quand UsersHub est sur un sous-domaine (https://usershub.readthedocs.io/fr/develop/installation.html#installation-de-usershub-sur-un-sous-domaine) (#148) +* Correction de la configuration quand UsersHub est à la racine d'un sous-domaine (#148) * Correction de la génération automatique de la documentation sur Read the Docs (https://usershub.readthedocs.io) * Suppression de l'extension ``Flask-Cors`` et du paramètre associé (``URLS_COR``) (#148) From 2f7ba15da2c60d5bcacb67cf39a2908a6aa240d4 Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Tue, 21 Dec 2021 08:52:02 +0100 Subject: [PATCH 52/57] Changelog 2.2.2 --- docs/changelog.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/changelog.rst b/docs/changelog.rst index 876e34fa..fcc45344 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -5,6 +5,8 @@ CHANGELOG 2.2.2 (unreleased) ------------------ +Voir PR de sécurité + **Corrections** * Complément de la documentation Apache pour préciser quand UsersHub est sur un sous-domaine (https://usershub.readthedocs.io/fr/develop/installation.html#installation-de-usershub-sur-un-sous-domaine) (#148) From 89f8a8a6331d0575ee564132ee4be064eadb9ecd Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Wed, 22 Dec 2021 10:03:23 +0100 Subject: [PATCH 53/57] Preparation 2.2.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index c043eea7..b1b25a5f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.2.1 +2.2.2 From c81156f227f235c3384c9dc76879e0238bc17648 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Wed, 22 Dec 2021 16:18:47 +0100 Subject: [PATCH 54/57] install app: does not modify existing config.py --- install_app.sh | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/install_app.sh b/install_app.sh index 53b633af..1c345683 100755 --- a/install_app.sh +++ b/install_app.sh @@ -9,19 +9,18 @@ cd config echo "Création du fichier de configuration ..." if [ ! -f config.py ]; then cp config.py.sample config.py || exit 1 -fi - - -echo "préparation du fichier config.py..." -sed -i "s/SQLALCHEMY_DATABASE_URI = .*$/SQLALCHEMY_DATABASE_URI = \"postgresql:\/\/$user_pg:$user_pg_pass@$db_host:$pg_port\/$db_name\"/" config.py || exit 1 -url_application="${url_application//\//\\/}" -# on enleve le / final -if [ "${url_application: -1}" = '/' ] -then -url_application="${url_application::-1}" + echo "préparation du fichier config.py..." + sed -i "s/SQLALCHEMY_DATABASE_URI = .*$/SQLALCHEMY_DATABASE_URI = \"postgresql:\/\/$user_pg:$user_pg_pass@$db_host:$pg_port\/$db_name\"/" config.py || exit 1 + + url_application="${url_application//\//\\/}" + # on enleve le / final + if [ "${url_application: -1}" = '/' ] + then + url_application="${url_application::-1}" + fi + sed -i "s/URL_APPLICATION =.*$/URL_APPLICATION ='$url_application'/g" config.py || exit 1 fi -sed -i "s/URL_APPLICATION =.*$/URL_APPLICATION ='$url_application'/g" config.py || exit 1 cd .. From 634febad5f8bcd50e14722ff771975ee8040c093 Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Wed, 22 Dec 2021 16:28:20 +0100 Subject: [PATCH 55/57] Changelog 2.2.2 --- docs/changelog.rst | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index fcc45344..99c121f9 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -2,17 +2,16 @@ CHANGELOG ========= -2.2.2 (unreleased) +2.2.2 (2021-12-22) ------------------ -Voir PR de sécurité - **Corrections** -* Complément de la documentation Apache pour préciser quand UsersHub est sur un sous-domaine (https://usershub.readthedocs.io/fr/develop/installation.html#installation-de-usershub-sur-un-sous-domaine) (#148) +* Complément de la documentation Apache pour préciser quand UsersHub est sur un sous-domaine (https://usershub.readthedocs.io/fr/latest/installation.html#installation-de-usershub-sur-un-sous-domaine) (#148) * Correction de la configuration quand UsersHub est à la racine d'un sous-domaine (#148) * Correction de la génération automatique de la documentation sur Read the Docs (https://usershub.readthedocs.io) * Suppression de l'extension ``Flask-Cors`` et du paramètre associé (``URLS_COR``) (#148) +* Si le fichier ``config/config.py`` existe, alors on n'écrase plus ses valeurs à partir de celles du fichier ``config/settings.ini`` quand on lance le script ``install_app.sh``, lors d'une mise à jour de UsersHub notamment **Note de version** From c472e90a7964defa34836f51107614ceb5e046fa Mon Sep 17 00:00:00 2001 From: Jean-Pascal Milcent <51449363+jpm-cbna@users.noreply.github.com> Date: Thu, 20 Jan 2022 17:11:07 +0100 Subject: [PATCH 56/57] Doc Changelog: add icons, fix titles Use the same section names as GeoNature. --- docs/changelog.rst | 80 +++++++++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 99c121f9..959f62a0 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -5,7 +5,7 @@ CHANGELOG 2.2.2 (2021-12-22) ------------------ -**Corrections** +**🐛 Corrections** * Complément de la documentation Apache pour préciser quand UsersHub est sur un sous-domaine (https://usershub.readthedocs.io/fr/latest/installation.html#installation-de-usershub-sur-un-sous-domaine) (#148) * Correction de la configuration quand UsersHub est à la racine d'un sous-domaine (#148) @@ -13,7 +13,7 @@ CHANGELOG * Suppression de l'extension ``Flask-Cors`` et du paramètre associé (``URLS_COR``) (#148) * Si le fichier ``config/config.py`` existe, alors on n'écrase plus ses valeurs à partir de celles du fichier ``config/settings.ini`` quand on lance le script ``install_app.sh``, lors d'une mise à jour de UsersHub notamment -**Note de version** +**⚠️ Notes de version** Si vous mettez à jour UsersHub : @@ -22,7 +22,7 @@ Si vous mettez à jour UsersHub : 2.2.1 (2021-09-29) ------------------ -**Nouveautés** +**🚀 Nouveautés** * Le fichier de configuration Apache fourni par UsersHub n’est plus automatiquement activé; il peut l’être manuellement avec la commande ``a2enconf usershub``. * Une dépendance Alembic de la branche ``usershub`` vers la dernière révision de la branche ``utilisateurs`` permet d’obtenir automatiquement la dernière version du schéma ``utilisateurs`` avec la commande ``flask db upgrade usershub@head`` (tel que fait dans le script ``install_db.sh``). @@ -30,7 +30,7 @@ Si vous mettez à jour UsersHub : 2.2.0 (2021-09-29) ------------------ -**Nouveautés** +**🚀 Nouveautés** * Affichage des emails des utilisateurs dans les fiches des groupes (#133) * Packaging de l’application UsersHub @@ -43,11 +43,11 @@ Si vous mettez à jour UsersHub : * Suppression de ``ID_APP`` du fichier de configuration (auto-détection depuis la base de données) * Mise à jour de `UsersHub-authentification-module `__ en version 1.5.3 -**Développement** +**💻 Développement** * Ajout de UsersHub-authentification-module en temps que sous-module git -**Note de version** +**⚠️ Notes de version** Si vous mettez à jour UsersHub : @@ -83,13 +83,13 @@ Si vous mettez à jour UsersHub : 2.1.3 (2020-09-29) ------------------ -**Nouveautés** +**🚀 Nouveautés** * Possibilité de définir une action spécifique à une application, à exécuter après la validation d'un compte utilisateur en attente, renseignée dans le nouveau champs ``utilisateurs.temp_users.confirmation_url`` (#115 par @jpm-cbna) * Passage du champs ``bib_organismes.nom_organisme`` de 100 à 500 caractères * Mise à jour des versions des librairies psycopg2 (2.8.5) et sqlalchemy (1.3.19) (par @jpm-cbna) -**Note de version** +**⚠️ Notes de version** Si vous mettez à jour UsersHub : @@ -114,14 +114,14 @@ Si vous mettez à jour UsersHub : 2.1.2 (2020-06-17) ------------------ -**Nouveautés** +**🚀 Nouveautés** * Mise à jour des librairies Javascript (Bootstrap 4.5.0, jQuery 3.5.0) * Mise à jour de MarkupSafe de la version 1.0 à 1.1 (#103) * Amélioration du template du formulaire de connexion * Utilisation du ``code_application`` de valeur ``UH`` dans la table ``utilisateurs.t_applications`` pour l'authentification, au lieu du paramètre ``ID_APP`` du fichier ``config/config.py`` -**Corrections** +**🐛 Corrections** * Correction de l'affichage des fiches "Organisme" (#90) * Correction de la documentation d'installation (par @lpofredc) @@ -129,13 +129,13 @@ Si vous mettez à jour UsersHub : 2.1.1 (2019-02-12) ------------------ -**Corrections** +**🐛 Corrections** * Modification de l'écriture d'une contrainte d'unicité * Modification de la méthode d'installation du virtualenv * Utilisation de nvm pour installer node et npm (uniformisation avec GeoNature) -**Note de version** +**⚠️ Notes de version** * Installez ``pip3`` et ``virtualenv`` @@ -152,7 +152,7 @@ Si vous mettez à jour UsersHub : 2.1.0 (2019-09-17) ------------------ -**Nouveautés** +**🚀 Nouveautés** * Ajout d'une API sécurisée de création de comptes utilisateurs depuis des applications tierces (création de roles et d'utilisateurs temporaires à valider, changement de mot de passe et des informations personnelles). Par @joelclems, @amandine-sahl, @jbrieuclp et @TheoLechemia #47 * Création des tables ``temp_users`` et ``cor_role_token`` permettant de gérer de manière sécurisée les créations de compte et les changements de mot de passe. @@ -164,11 +164,11 @@ Si vous mettez à jour UsersHub : * Factorisation de la fonction ``encrypt_password`` * Mise à jour de Flask (1.0.2 à 1.1.1) -**Corrections** +**🐛 Corrections** * Ordonnancement des listes par ordre alphabétique (#81) -**Notes de version** +**⚠️ Notes de version** * Vous pouvez passer directement de la version 2.0.0 à la version 2.1.0, mais en suivant les notes de version intermédiaires. * Exécuter le script de mise à jour de la BDD suivant: https://github.com/PnX-SI/UsersHub/blob/2.1.3/data/update_2.0.3to2.1.0.sql @@ -177,18 +177,18 @@ Si vous mettez à jour UsersHub : 2.0.3 (2019-02-27) ------------------ -**Nouveautés** +**🚀 Nouveautés** * Mise en place de logs rotatifs pour éviter de surcharger le serveur -**Corrections** +**🐛 Corrections** * Correction de l'enregistrement du formulaire des groupes qui passait automatiquement le champs ``t_roles.active`` à ``false`` (#71) * Redirection de l'utilisateur si il n'a pas les droits suffisants pour accéder à une page * Correction du script de migration 1.3.0to1.3.1.sql * Correction de conflit d'authentification entre les différentes applications utilisant le sous-module d'authentification (MAJ du sous module en 1.3.2) -**Note de version** +**⚠️ Notes de version** * Afin que les logs de l'application (supervisor et gunicorn) soient tous écrits au même endroit, éditez le fichier ``usershub-service.conf`` (``sudo nano /etc/supervisor/conf.d/usershub-service.conf``. A la ligne ``stdout_logfile``, remplacer la ligne existante par : ``stdout_logfile = /home//usershub/var/log/errors_uhv2.log`` (en remplaçant ```` par votre utilisateur linux). * Vous pouvez également mettre en place un système de logs rotatifs (système permettant d'archiver les fichiers de log afin qu'ils ne surchargent pas le serveur) - conseillé si votre serveur a une capacité disque limitée. Créer le fichier suivant ``sudo nano /etc/logrotate.d/uhv2`` puis copiez les lignes suivantes dans le fichier nouvellement créé (en remplaçant ```` par votre utilisateur linux) @@ -210,12 +210,12 @@ Si vous mettez à jour UsersHub : 2.0.2 (2019-01-18) ------------------ -**Corrections** +**🐛 Corrections** * Correction de la documentation * Correction des versions du sous-module d'authentification -**Notes de version** +**⚠️ Notes de version** * Vous pouvez passer directement de la version 1.3.3 à la version 2.0.2, mais en suivant les notes de version de la 2.0.0. * Si vous mettez à jour depuis la version 2.0.0, suivez la procédure classique de mise à jour (https://usershub.readthedocs.io/fr/latest/installation.html#mise-a-jour-de-l-application) @@ -223,12 +223,12 @@ Si vous mettez à jour UsersHub : 2.0.1 (2019-01-18) ------------------ -**Corrections** +**🐛 Corrections** * Corrections mineures de l'authentification et de la gestion des sessions * Mise à jour des scripts de synchronisation du schéma ``utilisateurs`` entre BDD mère et BDD filles (https://github.com/PnX-SI/UsersHub/blob/2.1.3/data/synchro_interbase_fille.sql et https://github.com/PnX-SI/UsersHub/blob/2.1.3/data/synchro_interbase_mere.sql). A tester et finaliser. -**Notes de version** +**⚠️ Notes de version** * Vous pouvez passer directement de la version 1.3.3 à la version 2.0.1, mais en suivant les notes de version de la 2.0.0. * Si vous mettez à jour depuis la version 2.0.0, suivez la procédure classique de mise à jour (https://usershub.readthedocs.io/fr/latest/installation.html#mise-a-jour-de-l-application) @@ -238,7 +238,7 @@ Si vous mettez à jour UsersHub : Refonte complète de l'application en Python / Flask / Bootstrap 4 -**Nouveautés** +**🚀 Nouveautés** * Suppression de la notion de droits à 6 niveaux (trop restrictive) * Intégration de la notion de profils personalisables pour chaque application @@ -254,7 +254,7 @@ Refonte complète de l'application en Python / Flask / Bootstrap 4 * Possibilité de ne pas utiliser le champs ``pass`` (md5) si on ne l'utilise pas pour renforcer la sécurité du contenu * Développement de pages d'information par utilisateur, groupe, organisme, liste et application -**Notes de version** +**⚠️ Notes de version** Pour mettre à jour UsersHub depuis la version 1, il s'agit d'une nouvelle installation et d'une migration des données vers le nouveau modèle de BDD. @@ -264,7 +264,7 @@ Pour mettre à jour UsersHub depuis la version 1, il s'agit d'une nouvelle insta 1.3.3 (2018-10-17) ------------------ -**Corrections** +**🐛 Corrections** * Suppression de ``cor_role_droit_application`` inutiles * ``install_app.sh`` : Suppression de messages portant à confusion @@ -272,7 +272,7 @@ Pour mettre à jour UsersHub depuis la version 1, il s'agit d'une nouvelle insta 1.3.2 (2018-09-20) ------------------ -**Corrections** +**🐛 Corrections** * Installation BDD : Nettoyage des données insérées et remise à 1 des séquences par défaut * Vérification que le mot de passe encrypté en md5 et sha soient cohérents (#34) @@ -287,7 +287,7 @@ Refonte totale de l'application en Python, Flask, Jinja, Bootstrap, Jquery. Par .. image :: http://geonature.fr/img/uhv2-screenshot.png -**Nouveautés** +**🚀 Nouveautés** * Interface de gestion des tags et de leurs types * Interface de gestion des CRUVED @@ -298,7 +298,7 @@ Refonte totale de l'application en Python, Flask, Jinja, Bootstrap, Jquery. Par * Compléments des données minimales (tags, types de tags...) * Modification de la vue ``v_useraction_forall_gn_modules`` qui retourne le CRUVED d'un utilisateur pour pouvoir aussi récupérer le CRUVED d'un groupe -**Note de version** +**⚠️ Notes de version** * Version beta à ne pas utiliser en production * Installation : https://github.com/PnEcrins/UsersHub/issues/35 @@ -308,7 +308,7 @@ Refonte totale de l'application en Python, Flask, Jinja, Bootstrap, Jquery. Par 1.3.1 (2018-05-17) ------------------ -**Nouveautés** +**🚀 Nouveautés** * Préparation dans la BDD d'une future version 1.4.0 (dont les extensions sont utilisées dans le développement de GeoNature2) : @@ -318,14 +318,14 @@ Refonte totale de l'application en Python, Flask, Jinja, Bootstrap, Jquery. Par * Mise en paramètre du cost de l'algorythme de criptage bcrypt * Configuration Apache dans un fichier ``usershub.conf`` comme TaxHub et GeoNature-atlas -**Corrections** +**🐛 Corrections** * Ajout du ``pass_plus`` dans toutes les vues * Correction de l'installation (localisation du ``config.php``) * Ajout d'une vue manquante et nécessaire au sous-module d'authentification * Interdire la création d'utilisateur avec l'organisme 0 (= ALL = tous les organismes) ; Utilisé dans GeoNature2 pour définir des paramètres applicables à tous les organismes. -**Notes de version** +**⚠️ Notes de version** * Ajouter le paramètre ``$pass_cost`` dans le ``config/config.php`` et lui donner une valeur éventuellement différente. Plus la valeur est importante, plus le temps de calcul de hashage du mot de passe est important. * Exécuter le script https://github.com/PnX-SI/UsersHub/blob/2.1.3/data/update1.3.0to1.3.1.sql @@ -335,14 +335,14 @@ Refonte totale de l'application en Python, Flask, Jinja, Bootstrap, Jquery. Par 1.3.0 (2017-12-11) ------------------ -**Changements** +**🚀 Changements** * Mise en paramètre du port PostgreSQL pour l'installation initiale * Intégration d'UUID pour les organismes et les roles afin de permettre des consolidations de bases utilisateurs * Intégration d'un mécanisme d'authentification plus solide à base de hachage du mot de pass sur la base de l'algorithme ``bscript``. L'ancien mécanisme encodé en md5 (champ ``pass``) reste utilisable. Attention ceci ne concerne que l'authentification à UsersHub. Pour utiliser le hash dans d'autres applications, il faudra modifier les applications concernées et utiliser le nouveau champ ``pass_plus`` à la place du champ ``pass``. * Création d'un formulaire permettant aux utilisateurs de mettre à jour leur mot de passe et de générer le nouveau hachage du mot de passe (http://mondomaine.fr/usershub/majpass.php). -**Notes de version** +**⚠️ Notes de version** * Les modifications de la BDD (ajout champ ``pass_plus`` notamment) doivent concerner la BDD principale de UsersHub (BDD mère) mais aussi toutes les BDD filles inscrites dans le fichier ``dbconnexions.json``. Pour cela 2 scripts sont proposés : https://github.com/PnX-SI/UsersHub/blob/2.1.3/data/update_mère_1.2.1to1.3.0.sql et https://github.com/PnX-SI/UsersHub/blob/2.1.3/data/update_filles_1.2.1to1.3.0.sql. * Synchroniser les UUID vers les BDD filles. Le script SQL appliqué sur la BDD mère va générer des UUID pour chaque utilisateur et organisme. S'il était appliqué sur les BDD filles, les UUID générés seraient différents de ceux de la BDD mère. Il faut donc les générer une seule fois dans la BDD mère, puis les copier dans les BDD filles. Pour cela, après s'être authentifié dans UsersHub il suffit de lancer le script ``web/sync_uuid.php`` : http://mondomaine.fr/usershub/sync_uuid.php. ATTENTION, ce script utilise le fichier ``dbconnexions.json`` pour boucler sur les BDD filles, il ne fonctionnera que si vous avez préalablement mis à jour toutes les BDD filles inscrites dans ``dbconnexions.json``. @@ -358,13 +358,13 @@ Refonte totale de l'application en Python, Flask, Jinja, Bootstrap, Jquery. Par 1.2.2 (2017-07-06) ------------------ -**Changements** +**🚀 Changements** * Correction du script SQL (remplacement de SELECT par PERFORM) * Mise à jour du fichier ``settings.ini.sample`` pour prendre en compte le port * Suppression de la référence au host databases (retour à localhost) -**Notes de version** +**⚠️ Notes de version** * Les modifications réalisée concerne une première installation, vous n'avez aucune action particulière à réaliser. @@ -372,7 +372,7 @@ Refonte totale de l'application en Python, Flask, Jinja, Bootstrap, Jquery. Par 1.2.1 (2017-04-11) ------------------ -**Changements** +**🚀 Changements** * Gestion plus fine des erreurs dans le script SQL de création du schéma ``utilisateurs``, afin de pouvoir éxecuter le script sur une BDD existante * Gestion des notices PHP @@ -381,14 +381,14 @@ Refonte totale de l'application en Python, Flask, Jinja, Bootstrap, Jquery. Par * Mise à jour du fichier ``web/js/settings.js.sample`` * Documentation - Ajout d'une FAQ et mise en forme -**Notes de version** +**⚠️ Notes de version** * Si vous mettez à jour l'application depuis la version 1.2.0, éxécutez le script https://github.com/PnX-SI/UsersHub/blob/2.1.3/data/update1.2.0to1.2.1.sql qui supprime la table inutile ``bib_observateurs``. 1.2.0 (2016-11-16) ------------------ -**Changements** +**🚀 Changements** * Compatibilité avec TaxHub accrue * Bugfix @@ -400,7 +400,7 @@ Refonte totale de l'application en Python, Flask, Jinja, Bootstrap, Jquery. Par 1.1.2 (2016-11-02) ------------------ -**Corrections** +**🐛 Corrections** * Prise en compte de TaxHub en tant qu'application à part entière avec ses utilisateurs et leurs droits. @@ -412,7 +412,7 @@ Corrections mineures 1.1.0 (2016-08-31) ------------------ -**Changements** +**🚀 Changements** * Ajout du port PostgreSQL (``port``) dans les paramètres de configuration (by Claire Lagaye PnVanoise) From aae10bdca24ebf4a1ab5019cf89c02600942b001 Mon Sep 17 00:00:00 2001 From: TheoLechemia Date: Wed, 16 Mar 2022 10:49:10 +0100 Subject: [PATCH 57/57] change logrotate --- log_rotate | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/log_rotate b/log_rotate index bd182e04..61af3c91 100644 --- a/log_rotate +++ b/log_rotate @@ -1,4 +1,4 @@ -APP_PATH/var/log/*.log { +/var/log/usershub.log { daily rotate 8 size 100M