Blame view

app/commands/commands.py 8.45 KB
e0778a0d   hitier   New fake_lesia_na...
1
2
import csv
import os
335db4c0   hitier   Allow randoming c...
3
import sys
a17327bf   hitier   New db feeding co...
4
5
6
import click
import random

21724174   hitier   Fix mysql_lesia_u...
7
from flask import current_app
74494ea1   hitier   cli.create_db hol...
8
from sqlalchemy.exc import OperationalError, IntegrityError
e817ff5e   hitier   Random Charge Age...
9
from sqlalchemy.sql import func
a17327bf   hitier   New db feeding co...
10
11
12
13
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import Session
from sqlalchemy import create_engine

a5a365e8   hitier   Move User model t...
14
15
from app.models import db, Agent, Service, Project, Capacity, Period, Charge
from app.auth.models import User
a17327bf   hitier   New db feeding co...
16

a17327bf   hitier   New db feeding co...
17
18
from . import bp

335db4c0   hitier   Allow randoming c...
19

e0778a0d   hitier   New fake_lesia_na...
20
21
@bp.cli.command("fake_lesia_names")
def fake_lesia_names():
14f36f55   hitier   Move lesia init c...
22
    """
e0778a0d   hitier   New fake_lesia_na...
23
24
25
26
27
    Extract fake name from resources files to change names in db.
    Mainly after a lesia import, for confidential reasons

    Changes nams in tables:

14f36f55   hitier   Move lesia init c...
28
29
30
31
32
33
        - services
        - capacities
        - projects
    :return:
    """

e0778a0d   hitier   New fake_lesia_na...
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
    current_app.logger.info("Faking names from resources files")
    # get  resources files
    #
    # 1- projects
    #
    fake_projects_file = os.path.join(current_app.config['PDC_RESOURCES_DIR'], 'fake-db-names', 'fake-projects.txt')
    with open(fake_projects_file, newline='') as csvfile:
        spamreader = csv.reader(csvfile, delimiter=';', quotechar='|')
        fake_projects_names = [', '.join(row) for row in spamreader]
    fake_projects_names_iterator = iter(fake_projects_names)

    # 2- functions/capacities
    #
    fake_capacities_file = os.path.join(current_app.config['PDC_RESOURCES_DIR'], 'fake-db-names',
                                        'fake-capacities.txt')
    with open(fake_capacities_file, newline='') as csvfile:
        spamreader = csv.reader(csvfile, delimiter=';', quotechar='|')
        fake_capacities_names = [row for [row] in spamreader]
    fake_capacities_names_iterator = iter(fake_capacities_names)

    # 3- services
    #
    fake_services_file = os.path.join(current_app.config['PDC_RESOURCES_DIR'], 'fake-db-names',
                                      'fake-services.txt')
    with open(fake_services_file, newline='') as csvfile:
        spamreader = csv.reader(csvfile, delimiter=';', quotechar='|')
        fake_services_names = [row for row in spamreader]
    fake_services_names_iterator = iter(fake_services_names)

    # Skip columns names
    #
    next(fake_projects_names_iterator)
    next(fake_capacities_names_iterator)
    next(fake_services_names_iterator)

    for s in Service.query.all():
        next_service = next(fake_services_names_iterator)
        s.name = next_service[0]
        s.abbr = next_service[1]

    for p in Project.query.all():
        p.name = next(fake_projects_names_iterator)

    for c in Capacity.query.all():
        c.name = next(fake_capacities_names_iterator)

    db.session.commit()

14f36f55   hitier   Move lesia init c...
82

a17327bf   hitier   New db feeding co...
83
84
@bp.cli.command("feed_from_lesia")
def feed_from_lesia():
74494ea1   hitier   cli.create_db hol...
85
86
    """
    Feed db with agents from a lesia like mysql database.
d8a6b942   hitier   More install doc
87

e0778a0d   hitier   New fake_lesia_na...
88
    Remember to configure the proper database uri in the db_config.py file.
d8a6b942   hitier   More install doc
89
    """
14f36f55   hitier   Move lesia init c...
90
91
    from .lesia_db import lesia_agent, lesia_session, lesia_service, lesia_project, \
        lesia_fonction, lesia_periods, lesia_affectation
1002c994   hitier   Also feed ids fro...
92

