Commit d8a6b942cd8d519f09b0d2871f7a6692220e29ab
1 parent
d086fdc1
Exists in
master
and in
4 other branches
More install doc
and changed cli commands names
Showing
4 changed files
with
71 additions
and
19 deletions
Show diff stats
INSTALL.md
... | ... | @@ -3,6 +3,9 @@ |
3 | 3 | ## Prérequis |
4 | 4 | |
5 | 5 | - python3 |
6 | +- sqlite ( pour le développement et les tests unitaires ) | |
7 | +- chrome-driver et chromium ( pour les tests unitaires) | |
8 | +- postgresql ou mariadb (pour la production) | |
6 | 9 | |
7 | 10 | ## Obtenir un répertoire fonctionnel |
8 | 11 | |
... | ... | @@ -13,14 +16,28 @@ |
13 | 16 | |
14 | 17 | python3 -m venv venv |
15 | 18 | source venv/bin/activate |
19 | + pip install --upgrade pip | |
16 | 20 | pip install -r requirements.txt |
17 | 21 | |
18 | 22 | ### Configurer l'application |
19 | 23 | |
20 | - cp resources/pdc_config.py . | |
21 | - $(EDITOR) pdc_config.py | |
24 | + # D'abord les accés base de donnée | |
25 | + cp resources/db_config.py . | |
26 | + $(EDITOR) db_config.py | |
22 | 27 | |
28 | + # Ensuite l'appli elle même (ce fichier est utilisable tel quel) | |
23 | 29 | cp resources/flaskenv .flaskenv |
30 | + $(EDITOR) .flaskenv | |
31 | + | |
32 | +### Créer la base de données | |
33 | + | |
34 | +Utiliser l'outil de ligne de commande fourni avec l'application. | |
35 | + | |
36 | + flask pdc_db --help | |
37 | + flask pdc_db create_db # créer la structure | |
38 | + flask pdc_db feed_from_lesia # renseigner des agent depuis une base type lesia | |
39 | + flask pdc_db feed_periods # entrer des périodes | |
40 | + flask pdc_db feed_random_charges # entrer des charges aléatoires (une centaine) | |
24 | 41 | |
25 | 42 | |
26 | 43 | ### Jouer les tests et exécuter un serveur local |
... | ... | @@ -34,17 +51,33 @@ |
34 | 51 | # ouvrir un serveur sur localhost:5000 |
35 | 52 | flask run |
36 | 53 | |
37 | -## Configurer apache | |
54 | +## Configurer l'appli web avec apache | |
38 | 55 | |
39 | 56 | Les fichiers concernés: |
40 | 57 | |
41 | 58 | - pdc_web.wsgi |
42 | -- pdc_config.py | |
59 | +- db_config.py | |
43 | 60 | |
44 | 61 | La procédure: |
45 | 62 | |
46 | - mkdir /var/www/html/pdc-web | |
63 | + # créer le répertoire pour le web | |
64 | + export WEB_DIR=/var/www/html/pdc-web | |
65 | + mkdir $WEB_DIR | |
66 | + | |
67 | + # le peupler avec le code | |
68 | + export GIT_DIR=/path/to/pdc_web/.git | |
69 | + export GIT_BRANCH=master | |
70 | + git --work-tree=$WEB_DIR --git-dir=$GIT_DIR checkout -f $GIT_BRANCH | |
71 | + | |
72 | + # le configurer : cf "Obtenir un répertoire fonctionnel" | |
73 | + cd $WEB_DIR | |
74 | + python -m venv venv | |
75 | + source venv/bin/activate | |
76 | + pip install -r requirements.txt | |
77 | + $(EDITOR) db_config.py .flaskenv .... | |
78 | + | |
47 | 79 | |
80 | + # configurer le serveur web | |
48 | 81 | cp ./resources/apache2-virtual-host.conf /etc/apache2/sites-available/pdc-web.conf |
49 | 82 | $(EDITOR) /etc/apache2/sites-available/pdc-web.conf # éditer les paramètres |
50 | 83 | a2ensite pdc-web | ... | ... |
app/__init__.py
... | ... | @@ -18,12 +18,12 @@ def load_user(user_id): |
18 | 18 | |
19 | 19 | |
20 | 20 | # Please, set a config file on top project dir |
21 | -# find example in ressources/pdc_config.py | |
21 | +# see in ../pdc_config.py | |
22 | 22 | try: |
23 | 23 | from pdc_config import Config, ProdConfig, DevConfig, TestConfig |
24 | 24 | except ImportError: |
25 | 25 | # TODO: use logging system |
26 | - print("Please set an pdc_config.py file in you PYTHON_PATH") | |
26 | + print("Please set a pdc_config.py file in you PYTHON_PATH") | |
27 | 27 | print("See INSTALL.md for more info") |
28 | 28 | sys.exit(-1) |
29 | 29 | ... | ... |
app/commands/__init__.py
app/commands/commands.py
... | ... | @@ -2,6 +2,7 @@ import sys |
2 | 2 | import click |
3 | 3 | import random |
4 | 4 | |
5 | +from sqlalchemy.exc import OperationalError | |
5 | 6 | from sqlalchemy.sql import func |
6 | 7 | from sqlalchemy.ext.automap import automap_base |
7 | 8 | from sqlalchemy.orm import Session |
... | ... | @@ -9,19 +10,29 @@ from sqlalchemy import create_engine |
9 | 10 | |
10 | 11 | from app.models import db, User, Agent, Service, Project, Capacity, Period, Charge |
11 | 12 | |
12 | -from db_config import mysql_uri | |
13 | +from db_config import mysql_lesia_uri | |
13 | 14 | |
14 | 15 | from . import bp |
15 | 16 | |
16 | 17 | |
17 | 18 | @bp.cli.command("feed_from_lesia") |
18 | 19 | def feed_from_lesia(): |
20 | + """ Feed db with agents from a lesia like mysql database. | |
21 | + | |
22 | + configure that database uri in the db_config.py file. | |
23 | + """ | |
19 | 24 | Base = automap_base() |
20 | 25 | |
21 | - engine = create_engine(mysql_uri) | |
26 | + engine = create_engine(mysql_lesia_uri) | |
22 | 27 | |
23 | 28 | # reflect the tables |
24 | - Base.prepare(engine, reflect=True) | |
29 | + try: | |
30 | + Base.prepare(engine, reflect=True) | |
31 | + except OperationalError: | |
32 | + # TODO: use logging facility instead | |
33 | + print("Please, configure the mysql database (see db_config.py)") | |
34 | + sys.exit(-1) | |
35 | + | |
25 | 36 | |
26 | 37 | # mapped classes are now created with names by default |
27 | 38 | # matching that of the table name. |
... | ... | @@ -58,6 +69,7 @@ def feed_from_lesia(): |
58 | 69 | |
59 | 70 | @bp.cli.command("feed_periods") |
60 | 71 | def feed_periods(): |
72 | + """ Fill in the periods name in the database. """ | |
61 | 73 | for y in range(2014, 2023): |
62 | 74 | for s in ['S1', 'S2']: |
63 | 75 | period_name = "{}_{}".format(y, s) |
... | ... | @@ -66,9 +78,10 @@ def feed_periods(): |
66 | 78 | db.session.commit() |
67 | 79 | |
68 | 80 | |
69 | -@bp.cli.command("random_charges") | |
70 | -@click.option('--agent', '-a', 'agent', default=None) | |
71 | -def random_charges(agent): | |
81 | +@bp.cli.command("feed_random_charges") | |
82 | +@click.option('--agent', '-a', 'agent', default=None, help="the agent id you want to charge") | |
83 | +def feed_random_charges(agent): | |
84 | + """ Randomly fill in the agents charges. """ | |
72 | 85 | for i in range(0, 100): |
73 | 86 | if agent is None: |
74 | 87 | agent_id = random.choice([i for (i,) in db.session.query(Agent.id).all()]) |
... | ... | @@ -98,9 +111,10 @@ def random_charges(agent): |
98 | 111 | db.session.commit() |
99 | 112 | |
100 | 113 | |
101 | -@bp.cli.command('delete_user') | |
114 | +@bp.cli.command('user_delete') | |
102 | 115 | @click.argument('user_id') |
103 | -def delete_user(user_id): | |
116 | +def user_delete(user_id): | |
117 | + """Delete the user by given id (see user_show_all").""" | |
104 | 118 | user = User.query.get(user_id) |
105 | 119 | db.session.delete(user) |
106 | 120 | db.session.commit() |
... | ... | @@ -108,26 +122,29 @@ def delete_user(user_id): |
108 | 122 | |
109 | 123 | @bp.cli.command('create_db') |
110 | 124 | def create_db(): |
125 | + """ Create the database structure.""" | |
111 | 126 | db.create_all() |
112 | 127 | admin = User(email='admin@nowhere.org', name='admin', login='admin', password='admin') |
113 | 128 | db.session.add(admin) |
114 | 129 | db.session.commit() |
115 | 130 | |
116 | 131 | |
117 | -@bp.cli.command('add_user') | |
132 | +@bp.cli.command('user_add') | |
118 | 133 | @click.argument('email') |
119 | 134 | @click.argument('name') |
120 | 135 | @click.argument('login') |
121 | 136 | @click.argument('password') |
122 | -def add_user(email, name, login, password): | |
137 | +def user_add(email, name, login, password): | |
138 | + """ Add a new user in db.""" | |
123 | 139 | user = User(email=email, name=name, login=login, password=password) |
124 | 140 | db.session.add(user) |
125 | 141 | db.session.commit() |
126 | 142 | print("added ", name) |
127 | 143 | |
128 | 144 | |
129 | -@bp.cli.command('show_all') | |
130 | -def show_all(): | |
145 | +@bp.cli.command('user_show_all') | |
146 | +def user_show_all(): | |
147 | + """ Show all users in db.""" | |
131 | 148 | print("{:<5} {:<15} {:<15} {:<15} {:<15}".format('id', 'name', 'login', 'passwd', 'email')) |
132 | 149 | print("{:<5} {:<15} {:<15} {:<15} {:<15}".format('-' * 5, '-' * 15, '-' * 15, '-' * 15, '-' * 15)) |
133 | 150 | for user in User.query.all(): | ... | ... |