Skip to content

Commit 1019f87

Browse files
committed
Remplacement d'accessoires
1 parent fbba242 commit 1019f87

1 file changed

Lines changed: 62 additions & 0 deletions

File tree

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
from orgues.models import Orgue, Accessoire
2+
from django.core.management.base import BaseCommand
3+
import os
4+
5+
6+
class Command(BaseCommand):
7+
"""
8+
Remplace dans tous les orgues un accessoire par un autre déjà existant.
9+
La fonction prend un argument obligatoire et un optionnel:
10+
- Le fichier csv séparateur ";" contenant les modifications : une colonne pour les accessoires à remplacer, une autre pour les accessoires qui remplacent;
11+
- optionnel : --delete : efface de la base de données les accessoires à retirer.
12+
La fonction renvoie un message d'erreur si l'un des accessoires du fichier csv n'existe pas dans la base de données ou s'il existe plusieurs fois.
13+
Ex :
14+
py manage.py replace_organ_builder --delete fic.csv
15+
"""
16+
help = "Remplace un accessoire par un autre déjà existant"
17+
18+
def add_arguments(self, parser):
19+
parser.add_argument('codestable', nargs=1, type=str,
20+
help='Chemin vers le fichier (CSV, points-virgules, utf-8) contenant au moins deux colonnes : accessoires à remplacer dans la première et accesoires qui remplacent dans les suivantes.')
21+
parser.add_argument('--delete', action='store_true',
22+
help="Efface le facteur d'orgues de la base de données")
23+
24+
def handle(self, *args, **options):
25+
if not os.path.exists(options['codestable'][0]):
26+
return "Fichier introuvable".format(options['codestable'][0])
27+
else:
28+
with open(options['codestable'][0], "r", encoding="utf-8") as f:
29+
print("Début traitement d'une liste de codes à remplacer.")
30+
couples_accessoires = [ligne.rstrip('\n').split(';') for ligne in f.readlines()]
31+
for couple_accessoires in couples_accessoires:
32+
accessoire_avant = couple_accessoires[0]
33+
accessoire_delete = Accessoire.objects.filter(nom=accessoire_avant)
34+
if accessoire_delete.count() == 0:
35+
print("ERROR : Le nom de l'accessoire à remplacer n'existe pas : {}".format(accessoire_avant))
36+
elif accessoire_delete.count() > 1:
37+
print("ERROR : Deux accessoires à effacer portent le même nom : {}".format(accessoire_avant))
38+
else:
39+
liste_accessoires_apres = []
40+
erreur = False
41+
for f in range(1, len(couple_accessoires)):
42+
accessoire_apres = couple_accessoires[f]
43+
accessoire_replace = Accessoire.objects.filter(nom=accessoire_apres)
44+
liste_accessoires_apres.append(accessoire_replace)
45+
if accessoire_replace.count() == 0:
46+
erreur = True
47+
print("ERROR : Le nom de l'accessoire qui doit prendre place n'existe pas : {}".format(accessoire_apres))
48+
elif accessoire_replace.count() > 1:
49+
erreur = True
50+
print("ERROR : Deux accessoires à mettre portent le même nom : {}".format(accessoire_apres))
51+
if not erreur:
52+
print("INFO : Je cherche à remplacer {} par {}".format(accessoire_delete, liste_accessoires_apres))
53+
orgues = Orgue.objects.filter(accessoires=accessoire_delete[0])
54+
for orgue in orgues:
55+
for accessoire_replace in liste_accessoires_apres:
56+
orgue.accessoires.add(accessoire_replace[0])
57+
orgue.accessoires.remove(accessoire_delete[0])
58+
print("INFO : Changement effectué pour l'orgue de {}.".format(orgue))
59+
orgue.save()
60+
if options['delete']:
61+
print("INFO : L'accessoire {} a été retiré de la liste.".format(accessoire_delete))
62+
accessoire_delete[0].delete()

0 commit comments

Comments
 (0)