f1026243   hitier   Feed db periods a...
93
    agents = lesia_session.query(lesia_agent).all()
a17327bf   hitier   New db feeding co...
94
    for a in agents:
1002c994   hitier   Also feed ids fro...
95
        n_a = Agent(id=a.IDagent, firstname=a.nom, secondname=a.prenom)
a17327bf   hitier   New db feeding co...
96
97
98
        db.session.add(n_a)
    db.session.commit()

f1026243   hitier   Feed db periods a...
99
    services = lesia_session.query(lesia_service).all()
a17327bf   hitier   New db feeding co...
100
    for s in services:
1002c994   hitier   Also feed ids fro...
101
        n_s = Service(id=s.id, name=s.nom, abbr=s.abbreviation)
a17327bf   hitier   New db feeding co...
102
103
104
        db.session.add(n_s)
    db.session.commit()

f1026243   hitier   Feed db periods a...
105
    projects = lesia_session.query(lesia_project).all()
a17327bf   hitier   New db feeding co...
106
    for p in projects:
1002c994   hitier   Also feed ids fro...
107
        n_p = Project(id=p.id, name=p.nom)
a17327bf   hitier   New db feeding co...
108
109
110
        db.session.add(n_p)
    db.session.commit()

f1026243   hitier   Feed db periods a...
111
    fonctions = lesia_session.query(lesia_fonction).all()
a17327bf   hitier   New db feeding co...
112
    for f in fonctions:
1002c994   hitier   Also feed ids fro...
113
        n_c = Capacity(id=f.id, name=f.nom)
a17327bf   hitier   New db feeding co...
114
115
116
        db.session.add(n_c)
    db.session.commit()

f1026243   hitier   Feed db periods a...
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
    periods = lesia_session.query(lesia_periods)
    for p in periods:
        n_p = Period(name=p.id_semestre)
        db.session.add(n_p)
    db.session.commit()

    affectations = lesia_session.query(lesia_affectation)
    for f in affectations:
        p = Period.query.filter(Period.name == f.semestre_id).one()
        n_c = Charge(agent_id=f.agent_id,
                     project_id=f.projet_id,
                     service_id=f.service_id,
                     capacity_id=f.fonction_id,
                     period_id=p.id,
                     charge_rate=f.charge)
        db.session.add(n_c)
    db.session.commit()

335db4c0   hitier   Allow randoming c...
135

a17327bf   hitier   New db feeding co...
136
@bp.cli.command("feed_periods")
fa86be39   hitier   Enhance error cat...
137
138
139
140
141
@click.option('--begin-year', '-b', 'begin_year', default=2005, help="the start year to begin periods with")
@click.option('--end-year', '-e', 'end_year', default=2025, help="the last year to end periods with")
def feed_periods(begin_year, end_year):
    """ Fill in the periods names in the database. """
    for y in range(begin_year, end_year):
a17327bf   hitier   New db feeding co...
142
143
144
145
        for s in ['S1', 'S2']:
            period_name = "{}_{}".format(y, s)
            p = Period(name=period_name)
            db.session.add(p)
fa86be39   hitier   Enhance error cat...
146
147
148
149
    try:
        db.session.commit()
    except IntegrityError:
        current_app.logger.error("Periods already exist")
a17327bf   hitier   New db feeding co...
150
151


d8a6b942   hitier   More install doc
152
153
154
155
@bp.cli.command("feed_random_charges")
@click.option('--agent', '-a', 'agent', default=None, help="the agent id you want to charge")
def feed_random_charges(agent):
    """ Randomly fill in the agents charges. """
a17327bf   hitier   New db feeding co...
156
    for i in range(0, 100):
335db4c0   hitier   Allow randoming c...
157
158
159
160
        if agent is None:
            agent_id = random.choice([i for (i,) in db.session.query(Agent.id).all()])
        else:
            agent_id = int(agent)
a17327bf   hitier   New db feeding co...
161
162
163
164
165
        project_id = random.choice([i for (i,) in db.session.query(Project.id).all()])
        service_id = random.choice([i for (i,) in db.session.query(Service.id).all()])
        capacity_id = random.choice([i for (i,) in db.session.query(Capacity.id).all()])
        period_id = random.choice([i for (i,) in db.session.query(Period.id).all()])
        percent = random.choice(range(10, 110, 10))
