Application configuration#

Configuration is achieved bu two means:

Cold configuration#

It contains basic and highly technical data. It is meant to be tweaked by a technician and requires a full reboot to be taken into account.

Default configuration is in config.py. Override paramteters should be in instance/config.py.

Most configuration variables can be set using eponym environment variables.

Cold configuration description#

Configuration for the Application

Base configuration is defined in /config.py, but this file should be modified only by developper. To deploy an application with specific parameters, use instance/config.py. WARNING: for production, some parameter MUST be modified (ADMINPWD, SECRET_KEY)

config.ACTIVITY_TYPES = {1: {'email': 'dev-collectives@cafannecy.fr', 'name': 'Ski et surf en station', 'short': 'ski_alpin', 'trigram': 'ASA'}, 2: {'email': 'dev-collectives@cafannecy.fr', 'name': 'Escalade', 'short': 'escalade', 'trigram': 'AES'}, 3: {'email': 'dev-collectives@cafannecy.fr', 'name': 'Ski de randonnée', 'short': 'ski_rando', 'trigram': 'ASM'}, 4: {'email': 'dev-collectives@cafannecy.fr', 'name': 'Trail', 'short': 'trail', 'trigram': 'ATRAIL'}, 5: {'email': 'dev-collectives@cafannecy.fr', 'name': 'Canyon', 'short': 'canyon', 'trigram': 'ACA'}, 6: {'email': 'dev-collectives@cafannecy.fr', 'name': 'Randonnée raquettes', 'short': 'raquette', 'trigram': 'ARR'}, 7: {'email': 'dev-collectives@cafannecy.fr', 'name': 'Snow de randonnée', 'short': 'snow_rando', 'trigram': 'ASUM'}, 8: {'email': 'dev-collectives@cafannecy.fr', 'name': 'Cascade de glace', 'short': 'cascade_glace', 'trigram': 'AAL'}, 9: {'email': 'dev-collectives@cafannecy.fr', 'name': 'Alpinisme', 'short': 'alpinisme', 'trigram': 'AAL'}, 10: {'email': 'dev-collectives@cafannecy.fr', 'name': 'Parapente', 'short': 'parapente', 'trigram': 'AVR'}, 11: {'email': 'dev-collectives@cafannecy.fr', 'name': 'Randonnée montagne', 'short': 'randonnee', 'trigram': 'ARP'}, 12: {'email': 'dev-collectives@cafannecy.fr', 'name': 'VTT', 'short': 'cyclisme', 'trigram': 'AVTT'}, 13: {'deprecated': True, 'name': 'Formation', 'short': 'formation', 'trigram': 'FOR'}, 14: {'deprecated': True, 'name': 'Soirée', 'order': 99, 'short': 'soiree', 'trigram': 'SCL'}, 15: {'deprecated': True, 'name': 'Non classé', 'order': 100, 'short': 'none', 'trigram': 'NCL'}, 16: {'email': 'dev-collectives@cafannecy.fr', 'name': 'Slackline', 'short': 'slackline', 'trigram': 'ASL'}, 17: {'email': 'dev-collectives@cafannecy.fr', 'name': 'Marche nordique', 'short': 'marche_nordique', 'trigram': 'ANW'}, 18: {'email': 'dev-collectives@cafannecy.fr', 'name': 'Ski de fond et rando nordique', 'short': 'ski_fond', 'trigram': 'ASF'}, 20: {'deprecated': True, 'name': 'Jeunes', 'short': 'jeune', 'trigram': 'AJAL'}, 21: {'deprecated': True, 'name': 'Randonnées lointaines', 'short': 'randonnees_lointaines', 'trigram': 'ARL'}, 22: {'email': 'dev-collectives@cafannecy.fr', 'name': 'Via ferrata', 'short': 'viaferrata', 'trigram': 'AVF'}}#

List of activity type

Contains the list of activity type as a dictionnary. id is an int, value is a hash. short is the name of the icon. trigram is the activity id for accounting. email is the dedicated activity email

