diff --git a/avisstage/management/__init__.py b/avisstage/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/avisstage/management/commands/__init__.py b/avisstage/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/avisstage/management/commands/nettoie_lieux.py b/avisstage/management/commands/nettoie_lieux.py new file mode 100644 index 0000000..dab740d --- /dev/null +++ b/avisstage/management/commands/nettoie_lieux.py @@ -0,0 +1,43 @@ +#coding: utf-8 +from django.core.management.base import BaseCommand, CommandError +from django.db.models import Count +from avisstage.models import Stage, Lieu + +class Command(BaseCommand): + help = 'Nettoie les stages à plusieurs lieux identiques' + + def add_arguments(self, parser): + parser.add_argument('min_lieu', nargs='?', default=0, type=int) + parser.add_argument( + '--apply', + action='store_true', + default=False, + help='Applies the modifications', + ) + + def handle(self, *args, **options): + rundb = False + if options.get('apply', False): + rundb = True + else: + print u"Les modifications ne seront pas appliquées" + + min_lieu = options.get('min_lieu', 0) + + for lieu in Lieu.objects.filter(id__gte=min_lieu).order_by('-id'): + lproches = Lieu.objects.filter(id__lt=lieu.id, coord__distance_lte=(lieu.coord, 5)) + if len(lproches) == 0: + continue + print u"Doublons possibles pour %s (id=%d, %d avis) :" % (lieu, lieu.id, lieu.avislieu_set.count()) + for plieu in lproches: + pprint = u" > %s (id=%d, %d avis)" % (plieu, plieu.id, plieu.avislieu_set.count()) + if plieu.nom == lieu.nom and plieu.ville == lieu.ville and plieu.type_lieu == lieu.type_lieu: + print u"%s %s" % (pprint, self.style.SUCCESS(u'-> Suppression')) + if rundb: + for avis in plieu.avislieu_set.all(): + avis.lieu = lieu + avis.save() + plieu.delete() + else: + print u"%s %s" % (pprint, self.style.WARNING(u'-> À supprimer manuellement')) + self.stdout.write(self.style.SUCCESS(u'Nettoyage des lieux effectué')) diff --git a/avisstage/management/commands/nettoie_stages.py b/avisstage/management/commands/nettoie_stages.py new file mode 100644 index 0000000..0bbc8ac --- /dev/null +++ b/avisstage/management/commands/nettoie_stages.py @@ -0,0 +1,66 @@ +#coding: utf-8 +from django.core.management.base import BaseCommand, CommandError +from django.db.models import Count +from avisstage.models import Stage, Lieu + +class Command(BaseCommand): + help = 'Nettoie les stages à plusieurs lieux identiques' + + def add_arguments(self, parser): + parser.add_argument('min_stage', nargs='?', default=0, type=int) + parser.add_argument( + '--apply', + action='store_true', + default=False, + help='Applies the modifications', + ) + + def handle(self, *args, **options): + def get_len(obj): + length = 0 + avis = obj.avis_all + for k, av in avis: + length += len(av.split()) + length += len(obj.chapo.split()) + length += len(obj.les_plus.split()) + length += len(obj.les_moins.split()) + return length + + rundb = False + if options.get('apply', False): + rundb = True + else: + print u"Les modifications ne seront pas appliquées" + + min_stage = options.get('min_stage', 0) + + for stage in Stage.objects.annotate(c=Count("lieux"))\ + .filter(c__gte=2, id__gte=min_stage): + lieuset = {} + todel = [] + problems = [] + for avis in stage.avislieu_set.all(): + alen = get_len(avis) + aid = avis.lieu.id + if aid in lieuset: + if alen == 0: + todel.append((avis, alen)) + continue + elif lieuset[aid][1] == 0: + todel.append(lieuset[aid]) + else: + problems += [(avis, alen), lieuset[aid]] + lieuset[aid] = (avis, alen) + if len(todel) > 0: + print u"Doublons détectés dans %s" % (stage,) + for avis, alen in todel: + print u" > Suppression de l'avis sur %s de %d mots" % \ + (avis.lieu, alen) + if rundb: + avis.delete() + if len(problems) > 0: + self.stdout.write(self.style.WARNING(u"Réparation impossible de %s (id=%d)" % (stage, stage.id))) + for avis, alen in problems: + print u" > Avis sur %s de %d mots" % \ + (avis.lieu, alen) + self.stdout.write(self.style.SUCCESS(u'Nettoyage des stages effectué')) diff --git a/avisstage/management/commands/supprime_lieu.py b/avisstage/management/commands/supprime_lieu.py new file mode 100644 index 0000000..c6a223c --- /dev/null +++ b/avisstage/management/commands/supprime_lieu.py @@ -0,0 +1,35 @@ +#coding: utf-8 +from django.core.management.base import BaseCommand, CommandError +from django.db.models import Count +from avisstage.models import Stage, Lieu + +class Command(BaseCommand): + help = 'Nettoie les stages à plusieurs lieux identiques' + + def add_arguments(self, parser): + parser.add_argument('del_lieu', type=int, help='Lieu à supprimer') + parser.add_argument('repl_lieu', type=int, help='Lieu le remplaçant') + parser.add_argument( + '--apply', + action='store_true', + default=False, + help='Applies the modifications', + ) + + def handle(self, *args, **options): + rundb = False + if options.get('apply', False): + rundb = True + else: + print u"Les modifications ne seront pas appliquées" + + plieu = Lieu.objects.get(id=options['del_lieu']) + lieu = Lieu.objects.get(id=options['repl_lieu']) + print u"Suppression de %s (id=%d, %d avis)" % (plieu, plieu.id, plieu.avislieu_set.count()) + print u"Remplacement par %s (id=%d, %d avis)" % (lieu, lieu.id, lieu.avislieu_set.count()) + if rundb: + for avis in plieu.avislieu_set.all(): + avis.lieu = lieu + avis.save() + plieu.delete() + self.stdout.write(self.style.SUCCESS(u'Terminé'))