Blame view

app/commands/commands.py 17.9 KB
e0778a0d   hitier   New fake_lesia_na...
1
2
import csv
import os
335db4c0   hitier   Allow randoming c...
3
import sys
f1bb8c76   hitier   Move auth tests t...
4

a17327bf   hitier   New db feeding co...
5
6
7
import click
import random

21724174   hitier   Fix mysql_lesia_u...
8
from flask import current_app
f1bb8c76   hitier   Move auth tests t...
9
from sqlalchemy.exc import IntegrityError
e817ff5e   hitier   Random Charge Age...
10
from sqlalchemy.sql import func
a17327bf   hitier   New db feeding co...
11

d6b9daca   hitier   Feed categories a...
12
from app.models import db, Agent, Service, Project, Capacity, Period, Charge, AgentStatus, Company, AgentBap, \
f1bb8c76   hitier   Move auth tests t...
13
14
    AgentGrade, Category, Label, ProjectLabel
# TODO: rename to methods and add get_roles()
946dda30   hitier   New cli command u...
15
from app.auth.models import User, _nameToRole, _roleToName
a17327bf   hitier   New db feeding co...
16

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

335db4c0   hitier   Allow randoming c...
19

946dda30   hitier   New cli command u...
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
@bp.cli.command('create_db')
def create_db():
    """
    Create the database structure. Database should be empty.

    configure the proper database uri in the db_config.py file.
    """
    db.create_all()
    admin = User(email='admin@nowhere.org', name='admin', login='admin', role='admin')
    admin.set_password('admin')
    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:
            current_app.logger.error("see " + sqlite_uri)
        sys.exit(-1)

    if sqlite_uri:
        current_app.logger.info("Created sqlite db: " + sqlite_uri)


67814e41   hitier   New cli command f...
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
@bp.cli.command("feed_from_irap")
@click.option('--csv-file', '-f', 'csv_file_name', help="the csv file path to feed from")
def feed_from_irap(csv_file_name):
    """
    Use an Irap csv charges files and feed db with

    :param csv_file_name:
    :return:
    """

    rows = []

    with open(csv_file_name, newline='') as csvfile:
        csvreader = csv.DictReader(csvfile, delimiter=',', quotechar='"')
        for row in csvreader:
28a7e0a2   hitier   Strip row values ...
59
60
            # Remove any leading/trailing spaces
            row = {k: v.strip() for k, v in row.items()}
67814e41   hitier   New cli command f...
61
62
            rows.append(row)

28a7e0a2   hitier   Strip row values ...
63
    firstname_key = 'NOM'
2d944bab   hitier   CSV column keys a...
64
    secondname_key = 'PRÉNOM'
0e188a92   hitier   Import more agent...
65
    status_key = 'STATUT'
2d944bab   hitier   CSV column keys a...
66
67
    virtual_key = 'VIRTUEL'
    company_key = 'SOCIÉTÉ'
0e188a92   hitier   Import more agent...
68
69
    bap_key = 'BAP'
    grade_key = 'GRADE CORPS'
28a7e0a2   hitier   Strip row values ...
70
    project_key = 'PROJETS'
2d944bab   hitier   CSV column keys a...
71
    service_key = 'GROUPE MÉTIER'
d6b9daca   hitier   Feed categories a...
72
    categorie_keys = ['TYPOLOGIE', 'THÉMATIQUE']
67814e41   hitier   New cli command f...
73

28a7e0a2   hitier   Strip row values ...
74
75
    # Get the columns values
    #
0e188a92   hitier   Import more agent...
76
77
78
79
80
    agents = []
    services = []
    baps = []
    grades = []
    companies = []
854e5e73   hitier   Feed statuses, so...
81
    statuses = []
f1bb8c76   hitier   Move auth tests t...
82
83
84
85

    # build a category dict of lists
    #   key being the category name,
    #   list being filled with corresponding labels
d6b9daca   hitier   Feed categories a...
86
    categories = {k: [] for k in categorie_keys}
f1bb8c76   hitier   Move auth tests t...
87
88
89
90

    #
    categorized_projects = {}

0e188a92   hitier   Import more agent...
91
    for r in rows:
0e188a92   hitier   Import more agent...
92
93
94
95
        services.append(r[service_key])
        baps.append(r[bap_key])
        grades.append(r[grade_key])
        companies.append(r[company_key])