Type

dict

config.ADMINPWD = 'foobar2'#

Password for admin account

Will be set or reset at every application. Makes sure this is a secure password in production.

Can be set using environment variable.

Type

string

config.ALLOWED_EXTENSIONS = {'gif', 'jpeg', 'jpg', 'png'}#

Allowed extension for uploaded images

Type

array

config.CONFIGURATION_CACHE_TIME = 60#

Number of second a configuration item can be cached before requiring an update from DB.

Type

int

config.CSV_COLUMNS = {'altitude': {'description': 'Altitude du sommet (en m)', 'optional': 1, 'short_desc': 'Altitude (en m)', 'type': 'int'}, 'carte_IGN': {'description': 'Référence de la carte IGN', 'optional': 1, 'short_desc': 'Carte IGN', 'type': 'string'}, 'cotation': {'description': 'Cotation / difficulté de la collective', 'optional': 1, 'short_desc': 'Cotation', 'type': 'string'}, 'debut': {'description': 'Date de début de la collective au format jj/mm/yyyy hh:mm (ex: 31/12/2020 14:45)', 'short_desc': 'Date de début', 'type': 'datetime'}, 'debut_internet': {'default': '7j avant la date de début de la collective à 7h', 'description': "Date d'ouverture des inscriptions par internet de la collective au format jj/mm/yyyy hh:mm (ex: 31/12/2020 14:45)", 'optional': 1, 'short_desc': "Date d'ouverture des inscriptions par internet", 'type': 'datetime'}, 'denivele': {'description': 'Dénivelé total de la collective (en m)', 'optional': 1, 'short_desc': 'Dénivelé (en m)', 'type': 'string'}, 'distance': {'description': 'Distance totale de la collective (en km)', 'optional': 1, 'short_desc': 'Distance (en km)', 'type': 'string'}, 'fin': {'description': 'Date de fin de la collective au format jj/mm/yyyy hh:mm (ex: 31/12/2020 14:45)', 'short_desc': 'Date de fin', 'type': 'datetime'}, 'fin_internet': {'default': '1j avant la date de début de la collective à 18h', 'description': 'Date de fin des inscriptions par internet de la collective au format jj/mm/yyyy hh:mm (ex: 31/12/2020 14:45)', 'optional': 1, 'short_desc': 'Date de fin des inscriptions par internet', 'type': 'datetime'}, 'id_encadrant': {'description': "Numéro de licence de l'encadrant", 'short_desc': 'Numéro de licence', 'type': 'int'}, 'nom_encadrant': {'description': "Prénom et nom de l'encadrant", 'short_desc': 'Encadrant', 'type': 'string'}, 'observations': {'description': 'Observations et description de la collective', 'optional': 1, 'short_desc': 'Observations', 'type': 'string'}, 'parent': {'default': None, 'description': 'ID (nombre) de la collective parente', 'optional': 1, 'short_desc': 'Collective parente', 'type': 'int'}, 'places': {'default': 0, 'description': 'Nombre de places', 'optional': 1, 'short_desc': 'Nombre de places', 'type': 'int'}, 'places_internet': {'default': '0', 'description': 'Nombre de places par internet', 'optional': 1, 'short_desc': 'Nombre de places par internet', 'type': 'int'}, 'secteur': {'description': 'Secteur / massif de la collective (ex: Bornes / Aravis)', 'optional': 1, 'short_desc': 'Secteur', 'type': 'string'}, 'tag': {'default': None, 'description': 'Nom du tag à ajouter', 'optional': 1, 'short_desc': 'Tag de la collective', 'type': 'string'}, 'titre': {'description': 'Titre de la collective', 'short_desc': 'Titre de la collective', 'type': 'string'}}#

Dictionnary of columns to import from CSV files.

Ordered list of columns. Dictionnary keys will be used as variables during csv import and can be inserted in description using place holders.

