Conversation
8618084 to
8d24c28
Compare
There was a problem hiding this comment.
De manière générale :
- c'est vraiment dommage qu'il n'y ait aucune docstring, au moins en haut au niveau du module... Un nouvel arrivant sur le projet aura bien du mal à comprendre ce que fait chaque script.
- les fonctions sont bien trop grandes à mon goût et ont trop de responsabilités. Les fractionner en petites fonctions qui font moins de choses aiderait à comprendre plus rapidement chaque script (en lisant la fonction principale on devrait comprendre tout de suite chaque étape sans entrer dans le détail).
- il n'y a aucun test !!! => 😱 Avant d'envisager un refacto il faut surtout faire des tests unitaires à mon humble avis !
- les requêtes en DB en écriture n'ont pas de rollback en cas de souci. J'imagine que tu as dû tester les cas d'erreur mais ça me semble assez dangereux en l'état, non ?
- l'historique git contient pas mal de wip, ça ne me semble pas très lisible.
Et sinon, bravo pour le boulot !! 👏
| return con, cur | ||
|
|
||
| def create_sqlalchemy_engine(): | ||
| connexion_url = ('mysql://'+DATABASE['USER']+':%s@'+\ |
There was a problem hiding this comment.
Je trouve que ce serait plus lisible d'enlever les "+" et de passer par format. Exemple : f"mysql://{DATABASE['USER']}:%s@".
There was a problem hiding this comment.
TIL nouvelle syntaxe, je connaissais seulement '{} {}'.format('one', 'two')
| @@ -0,0 +1,147 @@ | |||
| from datetime import date | |||
There was a problem hiding this comment.
Une docstring générale ne ferait pas de mal pour expliquer ce que fait le script et comment l'utiliser, toujours dans l'optique de la MCO.
| import pandas as pd | ||
| from labonneboite.importer import util as import_util | ||
| from labonneboite.importer import settings as importer_settings | ||
| from labonneboite.importer.jobs.common import logger |
There was a problem hiding this comment.
Ce serait bien de différencier les librairies natives des externes et de celles du projet par un saut de ligne.
| def clean_csv_act_dpae_file(existing_sql_table=True): | ||
|
|
||
| dpae_folder_path = importer_settings.INPUT_SOURCE_FOLDER + '/' | ||
| csv_path = dpae_folder_path+'act_dpae.csv' |
There was a problem hiding this comment.
A mon humble avis, tu peux supprimer la ligne précédente et écrire csv_path = f"{importer_settings.INPUT_SOURCE_FOLDER}/act_dpae.csv", ça enlève une variable et c'est plus lisible.
| inplace=True) | ||
|
|
||
|
|
||
| def get_type_contrat(row): |
There was a problem hiding this comment.
Est-ce que ce ne serait pas plus logique que les fonctions soient réunies au début du script, avant la fonction principale appelée par run_main ? Là ça mélange tout.
D'ailleurs j'ai un peu de mal à saisir pourquoi plusieurs fonctions sont dans "clean_csv_act_dpae_file" alors qu'elles pourraient être définies précédemment et être ainsi indépendantes. Ca aiderait grandement à les tester en tests unitaires.
| #We select the last DPAE date that has been used in the last joined dpae | ||
| engine = import_util.create_sqlalchemy_engine() | ||
|
|
||
| query = "select date_embauche from act_dpae_clean order by date_embauche DESC LIMIT 1 " |
There was a problem hiding this comment.
Ce serait plus lisible si les commandes SQL étaient toutes en majuscules.
| chunksize = 10 ** 5 | ||
| else: | ||
| chunksize = 10 ** 6 | ||
| i = 0 |
There was a problem hiding this comment.
Devrait être juste avant la ligne 77 car est utilisé uniquement dans le cadre de cette boucle for.
| from labonneboite.scripts.impact_retour_emploi.scripts_charts import grand_public as gd | ||
| from labonneboite.importer import util as import_util | ||
| from labonneboite.importer.jobs.common import logger | ||
| from labonneboite.scripts.impact_retour_emploi.settings_path_charts import root_path, clean_path, gd_pub_path, images_path |
There was a problem hiding this comment.
Même remarque que précédemment sur les imports.
|
|
||
| ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' | ||
|
|
||
| # FIXME : Refacto all files about the creation of charts and pasting on sheets (<3 Joris) |
| @@ -0,0 +1,6 @@ | |||
| from labonneboite.importer import settings as importer_settings | |||
There was a problem hiding this comment.
Ces settings ne devraient-ils pas être dans scripts_charts ? Ainsi il n'y aurait pas à l'appeler "settings_path_charts" mais juste "settings.py".
Our bien dans les settings de l'importeur (s'il y en a) de manière générale. Ce serait d'ailleurs mieux car ça centralise toutes les configurations de ce module, non ?
dejafait
left a comment
There was a problem hiding this comment.
Quelques points en plus de la review très complète de @celine-m-s
| return con, cur | ||
|
|
||
| def create_sqlalchemy_engine(): | ||
| connexion_url = ('mysql://'+DATABASE['USER']+':%s@'+\ |
There was a problem hiding this comment.
TIL nouvelle syntaxe, je connaissais seulement '{} {}'.format('one', 'two')
| cell_A5.alignment = openpyxl.styles.Alignment(horizontal="center") | ||
| DPAE_for_gd_pub = [cell_A4.value, nbre_DPAE] # for grand_public | ||
|
|
||
| # Add number of IDPE unique |
There was a problem hiding this comment.
IDPE =?
on utilise PEID partout ailleurs dans le code et avec les autres startups, je conseille de s'aligner
s/idpe/peid/
| return [title]+stats | ||
|
|
||
|
|
||
| def Graph(ordre, columns_date, df, title, name, time_type='week'): |
There was a problem hiding this comment.
méthode hyper longue à casser en petits bouts
| x = [] | ||
|
|
||
|
|
||
| def Stacked_Bar(ordre, columns_x, df, titles, name, columns_legend): |
| 04 Réunion | ||
| 05 Saint Pierre et Miquelon | ||
| 06 Mayotte | ||
| ''' |
There was a problem hiding this comment.
à quoi sert cette string? Pourquoi n'est-elle pas stockée dans une variable?
| "La plus grande valeur est : "] | ||
|
|
||
|
|
||
| def build_grand_public_sheet(nbre_DPAE, nbre_IDPE, nbre_IDPE_sign, all_stats, impact_xlsx): |
| openpyxl | ||
| pygal | ||
| pygal_maps_fr | ||
| matplotlib |
| matplotlib | ||
| imgkit | ||
| xlsxwriter | ||
| cairosvg No newline at end of file |
There was a problem hiding this comment.
c'est chaud d'importer autant de libs (comme matplotlib) en production alors qu'elles sont utiles seulement pour l'IRE
on paye le prix de la non séparation de l'importer vs le frontend/api
j'ai pas de solution mais je veux bien l'avis de @celine-m-s
à noter: Michel pour son projet ROME NAF avait séparé ses requirements dans son dossier spécifique ROME_NAF à la racine du repo, c'était pas mal
There was a problem hiding this comment.
C'est vrai que ce n'est pas très efficace...
Peut-être qu'on peut créer un requirements.in spécifique à l'importer et installer ces dépendances dans chaque commande make qui les nécessite ?
Ou bien, si c'est Ansible qui lance les commandes make et installe l'environnement, on peut les installer à ce moment-là ?
45e1449 to
8ac38f2
Compare
8ac38f2 to
741db50
Compare
741db50 to
f4e39e0
Compare
|
Elle a 8 mois cette branche, temps de tourner la page et en fait une nouvelle non? @JimmyDore besoin de review? |
4421e1d to
fc35a7a
Compare
Ajout des scripts réalisés par Joris, Refacto et industrialisation de ces scripts,
afin de calculer l'impact sur le retour à l'emploi de LBB.