854e5e73   hitier   Feed statuses, so...
96
        statuses.append(r[status_key])
f1bb8c76   hitier   Move auth tests t...
97
98
99
100
101
102

        # categorized_projects
        project = r[project_key]
        categorized_projects[project] = []

        # fill in the category-labels dict
d6b9daca   hitier   Feed categories a...
103
104
        for k in categorie_keys:
            categories[k].append(r[k])
f1bb8c76   hitier   Move auth tests t...
105
106
107
            categorized_projects[project].append(r[k])

        # build agents list of dicts
d6b9daca   hitier   Feed categories a...
108
        agents.append({
0e188a92   hitier   Import more agent...
109
110
111
112
113
114
            'firstname': r[firstname_key],
            'secondname': r[secondname_key],
            'status': r[status_key],
            'virtual': r[virtual_key],
            'company': r[company_key],
            'bap': r[bap_key],
d6b9daca   hitier   Feed categories a...
115
            'grade': r[grade_key]})
0e188a92   hitier   Import more agent...
116

ed453065   hitier   Remove empty valu...
117
118
119
120
121
122
123
124
125
126
127
    # Uppercase the small tables
    #
    baps = [x.upper() for x in baps]
    grades = [x.upper() for x in grades]
    statuses = [x.upper() for x in statuses]

    # Now, sort the lists
    #
    #  1- first remove empty string with filter()
    #  2- then keep only uniq item with set()
    #  3- at last alpha sort  with sorted()
0e188a92   hitier   Import more agent...
128
    #
ed453065   hitier   Remove empty valu...
129
130
131
132
133
    services = sorted(set(filter(None, services)))
    baps = sorted(set(filter(None, baps)))
    grades = sorted(set(filter(None, grades)))
    companies = sorted(set(filter(None, companies)))
    statuses = sorted(set(filter(None, statuses)))
67814e41   hitier   New cli command f...
134

f1bb8c76   hitier   Move auth tests t...
135
136
137
138
    # Do the same for the projects, that are keys of categorized_projects
    #
    projects = sorted(set(categorized_projects.keys()))

d6b9daca   hitier   Feed categories a...
139
140
141
142
143
144
145
146
147
    # Do the same for the category labels stored as a dict
    #
    #   k is category name
    #   v is labels list for that category
    for k in categorie_keys:
        labels = sorted(set(filter(None, categories[k])))
        categories[k] = labels

    # At least, as agents is a list of dicts, sorting is a bit tricky
854e5e73   hitier   Feed statuses, so...
148
149
150
151
152
    #
    # the first one liner will store the last agent's line only
    # then we alpha sort  on the name
    # on both, the discrimination is based on the name couple: (firstname, secondname)
    #
0e188a92   hitier   Import more agent...
153
    agents = list({(a['firstname'], a['secondname']): a for a in agents}.values())
854e5e73   hitier   Feed statuses, so...
154
    agents = sorted(agents, key=lambda a: (a['firstname'], a['secondname']))
28a7e0a2   hitier   Strip row values ...
155

0e188a92   hitier   Import more agent...
156
    # Feed baps from column
28a7e0a2   hitier   Strip row values ...
157
    #
0e188a92   hitier   Import more agent...
158
159
160
161
162
    for b in baps:
        n_b = AgentBap(name=b)
        db.session.add(n_b)
    db.session.commit()

f1bb8c76   hitier   Move auth tests t...
163
    # Feed grades from column
0e188a92   hitier   Import more agent...
164
165
166
167
168
169
    #
    for g in grades:
        n_g = AgentGrade(name=g)
        db.session.add(n_g)
    db.session.commit()

f1bb8c76   hitier   Move auth tests t...
170
    # Feed companies from column
0e188a92   hitier   Import more agent...
171
172
173
174
    #
    for c in companies:
        n_c = Company(name=c)
        db.session.add(n_c)
67814e41   hitier   New cli command f...
175
    db.session.commit()
67814e41   hitier   New cli command f...
176

854e5e73   hitier   Feed statuses, so...
177
178
179
180
181
182
183
    # Feed statuses from column
    #
    for s in statuses:
        n_s = AgentStatus(name=s)
        db.session.add(n_s)
    db.session.commit()

28a7e0a2   hitier   Strip row values ...
184
185
    # Feed projects from column
    #
