+# container, that host's errors will be logged there and not here.
+#
+ErrorLog /proc/self/fd/2
+
+#
+# LogLevel: Control the number of messages logged to the error_log.
+# Possible values include: debug, info, notice, warn, error, crit,
+# alert, emerg.
+#
+LogLevel warn
+
+
+ #
+ # The following directives define some format nicknames for use with
+ # a CustomLog directive (see below).
+ #
+ LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
+ LogFormat "%h %l %u %t \"%r\" %>s %b" common
+
+
+ # You need to enable mod_logio.c to use %I and %O
+ LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
+
+
+ #
+ # The location and format of the access logfile (Common Logfile Format).
+ # If you do not define any access logfiles within a
+ # container, they will be logged here. Contrariwise, if you *do*
+ # define per- access logfiles, transactions will be
+ # logged therein and *not* in this file.
+ #
+ CustomLog /proc/self/fd/1 common
+
+ #
+ # If you prefer a logfile with access, agent, and referer information
+ # (Combined Logfile Format) you can use the following directive.
+ #
+ #CustomLog "logs/access_log" combined
+
+
+
+ #
+ # Redirect: Allows you to tell clients about documents that used to
+ # exist in your server's namespace, but do not anymore. The client
+ # will make a new request for the document at its new location.
+ # Example:
+ # Redirect permanent /foo http://www.example.com/bar
+
+ #
+ # Alias: Maps web paths into filesystem paths and is used to
+ # access content that does not live under the DocumentRoot.
+ # Example:
+ # Alias /webpath /full/filesystem/path
+ #
+ # If you include a trailing / on /webpath then the server will
+ # require it to be present in the URL. You will also likely
+ # need to provide a section to allow access to
+ # the filesystem path.
+
+ #
+ # ScriptAlias: This controls which directories contain server scripts.
+ # ScriptAliases are essentially the same as Aliases, except that
+ # documents in the target directory are treated as applications and
+ # run by the server when requested rather than as documents sent to the
+ # client. The same rules about trailing "/" apply to ScriptAlias
+ # directives as to Alias.
+ #
+ ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
+
+
+
+
+ #
+ # ScriptSock: On threaded servers, designate the path to the UNIX
+ # socket used to communicate with the CGI daemon of mod_cgid.
+ #
+ #Scriptsock cgisock
+
+
+#
+# "/usr/local/apache2/cgi-bin" should be changed to whatever your ScriptAliased
+# CGI directory exists, if you have that configured.
+#
+
+ AllowOverride None
+ Options None
+ Require all granted
+
+
+
+ #
+ # Avoid passing HTTP_PROXY environment to CGI's on this or any proxied
+ # backend servers which have lingering "httpoxy" defects.
+ # 'Proxy' request header is undefined by the IETF, not listed by IANA
+ #
+ RequestHeader unset Proxy early
+
+
+
+ #
+ # TypesConfig points to the file containing the list of mappings from
+ # filename extension to MIME-type.
+ #
+ TypesConfig conf/mime.types
+
+ #
+ # AddType allows you to add to or override the MIME configuration
+ # file specified in TypesConfig for specific file types.
+ #
+ #AddType application/x-gzip .tgz
+ #
+ # AddEncoding allows you to have certain browsers uncompress
+ # information on the fly. Note: Not all browsers support this.
+ #
+ #AddEncoding x-compress .Z
+ #AddEncoding x-gzip .gz .tgz
+ #
+ # If the AddEncoding directives above are commented-out, then you
+ # probably should define those extensions to indicate media types:
+ #
+ AddType application/x-compress .Z
+ AddType application/x-gzip .gz .tgz
+
+ #
+ # AddHandler allows you to map certain file extensions to "handlers":
+ # actions unrelated to filetype. These can be either built into the server
+ # or added with the Action directive (see below)
+ #
+ # To use CGI scripts outside of ScriptAliased directories:
+ # (You will also need to add "ExecCGI" to the "Options" directive.)
+ #
+ #AddHandler cgi-script .cgi
+
+ # For type maps (negotiated resources):
+ #AddHandler type-map var
+
+ #
+ # Filters allow you to process content before it is sent to the client.
+ #
+ # To parse .shtml files for server-side includes (SSI):
+ # (You will also need to add "Includes" to the "Options" directive.)
+ #
+ #AddType text/html .shtml
+ #AddOutputFilter INCLUDES .shtml
+
+
+#
+# The mod_mime_magic module allows the server to use various hints from the
+# contents of the file itself to determine its type. The MIMEMagicFile
+# directive tells the module where the hint definitions are located.
+#
+#MIMEMagicFile conf/magic
+
+#
+# Customizable error responses come in three flavors:
+# 1) plain text 2) local redirects 3) external redirects
+#
+# Some examples:
+#ErrorDocument 500 "The server made a boo boo."
+#ErrorDocument 404 /missing.html
+#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
+#ErrorDocument 402 http://www.example.com/subscription_info.html
+#
+
+#
+# MaxRanges: Maximum number of Ranges in a request before
+# returning the entire resource, or one of the special
+# values 'default', 'none' or 'unlimited'.
+# Default setting is to accept 200 Ranges.
+#MaxRanges unlimited
+
+#
+# EnableMMAP and EnableSendfile: On systems that support it,
+# memory-mapping or the sendfile syscall may be used to deliver
+# files. This usually improves server performance, but must
+# be turned off when serving from networked-mounted
+# filesystems or if support for these functions is otherwise
+# broken on your system.
+# Defaults: EnableMMAP On, EnableSendfile Off
+#
+#EnableMMAP off
+#EnableSendfile on
+
+# Supplemental configuration
+#
+# The configuration files in the conf/extra/ directory can be
+# included to add extra features or to modify the default configuration of
+# the server, or you may simply copy their contents here and change as
+# necessary.
+
+# Server-pool management (MPM specific)
+#Include conf/extra/httpd-mpm.conf
+
+# Multi-language error messages
+#Include conf/extra/httpd-multilang-errordoc.conf
+
+# Fancy directory listings
+#Include conf/extra/httpd-autoindex.conf
+
+# Language settings
+#Include conf/extra/httpd-languages.conf
+
+# User home directories
+#Include conf/extra/httpd-userdir.conf
+
+# Real-time info on requests and configuration
+#Include conf/extra/httpd-info.conf
+
+# Virtual hosts
+#Include conf/extra/httpd-vhosts.conf
+
+# Local access to the Apache HTTP Server Manual
+#Include conf/extra/httpd-manual.conf
+
+# Distributed authoring and versioning (WebDAV)
+#Include conf/extra/httpd-dav.conf
+
+# Various default settings
+#Include conf/extra/httpd-default.conf
+
+# Configure mod_proxy_html to understand HTML4/XHTML1
+
+Include conf/extra/proxy-html.conf
+
+
+# Secure (SSL/TLS) connections
+#Include conf/extra/httpd-ssl.conf
+#
+# Note: The following must must be present to support
+# starting without SSL on platforms with no /dev/random equivalent
+# but a statically compiled-in mod_ssl.
+#
+
+SSLRandomSeed startup builtin
+SSLRandomSeed connect builtin
+
+
+
+#MOD MARC ->
+
+
+ # La suite de la configuration ne concerne plus les fichiers statiques
+ # mais passe simplement les requêtes à un des 3 services
+
+ # Chemin de GeoNature-citizen (frontend)
+ #
+ # ProxyPass http://citizen-front:4000/ retry=0
+ # ProxyPassReverse http://citizen-front:4000/
+ #
+
+
+ # Chemin de GeoNature-citizen (API)
+
+ ProxyPass http://citizen-back:5002/api retry=0
+ ProxyPassReverse http://citizen-back:5002/api
+
+
+
+ # La suite de la configuration ne concerne plus les fichiers statiques
+ # mais passe simplement les requêtes à un des 3 services
+
+
+ # Chemin de l'interface web de taxhub
+ # Chemin de taxhub
+
+ ProxyPass http://taxhub:5000/ retry=0
+ ProxyPassReverse http://taxhub:5000/
+
+
+
+
+#END MOD MARC
\ No newline at end of file
diff --git a/docker-compose.override.yml b/docker-compose.override.yml
index ba94a76..2c10435 100644
--- a/docker-compose.override.yml
+++ b/docker-compose.override.yml
@@ -1,11 +1,69 @@
version: '3.3'
services:
- citizen:
- tty: true
+ db:
+ image: postgis/postgis:12-3.1-alpine
+ ports:
+ - "5432:5432"
volumes:
- ./vendor/GeoNature-citizen/frontend:/home/appuser/citizen/frontend
- ./vendor/GeoNature-citizen/backend:/home/appuser/citizen/backend
- ./restart.sh:/home/appuser/citizen/install/restart.sh
- ./patches/frontend/src/conf:/home/appuser/citizen/frontend/src/conf
- ./patches/frontend/src/assets:/home/appuser/citizen/frontend/src/assets
+ - "./db/data:/var/lib/postgresql/data"
+ environment:
+ - "POSTGRES_PASSWORD=postgres"
+ citizen-front:
+ build:
+ dockerfile: ./Dockerfile-front
+ context: .
+ image: registry.gitlab.com/champs-libres/geonature-citizen/front
+ volumes:
+ - ./patches/settings.ini:/home/appuser/citizen/config/settings.ini
+ - ./patches/front/app.config.ts:/home/appuser/citizen/frontend/src/conf/app.config.ts
+ - ./dist/browser:/home/appuser/citizen/frontend/dist/browser
+ ports:
+ - "4000:4000"
+ - "4200:4200"
+ command: npm run serve:ssr
+ citizen-back:
+ build:
+ dockerfile: ./Dockerfile-back
+ context: .
+ image: registry.gitlab.com/champs-libres/geonature-citizen/back
+ volumes:
+ - ./patches/settings.ini:/home/appuser/citizen/config/settings.ini
+ - ./patches/back/default_config.toml:/home/appuser/citizen/config/default_config.toml
+ - ./patches/back/wsgi.py:/home/appuser/citizen/backend/wsgi.py
+ - ./patches/back/server.py:/home/appuser/citizen/backend/server.py
+ ports:
+ - "5002:5002"
+ command: python wsgi.py
+ taxhub:
+ build:
+ dockerfile: ./Dockerfile-taxhub
+ context: .
+ image: registry.gitlab.com/champs-libres/geonature-citizen/taxhub
+ ports:
+ - "5000:5000"
+ volumes:
+ - ./patches/taxhub/config.py:/home/appuser/taxhub/config.py
+ - ./patches/taxhub/server.py:/home/appuser/taxhub/server.py
+ - ./patches/taxhub/install_db.sh:/home/appuser/taxhub/install_db.sh
+ - ./patches/taxhub/settings.ini:/home/appuser/taxhub/settings.ini
+ command: python server.py
+
+ pgweb:
+ image: sosedoff/pgweb
+ ports:
+ - 8081:8081
+ apache:
+ build:
+ context: ./apache
+ image: registry.gitlab.com/champs-libres/geonature-citizen/apache
+ ports:
+ - "8080:80"
+ volumes:
+ - ./dist/browser:/home/appuser/citizen/frontend/dist/browser
+ - ./apache/my-httpd.conf /usr/local/apache2/conf/httpd.conf
\ No newline at end of file
diff --git a/patches/back/default_config.toml b/patches/back/default_config.toml
new file mode 100644
index 0000000..7a369a7
--- /dev/null
+++ b/patches/back/default_config.toml
@@ -0,0 +1,62 @@
+# Database
+SQLALCHEMY_DATABASE_URI = "postgresql+psycopg2://postgres:postgres@db:5432/referentielsdb"
+SQLALCHEMY_TRACK_MODIFICATIONS = false
+
+# JWT Auth
+JWT_SECRET_KEY = 'jwt-secret-string'
+JWT_BLACKLIST_ENABLED = true
+JWT_BLACKLIST_TOKEN_CHECKS = ['access', 'refresh']
+
+# Application
+appName = 'GeoNature-citizen' # Application name in the home page
+DEFAULT_LANGUAGE = 'fr'
+
+# Debug
+DEBUG = false
+SQLALCHEMY_DEBUG_LEVEL = 'WARNING'
+
+# URL_APPLICATION = "http://mydomain.org" # Replace mydomain.org by your domain
+URL_APPLICATION = "http://taxhub:5000"
+API_TAXHUB = "http://taxhub:5000/api/"
+# API_TAXHUB = "http://mytaxhub.org/api/" # Replace mytaxhub.org by your TaxHub url
+
+
+
+SECRET_KEY = 'MyS3cr3tK3y'
+CONFIRM_MAIL_SALT = 'your-secret-salt' # secret salt for corfirm mail token
+
+MEDIA_FOLDER = 'media'
+
+
+[RESET_PASSWD]
+ SUBJECT = "Link"
+ FROM = 'contact@geonature-citizen.fr'
+ TEXT_TEMPLATE = '''
+ Bonjour,\r\nVoici votre nouveau mot de passe :\r\n{passwd}\r\n"{app_url}
+ '''
+ HTML_TEMPLATE = '''
+ Bonjour,
Voici votre nouveau mot de passe :
+ {passwd}
+
"
+ Connexion'
+ '''
+
+[CONFIRM_EMAIL]
+ SUBJECT = "Activez votre compte"
+ FROM = 'contact@geonature-citizen.fr'
+ HTML_TEMPLATE = ''' Bonjour,
Nous vous confirmons que votre compte a bien été créé.
+ Afin d'activer votre compte veuillez cliquer ici.
+
Nous vous souhaitons la bienvenue sur notre site.
+ Bien à vous.
+ '''
+
+[MAIL]
+ MAIL_USE_SSL = false
+ MAIL_STARTTLS = true
+ MAIL_HOST = 'smtpd host'
+ MAIL_PORT = 493 # mandatory SSL port
+ MAIL_AUTH_LOGIN = 'smtpd/relay host username'
+ MAIL_AUTH_PASSWD = 'smtpd/relay host password'
+
+
+# API flasgger main config
\ No newline at end of file
diff --git a/patches/back/requirements.txt b/patches/back/requirements.txt
new file mode 100644
index 0000000..ef42fcd
--- /dev/null
+++ b/patches/back/requirements.txt
@@ -0,0 +1,35 @@
+certifi==2019.6.16
+chardet==3.0.4
+Click==7.0
+colorlog==4.0.2
+flasgger==0.9.3
+Flask==1.1.1
+Flask-Admin==1.5.3
+Flask-CKEditor==0.4.3
+Flask-Cors==3.0.8
+Flask-JWT-Extended==3.21.0
+Flask-SQLAlchemy==2.4.0
+GeoAlchemy2==0.6.3
+geojson==2.5.0
+gunicorn==20.0.4
+idna==2.8
+itsdangerous==1.1.0
+Jinja2==2.10.1
+jsonschema==2.6.0
+MarkupSafe==1.1.1
+mistune==0.8.4
+passlib==1.7.1
+psycopg2-binary==2.8.3
+PyJWT==1.7.1
+PyYAML==5.1.2
+requests==2.22.0
+Shapely==1.7.1
+six==1.12.0
+SQLAlchemy==1.3.7
+toml==0.10.0
+urllib3==1.25.3
+Werkzeug==0.15.5
+WTForms==2.2.1
+gunicorn==20.0.4
+httplib2==0.19.0
+xlwt==1.3.0
diff --git a/patches/back/server.py b/patches/back/server.py
new file mode 100644
index 0000000..1b50d7d
--- /dev/null
+++ b/patches/back/server.py
@@ -0,0 +1,160 @@
+import sys
+import os
+import logging
+
+from flask import Flask, current_app
+from flask_cors import CORS
+
+from gncitizen.utils.env import (
+ db,
+ list_and_import_gnc_modules,
+ jwt,
+ swagger,
+ admin,
+ ckeditor,
+)
+from gncitizen.utils.init_data import create_schemas, populate_modules
+from gncitizen import __version__
+
+basedir = os.path.abspath(os.path.dirname(__file__))
+
+
+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)
+
+
+def get_app(config, _app=None, with_external_mods=True, url_prefix="/api"):
+ # Make sure app is a singleton
+ if _app is not None:
+ return _app
+
+ app = Flask(__name__)
+ app.config.update(config)
+
+ if app.config["DEBUG"]:
+ from flask.logging import default_handler
+ import colorlog
+
+ handler = colorlog.StreamHandler()
+ handler.setFormatter(
+ colorlog.ColoredFormatter(
+ """%(log_color)s%(asctime)s %(levelname)s:%(name)s:%(message)s [in %(pathname)s:%(lineno)d]"""
+ )
+ )
+
+ logger = logging.getLogger("werkzeug")
+ logger.addHandler(handler)
+ app.logger.removeHandler(default_handler)
+
+ for l in logging.Logger.manager.loggerDict.values():
+ if hasattr(l, "handlers"):
+ l.handlers = [handler]
+
+ # else:
+ # # TODO: sourced from app.config['LOGGING']
+ # logging.basicConfig()
+ # logger = logging.getLogger()
+ # logger.setLevel(logging.INFO)
+ logging.getLogger("sqlalchemy.engine").setLevel(
+ getattr(sys.modules["logging"], app.config["SQLALCHEMY_DEBUG_LEVEL"])
+ )
+
+ CORS(app, supports_credentials=True)
+ # app.config['PROPAGATE_EXCEPTIONS'] = False
+ # ... brings back those cors headers on error response in debug mode
+ # to trace client-side error handling
+ # but drops the embedded debugger ¯\_(ツ)_/¯
+ # https://github.com/corydolphin/flask-cors/issues/67
+ # https://stackoverflow.com/questions/29825235/getting-cors-headers-in-a-flask-500-error
+
+ # Bind app to DB
+ db.init_app(app)
+
+ # JWT Auth
+ jwt.init_app(app)
+
+ swagger.init_app(app)
+
+ admin.init_app(app)
+
+ ckeditor.init_app(app)
+
+ with app.app_context():
+
+ from gncitizen.core.users.routes import routes
+
+ app.register_blueprint(routes, url_prefix=url_prefix)
+
+ from gncitizen.core.commons.routes import routes
+
+ app.register_blueprint(routes, url_prefix=url_prefix)
+
+ from gncitizen.core.observations.routes import routes
+
+ app.register_blueprint(routes, url_prefix=url_prefix)
+
+ from gncitizen.core.ref_geo.routes import routes
+
+ app.register_blueprint(routes, url_prefix=url_prefix)
+
+ from gncitizen.core.badges.routes import routes
+
+ app.register_blueprint(routes, url_prefix=url_prefix)
+
+ from gncitizen.core.taxonomy.routes import routes
+
+ app.register_blueprint(routes, url_prefix=url_prefix)
+
+ from gncitizen.core.sites.routes import routes
+
+ app.register_blueprint(routes, url_prefix=url_prefix + "/sites")
+
+ CORS(app, supports_credentials=True)
+
+ # Chargement des mosdules tiers
+ if with_external_mods:
+ for conf, manifest, module in list_and_import_gnc_modules(app):
+ try:
+ prefix = url_prefix + conf["api_url"]
+ except Exception as e:
+ current_app.logger.debug(e)
+ prefix = url_prefix
+ app.register_blueprint(
+ module.backend.blueprint.blueprint, url_prefix=prefix
+ )
+ try:
+ module.backend.models.create_schema(db)
+ except Exception as e:
+ current_app.logger.debug(e)
+ # chargement de la configuration
+ # du module dans le blueprint.config
+ module.backend.blueprint.blueprint.config = conf
+ app.config[manifest["module_name"]] = conf
+
+ _app = app
+
+ create_schemas(db)
+ db.create_all()
+ populate_modules(db)
+
+
+ return app
diff --git a/patches/back/wsgi.py b/patches/back/wsgi.py
new file mode 100644
index 0000000..ecf3449
--- /dev/null
+++ b/patches/back/wsgi.py
@@ -0,0 +1,17 @@
+"""
+ Give a unique entry point for gunicorn
+"""
+
+from gncitizen.utils.env import load_config
+from server import get_app
+
+# get the app config file
+config = load_config()
+
+# give the app context from server.py in a app object
+app = get_app(config)
+port = app.config["API_PORT"] if app.config.get("API_PORT", False) else 5002
+
+if __name__ == "__main__":
+ app.debug = True
+ app.run(host="0.0.0.0", port=port)
diff --git a/patches/front/app.config.ts b/patches/front/app.config.ts
new file mode 100644
index 0000000..5e6b08f
--- /dev/null
+++ b/patches/front/app.config.ts
@@ -0,0 +1,72 @@
+export const AppConfig = {
+ appName: "GeoNature-citizen",
+ API_ENDPOINT:"http://localhost:8080/citizen/api",
+ API_TAXHUB:"http://localhost:5000/api/",
+ FRONTEND:{
+ PROD_MOD:true,
+ MULTILINGUAL:false,
+ DISPLAY_FOOTER: true,
+ DISPLAY_TOPBAR: true,
+ DISPLAY_SIDEBAR: true,
+ DISPLAY_STATS: true,
+ DISPLAY_BADGES: true,
+ NEW_OBS_FORM_MODAL_VERSION: true
+ },
+ META: {
+ keywords: 'biodiversite enquetes participatif observations',
+ },
+ about: true,
+ URL_APPLICATION:"http://localhost:4000/",
+ REWARDS: true,
+ termsOfUse: {
+ fr: "assets/cgu.pdf",
+ en: "assets/termsOfUse.pdf"
+ },
+ signup:true,
+ email_contact:false,
+ platform_intro: {
+ fr: "Bienvenue
sur GeoNature Citizen",
+ en: "Welcome
on GeoNature Citizen"
+ },
+ platform_teaser: {
+ fr: "Hae duae provinciae bello quondam piratico catervis mixtae praedonum a Servilio pro consule missae sub iugum factae sunt vectigales. et hae quidem regiones velut in prominenti terrarum lingua positae ob orbe eoo monte Amano disparantur.",
+ en: "Hae duae provinciae bello quondam piratico catervis mixtae praedonum a Servilio pro consule missae sub iugum factae sunt vectigales. et hae quidem regiones velut in prominenti terrarum lingua positae ob orbe eoo monte Amano disparantur."
+ },
+ platform_participate: {
+ fr: "PARTICIPER AU PROGRAMME",
+ en: "PARTICIPATE"
+ },
+ programs_label: {
+ fr: "Programmes",
+ en: "Surveys"
+ },
+ program_label: {
+ fr: "Le programme",
+ en: "Survey"
+ },
+ program_share_an_observation: {
+ fr: "PARTAGER UNE OBSERVATION",
+ en: "SHARE AN OBSERVATION"
+ },
+ program_add_an_observation: {
+ fr: "AJOUTER UNE OBSERVATION",
+ en: "CONTRIBUTE AN OBSERVATION"
+ },
+ program_allow_email_contact: {
+ fr: "J'accepte que mon adresse e-mail puisse être utilisée pour recontacter à propos de mon observation",
+ en : "I agree that my e-mail address can be used to recontact about my observation"
+ },
+ taxonSelectInputThreshold: 7,
+ taxonAutocompleteInputThreshold: 12,
+ taxonAutocompleteFields: [
+ "nom_complet",
+ "nom_vern",
+ "nom_vern_eng",
+ "cd_nom"
+ ],
+ taxonDisplaySciName: true,
+ program_list_observers_names: true,
+ program_list_sort: "-timestamp_create",
+ details_espece_url: "/cd_nom/", // !! gardez bien le cd_nom/ dans l'url
+ registration_message : "Vous inscrire vous permet de gérer vos observations"
+}
diff --git a/patches/settings.ini b/patches/settings.ini
index c093489..839b6aa 100644
--- a/patches/settings.ini
+++ b/patches/settings.ini
@@ -7,9 +7,9 @@ my_local=fr_FR.UTF-8
my_url=http://localhost:8080/
url_application=http://localhost:8080/ # Url For the frontend
-api_endpoint=http://localhost:8080/api # Url for the geonature api don't forget /api
+api_endpoint=http://localhost:8080/citizen/api # Url for the geonature api don't forget /api
api_port=5002
-api_taxhub=http://localhost/taxhub/api/ # Url for the taxhub api
+api_taxhub=http://localhost:8080/taxhub/api/ # Url for the taxhub api
install_taxhub=1
taxhub_version=1.7.3
@@ -27,15 +27,15 @@ admin_password=MotDePasseAChanger
# Localisation du server PostgreSQL.
# Les scripts d'installation automatique ne fonctionnent que si votre BDD est sur le même serveur (localhost)
-pg_host=localhost
+pg_host=db
# Port sur lequel PostgreSQL ecoute
pg_port=5432
#Base de donnée Geonature
-pg_dbname=dbname
+pg_dbname=postgres
# Nom de l'utilisateur propriétaire des bases UsersHub, GeoNature, TaxHub
-user_pg=dbuser
+user_pg=postgres
# Pass de l'utilisateur propriétaire des bases UsersHub, GeoNature, TaxHub
-user_pg_pass=dbpwd
+user_pg_pass=postgres
#########################
### Gunicorn settings ###
diff --git a/patches/taxhub/config.py b/patches/taxhub/config.py
new file mode 100644
index 0000000..096ba25
--- /dev/null
+++ b/patches/taxhub/config.py
@@ -0,0 +1,29 @@
+
+'''
+TaxHub global settings file
+'''
+
+# Database settings
+SQLALCHEMY_DATABASE_URI = "postgresql://postgres:postgres@db/referentielsdb"
+SQLALCHEMY_TRACK_MODIFICATIONS = False
+
+
+DEBUG=True
+
+
+SESSION_TYPE = 'filesystem'
+SECRET_KEY = 'super secret key'
+COOKIE_EXPIRATION = 3600
+COOKIE_AUTORENEW = True
+
+# File
+import os
+BASE_DIR = os.path.abspath(os.path.dirname(__file__))
+UPLOAD_FOLDER = 'static/medias'
+
+# Authentification crypting method (hash or md5)
+PASS_METHOD='hash'
+
+# ID APPLICATION TaxHub
+# User in the authentification submodule to avoid token conflict between app on the same server
+ID_APP = 2
diff --git a/patches/taxhub/install_db.sh b/patches/taxhub/install_db.sh
new file mode 100644
index 0000000..5853af5
--- /dev/null
+++ b/patches/taxhub/install_db.sh
@@ -0,0 +1,144 @@
+#!/bin/bash
+
+# Make sure only root can run our script
+if [ "$(id -u)" == 0 ]; then
+ echo "This script must not be run as root" 1>&2
+ exit 1
+fi
+
+
+#Création des répertoires systèmes
+. create_sys_dir.sh
+create_sys_dir
+
+if [ ! -f settings.ini ]; then
+ cp settings.ini.sample settings.ini
+fi
+
+# nano settings.ini
+
+#include user config = settings.ini
+. settings.ini
+
+#get app path
+DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
+LOG_DIR=$DIR/var/log
+
+
+function database_exists () {
+ # /!\ Will return false if psql can't list database. Edit your pg_hba.conf
+ # as appropriate.
+ if [ -z $1 ]
+ then
+ # Argument is null
+ return 0
+ else
+ # Grep db name in the list of database
+ sudo -u postgres -s -- psql -tAl | grep -q "^$1|"
+ return $?
+ fi
+}
+
+
+if database_exists $db_name
+then
+ if $drop_apps_db
+ then
+ echo "Suppression de la base..."
+ sudo -u postgres -s dropdb $db_name
+ else
+ echo "La base de données existe et le fichier de settings indique de ne pas la supprimer."
+ fi
+fi
+if ! database_exists $db_name
+then
+ echo "Création de la base..."
+ sudo -u postgres -s createdb -O $user_pg $db_name
+
+ sudo -n -u postgres -s psql -d $db_name -c "CREATE EXTENSION IF NOT EXISTS pg_trgm;" &> $LOG_DIR/installdb/install_db.log
+
+ sudo -n -u postgres -s psql -d $db_name -c 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp";' &>> $LOG_DIR/installdb/install_db.log
+
+ sudo -n -u postgres -s psql -d $db_name -c 'CREATE EXTENSION IF NOT EXISTS "pg_trgm";' &>> $LOG_DIR/installdb/install_db.log
+
+ # 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..."
+ export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f data/taxhubdb.sql &> $LOG_DIR/installdb/install_db.log
+ export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f data/generic_drop_and_restore_deps_views.sql &> $LOG_DIR/installdb/install_db.log
+
+ echo "Décompression des fichiers du taxref..."
+
+ array=( TAXREF_INPN_v13.zip ESPECES_REGLEMENTEES_v11.zip LR_FRANCE_20160000.zip BDC_STATUTS_13.zip)
+ for i in "${array[@]}"
+ do
+ if [ ! -f '/tmp/taxhub/'$i ]
+ then
+ wget http://geonature.fr/data/inpn/taxonomie/$i -P /tmp/taxhub
+ unzip /tmp/taxhub/$i -d /tmp/taxhub
+ else
+ echo $i exists
+ fi
+ done
+
+ echo "Insertion des données taxonomiques de l'inpn... (cette opération peut être longue)"
+ cd $DIR
+ sudo -u postgres -s psql -d $db_name -f data/inpn/data_inpn_taxhub.sql &>> $LOG_DIR/installdb/install_db.log
+
+ echo "Création de la vue représentant la hierarchie taxonomique..."
+ export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f data/materialized_views.sql &>> $LOG_DIR/installdb/install_db.log
+
+ echo "Insertion de données de base"
+ export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f data/taxhubdata.sql &>> $LOG_DIR/installdb/install_db.log
+
+ echo "Insertion de fonctions génériques de détection de vues dépendantes"
+ export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f data/generic_drop_and_restore_deps_views.sql &>> $LOG_DIR/installdb/install_db.log
+
+ if $insert_geonatureatlas_data
+ then
+ echo "Insertion de données nécessaires à GeoNature-atlas"
+ export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f data/taxhubdata_atlas.sql &>> $LOG_DIR/installdb/install_db.log
+ fi
+
+ if $insert_attribut_example
+ then
+ echo "Insertion d'un exemple d'attribut"
+ export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f data/taxhubdata_example.sql &>> $LOG_DIR/installdb/install_db.log
+ fi
+
+ if $insert_taxons_example
+ then
+ echo "Insertion de 8 taxons exemple"
+ export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f data/taxhubdata_taxons_example.sql &>> $LOG_DIR/installdb/install_db.log
+ fi
+
+ if [ $users_schema = "local" ]
+ then
+ echo "Création du schéma Utilisateur..."
+ wget https://raw.githubusercontent.com/PnX-SI/UsersHub/$usershub_release/data/usershub.sql -P /tmp
+ wget https://raw.githubusercontent.com/PnX-SI/UsersHub/$usershub_release/data/usershub-data.sql -P /tmp
+ wget https://raw.githubusercontent.com/PnX-SI/UsersHub/$usershub_release/data/usershub-dataset.sql -P /tmp
+ export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f /tmp/usershub.sql &>> $LOG_DIR/installdb/install_db.log
+ export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f /tmp/usershub-data.sql &>> $LOG_DIR/installdb/install_db.log
+ export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f /tmp/usershub-dataset.sql &>> $LOG_DIR/installdb/install_db.log
+ export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f data/adds_for_usershub.sql &>> $LOG_DIR/installdb/install_db.log
+ else
+ echo "Connexion à la base Utilisateur..."
+ cp data/create_fdw_utilisateurs.sql /tmp/taxhub/create_fdw_utilisateurs.sql
+ cp data/grant.sql /tmp/taxhub/grant.sql
+ sed -i "s#\$user_pg#$user_pg#g" /tmp/taxhub/create_fdw_utilisateurs.sql
+ sed -i "s#\$usershub_host#$usershub_host#g" /tmp/taxhub/create_fdw_utilisateurs.sql
+ sed -i "s#\$usershub_db#$usershub_db#g" /tmp/taxhub/create_fdw_utilisateurs.sql
+ sed -i "s#\$usershub_port#$usershub_port#g" /tmp/taxhub/create_fdw_utilisateurs.sql
+ sed -i "s#\$usershub_user#$usershub_user#g" /tmp/taxhub/create_fdw_utilisateurs.sql
+ sed -i "s#\$usershub_pass#$usershub_pass#g" /tmp/taxhub/create_fdw_utilisateurs.sql
+ sed -i "s#\$usershub_user#$usershub_user#g" /tmp/taxhub/grant.sql
+ sudo -u postgres -s psql -d $db_name -f /tmp/taxhub/create_fdw_utilisateurs.sql &>> $LOG_DIR/installdb/install_db.log
+ sudo -u postgres -s psql -d $db_name -f /tmp/taxhub/grant.sql &>> $LOG_DIR/installdb/install_db.log
+ fi
+
+ # Vaccum database
+ echo "Vaccum database ... (cette opération peut être longue)"
+ export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -c "VACUUM FULL VERBOSE;" &>> $LOG_DIR/installdb/install_db.log
+
+fi
diff --git a/patches/taxhub/server.py b/patches/taxhub/server.py
new file mode 100644
index 0000000..b599fba
--- /dev/null
+++ b/patches/taxhub/server.py
@@ -0,0 +1,65 @@
+# coding: utf8
+from flask import Flask
+from flask_cors import CORS
+
+from apptax.database import db
+
+db = db
+
+app_globals = {}
+
+
+def init_app():
+ if app_globals.get('app', False):
+ app = app_globals['app']
+ else:
+ app = Flask(__name__)
+
+ with app.app_context():
+ app.config.from_pyfile('config.py')
+ db.init_app(app)
+ db.app = app
+ app.config['DB'] = db
+
+ @app.teardown_request
+ def _manage_transaction(exception):
+ if exception:
+ db.session.rollback()
+ else:
+ db.session.commit()
+ db.session.remove()
+
+ from pypnusershub import routes
+ app.register_blueprint(routes.routes, url_prefix='/api/auth')
+
+ from apptax.index import routes
+ app.register_blueprint(routes, url_prefix='/')
+
+ from apptax.taxonomie.routesbibnoms import adresses
+ app.register_blueprint(adresses, url_prefix='/api/bibnoms')
+
+ from apptax.taxonomie.routestaxref import adresses
+ app.register_blueprint(adresses, url_prefix='/api/taxref')
+
+ from apptax.taxonomie.routesbibattributs import adresses
+ app.register_blueprint(adresses, url_prefix='/api/bibattributs')
+
+ from apptax.taxonomie.routesbiblistes import adresses
+ app.register_blueprint(adresses, url_prefix='/api/biblistes')
+
+ from apptax.taxonomie.routestmedias import adresses
+ app.register_blueprint(adresses, url_prefix='/api/tmedias')
+
+ from apptax.taxonomie.routesbibtypesmedia import adresses
+ app.register_blueprint(adresses, url_prefix='/api/bibtypesmedia')
+
+ from apptax.utils.routesconfig import adresses
+ app.register_blueprint(adresses, url_prefix='/api/config')
+
+
+ return app
+
+app = init_app()
+CORS(app, supports_credentials=True)
+if __name__ == '__main__':
+ app.run(host="0.0.0.0", debug=True)
\ No newline at end of file
diff --git a/patches/taxhub/settings.ini b/patches/taxhub/settings.ini
new file mode 100644
index 0000000..3ee9a9d
--- /dev/null
+++ b/patches/taxhub/settings.ini
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+##########################################
+###### TAXHUB installation settings ######
+##########################################
+
+app_name=taxhub
+
+#######################
+### Python settings ###
+#######################
+
+venv_dir=venv
+python_path=/usr/bin/python3
+
+###########################
+### PostgreSQL settings ###
+###########################
+
+# Drop eventual existing database during installation
+drop_apps_db=false
+
+# DB host
+db_host=db
+
+# PostgreSQL port
+db_port=5432
+
+# Database name
+db_name=referentielsdb
+
+# Database owner username
+user_pg=postgres
+
+# Database owner password
+user_pg_pass=postgres
+
+### Users schema localisation
+# Possible values : 'local' or 'foreign'
+# 'local' means that the 'utilisateurs' schema has to be installed in TaxHub database.
+# 'foreign' means that the 'utilisateurs' schema is in another database. An FDW schema will be created on it.
+# Nota : foreign requires UsersHub to be already installed
+usershub_release=2.1.1
+users_schema=local
+
+### UsersHub relation settings - Required if users_schema=foreign
+usershub_host=db
+usershub_db=referentielsdb
+usershub_port=5432
+usershub_user=postgres
+usershub_pass=postgres
+
+###############
+### Options ###
+###############
+
+# Insert GeoNature-atlas data (theme & attributs)
+insert_geonatureatlas_data=true
+# Insert an example of attribute (Migrateur)
+insert_attribut_example=false
+# Insert 8 examples of taxons and add it to the Occtax list
+insert_taxons_example=true
+
+#########################
+### Gunicorn settings ###
+#########################
+
+gun_num_workers=4
+gun_host=0.0.0.0
+gun_port=5000
diff --git a/vendor/TaxHub b/vendor/TaxHub
new file mode 160000
index 0000000..2b0616d
--- /dev/null
+++ b/vendor/TaxHub
@@ -0,0 +1 @@
+Subproject commit 2b0616d3d399894043cfcef8707f2b32ee1f2e72