from django.core.management.base import BaseCommand, CommandParser, CommandError from django.db.models import DecimalField, F, Sum, Func, Q from decimal import Decimal from services.models import Service, ServiceType class Command(BaseCommand): help = 'Gestion des types de services' def add_arguments(self, parser): cmd = self class SubParser(CommandParser): def __init__(self, **kwargs): super().__init__(cmd, **kwargs) subparsers = parser.add_subparsers(dest='command', parser_class=SubParser) subparsers.required = True parser_list = subparsers.add_parser('list', help='Lister les types de services') parser_add = subparsers.add_parser('add', help='Ajouter un nouveau type de service') parser_add.add_argument('name', help='Nom du nouveau type de service') parser_change = subparsers.add_parser('change', help='Renomer un type de service') parser_change.add_argument('old_name', help='Ancien nom') parser_change.add_argument('new_name', help='Nouveau nom') parser_delete = subparsers.add_parser('delete', help='Supprimer un type de service') parser_delete.add_argument('name', help='Nom du type de service') def handle(self, *args, **options): cmd = options.pop('command') getattr(self, 'handle_{cmd}'.format(cmd=cmd))(*args, **options) def handle_list(self, *args, **options): for st in ServiceType.objects.all(): self.stdout.write('{:<30} {:4d} services'.format(st.name, st.services.count())) def handle_add(self, *args, **options): if ServiceType.objects.filter(name=options['name']).exists(): raise CommandError('Le type de service "%s" existe déjà' % options['name']) st = ServiceType.objects.create(name=options['name']) self.stdout.write(self.style.SUCCESS('Nouveau type de service "%s" créé avec succès' % st.name)) def handle_change(self, *args, **options): try: st = ServiceType.objects.get(name=options['old_name']) except ServiceType.DoesNotExist: raise CommandError('Le type de service "%s" n’existe pas' % options['old_name']) if ServiceType.objects.filter(name=options['new_name']).exists(): raise CommandError('Le type de service "%s" existe déjà' % options['new_name']) st.name = options['new_name'] st.save() self.stdout.write(self.style.SUCCESS('Type de service renommé en "%s"' % options['new_name'])) def handle_delete(self, *args, **options): try: st = ServiceType.objects.get(name=options['name']) except ServiceType.DoesNotExist: raise CommandError('Le type de service "%s" n’existe pas' % options['name']) if Service.objects.filter(service_type=st).exists(): raise CommandError('Il existe des services de type "%s", suppression refusé' % options['name']) st.delete() self.stdout.write(self.style.SUCCESS('Le type de service "%s" a été supprimé' % options['name']))