67814e41   hitier   New cli command f...
186
187
188
189
190
    for p in projects:
        n_p = Project(name=p)
        db.session.add(n_p)
    db.session.commit()

28a7e0a2   hitier   Strip row values ...
191
192
    # Feed services from column
    #
67814e41   hitier   New cli command f...
193
194
195
196
197
    for s in services:
        n_s = Service(name=s)
        db.session.add(n_s)
    db.session.commit()

770d2129   hitier   Now add only non-...
198
    # Feed periods names
61e60a1f   hitier   Now add default c...
199
    # Todo: are statically built,
ed453065   hitier   Remove empty valu...
200
201
    #      should come from year column name.
    #      also see later
770d2129   hitier   Now add only non-...
202
    #
67814e41   hitier   New cli command f...
203
204
205
206
207
    for p in range(2011, 2030):
        n_p = Period(name=f"{p}")
        db.session.add(n_p)
    db.session.commit()

61e60a1f   hitier   Now add default c...
208
    # Add one default capacity
f1bb8c76   hitier   Move auth tests t...
209
    #
0e188a92   hitier   Import more agent...
210
211
212
    db.session.add(Capacity(name="Agent"))
    db.session.commit()

d6b9daca   hitier   Feed categories a...
213
214
215
    # Feed categories and labels
    #
    for c, l in categories.items():
f1bb8c76   hitier   Move auth tests t...
216
        current_app.logger.debug("Adding category " + c)
d6b9daca   hitier   Feed categories a...
217
218
        n_c = Category(name=c)
        db.session.add(n_c)
454728d5   hitier   Use sqlalchemy re...
219
        # db.session.commit()
d6b9daca   hitier   Feed categories a...
220
        for label in l:
f1bb8c76   hitier   Move auth tests t...
221
222
            current_app.logger.debug("Adding label {} for id {}".format(label, n_c.id))
            n_l = Label(name=label, category=n_c)
d6b9daca   hitier   Feed categories a...
223
224
225
            db.session.add(n_l)
    db.session.commit()

f1bb8c76   hitier   Move auth tests t...
226
227
228
229
230
231
232
233
234
235
236
237
    # Feed project's labels
    #
    for p, labels in categorized_projects.items():
        n_p = Project.query.filter(Project.name == p).one()
        for l in labels:
            n_l = Label.query.filter(Label.name == l).one()
            n_c = n_l.category
            n_pl = ProjectLabel(project=n_p, category=n_c, label=n_l)
            db.session.add(n_pl)
    db.session.commit()

    # Feed agents from agents list previously filled
0e188a92   hitier   Import more agent...
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
    #
    for a in agents:
        status = AgentStatus.query.filter(AgentStatus.name == a['status']).one_or_none()
        if status is None and a['status']:
            status = AgentStatus(name=a['status'])
        company = Company.query.filter(Company.name == a['company']).one_or_none()
        if company is None and a['company']:
            company = Company(name=a['company'])
        bap = AgentBap.query.filter(AgentBap.name == a['bap']).one_or_none()
        if bap is None and a['bap']:
            bap = AgentBap(name=a['bap'])
        grade = AgentGrade.query.filter(AgentGrade.name == a['grade']).one_or_none()
        if grade is None and a['grade']:
            grade = AgentBap(name=a['grade'])
        virtual = 1 if a['virtual'] else 0
2d277715   hitier   Set permanent fie...
253
        permanent = 1 if a['status'] == 'PERM' else 0
0e188a92   hitier   Import more agent...
254
255
256
        n_a = Agent(firstname=a['firstname'],
                    secondname=a['secondname'],
                    status_id=status.id if status else None,
854e5e73   hitier   Feed statuses, so...
257
                    company_id=company.id if company else None,
0e188a92   hitier   Import more agent...
258
                    bap_id=bap.id if bap else None,
ed453065   hitier   Remove empty valu...
259
                    grade_id=grade.id if grade else None,
2d277715   hitier   Set permanent fie...
260
261
                    virtual=virtual,
                    permanent=permanent)
0e188a92   hitier   Import more agent...
262
        db.session.add(n_a)
61e60a1f   hitier   Now add default c...
263
264
    db.session.commit()

f1bb8c76   hitier   Move auth tests t...
265
266
267
    # Feed agents from agents list previously filled
    #