Key is the column name. And for each column:

  • short_desc: is the human readable column name

  • description: is a long description of the column, to be used in a documentation

  • type: is the column value type (can be one of string, int or datetime)

  • optional: if set to 1, column value is optional

  • default: default value

Type

dict

config.DEFAULT_ONLINE_SLOTS = 0#

Default number of slots for online subscription to an event

Can be set using environment variable.

Type

int

config.EVENT_TYPES = {1: {'name': 'Collective', 'requires_activity': True, 'short': 'collective', 'terms_file': '{GUIDE_FILE}', 'terms_title': '{GUIDE_TITLE}'}, 2: {'license_types': ['J1', 'J2', 'E1', 'E2'], 'name': 'Jeunes', 'requires_activity': True, 'short': 'jeune', 'terms_file': '{GUIDE_FILE}', 'terms_title': '{GUIDE_TITLE}'}, 3: {'name': 'Formation', 'requires_activity': False, 'short': 'formation', 'terms_file': '{GUIDE_FILE}', 'terms_title': '{GUIDE_TITLE}'}, 4: {'name': 'Soirée', 'requires_activity': False, 'short': 'soiree', 'terms_file': '{GUIDE_FILE}', 'terms_title': '{GUIDE_TITLE}'}, 5: {'name': 'Randonnées lointaines', 'requires_activity': True, 'short': 'randonnees_lointaines', 'terms_file': '2021-09-12_Organisation_Randonnées_Lointaines.pdf', 'terms_title': "guide d'organisation des randonnées lointaines du Club Alpin Français d'Annecy"}, 6: {'name': 'Achat groupé', 'requires_activity': False, 'short': 'shopping'}, 7: {'name': 'Inscription en ligne', 'requires_activity': False, 'short': 'inscription', 'terms_file': '{GUIDE_FILE}', 'terms_title': '{GUIDE_TITLE}'}, 8: {'name': 'Accès libre', 'requires_activity': True, 'short': 'acces_libre', 'terms_file': '{GUIDE_FILE}', 'terms_title': '{GUIDE_TITLE}'}, 9: {'name': 'Entrainement', 'requires_activity': True, 'short': 'entrainement', 'terms_file': '{GUIDE_FILE}', 'terms_title': '{GUIDE_TITLE}'}, 10: {'name': 'Cours', 'requires_activity': True, 'short': 'cours', 'terms_file': '{GUIDE_FILE}', 'terms_title': '{GUIDE_TITLE}'}, 11: {'name': 'Bénévolat', 'requires_activity': False, 'short': 'benevolat', 'terms_file': '{GUIDE_FILE}', 'terms_title': '{GUIDE_TITLE}'}, 12: {'name': 'Famille', 'requires_activity': False, 'short': 'famille', 'terms_file': '{GUIDE_FILE}', 'terms_title': '{GUIDE_TITLE}'}}#

List of event types

Contains the list of event type as a dictionnary. id is an int, value is a hash. short is the name of the icon.

Type

dict

config.EXTRANET_DISABLE = None#

Use a connection to FFCAM server to activate accounts.

Usually set to False for tests which don’t have acces to FFCAM server such as github CI tests.

Type

boolean

config.EXTRANET_WSDL = 'https://extranet-clubalpin.com/app/soap/extranet_pro.wsdl'#

URL of WSDL to connect to FFCAM server

Can be set using environment variable.

Type

string

config.FAVICON = 'caf/favicon.ico'#

URL to the site favicon

Type

string

config.FLASK_DEBUG = None#

Whether debug mode is enabled.

See https://flask.palletsprojects.com/en/1.1.x/config/#DEBUG

Can be set using environment variable.

Type

boolean

config.FLASK_ENV = None#

What environment the app is running in.

See https://flask.palletsprojects.com/en/1.1.x/config/#ENV

Can be set using environment variable.

Type

string

config.LOGGING_CONFIGURATION = '/home/demo/collectives-flask2/logging.cfg'#

Logging configuration file path.

File syntax is described here: here

Type

string

config.MAX_CONTENT_LENGTH = 5242880#

