Blame view

app/commands/commands.py 20.1 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, \
a53e2fff   hitier   New category/labe...
13
    AgentGrade, Category, Label, ProjectLabel, CategoryLabel
f1bb8c76   hitier   Move auth tests t...
14
# 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
@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:
3262868b   hitier   New Cli tests
41
        print("Created sqlite db: " + sqlite_uri)
946dda30   hitier   New cli command u...
42
43


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)
919d72f4   hitier   Tiny irap categor...
217
        n_c = Category(name=c.capitalize())
d6b9daca   hitier   Feed categories a...
218
        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
@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, \
90fdccc7   hitier   Now feed projects...
308
309
310
311
312
313
314
315
        lesia_fonction, lesia_periods, lesia_affectation, lesia_domains, lesia_poles, \
        lesia_domainprojects

    # Feed all lesia 'domaine' names and link to new category "Domaine"
    #
    domain_category = Category(name="Domaine")
    domains = lesia_session.query(lesia_domains)
    for d in domains:
a53e2fff   hitier   New category/labe...
316
317
318
        n_l = Label(name=d.nom)
        n_cl = CategoryLabel(category=domain_category, label=n_l )
        db.session.add(n_cl)
90fdccc7   hitier   Now feed projects...
319
320
321
322
323
324
325
    db.session.commit()

    # Feed all lesia 'pôle' names and link to new category  "Pôle"
    #
    pole_category = Category(name="Pôle")
    poles = lesia_session.query(lesia_poles)
    for p in poles:
a53e2fff   hitier   New category/labe...
326
327
328
        n_l = Label(name=p.nom)
        n_cl = CategoryLabel(category=pole_category, label=n_l)
        db.session.add(n_cl)
90fdccc7   hitier   Now feed projects...
329
330
331
332
333
334
335
336
337
338
339
340
341
342
    db.session.commit()

    # Feed lesia project with proper "pôle"
    #  (as this information is stored in gestit_projets)
    #
    projects = lesia_session.query(lesia_project).all()
    for p in projects:
        # add project
        n_p = Project(id=p.id, name=p.nom)
        db.session.add(n_p)
        # get corresponding lesia pole name
        pole_name = lesia_session.query(lesia_poles).filter(lesia_poles.id == p.pole_id).one().nom
        # search corresponding Label and store in ProjectLabel table
        n_l = Label.query.filter(Label.name == pole_name).one()
a53e2fff   hitier   New category/labe...
343
        n_pl = ProjectLabel(project=n_p, label=n_l)
90fdccc7   hitier   Now feed projects...
344
345
346
347
348
349
350
351
352
353
354
        db.session.add(n_pl)
        db.session.commit()

    # Get projects domain information and store in ProjectLabel
    #
    domain_projects = lesia_session.query(lesia_domainprojects)
    for dp in domain_projects:
        project_name = lesia_session.query(lesia_project).filter(lesia_project.id == dp.projet_id).one().nom
        domain_name = lesia_session.query(lesia_domains).filter(lesia_domains.id == dp.domaine_id).one().nom
        n_p = Project.query.filter(Project.name == project_name).one()
        n_l = Label.query.filter(Label.name == domain_name).one()
a53e2fff   hitier   New category/labe...
355
        n_pl = ProjectLabel(project=n_p, label=n_l)
90fdccc7   hitier   Now feed projects...
356
357
358
359
360
361
362
363
364
365
366
        db.session.add(n_pl)
        # Some projects have 2 domain labels in lesia db
        # That is not allowed any more in the new model.
        #
        try:
            db.session.commit()
        except IntegrityError:
            db.session.rollback()
            current_app.logger.error(
                "Error adding project to category/label: {} {} {}".format(n_p.name, n_l.category.name, n_l.name))
            continue
946dda30   hitier   New cli command u...
367
368
369
370
371
372
373
374
375
376
377
378
379

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

946dda30   hitier   New cli command u...
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
    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...
405
406
@bp.cli.command("fake_lesia_names")
def fake_lesia_names():
14f36f55   hitier   Move lesia init c...
407
    """
e0778a0d   hitier   New fake_lesia_na...
408
409
410
411
412
    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...
413
414
415
416
417
418
        - services
        - capacities
        - projects
    :return:
    """

e0778a0d   hitier   New fake_lesia_na...
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
    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...
467

a17327bf   hitier   New db feeding co...
468
@bp.cli.command("feed_periods")
fa86be39   hitier   Enhance error cat...
469
470
471
472
473
@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...
474
475
476
477
        for s in ['S1', 'S2']:
            period_name = "{}_{}".format(y, s)
            p = Period(name=period_name)
            db.session.add(p)
fa86be39   hitier   Enhance error cat...
478
479
480
481
    try:
        db.session.commit()
    except IntegrityError:
        current_app.logger.error("Periods already exist")
a17327bf   hitier   New db feeding co...
482
483


d8a6b942   hitier   More install doc
484
485
486
487
@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. """
65b2833e   hitier   Fix some sonar co...
488
    for _ in range(0, 100):
335db4c0   hitier   Allow randoming c...
489
490
491
492
        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...
493
494
495
496
497
        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...
498
499
500
501
502
        # 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...
503
        if total_charge is not None and (total_charge + percent) >= 100:
e817ff5e   hitier   Random Charge Age...
504
505
            print("Skipping agent {} for period {}".format(agent_id, period_id))
            continue
335db4c0   hitier   Allow randoming c...
506
        charge = Charge(agent_id=agent_id,
a17327bf   hitier   New db feeding co...
507
508
509
510
511
512
513
514
515
516
                        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
517
@bp.cli.command('user_add')
a17327bf   hitier   New db feeding co...
518
519
@click.argument('email')
@click.argument('name')
3ed62121   hitier   Add login to user
520
@click.argument('login')
a17327bf   hitier   New db feeding co...
521
@click.argument('password')
149f7875   hitier   Now user_add acce...
522
523
@click.argument('role')
def user_add(email, name, login, password, role):
d8a6b942   hitier   More install doc
524
    """ Add a new user in db."""
149f7875   hitier   Now user_add acce...
525
    user = User.query.filter(User.name == name).one_or_none()
f1bb8c76   hitier   Move auth tests t...
526
527
    if user:
        current_app.logger.warn(f"user already exists {name}")
82642adb   hitier   Update routes and...
528
        return
149f7875   hitier   Now user_add acce...
529
    user = User(email=email, name=name, login=login, password=password, role=role)
a17327bf   hitier   New db feeding co...
530
531
    db.session.add(user)
    db.session.commit()
82642adb   hitier   Update routes and...
532
    current_app.logger.info(f"added {name}")
a17327bf   hitier   New db feeding co...
533
534


946dda30   hitier   New cli command u...
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
@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...
554
        user.email = email
946dda30   hitier   New cli command u...
555
556
557
558
        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...
559
    if not (name or role or email or password):
946dda30   hitier   New cli command u...
560
561
562
563
564
565
566
567
568
569
570
571
572
        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...
573
574
575
576
577
578
@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
579
580
581
@bp.cli.command('user_show_all')
def user_show_all():
    """ Show all users in db."""
4113c4f3   hitier   Fix user_show_all
582
583
    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...
584
585
    for user in User.query.all():
        print(user.login)
4113c4f3   hitier   Fix user_show_all
586
        print("{:<5} {:<15} {:<15} {:<15}".format(
a17327bf   hitier   New db feeding co...
587
588
589
            user.id,
            user.name,
            user.login,
a17327bf   hitier   New db feeding co...
590
591
            user.email
        ))