770d2129   hitier   Now add only non-...
268
269
270
271
272
    # Now feed the charges.
    #
    # At least one for each csv row
    # At most one for each year
    #
67814e41   hitier   New cli command f...
273
    for r in rows:
28a7e0a2   hitier   Strip row values ...
274
275
276
        p = Project.query.filter(Project.name == r[project_key]).one()
        a = Agent.query.filter(Agent.firstname == r[firstname_key], Agent.secondname == r[secondname_key]).one()
        s = Service.query.filter(Service.name == r[service_key]).one()
61e60a1f   hitier   Now add default c...
277
        c = Capacity.query.first()
ed453065   hitier   Remove empty valu...
278
        # TODO: period names should come from db request
67814e41   hitier   New cli command f...
279
280
281
        for period_name in range(2011, 2030):
            t = Period.query.filter(Period.name == period_name).one()
            charge = r[f"{period_name}"]
796a5688   hitier   Add % sign in cha...
282
283
            # Charge are stored as percent in db, but as fraction of ETP in irap csv
            # we make the conversion here.
67814e41   hitier   New cli command f...
284
            try:
28a7e0a2   hitier   Strip row values ...
285
                charge = int(100 * float(charge))
67814e41   hitier   New cli command f...
286
            except ValueError:
67814e41   hitier   New cli command f...
287
                charge = 0
770d2129   hitier   Now add only non-...
288
289
            if charge == 0:
                continue
67814e41   hitier   New cli command f...
290
291
292
            n_c = Charge(agent_id=a.id,
                         project_id=p.id,
                         service_id=s.id,
61e60a1f   hitier   Now add default c...
293
                         capacity_id=c.id,
67814e41   hitier   New cli command f...
294
295
296
297
298
299
                         period_id=t.id,
                         charge_rate=charge)
            db.session.add(n_c)
    db.session.commit()


946dda30   hitier   New cli command u...
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
@bp.cli.command("feed_from_lesia")
def feed_from_lesia():
    """
    Feed db with agents from a lesia like mysql database.

    Remember to configure the proper database uri in the db_config.py file.
    """
    from .lesia_db import lesia_agent, lesia_session, lesia_service, lesia_project, \
        lesia_fonction, lesia_periods, lesia_affectation

    agents = lesia_session.query(lesia_agent).all()
    for a in agents:
        n_a = Agent(id=a.IDagent, firstname=a.nom, secondname=a.prenom)
        db.session.add(n_a)
    db.session.commit()

    services = lesia_session.query(lesia_service).all()
    for s in services:
        n_s = Service(id=s.id, name=s.nom, abbr=s.abbreviation)
        db.session.add(n_s)
    db.session.commit()

    projects = lesia_session.query(lesia_project).all()
    for p in projects:
        n_p = Project(id=p.id, name=p.nom)
        db.session.add(n_p)
    db.session.commit()

    fonctions = lesia_session.query(lesia_fonction).all()
    for f in fonctions:
        n_c = Capacity(id=f.id, name=f.nom)
        db.session.add(n_c)
    db.session.commit()

    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()


e0778a0d   hitier   New fake_lesia_na...
353
354
@bp.cli.command("fake_lesia_names")
def fake_lesia_names():
14f36f55   hitier   Move lesia init c...
355
    """
e0778a0d   hitier   New fake_lesia_na...
356
357
358
359
360
    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...
361
362
363
364
365
366
        - services
        - capacities
        - projects
    :return:
    """

e0778a0d   hitier   New fake_lesia_na...
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
    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...
415

a17327bf   hitier   New db feeding co...
416
@bp.cli.command("feed_periods")
fa86be39   hitier   Enhance error cat...
417
418
419
420
421
@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...
422
423
424
425
        for s in ['S1', 'S2']:
            period_name = "{}_{}".format(y, s)
            p = Period(name=period_name)
            db.session.add(p)
fa86be39   hitier   Enhance error cat...
426
427
428
429
    try:
        db.session.commit()
    except IntegrityError:
        current_app.logger.error("Periods already exist")
a17327bf   hitier   New db feeding co...
430
431


d8a6b942   hitier   More install doc
432
433
434
435
@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...
436
    for i in range(0, 100):
335db4c0   hitier   Allow randoming c...
437
438
439
440
        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...