Max size to upload files.

Note: this is a Flask setting that will make the server itself refuse to upload files larger than this

Type

int

config.MAX_FILE_SIZE_MESSAGE = 'Le fichier est trop gros pour être chargé sur le serveur\u202f: [size] Mo. (max 5.0 Mo)'#

Error message if uploaded file is too big.

This error message is only used in form validation on client. [size] is a placeholder which will be replaced by the actual size of the file.

Type

int

config.PAYLINE_DIRECTPAYMENT_WSDL = './collectives/utils/payline_directpayment.wsdl'#

Path to WDSL file describing Payline DirectPayment SOAP API

Can be set using environment variable.

Type

string

config.PAYLINE_WSDL = './collectives/utils/payline.wsdl'#

Path to WDSL file describing Payline WebPayment SOAP API

Can be set using environment variable.

Type

string

config.PAYMENTS_MAX_PRICE = 10000#

Maximum price in euros for a payment item

Type

int

config.REGISTRATION_CLOSING_DELTA_DAYS = 1#

Default number of days the online registration should end before the beginning of the event

Can be set using environment variable.

Type

int

config.REGISTRATION_CLOSING_HOUR = 18#

Default hour of the day the online registration should end before the beginning of the event

Can be set using environment variable.

Type

int

config.REGISTRATION_OPENING_DELTA_DAYS = 7#

Default number of days the online registration should start before the beginning of the event

Can be set using environment variable.

Type

int

config.REGISTRATION_OPENING_HOUR = 7#

Default hour of the day the online registration should start before the beginning of the event

Can be set using environment variable.

Type

int

config.SECRET_KEY = '\'@GU^CpusZ0G2"`=^QAt\rF]|(\''#

A secret key to securely sign the session cookie and other.

See https://flask.palletsprojects.com/en/1.1.x/config/#SECRET_KEY To generate a new secret key: >>> import random, string >>> “”.join([random.choice(string.printable) for _ in range(24)]) Secret key can also be set in instance/config.py

Can be set using environment variable.

Type

string

config.SQLALCHEMY_DATABASE_URI = 'sqlite:////home/demo/collectives-flask2/app.db'#

Database URL

Set URL for SQLAlchemy database. Can be sqlite: sqlite:///app.db or mysql: mysql+pymysql://username:password@localhost/db_name?charset=utf8mb4

NB: When using mysql, charset must be specified to allow UTF8 character in test field.

Can be set using environment variable.

Type

string

config.UPLOADED_AVATARS_DEST = '/home/demo/collectives-flask2/collectives/static/uploads/avatars'#

Folder path for uploaded user avatars.

config.UPLOADED_DOCUMENTS_DEST = '/home/demo/collectives-flask2/collectives/static/uploads/documents'#

Folder path for uploaded event documents.

Type

string

config.UPLOADED_IMGTYPEEQUIP_DEST = '/home/demo/collectives-flask2/collectives/static/uploads/typeEquipmentImg'#

Folder path for uploaded type images.

Type

string

config.UPLOADED_PHOTOS_DEST = '/home/demo/collectives-flask2/collectives/static/uploads'#

Folder path for uploaded event photos.

Type

string

config.UPLOADED_PRIVATE_DEST = '/home/demo/collectives-flask2/collectives/private_assets'#

Folder path for private technician data.

Type

string

config.UPLOADED_TECH_DEST = '/home/demo/collectives-flask2/collectives/static/uploads/tech'#

Folder path for technician data.

Type

string

config.XLSX_TEMPLATE = '/home/demo/collectives-flask2/collectives/templates/exported_event.xlsx'#

Path to Excel template.

Type

string

Hot configuration#

This configuration contains less technical data, such as login credentials to external third parties (extranet, SMTP), appereance, and naming. It is saved in database.

Default configuration is stored in collectives/configuration.yaml.

Configuration is modified on ‘/technician/configuration’ by a technician or an administrator.

Hot configuration types#

See collectives.models.configuration.ConfigurationTypeEnum