e817ff5e   hitier   Random Charge Age...
166
167
168
169
170
        # check max agent charge for the period
        total_charge = db.session.query(func.sum(Charge.charge_rate).label("total_charge")) \
            .filter(Charge.agent_id == agent_id,
                    Charge.period_id == period_id
                    ).scalar()
a5a365e8   hitier   Move User model t...
171
        if total_charge is not None and (total_charge + percent) >= 100:
e817ff5e   hitier   Random Charge Age...
172
173
            print("Skipping agent {} for period {}".format(agent_id, period_id))
            continue
335db4c0   hitier   Allow randoming c...
174
        charge = Charge(agent_id=agent_id,
a17327bf   hitier   New db feeding co...
175
176
177
178
179
180
181
182
183
184
                        project_id=project_id,
                        service_id=service_id,
                        capacity_id=capacity_id,
                        period_id=period_id,
                        charge_rate=percent)
        print("adding {}_{}_{}_{}_{}_{}".format(agent_id, project_id, service_id, capacity_id, period_id, percent))
        db.session.add(charge)
        db.session.commit()


d8a6b942   hitier   More install doc
185
@bp.cli.command('user_delete')
a17327bf   hitier   New db feeding co...
186
@click.argument('user_id')
d8a6b942   hitier   More install doc
187
188
def user_delete(user_id):
    """Delete the user by given id (see user_show_all")."""
a17327bf   hitier   New db feeding co...
189
190
191
192
193
194
195
    user = User.query.get(user_id)
    db.session.delete(user)
    db.session.commit()


@bp.cli.command('create_db')
def create_db():
74494ea1   hitier   cli.create_db hol...
196
197
198
199
200
    """
    Create the database structure. Database should be empty.

    configure the proper database uri in the db_config.py file.
    """
a17327bf   hitier   New db feeding co...
201
    db.create_all()
42c07429   hitier   Default role valu...
202
    admin = User(email='admin@nowhere.org', name='admin', login='admin', password='admin', role='admin')
74494ea1   hitier   cli.create_db hol...
203
204
205
206
207
208
209
    sqlite_uri = db.engine.url.__str__() if 'sqlite' in db.engine.url.__str__() else None
    try:
        db.session.add(admin)
        db.session.commit()
    except IntegrityError:
        current_app.logger.error("User admin already exists, database should be empty at create")
        if sqlite_uri:
14f36f55   hitier   Move lesia init c...
210
            current_app.logger.error("see " + sqlite_uri)
74494ea1   hitier   cli.create_db hol...
211
212
213
        sys.exit(-1)

    if sqlite_uri:
14f36f55   hitier   Move lesia init c...
214
        current_app.logger.info("Created sqlite db: " + sqlite_uri)
a17327bf   hitier   New db feeding co...
215
216


d8a6b942   hitier   More install doc
217
@bp.cli.command('user_add')
a17327bf   hitier   New db feeding co...
218
219
@click.argument('email')
@click.argument('name')
3ed62121   hitier   Add login to user
220
@click.argument('login')
a17327bf   hitier   New db feeding co...
221
@click.argument('password')
d8a6b942   hitier   More install doc
222
223
def user_add(email, name, login, password):
    """ Add a new user in db."""
3ed62121   hitier   Add login to user
224
    user = User(email=email, name=name, login=login, password=password)
a17327bf   hitier   New db feeding co...
225
226
    db.session.add(user)
    db.session.commit()
74494ea1   hitier   cli.create_db hol...
227
    current_app.logger.info("added ", name)
a17327bf   hitier   New db feeding co...
228
229


d8a6b942   hitier   More install doc
230
231
232
@bp.cli.command('user_show_all')
def user_show_all():
    """ Show all users in db."""
a17327bf   hitier   New db feeding co...
233
234
235
236
237
238
239
240
241
242
243
    print("{:<5} {:<15} {:<15} {:<15} {:<15}".format('id', 'name', 'login', 'passwd', 'email'))
    print("{:<5} {:<15} {:<15} {:<15} {:<15}".format('-' * 5, '-' * 15, '-' * 15, '-' * 15, '-' * 15))
    for user in User.query.all():
        print(user.login)
        print("{:<5} {:<15} {:<15} {:<15} {:<15}".format(
            user.id,
            user.name,
            user.login,
            user.password,
            user.email
        ))