441
442
443
444
445
        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...
446
447
448
449
450
        # 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...
451
        if total_charge is not None and (total_charge + percent) >= 100:
e817ff5e   hitier   Random Charge Age...
452
453
            print("Skipping agent {} for period {}".format(agent_id, period_id))
            continue
335db4c0   hitier   Allow randoming c...
454
        charge = Charge(agent_id=agent_id,
a17327bf   hitier   New db feeding co...
455
456
457
458
459
460
461
462
463
464
                        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
465
@bp.cli.command('user_add')
a17327bf   hitier   New db feeding co...
466
467
@click.argument('email')
@click.argument('name')
3ed62121   hitier   Add login to user
468
@click.argument('login')
a17327bf   hitier   New db feeding co...
469
@click.argument('password')
149f7875   hitier   Now user_add acce...
470
471
@click.argument('role')
def user_add(email, name, login, password, role):
d8a6b942   hitier   More install doc
472
    """ Add a new user in db."""
149f7875   hitier   Now user_add acce...
473
    user = User.query.filter(User.name == name).one_or_none()
f1bb8c76   hitier   Move auth tests t...
474
475
    if user:
        current_app.logger.warn(f"user already exists {name}")
82642adb   hitier   Update routes and...
476
        return
149f7875   hitier   Now user_add acce...
477
    user = User(email=email, name=name, login=login, password=password, role=role)
a17327bf   hitier   New db feeding co...
478
479
    db.session.add(user)
    db.session.commit()
82642adb   hitier   Update routes and...
480
    current_app.logger.info(f"added {name}")
a17327bf   hitier   New db feeding co...
481
482


946dda30   hitier   New cli command u...
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
@bp.cli.command('user_update')
@click.option('--name', '-n', 'name', default=None, help="the name to set for that user")
@click.option('--role', '-r', 'role', default=None, help="the role to set for that user")
@click.option('--email', '-e', 'email', default=None, help="the email to set for that user")
@click.option('--password', '-p', 'password', default=None, help="the password to set for that user")
@click.argument('user_id')
def user_update(user_id, name, role, email, password):
    """Update the user by given id and given parameters."""
    user = User.query.get(user_id)
    if not user:
        current_app.logger.error(f"such user_id doesnt exists {user_id}")
        return
    if name:
        user.name = name
        print(f"User --{user.name}-- name updated to {user.name}")
    if role:
        user.set_role(role)
        print(f"User --{user.name}-- role updated to {_roleToName[user.role]}")
    if email:
0e188a92   hitier   Import more agent...
502
        user.email = email
946dda30   hitier   New cli command u...
503
504
505
506
        print(f"User --{user.name}-- email updated to {user.email}")
    if password:
        print(f"User --{user.name}-- password updated")
        user.set_password(password)
0e188a92   hitier   Import more agent...
507
    if not (name or role or email or password):
946dda30   hitier   New cli command u...
508
509
510
511
512
513
514
515
516
517
518
519
520
        print(f"No update for user --{user.name}--")
    db.session.commit()


@bp.cli.command('user_delete')
@click.argument('user_id')
def user_delete(user_id):
    """Delete the user by given id (see user_show_all")."""
    user = User.query.get(user_id)
    db.session.delete(user)
    db.session.commit()


149f7875   hitier   Now user_add acce...
521
522
523
524
525
526
@bp.cli.command('show_roles')
def show_roles():
    """ List all available roles for a user"""
    print("\n".join(list(_nameToRole)))


d8a6b942   hitier   More install doc
527
528
529
@bp.cli.command('user_show_all')
def user_show_all():
    """ Show all users in db."""
4113c4f3   hitier   Fix user_show_all
530
531
    print("{:<5} {:<15} {:<15} {:<15}".format('id', 'name', 'login', 'email'))
    print("{:<5} {:<15} {:<15} {:<15}".format('-' * 5, '-' * 15, '-' * 15, '-' * 15))
a17327bf   hitier   New db feeding co...
532
533
    for user in User.query.all():
        print(user.login)
4113c4f3   hitier   Fix user_show_all
534
        print("{:<5} {:<15} {:<15} {:<15}".format(
a17327bf   hitier   New db feeding co...
535
536
537
            user.id,
            user.name,
            user.login,
a17327bf   hitier   New db feeding co...
538
539
            user.email
        ))